Category Other  Published on 27/02/2013

Robot_Forex

Description

I've tested this Robot with EURUSD and GBPUSD in H1 timeframe with good results.
But the problem is, that in one account I can run only one currency pair (e.g. EURUSD), not together with GBPUSD. Can someone have a look at it please?

many thanks
Robert


u

IM
imWald

Joined on 16.02.2013

  • Distribution: Free
  • Language: C#
  • Trading platform: cTrader Automate
  • File name: Robot_Forex.algo
  • Rating: 3.75
  • Installs: 49817
  • Modified: 13/10/2021 09:54
Comments
Log in to add a comment.
drkhashix's avatar
drkhashix · 5 months ago

I can solve the problem of the Nekert robot working on multiple currencies in two days. Anyone who wants to solve the problem, send a message. Also, it is better to open the transactions manually on a daily basis, and the robot should only do capital management. Anyone who wants to be a sponsor can contact me. email: khashayar.nezami@gmail.com

Supannee's avatar
Supannee · 6 months ago

Can you make the code visible?
 

JU
Junior_trader · 7 months ago

reduce initial batch to 1000

JU
Junior_trader · 7 months ago

 

Can you make the code visible?

19
1978williamsony2 · 8 months ago

any code?

JU
Junior_trader · 9 months ago

My contact +5531988096960

JU
Junior_trader · 9 months ago

Does anyone have the updated code?

AY
Ayrone Yii · 1 year ago

Greeting master coder, i implore your help to update the algorithm to the latest cAlgo compatible libraries. I'm not a coder and the current algo can't be run as it is obsolete. Help appreciated much!

drkhashix's avatar
drkhashix · 1 year ago

good morning

i want  to chose TradeType buy and sell sobody help plz

[Parameter]
public TradeType TradeType { get; set; }

how can emake this to work

or

bater chose pos bay sma for trent

JU
Junior_trader · 1 year ago

Good morning, how do I change the repurchase space?

ST
stefan_schwarz1 · 1 year ago

The Tral_Start and Tral_Stop is not working if you dont modify a stoplossprice in OnPositionOpend()

...    

private void OnPositionOpened(PositionOpenedEventArgs args)
        {
            double? StopLossPrice = null;
            double? TakeProfitPrice = null;

            if (Positions.Count == 1)
            {
                position = args.Position;

                if (position.TradeType == TradeType.Buy)
                    {
                    TakeProfitPrice = position.EntryPrice + TakeProfit * Symbol.TickSize;
                    StopLossPrice = position.EntryPrice - Stop_Loss * Symbol.TickSize;
                    }
                if (position.TradeType == TradeType.Sell)
                    {
                    TakeProfitPrice = position.EntryPrice - TakeProfit * Symbol.TickSize;
                    StopLossPrice = position.EntryPrice + Stop_Loss * Symbol.TickSize;
                    }
            }
            else
                switch (GetPositionsSide())
                {
                    case 0:
                        TakeProfitPrice = GetAveragePrice(TradeType.Buy) + TakeProfit * Symbol.TickSize;
                        StopLossPrice = GetAveragePrice(TradeType.Buy) - Stop_Loss * Symbol.TickSize;
                        break;
                    case 1:
                        TakeProfitPrice = GetAveragePrice(TradeType.Sell) - TakeProfit * Symbol.TickSize;
                        StopLossPrice = GetAveragePrice(TradeType.Sell) + Stop_Loss * Symbol.TickSize;
                        break;
                }

            for (int i = 0; i < Positions.Count; i++)
            {
                position = Positions[i];
                if (StopLossPrice != null || TakeProfitPrice != null)
                    ModifyPosition(position, StopLossPrice, TakeProfitPrice);
            }
        }

...

wera133's avatar
wera133 · 2 years ago

Hello, please help me with setting SL and other currencies. I'm not a programmer so I don't know how to do it. On the first day of testing for 5 minutes, only the profits for closing positions have a profit of EUR 15.36.x 6 it was only one position during the day at night with a loss of -18 EUR

AL
Alejandromendezen · 3 years ago

hello, I have tested the robot in Live account, it works very well.
However, sometimes it can lead to big losses, so I think a stop loss would be ideal.
I was trying however I could not change the lot, nor can I set a stop loss that works.
could someone help me with that? From already thank you very much.

