BREAK-EVEN
            
                 10 Aug 2013, 13:24
            
                    
hello,
can you help me to modify my robot?
I would replace Trailling stop by brekeven.
[Parameter (DefaultValue = 40)]
public double Trigger {get; set;}
[Parameter (DefaultValue = 20)]
public double breakeven {get; set;}
cordially
////////////////////////////////////////////////////////////////////////////////////////////////////////
//#reference: ..\Indicators\ZigZag.algo
using System;
using cAlgo.API;
using cAlgo.Indicators;
using cAlgo.API.Requests;
namespace cAlgo.Robots
        {
        
        [Robot]
        public class ZiGZaG : Robot
        
        {
       
        [Parameter(DefaultValue = 12)]
        public int ZzDepth { get; set;}
 
        [Parameter(DefaultValue = 5)]
        public int ZzDeviation { get; set;}
 
        [Parameter(DefaultValue = 3)]
        public int ZzBackStep { get; set;}
 
        [Parameter(DefaultValue = 100000)]
        public int Volume { get; set;}
 
        [Parameter(DefaultValue = 40)]
        public int StopLoss { get; set;}
        
        [Parameter(DefaultValue = 0)]   
        public int TakeProfit { get; set;} 
        [Parameter(DefaultValue = 0)]
        public double Trigger { get; set;}
 
        [Parameter(DefaultValue = 0)]
        public double TrailingStop { get; set;}
 
//////////////////////////////////////////////////////////////        
 
        private Position _position;
        private ZigZag _zigZag;
        private double prevValue;
        private MovingAverageType _matype;
         
/////////////////////////////////////////////////////////////
        protected bool UseTrailingStop
        
        {
        
        get { return Trigger > 0.0 && TrailingStop > 0.0; }
        
        }
        
        protected override void OnTick()
        
        {
             
        if (Trade.IsExecuting || _position == null) return;
 
        if (UseTrailingStop)
               Trail();
            
        }
        
        protected override void OnStart() 
        
        {
        
        _matype = MovingAverageType.Simple;
        _zigZag = Indicators.GetIndicator<ZigZag>(ZzDepth, ZzDeviation, ZzBackStep);
        
        }
        
        protected override void OnBar()
        
        {
        
        if (Trade.IsExecuting)
                return;
 
        bool isLongPositionOpen = _position != null && _position.TradeType == TradeType.Buy;
        bool isShortPositionOpen = _position != null && _position.TradeType == TradeType.Sell;
 
                         double lastValue = _zigZag.Result.LastValue;
 
        if (!double.IsNaN(lastValue))
        
        {
 
        if (lastValue < prevValue && !isLongPositionOpen)
        
        {
                         ClosePosition();
                              Buy();
        }
               
        else if (lastValue > prevValue && prevValue > 0.0 && !isShortPositionOpen)
        
        {
                          ClosePosition();
                              Sell();
        }
        
        prevValue = lastValue; 
        
        }         
        }
  
        private void ClosePosition()
        
        {
        
        if (_position == null) return;
 
        Trade.Close(_position);
        _position = null;
        
        }
 
        private void Buy()
        
        {
        
        Request request = new MarketOrderRequest(TradeType.Buy, Volume)
        
        {
                                 Label = "ZIGZAG",
                                      
        StopLossPips = StopLoss > 0 ? (int?)StopLoss : null,
        TakeProfitPips = TakeProfit > 0 ? (int?)TakeProfit : null
        
        };
        
                                Trade.Send(request);
                                
        }
 
        private void Sell()
        
        {
        
        Request request = new MarketOrderRequest(TradeType.Sell, Volume)
        
        {
                                Label = "ZIGZAG",
               
        StopLossPips = StopLoss > 0 ? (int?)StopLoss : null,
        TakeProfitPips = TakeProfit > 0 ? (int?)TakeProfit : null
        
        };
        
                              Trade.Send(request);
        }
 
        protected override void OnPositionOpened(Position openedPosition)
        
        {
        
                           _position = openedPosition;
            
        }
 
        private void Trail()
        
        {
        foreach (var position in Account.Positions)
        {
        if (position.TradeType == TradeType.Sell)
        {
        double distance = position.EntryPrice - Symbol.Ask;
        if (distance >= Trigger * Symbol.PipSize)
        {
        double newStopLossPrice = Symbol.Ask + TrailingStop * Symbol.PipSize;
        if (position.StopLoss == null || newStopLossPrice < position.StopLoss)
        {
        Trade.ModifyPosition(position, newStopLossPrice, position.TakeProfit);
        }
        }
        }
        else
        {
        double distance = Symbol.Bid - position.EntryPrice;
        if (distance >= Trigger * Symbol.PipSize)
        {
        double newStopLossPrice = Symbol.Bid - TrailingStop * Symbol.PipSize;
        if (position.StopLoss == null || newStopLossPrice > position.StopLoss)
        {
        Trade.ModifyPosition(position, newStopLossPrice, position.TakeProfit);
        }
          }
            }
              }
            }
          }
        }
Replies
                     cAlgo_Fanatic
                     13 Aug 2013, 17:31
                                    
Can you please clarify what the intended logic is:
when the currency reaches trigger: 40
the stop loss moves to the price of entry ...?
it does not position 30 above the entry price ...
You are setting a new stop loss if the trade type is sell:
Trade.ModifyPosition(position, N3, position.TakeProfit);
But if the type is Buy you are setting stop loss to entry price:
Trade.ModifyPosition(position, entryPrice, position.TakeProfit);
 
