Topics
Replies
voltharus
03 May 2022, 18:04
RE:
amusleh said:
Hi,
Most probably the value you use for stop loss is too small, try to Print the stop loss value before placing order and see how many Pips were the stop loss.
No, stop loss is not small and it is at the wick of the candle I specified with arrow and if you look at the picture you can see it is not a small stop loss and as I said it is happening at 2:30.
All I want to say is I am unable to understand why this is happening. Stop loss is 8 pips to be exact. In second picture I am calculating stop loss from closed of 2:30 candle and the wick of candle I specified with arrow, so the stop loss become the difference between these two candle.
@voltharus
voltharus
02 May 2022, 19:35
( Updated at: 21 Dec 2023, 09:22 )
RE:
amusleh said:
Hi,
Please post the code, and let us know what exactly is not working.
Thanks for reply
well above problem has been solved with some tweaks but i have another problem see, cBot is not setting specified stoploss at certain time i.e 2:30 ,except this time stoploss is correct for every position.
CODE FOR cBOT
using System;
using System.Linq;
using cAlgo.API;
using cAlgo.API.Indicators;
using cAlgo.API.Internals;
using cAlgo.Indicators;
namespace cAlgo.Robots
{
[Robot(AccessRights = AccessRights.None)]
public class Sample_cBot : Robot
{
public DOWNTRADEI DOWN;
public UPTRADEI UP;
protected override void OnStart()
{
DOWN = Indicators.GetIndicator<DOWNTRADEI>(0.0);
UP = Indicators.GetIndicator<UPTRADEI>(0.0);
}
protected override void OnTick()
{
// Put your core logic here
}
protected override void OnBar()
{
if (DOWN.Result.Last(1) == 1)
{
var st = Math.Abs((DOWN.stoploss.LastValue - Bars.OpenPrices.Last(1)) / Symbol.PipSize);
st = st + 2;
PlaceStopOrder(TradeType.Sell, Symbol, 1000, Bars.OpenPrices.Last(1) - Symbol.PipSize * 0.5, "DOWNTRADE", st, st * 2, Server.Time.AddMinutes(59));
}
if (UP.Result.Last(1) == 2)
{
var st2 = Math.Abs((UP.stoploss.LastValue - Bars.OpenPrices.Last(1)) / Symbol.PipSize);
st2 = st2 + 2;
PlaceStopOrder(TradeType.Buy, Symbol, 1000, Bars.OpenPrices.Last(1) + Symbol.PipSize * 0.5, "UPTRADE", st2, st2 * 2, Server.Time.AddMinutes(59));
}
}
protected override void OnStop()
{
// Put your deinitialization logic here
}
}
}
CODE FOR INDICATOR -
using System;
using cAlgo.API;
using cAlgo.API.Internals;
using cAlgo.API.Indicators;
using cAlgo.Indicators;
namespace cAlgo
{
[Indicator(IsOverlay = false, TimeZone = TimeZones.UTC, AccessRights = AccessRights.None)]
public class UPTRADEI : Indicator
{
[Parameter(DefaultValue = 0.0)]
public double Parameter { get; set; }
[Output("Main")]
public IndicatorDataSeries Result { get; set; }
[Output("ST")]
public IndicatorDataSeries stoploss { get; set; }
private Bars DailyCandle;
protected override void Initialize()
{
// Initialize and create nested indicators
DailyCandle = MarketData.GetBars(TimeFrame.Daily);
}
public override void Calculate(int index)
{
// Set up for Downtrades
var upBar = Bars.ClosePrices[index] > Bars.OpenPrices[index];
var downBar = Bars.ClosePrices[index - 1] < Bars.OpenPrices[index - 1];
// Set up for Uptrades
var downBar1 = Bars.ClosePrices[index] < Bars.OpenPrices[index];
var upBar1 = Bars.ClosePrices[index - 1] > Bars.OpenPrices[index - 1];
int k = 200;
var indexD = DailyCandle.OpenTimes.GetIndexByTime(Bars.OpenTimes[index]);
// CODE FOR TAKING DOWN TRADES
#region CODE FOR TAKING UP TRADES
if (DailyCandle.HighPrices[indexD - 3] < DailyCandle.HighPrices[indexD - 2] && DailyCandle.HighPrices[indexD - 2] < DailyCandle.HighPrices[indexD - 1])
{
if (downBar1 && upBar1)
{
for (int i = 1; i <= k; i++)
{
// condition set
var Last1 = Bars.ClosePrices[index - i - 1] < Bars.OpenPrices[index - i - 1];
var Last2 = Bars.ClosePrices[index - i - 2] < Bars.OpenPrices[index - i - 2];
var con1FT = Bars.ClosePrices[index - 1] > Bars.HighPrices[index - i - 1];
if (Bars.ClosePrices[index - i] < Bars.OpenPrices[index - i])
{
break;
}
if (Bars.ClosePrices[index - i] > Bars.OpenPrices[index - i])
{
if (Last1 && Last2 && con1FT || Bars.OpenPrices[index] > Bars.HighPrices[index - i] && Last1 && Last2)
{
Result[index] = 2;
stoploss[index] = Bars.LowPrices.Minimum(i + 3);
if (Result[index] == 2)
{
Chart.DrawIcon(index.ToString(), ChartIconType.UpArrow, index, Bars.LowPrices[index] - 10 * Symbol.PipSize, "green");
}
break;
}
}
else
Result[index] = 0;
}
}
else
Result[index] = 0;
}
else
{
Result[index] = 0;
stoploss[index] = 0;
}
#endregion
}
}
}
some picture examples
in second picture stoploss is not set at specified price you can see this in position information in picture
@voltharus
voltharus
04 May 2022, 10:46
RE:
amusleh said:
I have tested with both tick data and m1 bars and result is still same and to replicate the issue please try this from 17/02/2021, on the 18 feb you will see stop loss is negative which should not happen and my broker is IC Markets.
CODE FOR DOWNTRADEI -
using System;
using cAlgo.API;
using cAlgo.API.Internals;
using cAlgo.API.Indicators;
using cAlgo.Indicators;
namespace cAlgo
{
[Indicator(IsOverlay = false, TimeZone = TimeZones.UTC, AccessRights = AccessRights.None)]
public class UPTRADEI : Indicator
{
[Parameter(DefaultValue = 0.0)]
public double Parameter { get; set; }
[Output("Main")]
public IndicatorDataSeries Result { get; set; }
[Output("ST")]
public IndicatorDataSeries stoploss { get; set; }
private Bars DailyCandle;
protected override void Initialize()
{
// Initialize and create nested indicators
DailyCandle = MarketData.GetBars(TimeFrame.Daily);
}
public override void Calculate(int index)
{
// Set up for Downtrades
var upBar = Bars.ClosePrices[index] > Bars.OpenPrices[index];
var downBar = Bars.ClosePrices[index - 1] < Bars.OpenPrices[index - 1];
// Set up for Uptrades
var downBar1 = Bars.ClosePrices[index] < Bars.OpenPrices[index];
var upBar1 = Bars.ClosePrices[index - 1] > Bars.OpenPrices[index - 1];
int k = 200;
var indexD = DailyCandle.OpenTimes.GetIndexByTime(Bars.OpenTimes[index]);
// CODE FOR TAKING DOWN TRADES
#region CODE FOR TAKING UP TRADES
if (DailyCandle.HighPrices[indexD - 3] < DailyCandle.HighPrices[indexD - 2] && DailyCandle.HighPrices[indexD - 2] < DailyCandle.HighPrices[indexD - 1])
{
if (downBar1 && upBar1)
{
for (int i = 1; i <= k; i++)
{
// condition set
var Last1 = Bars.ClosePrices[index - i - 1] < Bars.OpenPrices[index - i - 1];
var Last2 = Bars.ClosePrices[index - i - 2] < Bars.OpenPrices[index - i - 2];
var con1FT = Bars.ClosePrices[index - 1] > Bars.HighPrices[index - i - 1];
if (Bars.ClosePrices[index - i] < Bars.OpenPrices[index - i])
{
break;
}
if (Bars.ClosePrices[index - i] > Bars.OpenPrices[index - i])
{
if (Last1 && Last2 && con1FT || Bars.OpenPrices[index] > Bars.HighPrices[index - i] && Last1 && Last2)
{
if (Bars.HighPrices[index - i - 1] < Bars.HighPrices[index - i - 2] && Bars.LowPrices[index - i - 1] < Bars.LowPrices[index - i - 2])
{
if (Bars.HighPrices[index - i - 1] < Bars.HighPrices[index - i] && Bars.LowPrices[index - i - 1] < Bars.LowPrices[index - i])
{
Result[index] = 2;
stoploss[index] = Bars.LowPrices.Minimum(i + 3);
}
}
if (Result[index] == 2)
{
Chart.DrawIcon(index.ToString(), ChartIconType.UpArrow, index, Bars.LowPrices[index] - 10 * Symbol.PipSize, "green");
}
break;
}
}
else
Result[index] = 0;
}
}
else
Result[index] = 0;
}
else
{
Result[index] = 0;
stoploss[index] = 0;
}
#endregion
}
}
}
@voltharus