GA
Gann · 3 years ago

is there anyway that we can use this bot on MT5 platform ?

5H
5h1ver · 3 years ago

@MudiCapital How can I contact with you?

5H
5h1ver · 3 years ago

In backtesting is working very good but the problem is, that the robot does not open all position in real time which according to backtesting should open. Does anybody know what's going on?

SU
suchocki82 · 4 years ago

LOL seams to be working. So far 100% accuracy. Got to do more tests though. Very impressed so far. Only profits no losses. I will leave it over night and next day to see the results.

RE
reking86 · 4 years ago

pipstep dont work

AL
alfredogarc · 4 years ago

Hi.

The FirstLot is 10000. Can it be changed to a smaller lot for mini accounts?

FA
fabrizioascani · 5 years ago

"Error CS0612: 'cAlgo.API.Robot.Trade' is obsolete"

to me is a Warning:
Error CS0612: 'cAlgo.API.Robot.Trade' is obsolete

"

Error CS0266: Cannot implicitly convert type 'double' to 'long'. An explicit conversion exists (are you missing a cast?) 

may you fix so?
 long NewVolume = (long)Symbol.NormalizeVolumeInUnits(FirstLot + FirstLot * Positions.Count, RoundingMode.ToNearest);

"

BA
bave.rowe · 5 years ago

two errors: can someone help to fix them pls 

Error CS0612: 'cAlgo.API.Robot.Trade' is obsolete 

Error CS0266: Cannot implicitly convert type 'double' to 'long'. An explicit conversion exists (are you missing a cast?) 

CT
ctid1250093 · 5 years ago

