Keep Stoploss in previous bar
Keep Stoploss in previous bar
06 Jan 2021, 18:16
Hello,
I'm new C# language coding all together, and im stuck with problem as follow
pls refer to picture, when i will Open Sell position 1 as current as Candle 3 with Stoploss above Candle 1. If th
using System;
using System.Linq;
using cAlgo.API;
using cAlgo.API.Indicators;
using cAlgo.API.Internals;
using cAlgo.Indicators;
namespace cAlgo
{
[Robot(TimeZone = TimeZones.UTC, AccessRights = AccessRights.None)]
public class test : Robot
{
[Parameter("Quantity (Lots)", Group = "Volume", DefaultValue = 0.1, MinValue = 0.01, Step = 0.01)]
public double Quantity { get; set; }
protected override void OnStart()
{
}
protected override void OnBar()
{
var SellOrder = Positions.Find("Sell", SymbolName, TradeType.Sell);
var SellOrder2 = Positions.Find("Sell2", SymbolName, TradeType.Sell);
var Open1 = MarketSeries.Open.Last(1);
var Close1 = MarketSeries.Close.Last(1);
var High1 = MarketSeries.High.Last(1);
var Low1 = MarketSeries.Low.Last(1);
var Open2 = MarketSeries.Open.Last(2);
var Close2 = MarketSeries.Close.Last(2);
var High2 = MarketSeries.High.Last(2);
var Low2 = MarketSeries.Low.Last(2);
var SL = (High1 - Close1) * 10000;
if (SellOrder == null)
{
if (Close1 < Close2)
{
ExecuteMarketOrder(TradeType.Buy, SymbolName, VolumeInUnits, "Sell", SL, 20);
}
}
if (SellOrder != null)
{
if (SellOrder.TradeType == TradeType.Sell)
{
if (SellOrder.Pips <= -20 && SellOrder2 == null)
{
ExecuteMarketOrder(TradeType.Sell, SymbolName, VolumeInUnits, "Sell2", SL, 20);
}
}
}
}
private long VolumeInUnits
{
get { return Symbol.QuantityToVolume(Quantity); }
}
}
}
e price go up 20pip, i will open Sell Position 2, and i want to put Stoploss with same position 1 (candle 3). The candle 4 and 5 is appeared, then the open sell position 2, but the Stoploss get the value of candle 4 not candle 1 (same with position 1). it is wrong. because it get the previous bar. and wrong. Could you pls help me to solve this error?
Replies
nguyendan81985
08 Jan 2021, 03:09
RE:
PanagiotisCharalampous said:
Hi nguyendan81985,
If you want to use the previous position's SL, try the following
if (SellOrder != null) { if (SellOrder.TradeType == TradeType.Sell) { if (SellOrder.Pips <= -20 && SellOrder2 == null) { var position = ExecuteMarketOrder(TradeType.Sell, SymbolName, VolumeInUnits, "Sell2", SL, 20).Position; position.ModifyStopLossPrice(SellOrder.StopLoss); } } }
Best Regards,
Panagiotis
Dear Mr.Panagiotis
thanks for your feedback.
now i have problem with below coding. when selloder.pips <-20pip, the sell position 2 will be opened, but it only open when the bar is closed. How can it open position 2 when selloder.pips <-20, no need to waiting bar closed?
if (SellOrder != null)
{
if (SellOrder.TradeType == TradeType.Sell)
{
if (SellOrder.Pips <= -20 && SellOrder2 == null)
{
var position = ExecuteMarketOrder(TradeType.Sell, SymbolName, VolumeInUnits, "Sell2", SL, 20).Position;
position.ModifyStopLossPrice(SellOrder.StopLoss);
}
}
}
@nguyendan81985
PanagiotisCharalampous
08 Jan 2021, 08:30
Hi nguyendan81985,
You should put your code in OnTick() method rather than in OnBar().
Best Regards,
Panagiotis
@PanagiotisCharalampous
nguyendan81985
08 Jan 2021, 11:01
RE:
PanagiotisCharalampous said:
Hi nguyendan81985,
You should put your code in OnTick() method rather than in OnBar().
Best Regards,
Panagiotis
Hi Panagiotis,
i put code in Ontick, but there are many position 2 which is opened when sellorder.pip <=20. i need only ONE position 2 is opened.
Best Regards,
Panagiotis
@nguyendan81985
... Deleted by UFO ...
... Deleted by UFO ...
... Deleted by UFO ...
PanagiotisCharalampous
08 Jan 2021, 11:28
Hi nguyendan81985,
Then you have done something wrong but I do not know what it is without the source code.
Best Regards,
Panagiotis
@PanagiotisCharalampous
nguyendan81985
09 Jan 2021, 02:51
RE:
PanagiotisCharalampous said:
Hi nguyendan81985,
Then you have done something wrong but I do not know what it is without the source code.
Best Regards,
Panagiotis
Dear Mr. Panagiotis,
thanks for you advise, my code is working for open position 2 and position 3 also. however, i want to close all position if the position 3.pips is > 30 pip. my source code as below and there is some wrong: only position 3 is closed if position.pip>30pip. could u pls advise me?
using System;
using System.Linq;
using cAlgo.API;
using cAlgo.API.Indicators;
using cAlgo.API.Internals;
using cAlgo.Indicators;
namespace cAlgo
{
[Robot(TimeZone = TimeZones.UTC, AccessRights = AccessRights.None)]
public class test : Robot
{
[Parameter("Quantity (Lots)", Group = "Volume", DefaultValue = 0.1, MinValue = 0.01, Step = 0.01)]
public double Quantity { get; set; }
[Parameter("Slow Periods", DefaultValue = 21)]
public int SlowPeriods { get; set; }
[Parameter("Source")]
public DataSeries SourceSeries { get; set; }
private ExponentialMovingAverage slowMa;
protected override void OnStart()
{
slowMa = Indicators.ExponentialMovingAverage(SourceSeries, 21);
}
protected override void OnTick()
{
var SellOrder = Positions.Find("Sell", SymbolName, TradeType.Sell);
var SellOrder2 = Positions.Find("Sell2", SymbolName, TradeType.Sell);
var SellOrder3 = Positions.Find("Sell3", SymbolName, TradeType.Sell);
if (SellOrder != null)
{
if (SellOrder.TradeType == TradeType.Sell)
{
if (SellOrder.Pips <= -20 && SellOrder2 == null)
{
ExecuteMarketOrder(TradeType.Sell, SymbolName, VolumeInUnits, "Sell2", null, null);
}
if (SellOrder.Pips <= -40 && SellOrder3 == null)
{
ExecuteMarketOrder(TradeType.Sell, SymbolName, VolumeInUnits, "Sell3", null, null);
}
}
}
if (SellOrder != null && SellOrder2 != null && SellOrder3 == null)
{
foreach (var position in Positions)
{
if (position.Pips > 20)
{
ClosePosition(position);
}
}
}
else if (SellOrder3 != null)
{
foreach (var position in Positions)
{
if (position.Pips > 30)
{
ClosePosition(position);
}
}
}
}
protected override void OnBar()
{
var SellOrder = Positions.Find("Sell", SymbolName, TradeType.Sell);
var SellOrder2 = Positions.Find("Sell2", SymbolName, TradeType.Sell);
var SellOrder3 = Positions.Find("Sell3", SymbolName, TradeType.Sell);
var Open1 = MarketSeries.Open.Last(1);
var Close1 = MarketSeries.Close.Last(1);
var High1 = MarketSeries.High.Last(1);
var Low1 = MarketSeries.Low.Last(1);
var Open2 = MarketSeries.Open.Last(2);
var Close2 = MarketSeries.Close.Last(2);
var High2 = MarketSeries.High.Last(2);
var Low2 = MarketSeries.Low.Last(2);
var Close3 = Bars.ClosePrices.Last(3);
var Open3 = Bars.OpenPrices.Last(3);
var High3 = Bars.HighPrices.Last(3);
var Low3 = MarketSeries.Low.Last(3);
double sma21_1 = slowMa.Result.LastValue;
double sma21_2 = slowMa.Result.Last(2);
double sma21_3 = slowMa.Result.Last(3);
if (SellOrder == null)
{
if (Close3 > sma21_3 && Close2 > sma21_2 && Close1 < sma21_1)
{
ExecuteMarketOrder(TradeType.Sell, SymbolName, VolumeInUnits, "Sell", null, null);
}
}
}
private long VolumeInUnits
{
get { return Symbol.QuantityToVolume(Quantity); }
}
}
}
@nguyendan81985
PanagiotisCharalampous
11 Jan 2021, 08:57
Hi ,
Try changing
else if (SellOrder3 != null)
{
foreach (var position in Positions)
{
if (position.Pips > 30)
{
ClosePosition(position);
}
}
}
to
if (SellOrder3 != null && SellOrder3.Pips > 30)
{
foreach (var position in Positions)
{
ClosePosition(position);
}
}
Best Regards,
Panagiotis
@PanagiotisCharalampous
nguyendan81985
11 Jan 2021, 15:55
RE:
Dear Mr. Panagiotis,
Thanks for your help. it is worked for me.
@nguyendan81985
PanagiotisCharalampous
07 Jan 2021, 09:31
Hi nguyendan81985,
If you want to use the previous position's SL, try the following
Best Regards,
Panagiotis
Join us on Telegram
@PanagiotisCharalampous