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

Created at 07 Dec 2013, 17:46
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