Optimization would not work , backtesting is working
26 Feb 2018, 11:01
using System;
using System.Linq;
using cAlgo.API;
using cAlgo.API.Indicators;
using cAlgo.API.Internals;
using cAlgo.Indicators;
namespace cAlgo
{
[Robot(TimeZone = TimeZones.RussianStandardTime, AccessRights = AccessRights.FullAccess)]
public class Donci3Av7 : Robot
{
#region Parameters
[Parameter("Instance Name", DefaultValue = "Blue")]
public string InstanceName { get; set; }
[Parameter()]
public DataSeries Source { get; set; }
[Parameter("Time Frame 2", DefaultValue = "Daily")]
public TimeFrame TimeFrame2 { get; set; }
[Parameter("Time Frame 3", DefaultValue = "Hour12")]
public TimeFrame TimeFrame3 { get; set; }
[Parameter("SL ATR multiple", DefaultValue = 2.2)]
public double ATRfactor { get; set; }
[Parameter("Hi Periods", DefaultValue = 20, MinValue =15, MaxValue =40, Step =1)]
public int HiPer { get; set; }
[Parameter("Low Periods", DefaultValue = 10, MinValue = 5, MaxValue =30, Step =1)]
public int LowPer { get; set; }
[Parameter("Quantity (Lots)", DefaultValue = 0.1, MinValue = 0.01, Step = 0.01)]
public double Quantity { get; set; }
[Parameter("Include Trading Hours", DefaultValue = false)]
public bool IncludeTradinHours { get; set; }
[Parameter("Start Hour", DefaultValue = 0.0, MinValue = 0.0, MaxValue = 24.0, Step = 0.5)]
public double StartTime { get; set; }
[Parameter("Stop Hour", DefaultValue = 24.0, MinValue = 0.0, MaxValue = 24.0, Step = 0.5)]
public double StopTime { get; set; }
[Parameter("Include Break-Even", DefaultValue = true)]
public bool IncludeBreakEven { get; set; }
[Parameter("Break-Even Trigger (SL)", DefaultValue = 1, MinValue = 0.4, MaxValue = 4.0)]
public double Trigger { get; set; }
[Parameter("Break-Even Extra (pips)", DefaultValue = 1.0, MinValue = 0.0)]
public double ExtraPips { get; set; }
[Parameter("Include Trailing Stop", DefaultValue = true)]
public bool IncludeTrailingStop { get; set; }
[Parameter("Trailing Stop Trigger (SL)", DefaultValue = 1.5, MinValue = 0.3, Step = 0.1)]
public double TrailingStopTrigger { get; set; }
[Parameter("Trailing Stop Step (SL)", DefaultValue = 1.2, MinValue = 0.1, Step = 0.1)]
public double TrailingStopStep { get; set; }
[Parameter("Max Spread (Pips)", DefaultValue = 2.0, MaxValue = 50.0, Step = 0.1)]
public double MaxSpread { get; set; }
private DateTime _startTime;
private DateTime _stopTime;
private double ma_Distance;
private MarketSeries series2;
private MarketSeries series3;
private MovingAverage MA2;
private MovingAverage MA3;
private MovingAverage MA;
private string _Blue;
public double SL;
private double _ATR;
private DonchianChannel DCH;
private DonchianChannel DCL;
private AverageTrueRange ATR;
private TradeType _tradetype;
private bool BuyTradeOK;
private bool SellTradeOK;
#endregion
#region OnStart
protected override void OnStart()
{
// Start Time is the same day at 22:00:00 Server Time
_startTime = Server.Time.Date.AddHours(StartTime);
// Stop Time is the next day at 06:00:00
_stopTime = Server.Time.Date.AddHours(StopTime);
Print("Start Time {0},", _startTime);
Print("Stop Time {0},", _stopTime);
ma_Distance = 0.2;
ma_Distance = ma_Distance * Symbol.PipSize;
series2 = MarketData.GetSeries(TimeFrame2);
series3 = MarketData.GetSeries(TimeFrame3);
MA = Indicators.MovingAverage(Source, HiPer, MovingAverageType.Exponential);
MA2 = Indicators.MovingAverage(series2.Close, HiPer, MovingAverageType.Exponential);
MA3 = Indicators.MovingAverage(series3.Close, HiPer, MovingAverageType.Exponential);
_Blue = "Donci 3Av7 " + "Blue" + " " + Symbol.Code;
InstanceName = _Blue;
ATR = Indicators.AverageTrueRange(LowPer, MovingAverageType.Exponential);
SL = ATR.Result.LastValue * ATRfactor / Symbol.PipSize;
DCH = Indicators.DonchianChannel(HiPer);
DCL = Indicators.DonchianChannel(LowPer);
_ATR = ATR.Result.LastValue;
}
#endregion
#region OnTick
protected override void OnTick()
{
if (IncludeTradinHours)
{
var currentHours = Server.Time.TimeOfDay.TotalHours;
bool tradeTime = StartTime < StopTime ? currentHours > StartTime && currentHours < StopTime : currentHours < StopTime || currentHours > StartTime;
if (!tradeTime)
return;
}
var position = Positions.Find(InstanceName, Symbol);
if (position == null)
{
if (MA2.Result.LastValue < Symbol.Bid - ma_Distance && MA3.Result.LastValue < Symbol.Bid - ma_Distance && MA2.Result.IsRising() && MA3.Result.IsRising() && Symbol.Spread <= MaxSpread)
{
BuyTradeOK = true;
SellTradeOK = false;
}
if (MA2.Result.LastValue > Symbol.Ask + ma_Distance && MA3.Result.LastValue > Symbol.Ask + ma_Distance && MA2.Result.IsFalling() && MA3.Result.IsFalling() && Symbol.Spread <= MaxSpread)
{
BuyTradeOK = false;
SellTradeOK = true;
}
if ((DCH.Top.LastValue < Symbol.Bid && BuyTradeOK) || (DCH.Bottom.LastValue > Symbol.Bid && SellTradeOK))
{
_tradetype = BuyTradeOK ? TradeType.Buy : TradeType.Sell;
Open(_tradetype);
}
}
else if (position != null)
{
if ((position.TradeType == TradeType.Buy && DCL.Bottom.LastValue > Symbol.Bid) || (position.TradeType == TradeType.Sell && DCL.Top.LastValue < Symbol.Bid))
{
ClosePosition(position);
}
}
if (IncludeBreakEven == true)
GoToBreakEven();
if (IncludeTrailingStop == true)
SetTrailingStop();
}
#endregion
#region Open trade
void Open(TradeType tradeType)
{
var volumeInUnits = Symbol.QuantityToVolume(Quantity);
SL = ATR.Result.LastValue * ATRfactor / Symbol.PipSize;
ExecuteMarketOrder(tradeType, Symbol, volumeInUnits, InstanceName, SL, null);
}
#endregion
#region Break Even
void GoToBreakEven()
{
var position = Positions.Find(InstanceName, Symbol);
if (position != null)
{
var entryPrice = position.EntryPrice;
var distance = 0.0;
var adjEntryPrice = 0.0;
if (position.TradeType == TradeType.Buy)
{
adjEntryPrice = entryPrice + ExtraPips * Symbol.PipSize;
distance = Symbol.Bid - entryPrice;
}
else
{
adjEntryPrice = entryPrice - ExtraPips * Symbol.PipSize;
distance = entryPrice - Symbol.Ask;
}
if (distance >= Trigger * SL * Symbol.PipSize)
{
if (position.TradeType == TradeType.Sell && position.StopLoss > adjEntryPrice)
ModifyPosition(position, adjEntryPrice, null);
if (position.TradeType == TradeType.Buy && position.StopLoss < adjEntryPrice)
ModifyPosition(position, adjEntryPrice, null);
}
}
}
#endregion
#region Trailing Stop
private void SetTrailingStop()
{
var sellPositions = Positions.FindAll(InstanceName, Symbol, TradeType.Sell);
foreach (Position position in sellPositions)
{
double distance = position.EntryPrice - Symbol.Ask;
if (distance < TrailingStopTrigger * SL * Symbol.PipSize)
continue;
double newStopLossPrice = Symbol.Ask + TrailingStopStep * SL * Symbol.PipSize;
if (position.StopLoss == null || newStopLossPrice < position.StopLoss)
{
ModifyPosition(position, newStopLossPrice, position.TakeProfit);
}
}
var buyPositions = Positions.FindAll(InstanceName, Symbol, TradeType.Buy);
foreach (Position position in buyPositions)
{
double distance = Symbol.Bid - position.EntryPrice;
if (distance < TrailingStopTrigger * SL * Symbol.PipSize)
continue;
double newStopLossPrice = Symbol.Bid - TrailingStopStep * SL * Symbol.PipSize;
if (position.StopLoss == null || newStopLossPrice > position.StopLoss)
{
ModifyPosition(position, newStopLossPrice, position.TakeProfit);
}
}
}
#endregion
}
}
I will try to add the screens
Replies
alexander.n.fedorov
26 Feb 2018, 11:58
Backtesting
The funny thing is that I did not change anything on both computers, and all of a sudden optimization is woking OK now.
What could it possibly be?
@alexander.n.fedorov
PanagiotisCharalampous
26 Feb 2018, 12:21
Hi Alexander,
It is not clear what was the problem. What do you mean that optimization was not working?
Best Regards,
Panagiotis
@PanagiotisCharalampous
alexander.n.fedorov
26 Feb 2018, 12:50
Hi, Panagiotis,
it starts, and after few seconds it stops with remaining time 0 seconds
I tryied to drop the *.png screenshot files, or *.jpg, but also could not do much, as it was taking the whole screen. How do I upload a jpg file?
@alexander.n.fedorov
alexander.n.fedorov
26 Feb 2018, 12:52
Backtesting
If you could send me your skype or e-mail,
I could send you the screenshots
just in case my skype is alexander.n.fedorov
and mail is alexander.n.fedorov@gmail.com
@alexander.n.fedorov
PanagiotisCharalampous
26 Feb 2018, 12:53
( Updated at: 19 Mar 2025, 08:57 )
Hi Alexander,
There is an image button when you are creating the post, use that. Else send the screenshots to support@ctrader.com. Also sending the cBot would be helpful so that we can reproduce the problem.
Best Regards,
Panagiotis
@PanagiotisCharalampous
alexander.n.fedorov
26 Feb 2018, 12:55
Backtesting
the Bot code is up the screen
I will try the image button again
@alexander.n.fedorov
alexander.n.fedorov
26 Feb 2018, 13:16
Backtesting
Panagiotis,
I tryied to do it on two differen computers. On both it did not work
Now it is working on both.
Out of that I think it was something with a server connection.
Alexander
@alexander.n.fedorov




alexander.n.fedorov
26 Feb 2018, 11:11
How do you add the screenshots?
I did not figure out how to post the screens.
@alexander.n.fedorov