How to make the robot work in more than one currency pair at the same time

Created at 07 Dec 2013, 17:46
How’s your experience with the cTrader Platform?
Your feedback is crucial to cTrader's development. Please take a few seconds to share your opinion and help us improve your trading experience. Thanks!
VE

Veloktrio

Joined 07.12.2013

How to make the robot work in more than one currency pair at the same time
07 Dec 2013, 17:46


Hello! I have this robot but I don't know how to make it work in more than one currency pair at the same time. I don't understand anything in coding and robot development. Please help!!!

 

 

 

 

using System;

using cAlgo.API;

 

namespace cAlgo.Robots

{

    [Robot("Robot Forex")]

    public class RobotForex : Robot

    {

        [Parameter(DefaultValue = 10000, MinValue = 10000)]

        public int FirstLot { get; set; }

 

        [Parameter("Take_Profit", DefaultValue = 180, MinValue = 10)]

        public int TakeProfit { get; set; }

         

        [Parameter("Tral_Start", DefaultValue = 50)]

        public int Tral_Start { get; set; }

         

        [Parameter("Tral_Stop", DefaultValue = 50)]

        public int Tral_Stop { get; set; }

 

        [Parameter(DefaultValue = 300)]

        public int PipStep { get; set; }

 

        [Parameter(DefaultValue = 5, MinValue = 2)]

        public int MaxOrders { get; set; }

         

        private Position position;

        private bool RobotStopped;

        private int LotStep=10000;

         

        protected override void OnStart()

        {

             

        }

 

        protected override void OnTick()

        {

        double Bid=Symbol.Bid;

        double Ask=Symbol.Ask;

        double Point=Symbol.PointSize;     

         

            if(Trade.IsExecuting) return;

            if(Account.Positions.Count > 0 && RobotStopped) return;

            else RobotStopped = false;

 

            if(Account.Positions.Count == 0)

                SendFirstOrder(FirstLot);

            else

                ControlSeries();

                 

           foreach (var position in Account.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)

                    Trade.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)

                    Trade.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:

                        Trade.CreateBuyMarketOrder(Symbol, OrderVolume);

                    break;

                    case 1:

                        Trade.CreateSellMarketOrder(Symbol, OrderVolume);

                    break;

                }

        }

         

        protected override void OnPositionOpened(Position openedPosition)

        {

            double? StopLossPrice = null;

            double? TakeProfitPrice = null;

             

            if(Account.Positions.Count == 1)

            {

                position = openedPosition;

                if( position.TradeType == TradeType.Buy)

                    TakeProfitPrice = position.EntryPrice + TakeProfit * Symbol.PointSize;

                if( position.TradeType == TradeType.Sell)

                    TakeProfitPrice = position.EntryPrice - TakeProfit * Symbol.PointSize;

            }

            else

                switch(GetPositionsSide())

                {

                    case 0:

                        TakeProfitPrice = GetAveragePrice(TradeType.Buy) + TakeProfit * Symbol.PointSize;

                    break;

                    case 1:

                        TakeProfitPrice = GetAveragePrice(TradeType.Sell) - TakeProfit * Symbol.PointSize;

                    break;

                }

 

            for(int i = 0; i < Account.Positions.Count; i++)

            {

                position = Account.Positions[i];

                if(StopLossPrice != null || TakeProfitPrice != null)

                    Trade.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 < Account.Positions.Count; i++)

            {

                position = Account.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 < Account.Positions.Count; i++)

            {

                if(Account.Positions[i].TradeType == TradeType.Buy) BuySide++;

                if(Account.Positions[i].TradeType == TradeType.Sell) SellSide++;

            }

            if(BuySide == Account.Positions.Count) Result = 0;

            if(SellSide == Account.Positions.Count) Result = 1;

            return Result;

        }

         

        private void ControlSeries()

        {

            int _pipstep, NewVolume, Rem;

            int BarCount = 25;

            int Del = MaxOrders - 1;

             

            if(PipStep == 0)

                _pipstep = GetDynamicPipstep(BarCount, Del);

            else

                _pipstep = PipStep;

             

            if(Account.Positions.Count < MaxOrders)

                switch(GetPositionsSide())

                {

                    case 0:

                        if(Symbol.Ask < FindLastPrice(TradeType.Buy) - _pipstep * Symbol.PointSize)

                        {

                            NewVolume = Math.DivRem((int)(FirstLot + FirstLot*Account.Positions.Count), LotStep, out Rem) * LotStep;

                            if(!(NewVolume < LotStep))

                                Trade.CreateBuyMarketOrder(Symbol, NewVolume);

                        }

                    break;

                    case 1:

                        if(Symbol.Bid > FindLastPrice(TradeType.Sell) + _pipstep * Symbol.PointSize)

                        {

                            NewVolume = Math.DivRem((int)(FirstLot + FirstLot*Account.Positions.Count), LotStep, out Rem) * LotStep;

                            if(!(NewVolume < LotStep))

                                Trade.CreateSellMarketOrder(Symbol, NewVolume);

                        }

                    break;

                }

        }

         

        private int GetDynamicPipstep(int CountOfBars, int Del)

        {

            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.PointSize / Del);

            return Result;

        }

         

        private double FindLastPrice(TradeType TypeOfTrade)

        {

            double LastPrice = 0;

 

            for(int i = 0; i < Account.Positions.Count; i++)

            {

                position = Account.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;

        }

    }

}


@Veloktrio
Replies

Cerunnos
07 Dec 2013, 18:20

The easiest way is using multiple robots with different currencies (different instances of your robot).
But you should better learn C # and cAlgo API. Then you can easily use in your code multi symbols:

var eurJpySeries = MarketData.GetSeries("EURJPY", TimeFrame);
var eurUsdSeries = MarketData.GetSeries("EURUSD", TimeFrame);


@Cerunnos

atrader
10 Dec 2013, 15:19

Hi,

Hope this helps: /algos/robots/show/391


@atrader

Forex19
26 Jan 2014, 00:20

RE:

atrader said:

Hi,

Hope this helps: /algos/robots/show/391

Hi,

thanks for signaling, I had missed this.

I wanted to ask. if you could change the code so as to do manage mutiple instanced, so you can set different parameter values ​​for the different currency pairs.


@Forex19