@cAlgo_Fanatic

tradermatrix
13 Aug 2013, 14:58
hello
I have changed my code. (trail)
it works well.
except for breakeven Buy.
it always changes its position to "0". (entry price)
for example:
stoploss: 40
breakeven 30:
trigger: 40
when the currency reaches trigger: 40
the stop loss moves to the price of entry ...?
it does not position 30 above the entry price ...
But it works with "shell".
( you can see the error more easily by removing "ClosePosition ();
of "protected override void OnBar ()" )
thank you for your help
//#reference: ..\Indicators\ZigZag.algo
using System;
using cAlgo.API;
using cAlgo.Indicators;
using cAlgo.API.Requests;
namespace cAlgo.Robots
{
[Robot]
public class ZiGZaG : Robot
{
[Parameter(DefaultValue = 12)]
public int ZzDepth { get; set;}
[Parameter(DefaultValue = 5)]
public int ZzDeviation { get; set;}
[Parameter(DefaultValue = 3)]
public int ZzBackStep { get; set;}
[Parameter(DefaultValue = 100000)]
public int Volume { get; set;}
[Parameter(DefaultValue = 40)]
public int StopLoss { get; set;}
[Parameter(DefaultValue = 80)]
public int TakeProfit { get; set;}
[Parameter(DefaultValue = 40)]
public double Trigger { get; set;}
[Parameter(DefaultValue = 0)]
public double TrailingStop { get; set;}
[Parameter("Breakeven", DefaultValue = 30)]
public double Breakeven { get; set;}
//////////////////////////////////////////////////////////////
private Position _position;
private ZigZag _zigZag;
private double prevValue;
private MovingAverageType _matype;
/////////////////////////////////////////////////////////////
protected override void OnTick()
{
Trail();
}
protected override void OnStart()
{
_matype = MovingAverageType.Simple;
_zigZag = Indicators.GetIndicator<ZigZag>(ZzDepth, ZzDeviation, ZzBackStep);
}
protected override void OnBar()
{
if (Trade.IsExecuting)
return;
bool isLongPositionOpen = _position != null && _position.TradeType == TradeType.Buy;
bool isShortPositionOpen = _position != null && _position.TradeType == TradeType.Sell;
double lastValue = _zigZag.Result.LastValue;
if (!double.IsNaN(lastValue))
{
if (lastValue < prevValue && !isLongPositionOpen)
{
ClosePosition();
Buy();
}
else if (lastValue > prevValue && prevValue > 0.0 && !isShortPositionOpen)
{
ClosePosition();
Sell();
}
prevValue = lastValue;
}
}
private void ClosePosition()
{
if (_position == null) return;
Trade.Close(_position);
_position = null;
}
private void Buy()
{
Request request = new MarketOrderRequest(TradeType.Buy, Volume)
{
Label = "ZIGZAG",
StopLossPips = StopLoss > 0 ? (int?)StopLoss : null,
TakeProfitPips = TakeProfit > 0 ? (int?)TakeProfit : null
};
Trade.Send(request);
}
private void Sell()
{
Request request = new MarketOrderRequest(TradeType.Sell, Volume)
{
Label = "ZIGZAG",
StopLossPips = StopLoss > 0 ? (int?)StopLoss : null,
TakeProfitPips = TakeProfit > 0 ? (int?)TakeProfit : null
};
Trade.Send(request);
}
private void Trail()
{
foreach (Position _position in base.Account.Positions)
{
{
if (_position.TradeType == TradeType.Sell)
{
if (_position.Pips >= (double)this.Trigger && this.Breakeven > 0)
{
double N2 = _position.EntryPrice - (double)this.Breakeven * base.Symbol.PipSize;
double N3 = N2;
double? stopLoss = _position.StopLoss;
if (N3 < stopLoss.GetValueOrDefault() && stopLoss.HasValue)
{
base.Trade.ModifyPosition(_position, new double?(N3), _position.TakeProfit);
}
}
if (_position.Pips >= (double)this.Trigger && this.Breakeven < 1)
{
double N2 = base.Symbol.Ask + (double)this.TrailingStop * base.Symbol.PipSize;
double N3 = N2;
double? stopLoss = _position.StopLoss;
if (N3 < stopLoss.GetValueOrDefault() && stopLoss.HasValue)
{
base.Trade.ModifyPosition(_position, new double?(N3),_position.TakeProfit);
}
}
}
else
{
if (_position.Pips >= (double)this.Trigger && this.Breakeven > 0)
{
double entryPrice = _position.EntryPrice;
double? stopLoss = _position.StopLoss;
double N2 = entryPrice;
if (stopLoss.GetValueOrDefault() < N2 && stopLoss.HasValue)
{
base.Trade.ModifyPosition(_position, new double?(entryPrice), _position.TakeProfit);
}
}
if (_position.Pips >= (double)this.Trigger && this.Breakeven < 1)
{
double N2 = base.Symbol.Bid - (double)this.TrailingStop * base.Symbol.PipSize;
double? stopLoss = _position.StopLoss;
double N3 = N2;
if (stopLoss.GetValueOrDefault() < N3 && stopLoss.HasValue)
{
base.Trade.ModifyPosition(_position, new double?(N2), _position.TakeProfit);
}
}
}
}
}
}
protected override void OnPositionOpened(Position openedPosition)
{
_position = openedPosition;
}
}
}
@tradermatrix