label

Created at 18 Apr 2013, 13:21
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!
TR

tradermatrix

Joined 24.07.2012

label
18 Apr 2013, 13:21


boujour
to complete the robot
can you help me to put a label.
this will allow to use multiple strategies and different CURRENCY.
malgres my good will there is always a problem.

thank you very much

cordially

using System;
using System.Linq;
using cAlgo.API;
using cAlgo.API.Indicators;
using cAlgo.API.Requests;
using cAlgo.Indicators;

 


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

        [Parameter("Take_Profit", DefaultValue = 300)]
        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 = 500)]
        public int PipStep { get; set; }

        [Parameter(DefaultValue = 3, MinValue = 2)]
        public int MaxOrders { get; set; }
        
        private Position position;
        private int LotStep=10000;
        private double startingBalance;
        private const double BalancePercent = 0.50;


        protected override void OnStart()
      
        {
        
        startingBalance = Account.Balance;
        
        }

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

        
            if(Trade.IsExecuting) return;
            
            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);
                    
           }}}}}
                  

       
           private void CheckBalance()
           
           { 
           
           if (Account.Equity <= startingBalance * BalancePercent)
           
           {
            
           foreach (var pos in Account.Positions)
           
           {
                Trade.Close(pos);
           }
                     Stop();
           }
           }

           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(= 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;
        }
    }
}

 
   
                                    

 

 


@tradermatrix
Replies

atrader
19 Apr 2013, 11:50

Hi,

Uploaded here: /algos/robots/show/259

Read the comments, you may need more modifications.


@atrader

tradermatrix
19 Apr 2013, 13:28

salut atrader

thank you very much,
I have thought I was crazy.


you are great !!! and generous ..


for that it works in differente currencies (without antagonizing) simply duplicate the robot and change the name;
for example EUR / USD:

[Parameter (DefaultValue = "Forex")]
public string LabelName {get; set;}

for USD / CHEF:

[Parameter (DefaultValue = "Forex2")]
public string LabelName {get; set;}

multiple robots can now work together.

this robot is now quite complete:
protection funds with "chekbalance"
and a "label" ...

 

good trade.

 

 


@tradermatrix