Close all positions

Created at 08 Sep 2018, 13:30
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!
US

useretinv

Joined 15.04.2016

Close all positions
08 Sep 2018, 13:30


Hello ,

plz help me to close all positions and make cbot start over when max orders is reached

if (Account.Positions.Count = MaxOrders) 

 Close all current positions and start over 

how to add or edit this logic to code below .

 

using System;
using cAlgo.API;
 
namespace cAlgo.Robots
{
    [Robot("Robot Forex", AccessRights = AccessRights.None)]
    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;
        }
    }
}

 


@useretinv
Replies

PanagiotisCharalampous
10 Sep 2018, 10:08

Hi useretinv,

As I proposed in another post, you can post a job or hire a professional consultant.

Best Regards,

Panagiotis


@PanagiotisCharalampous

useretinv
10 Sep 2018, 13:49

Great help !!

cBots API Help

Great Fourm Name !!! 


@useretinv

PanagiotisCharalampous
10 Sep 2018, 15:18

Hi useretinv,


In this forum we are trying to help programmers to use cTrader and cAlgo by addressing questions related to the API and the usage of the platform and by providing suggestions in development questions.

If you wish me to provide a sample on how to do what you have asked and then adjust the code yourself, I am more than happy to do so.

But understanding what a 300 lines cBot does and making the change you request is a task that could take some hours and can be considered custom development service. In this case, you should contact a professional.

Let me know if want me to provide you with a code sample.

Best Regards,
Panagiotis

 


@PanagiotisCharalampous

useretinv
10 Sep 2018, 15:31

RE:

Panagiotis Charalampous said:

Hi useretinv,


In this forum we are trying to help programmers to use cTrader and cAlgo by addressing questions related to the API and the usage of the platform and by providing suggestions in development questions.

If you wish me to provide a sample on how to do what you have asked and then adjust the code yourself, I am more than happy to do so.

But understanding what a 300 lines cBot does and making the change you request is a task that could take some hours and can be considered custom development service. In this case, you should contact a professional.

Let me know if want me to provide you with a code sample.

Best Regards,
Panagiotis

 

 

yes, i just want a sample code to close all position when max positions is reached , i just posted the full code cause i thought that will make it easy to help if you see the full code . that's all 

 Similarly here

https://ctrader.com/forum/cbot-support/13700 

 


@useretinv

PanagiotisCharalampous
10 Sep 2018, 15:40

Hi useretinv,

Here is how you can close all positions when a max has been reached

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

namespace cAlgo.Robots
{
    [Robot(TimeZone = TimeZones.UTC, AccessRights = AccessRights.None)]
    public class NewcBot : Robot
    {
        [Parameter(DefaultValue = 0.0)]
        public int MaxPositions { get; set; }

        protected override void OnStart()
        {
            // Put your initialization logic here
        }

        protected override void OnTick()
        {
            if (Positions.Count > MaxPositions)
                foreach (var position in Positions)
                {
                    ClosePositionAsync(position);
                }            
        }

        protected override void OnStop()
        {
            // Put your deinitialization logic here
        }
    }
}

Best Regards,

Panagiotis


@PanagiotisCharalampous