I have corrected most mistakes. However, I do not get along with the following and need help.
1. "if (Trade.IsExecuting) return" is deprecated. Against which command should / must I swap this?
2. "if (Positions.Count <MaxOrders)
             {
                 // int rem;
                 long NewVolume = Symbol.NormalizeVolumeInUnits (FirstLot + FirstLot * Positions.Count, RoundingMode.ToNearest);
                 int positionSide = GetPositionsSide (); "
-> double can not be implicitly converted to "long". An explicit conversion already exists (possibly a conversion is missing)
How do I fix this error?
Here the complete Code:
 using System;
using cAlgo.API;
using cAlgo.API.Internals;

namespace cAlgo.Robots
{
    [Robot("Robot Forex", AccessRights = AccessRights.None)]
    public class Robot_Forex : Robot
    {
        [Parameter(DefaultValue = 10000, MinValue = 1000)]
        public int FirstLot { get; set; }

        [Parameter(DefaultValue = 10000, MinValue = 1000)]
        public int LotStep { get; set; }

        //[Parameter(DefaultValue = 300)]
        //public int PipStep { get; set; }

        [Parameter("Stop_Loss", DefaultValue = 50, MinValue = 0)]
        public int Stop_Loss { get; set; }

        [Parameter("Take_Profit", DefaultValue = 180, MinValue = 10)]
        public int TakeProfit { get; set; }

        [Parameter("Tral_Start", DefaultValue = 50, MinValue = 10)]
        public int Tral_Start { get; set; }

        [Parameter("Tral_Stop", DefaultValue = 50, MinValue = 10)]
        public int Tral_Stop { get; set; }




        [Parameter(DefaultValue = 5, MinValue = 2)]
        public int MaxOrders { get; set; }

        private Position position;
        private bool RobotStopped;
        private string botLabel;


        protected override void OnStart()
        {
            botLabel = ToString();

            // The stop loss must be greater than tral stop
            //Stop_Loss = Math.Max(Tral_Stop, Stop_Loss);

            Positions.Opened += OnPositionOpened;
        }

        protected override void OnTick()
        {
            double Bid = Symbol.Bid;
            double Ask = Symbol.Ask;
            double Point = Symbol.TickSize;

            if (Trade.IsExecuting)
                return;

            if (Positions.Count > 0 && RobotStopped)
                return;
            else
                RobotStopped = false;

            if (Positions.Count == 0)
                SendFirstOrder(FirstLot);
            else
                ControlSeries();

            foreach (var position in Positions)
            {
                if (position.SymbolName == Symbol.Name)
                {

                    if (position.TradeType == TradeType.Buy)
                    {
                        if (Bid - GetAveragePrice(TradeType.Buy) >= Tral_Start * Point)
                            if (Bid - Tral_Stop * Point >= position.StopLoss)
                                ModifyPosition(position, Bid - Tral_Stop * Point, position.TakeProfit);
                    }

                    if (position.TradeType == TradeType.Sell)
                    {
                        if (GetAveragePrice(TradeType.Sell) - Ask >= Tral_Start * Point)
                            if (Ask + Tral_Stop * Point <= position.StopLoss || position.StopLoss == 0)
                                ModifyPosition(position, Ask + Tral_Stop * Point, position.TakeProfit);
                    }
                }
            }
        }

        protected override void OnError(Error CodeOfError)
        {
            if (CodeOfError.Code == ErrorCode.NoMoney)
            {
                RobotStopped = true;
                Print("ERROR!!! No money for order open, robot is stopped!");
            }
            else if (CodeOfError.Code == ErrorCode.BadVolume)
            {
                RobotStopped = true;
                Print("ERROR!!! Bad volume for order open, robot is stopped!");
            }
        }

        private void SendFirstOrder(int OrderVolume)
        {
            int Signal = GetStdIlanSignal();
            if (!(Signal < 0))
                switch (Signal)
                {
                    case 0:
                        ExecuteMarketOrder(TradeType.Buy, SymbolName, OrderVolume, botLabel);
                        break;
                    case 1:
                        ExecuteMarketOrder(TradeType.Sell, SymbolName, OrderVolume, botLabel);
                        break;
                }
        }

        private void OnPositionOpened(PositionOpenedEventArgs args)
        {
            double? StopLossPrice = null;
            double? TakeProfitPrice = null;

            if (Positions.Count == 1)
            {
                position = args.Position;

                if (position.TradeType == TradeType.Buy)
                    TakeProfitPrice = position.EntryPrice + TakeProfit * Symbol.TickSize;
                if (position.TradeType == TradeType.Sell)
                    TakeProfitPrice = position.EntryPrice - TakeProfit * Symbol.TickSize;
            }
            else
                switch (GetPositionsSide())
                {
                    case 0:
                        TakeProfitPrice = GetAveragePrice(TradeType.Buy) + TakeProfit * Symbol.TickSize;
                        break;
                    case 1:
                        TakeProfitPrice = GetAveragePrice(TradeType.Sell) - TakeProfit * Symbol.TickSize;
                        break;
                }

            for (int i = 0; i < Positions.Count; i++)
            {
                position = Positions[i];
                if (StopLossPrice != null || TakeProfitPrice != null)
                    ModifyPosition(position, position.StopLoss, TakeProfitPrice);
            }
        }

        private double GetAveragePrice(TradeType TypeOfTrade)
        {
            double Result = Symbol.Bid;
            double AveragePrice = 0;
            long Count = 0;

            for (int i = 0; i < Positions.Count; i++)
            {
                position = Positions[i];
                if (position.TradeType == TypeOfTrade)
                {
                    AveragePrice += position.EntryPrice * position.Volume;
                    Count += position.Volume;
                }
            }
            if (AveragePrice > 0 && Count > 0)
                Result = AveragePrice / Count;
            return Result;
        }

        private int GetPositionsSide()
        {
            int Result = -1;
            int i, BuySide = 0, SellSide = 0;

            for (i = 0; i < Positions.Count; i++)
            {
                if (Positions[i].TradeType == TradeType.Buy)
                    BuySide++;
                if (Positions[i].TradeType == TradeType.Sell)
                    SellSide++;
            }
            if (BuySide == Positions.Count)
                Result = 0;
            if (SellSide == Positions.Count)
                Result = 1;
            return Result;
        }

        /// <summary>
        /// The gradient variable is a dynamic value that represente an equidistant grid between
        /// the high value and the low value of price.
        /// </summary>
        /// 
        private void ControlSeries()
        {
            const int BarCount = 25;
            int gradient = MaxOrders - 1;

            foreach (Position position in Positions.FindAll(botLabel, SymbolName))
            {
                if (-position.Pips > Stop_Loss)
                    ClosePosition(position);

            }

            //if (PipStep == 0)
            int _pipstep = GetDynamicPipstep(BarCount, gradient);
            //else
            //    _pipstep = PipStep;

            if (Positions.Count < MaxOrders)
            {
                //int rem;
                long NewVolume = Symbol.NormalizeVolumeInUnits(FirstLot + FirstLot * Positions.Count, RoundingMode.ToNearest);
                int positionSide = GetPositionsSide();

                switch (positionSide)
                {
                    case 0:
                        if (Symbol.Ask < FindLastPrice(TradeType.Buy) - _pipstep * Symbol.TickSize)
                        {
                            //NewVolume = Math.DivRem((int)(FirstLot + FirstLot * Positions.Count), LotStep, out rem) * LotStep;

                            if (NewVolume >= LotStep)
                                ExecuteMarketOrder(TradeType.Buy, SymbolName, NewVolume, botLabel);
                        }
                        break;

                    case 1:
                        if (Symbol.Bid > FindLastPrice(TradeType.Sell) + _pipstep * Symbol.TickSize)
                        {
                            //NewVolume = Math.DivRem((int)(FirstLot + FirstLot * Positions.Count), LotStep, out rem) * LotStep;

                            if (NewVolume >= LotStep)
                                ExecuteMarketOrder(TradeType.Sell, SymbolName, NewVolume, botLabel);
                        }
                        break;
                }
            }

        }

        private int GetDynamicPipstep(int CountOfBars, int gradient)
        {
            int Result;
            double HighestPrice = 0, LowestPrice = 0;
            int StartBar = MarketSeries.Close.Count - 2 - CountOfBars;
            int EndBar = MarketSeries.Close.Count - 2;

            for (int i = StartBar; i < EndBar; i++)
            {
                if (HighestPrice == 0 && LowestPrice == 0)
                {
                    HighestPrice = MarketSeries.High[i];
                    LowestPrice = MarketSeries.Low[i];
                    continue;
                }
                if (MarketSeries.High[i] > HighestPrice)
                    HighestPrice = MarketSeries.High[i];
                if (MarketSeries.Low[i] < LowestPrice)
                    LowestPrice = MarketSeries.Low[i];
            }

            Result = (int)((HighestPrice - LowestPrice) / Symbol.TickSize / gradient);

            return Result;
        }

        private double FindLastPrice(TradeType TypeOfTrade)
        {
            double LastPrice = 0;

            for (int i = 0; i < Positions.Count; i++)
            {
                position = Positions[i];
                if (TypeOfTrade == TradeType.Buy)
                    if (position.TradeType == TypeOfTrade)
                    {
                        if (LastPrice == 0)
                        {
                            LastPrice = position.EntryPrice;
                            continue;
                        }
                        if (position.EntryPrice < LastPrice)
                            LastPrice = position.EntryPrice;
                    }
                if (TypeOfTrade == TradeType.Sell)
                    if (position.TradeType == TypeOfTrade)
                    {
                        if (LastPrice == 0)
                        {
                            LastPrice = position.EntryPrice;
                            continue;
                        }
                        if (position.EntryPrice > LastPrice)
                            LastPrice = position.EntryPrice;
                    }
            }
            return LastPrice;
        }

        private int GetStdIlanSignal()
        {
            int Result = -1;
            int LastBarIndex = MarketSeries.Close.Count - 2;
            int PrevBarIndex = LastBarIndex - 1;

            if (MarketSeries.Close[LastBarIndex] > MarketSeries.Open[LastBarIndex])
                if (MarketSeries.Close[PrevBarIndex] > MarketSeries.Open[PrevBarIndex])
                    Result = 0;
            if (MarketSeries.Close[LastBarIndex] < MarketSeries.Open[LastBarIndex])
                if (MarketSeries.Close[PrevBarIndex] < MarketSeries.Open[PrevBarIndex])
                    Result = 1;
            return Result;
        }
    }
}

CI
ciripa · 5 years ago

@MudiCapital How to contact you? Thank you.

SC
Scalper1 · 5 years ago

have anyone tried this on a live account? then how does the SL work? 

AL
alexe_bg · 5 years ago

Would be nice also to change the min lot from 10k to 1k....

MU
MudiCapital · 5 years ago

i already fixed the the trail stop and start and add magic index to use it for many currencies same time , contact me for more details

MU
MudiCapital · 5 years ago

any can modify this so it can open orders in diferentes currency at the same time by adding magic index or somthin

SE
sentencia72 · 6 years ago

I am trying to compile the code with the current version and it gives two errors.

It's as if it were using another cAlgo library or similar issue.

Could you please help me out?

Thank you!

ET
ethaneus99 · 8 years ago

why does equity drop very quickly at the end of a backtest?

MI
michal.straka0 · 8 years ago

Hi everyone,

 

after optimizing and backtesting the robot works fine but unfortunatelly only in backtesting. In the demo account the robot in EURUSD 1H do not open any positions or even if, than with no stop loss and with an error message

07/04/2016 11:03:30.940 | Robot_Forex, EURUSD, h1 | Request to modify position XXXXXXXXX failed with error "TRADING_BAD_STOPS".

After adding the stop loss manually, the robot continues to work with it and modifies as needed but the robot itself is somehow not able to attach the stop loss by itself.

Currently testing on Pepperstone ECN demo with leverage 1:500 with following settings

First lot 1000 (this has been modified in cAlgo by me)

TP 50

Tral_Start 30

Tral_Stop 30

PipStep 80

MaxOrders 3

 

Anyboty has a tip how to correct the behaviour of missing StopLoss

 

Thanks  in advance

 

RO
Robot forex · 8 years ago

the new versions gives 3 errors

CT
ctid200710 · 9 years ago

Hi  CTDN Team and Members,

Can anyone explain me how to add label to opened positions. So I would know that the position has been opened by Robot_Forex.  

FYI I am not programmer so please explain to me in a simpler way. After which line number the text needs to be add etc. 

Many thanks.

AY
aysos75 · 9 years ago

The statistic of the new version is here :

 

 

AY
aysos75 · 9 years ago

Le projet modifié se trouve sur github, il peut être récupéré directement dans visual studio avec les outils intégrés à vs2013 de gestion de versionning de code sources

The modified project is on github, it can be recovered directly into visual studio with the tools built into source code versioning management in vs2013

AY
aysos75 · 9 years ago

Voici le programme Robot_Forex avec l'ajout d'un stop Loss et la correction des méthodes obsolètes :

using System;
using cAlgo.API;
using cAlgo.API.Internals;

namespace cAlgo.Robots
{
    [Robot("Robot Forex", AccessRights = AccessRights.None)]
    public class Robot_Forex : Robot
    {
        [Parameter(DefaultValue = 10000, MinValue = 1000)]
        public int FirstLot { get; set; }

        [Parameter(DefaultValue = 10000, MinValue = 1000)]
        public int LotStep { get; set; }

        //[Parameter(DefaultValue = 300)]
        //public int PipStep { get; set; }

        [Parameter("Stop_Loss", DefaultValue = 50, MinValue = 0)]
        public int Stop_Loss { get; set; }

        [Parameter("Take_Profit", DefaultValue = 180, MinValue = 10)]
        public int TakeProfit { get; set; }

        [Parameter("Tral_Start", DefaultValue = 50, MinValue = 10)]
        public int Tral_Start { get; set; }

        [Parameter("Tral_Stop", DefaultValue = 50, MinValue = 10)]
        public int Tral_Stop { get; set; }

 


        [Parameter(DefaultValue = 5, MinValue = 2)]
        public int MaxOrders { get; set; }

        private Position position;
        private bool RobotStopped;
        private string botLabel;


        protected override void OnStart()
        {
            botLabel = ToString();

            // The stop loss must be greater than tral stop
            //Stop_Loss = Math.Max(Tral_Stop, Stop_Loss);

            Positions.Opened += OnPositionOpened;
        }

        protected override void OnTick()
        {
            double Bid = Symbol.Bid;
            double Ask = Symbol.Ask;
            double Point = Symbol.TickSize;

            if (Trade.IsExecuting)
                return;

            if (Positions.Count > 0 && RobotStopped)
                return;
            else
                RobotStopped = false;

            if (Positions.Count == 0)
                SendFirstOrder(FirstLot);
            else
                ControlSeries();

            foreach (var position in Positions)
            {
                if (position.SymbolCode == Symbol.Code)
                {

                    if (position.TradeType == TradeType.Buy)
                    {
                        if (Bid - GetAveragePrice(TradeType.Buy) >= Tral_Start * Point)
                            if (Bid - Tral_Stop * Point >= position.StopLoss)
                                ModifyPosition(position, Bid - Tral_Stop * Point, position.TakeProfit);
                    }

                    if (position.TradeType == TradeType.Sell)
                    {
                        if (GetAveragePrice(TradeType.Sell) - Ask >= Tral_Start * Point)
                            if (Ask + Tral_Stop * Point <= position.StopLoss || position.StopLoss == 0)
                                ModifyPosition(position, Ask + Tral_Stop * Point, position.TakeProfit);
                    }
                }
            }
        }

        protected override void OnError(Error CodeOfError)
        {
            if (CodeOfError.Code == ErrorCode.NoMoney)
            {
                RobotStopped = true;
                Print("ERROR!!! No money for order open, robot is stopped!");
            }
            else if (CodeOfError.Code == ErrorCode.BadVolume)
            {
                RobotStopped = true;
                Print("ERROR!!! Bad volume for order open, robot is stopped!");
            }
        }

        private void SendFirstOrder(int OrderVolume)
        {
            int Signal = GetStdIlanSignal();
            if (!(Signal < 0))
                switch (Signal)
                {
                    case 0:
                        ExecuteMarketOrder(TradeType.Buy, Symbol, OrderVolume, botLabel);
                        break;
                    case 1:
                        ExecuteMarketOrder(TradeType.Sell, Symbol, OrderVolume, botLabel);
                        break;
                }
        }

        private void OnPositionOpened(PositionOpenedEventArgs args)
        {
            double? StopLossPrice = null;
            double? TakeProfitPrice = null;

            if (Positions.Count == 1)
            {
                position = args.Position;

                if (position.TradeType == TradeType.Buy)
                    TakeProfitPrice = position.EntryPrice + TakeProfit * Symbol.TickSize;
                if (position.TradeType == TradeType.Sell)
                    TakeProfitPrice = position.EntryPrice - TakeProfit * Symbol.TickSize;
            }
            else
                switch (GetPositionsSide())
                {
                    case 0:
                        TakeProfitPrice = GetAveragePrice(TradeType.Buy) + TakeProfit * Symbol.TickSize;
                        break;
                    case 1:
                        TakeProfitPrice = GetAveragePrice(TradeType.Sell) - TakeProfit * Symbol.TickSize;
                        break;
                }

            for (int i = 0; i < Positions.Count; i++)
            {
                position = Positions[i];
                if (StopLossPrice != null || TakeProfitPrice != null)
                    ModifyPosition(position, position.StopLoss, TakeProfitPrice);
            }
        }

        private double GetAveragePrice(TradeType TypeOfTrade)
        {
            double Result = Symbol.Bid;
            double AveragePrice = 0;
            long Count = 0;

            for (int i = 0; i < Positions.Count; i++)
            {
                position = Positions[i];
                if (position.TradeType == TypeOfTrade)
                {
                    AveragePrice += position.EntryPrice * position.Volume;
                    Count += position.Volume;
                }
            }
            if (AveragePrice > 0 && Count > 0)
                Result = AveragePrice / Count;
            return Result;
        }

        private int GetPositionsSide()
        {
            int Result = -1;
            int i, BuySide = 0, SellSide = 0;

            for (i = 0; i < Positions.Count; i++)
            {
                if (Positions[i].TradeType == TradeType.Buy)
                    BuySide++;
                if (Positions[i].TradeType == TradeType.Sell)
                    SellSide++;
            }
            if (BuySide == Positions.Count)
                Result = 0;
            if (SellSide == Positions.Count)
                Result = 1;
            return Result;
        }

        /// <summary>
        /// The gradient variable is a dynamic value that represente an equidistant grid between
        /// the high value and the low value of price.
        /// </summary>
        /// 
        private void ControlSeries()
        {
            const int BarCount = 25;
            int gradient = MaxOrders - 1;

            foreach (Position position in Positions.FindAll(botLabel, Symbol))
            {
                if (-position.Pips > Stop_Loss)
                    ClosePosition(position);

            }

            //if (PipStep == 0)
            int _pipstep = GetDynamicPipstep(BarCount, gradient);
            //else
            //    _pipstep = PipStep;

            if (Positions.Count < MaxOrders)
            {
                //int rem;
                long NewVolume = Symbol.NormalizeVolume(FirstLot + FirstLot * Positions.Count, RoundingMode.ToNearest);
                int positionSide = GetPositionsSide();

                switch (positionSide)
                {
                    case 0:
                        if (Symbol.Ask < FindLastPrice(TradeType.Buy) - _pipstep * Symbol.TickSize)
                        {
                            //NewVolume = Math.DivRem((int)(FirstLot + FirstLot * Positions.Count), LotStep, out rem) * LotStep;

                            if (NewVolume >= LotStep)
                                ExecuteMarketOrder(TradeType.Buy, Symbol, NewVolume, botLabel);
                        }
                        break;

                    case 1:
                        if (Symbol.Bid > FindLastPrice(TradeType.Sell) + _pipstep * Symbol.TickSize)
                        {
                            //NewVolume = Math.DivRem((int)(FirstLot + FirstLot * Positions.Count), LotStep, out rem) * LotStep;

                            if (NewVolume >= LotStep)
                                ExecuteMarketOrder(TradeType.Sell, Symbol, NewVolume, botLabel);
                        }
                        break;
                }
            }

        }

        private int GetDynamicPipstep(int CountOfBars, int gradient)
        {
            int Result;
            double HighestPrice = 0, LowestPrice = 0;
            int StartBar = MarketSeries.Close.Count - 2 - CountOfBars;
            int EndBar = MarketSeries.Close.Count - 2;

            for (int i = StartBar; i < EndBar; i++)
            {
                if (HighestPrice == 0 && LowestPrice == 0)
                {
                    HighestPrice = MarketSeries.High[i];
                    LowestPrice = MarketSeries.Low[i];
                    continue;
                }
                if (MarketSeries.High[i] > HighestPrice)
                    HighestPrice = MarketSeries.High[i];
                if (MarketSeries.Low[i] < LowestPrice)
                    LowestPrice = MarketSeries.Low[i];
            }

            Result = (int)((HighestPrice - LowestPrice) / Symbol.TickSize / gradient);

            return Result;
        }

        private double FindLastPrice(TradeType TypeOfTrade)
        {
            double LastPrice = 0;

            for (int i = 0; i < Positions.Count; i++)
            {
                position = Positions[i];
                if (TypeOfTrade == TradeType.Buy)
                    if (position.TradeType == TypeOfTrade)
                    {
                        if (LastPrice == 0)
                        {
                            LastPrice = position.EntryPrice;
                            continue;
                        }
                        if (position.EntryPrice < LastPrice)
                            LastPrice = position.EntryPrice;
                    }
                if (TypeOfTrade == TradeType.Sell)
                    if (position.TradeType == TypeOfTrade)
                    {
                        if (LastPrice == 0)
                        {
                            LastPrice = position.EntryPrice;
                            continue;
                        }
                        if (position.EntryPrice > LastPrice)
                            LastPrice = position.EntryPrice;
                    }
            }
            return LastPrice;
        }

        private int GetStdIlanSignal()
        {
            int Result = -1;
            int LastBarIndex = MarketSeries.Close.Count - 2;
            int PrevBarIndex = LastBarIndex - 1;

            if (MarketSeries.Close[LastBarIndex] > MarketSeries.Open[LastBarIndex])
                if (MarketSeries.Close[PrevBarIndex] > MarketSeries.Open[PrevBarIndex])
                    Result = 0;
            if (MarketSeries.Close[LastBarIndex] < MarketSeries.Open[LastBarIndex])
                if (MarketSeries.Close[PrevBarIndex] < MarketSeries.Open[PrevBarIndex])
                    Result = 1;
            return Result;
        }
    }
}

AY
aysos75 · 9 years ago

@Juddly01

The problem is
ExecuteMarketOrder (TradeType.Buy, Symbol, OrderVolume);

replace by

Trade.CreateBuyMarketOrder(Symbol, OrderVolume);

 

JU
Juddly01 · 9 years ago

Hi CTDN Team and Members,

 

Does anyone have five minutes to fix this code?

I've had a go but I'm a beginner and pretty lame.

I cleaned up all the Account.Positions, TickSize and Trade.ModifyPosition warnings.

I replaced the Trade.CreateBuyMarketOrder.

Im stuck on the if (Trade.IsExecuting)

And the 2nd batch of Trade.Create

There must be a bug elsewhere also as the Tral_Start and Tral_Stop Parameters seem to have absolutely no effect.

Any help would be really appreciated and I think you guys could probs fix it in 3mins flat.

Its actually a good Bot even with the bugs and I'm curious to see its results when working as originally designed.

It would be a shame to leave a broken Bot in the library.

Thanks guys,

 

Juddly

TY
tynamite · 10 years ago

This cbot is really fine- it starts with a minimum of 10000 units.

I want to work with smaller amounts and to start with an amout of 1000 units.

Can anybody tell me how to change the cbots definitions ?

Thanks for your support !

 

 

 

RY
ryuji · 10 years ago

I am a beginner. We try in five steps. When the big announcement, I'll try to stop. It is a very good performance, but what if you have five or more away in the opposite direction, without creating a stop-loss, in both dollars and if you began to step in the opposite direction? But is the wrong way. . Is it possible to add a tag? I want to try.

gerardeur's avatar
gerardeur · 11 years ago

Please guys!!!! Tralstart and Tralstop!?

:(

 

:)

gerardeur's avatar
gerardeur · 11 years ago

Hello,

I understand everything about this martingal but tralstart and tralstop. Someone can tell me what this is for?

 

Thank you for your answer.

jeex's avatar
jeex · 11 years ago

This is a hedging robot that opens new trades based upon average values of other open trades.

It works fine on the main pairs in backtesting but it has a flaw: after and during the test you see beautifull results, but there can remain some open trades with ultra high losses, as it doesn't close trades with a stop loss. As soon as you add a stoploss to the trades, the results will probably fall dramatically, because trades are not in balance anymore.

Have not tested this live, but that is what the code teaches me. It has no real strategy than hedging. Quite a risk.

FO
fomega · 11 years ago

sorry mates, i mean this robot...

FO
fomega · 11 years ago

Hi, there is someone that use this indicator in real account?

ER
ergoefarmogi · 11 years ago
Can you add trailing stop and stop loss at robot? Thanks
RA
RaphBok · 11 years ago
Hi, how does this system choose it's entries, and exits? Does it pick the direction for it's entries based on a trailing stop parameter, or moving average, etc? Also, once an order is filled I do not see any changes to the stop loss (it remains at "-") so how are stops triggered (just 5 pips against the trade)? And if the previous trade was a loser then are new trades always opened in the opposite direction, but with 2x the lots of the previous trade (Martingale)?
susantasaren's avatar
susantasaren · 11 years ago
Can you share some more info about this robot? Thanks.
PA
Pablo0 · 11 years ago
I am impressed about results of this robot in backtesting, especially GBPUSD and I want to ask you if you could tell something more about it. What is the purpose of your robot's strategy? Do you use it with live / demo account successfully? I have the impression that it works a bit differently than in backtesting but it may be due to interruptions in his work when I'm not online 24H. Thank you in advance!
IM
imWald · 11 years ago
this is not a trailing stop, this the value for open the next trade if the markt goes in the "wrong" direction (martingale part).
TR
tradermatrix · 11 years ago
can you explain: [Parameter(DefaultValue = 300)] public int PipStep { get; set; }. the trailing stop does not work merci
cAlgo_Fanatic's avatar
cAlgo_Fanatic · 11 years ago
You might want to use labels (see /forum/whats-new/labels-and-a-new-method-to-create-orders) or a List (see /forum/calgo-reference-samples/56) for the positions opened by each robot in order to control only the positions of each robot. GetPositionsSide() loops through all the positions under the account and if one currency has the opposite direction of the other then it returns -1, thus not effectively controlling the direction of each currency and resulting in no action. If you need help with the code please post a question in the Robot (cBot) Development Support section of the forum (/forum/cbot-support).