Build Succeeded but Backtesting not Running
Created at 16 Nov 2020, 07:13
CH
Build Succeeded but Backtesting not Running
16 Nov 2020, 07:13
Hi cBots enthusiasts
This is my first attempt at coding. I modified the trend sample to include exits at loss and profit.
The build is succeeded but I cannot seem to run backtesting.
Any help is most appreciated.
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 MyFirstcBot : Robot
{
#region User Defined Parameters
// List all parameters required for this cBots.
[Parameter("cBots Name", Group = "Trades")]
public string cBotsName { get; set; }
[Parameter("Quantity (Lots)", Group = "Trades", DefaultValue = 0.3, MinValue = 0.01, Step = 0.3)]
public double Quantity { get; set; }
[Parameter("Set Hours", Group = "Trading Hours", DefaultValue = false)]
public bool IsTradingSession { get; set; }
[Parameter("Start Time", Group = "Trading Hours", DefaultValue = 10, Step = 1)]
public double StartTime { get; set; }
[Parameter("Stop Time", Group = "Trading Hours", DefaultValue = 23, Step = 1)]
public double StopTime { get; set; }
[Parameter("Avoid Trading News", Group = "Trading Hours", DefaultValue = false)]
public bool IsNewsTradingSession { get; set; }
[Parameter("Alert New Trade", Group = "Notifications", DefaultValue = false)]
public bool IsSendEmail { get; set; }
[Parameter("Email Address", Group = "Notifications", DefaultValue = "your@email.com")]
public string EmailAddress { get; set; }
[Parameter("Set Time Frame", Group = "Time Frame", DefaultValue = false)]
public bool IsTimeFrame { get; set; }
[Parameter("Time Frame 1", Group = "Time Frame")]
public TimeFrame EntryTimeFrame { get; set; }
[Parameter("Time Frame 2", Group = "Time Frame")]
public TimeFrame ExitTimeFrame { get; set; }
[Parameter("MA Type", Group = "Moving Average")]
public MovingAverageType MAType { get; set; }
[Parameter("MA Source", Group = "Moving Average")]
public DataSeries MASourceSeries { get; set; }
[Parameter("Fast", Group = "Moving Average", DefaultValue = 5)]
public int FastPeriods { get; set; }
[Parameter("Med", Group = "Moving Average", DefaultValue = 26)]
public int MedPeriods { get; set; }
[Parameter("Slow", Group = "Moving Average", DefaultValue = 60)]
public int SlowPeriods { get; set; }
[Parameter("RSI Source", Group = "RSI")]
public DataSeries RSISourceSeries { get; set; }
[Parameter("RSI Periods", Group = "RSI", DefaultValue = 14)]
public int RSIPeriods { get; set; }
#endregion User Defined Parameters
#region User Defined Indicators
// List all indicators required for this cBots.
private MovingAverage fastMa;
private MovingAverage medMa;
private MovingAverage slowMa;
private RelativeStrengthIndex rsi;
public TimeFrame entryTf;
public TimeFrame exitTf;
public DateTime startHr;
public DateTime endHr;
#endregion User Defined Indicators
#region OnStart
// This method is called when the robot first starts, it is only called once.
// Put your initialization logic here - construct all the indicators.
protected override void OnStart()
{
{
// Only trade between UTC+11, 09:00 current day and 05:00 the following day
startHr = Server.Time.Date.AddHours(StartTime);
endHr = Server.Time.Date.AddHours(StopTime);
// TO COMPLETE - NO ENTRY 10 minutes before and after major news
// Indicators used for entry and exit positions
fastMa = Indicators.MovingAverage(MASourceSeries, FastPeriods, MAType);
medMa = Indicators.MovingAverage(MASourceSeries, MedPeriods, MAType);
slowMa = Indicators.MovingAverage(MASourceSeries, SlowPeriods, MAType);
rsi = Indicators.RelativeStrengthIndex(RSISourceSeries, RSIPeriods);
// Time Frame used for entry and exit positions
entryTf = TimeFrame.Hour;
exitTf = TimeFrame.Minute;
}
}
#endregion OnStart
#region OnTick
// This method is called every time the price changes for the symbol.
// Put your core logic here.
protected override void OnTick()
{
var longPosition = Positions.Find(cBotsName, SymbolName, TradeType.Buy);
var shortPosition = Positions.Find(cBotsName, SymbolName, TradeType.Sell);
var currentSlowMa = slowMa.Result.Last(0);
var currentMedMa = medMa.Result.Last(0);
var currentFastMa = fastMa.Result.Last(0);
var previousSlowMa = slowMa.Result.Last(1);
var previousMedMa = medMa.Result.Last(1);
var previousFastMa = fastMa.Result.Last(1);
var _rsi = rsi.Result.Last(0);
var currentPrice = Bars.ClosePrices.Last(0);
var entryPrice = LastResult.Position.EntryPrice;
if (longPosition == null && previousFastMa < currentSlowMa && currentFastMa > currentSlowMa && currentPrice > currentFastMa && currentFastMa > currentMedMa && currentMedMa > currentSlowMa && _rsi > 52)
{
// Close long at profit
if (previousFastMa > currentMedMa && currentFastMa < currentMedMa && ((1.5 * currentPrice) > entryPrice) && _rsi < 50)
{
ClosePosition(longPosition);
}
// Close long at Loss
else if (previousFastMa > currentMedMa && currentFastMa < currentMedMa && ((1.5 * currentPrice) < entryPrice) && _rsi < 50)
{
ClosePosition(longPosition);
}
ExecuteMarketOrder(TradeType.Buy, SymbolName, VolumeInUnits, cBotsName);
}
else if (shortPosition == null && previousFastMa > currentSlowMa && currentFastMa < currentSlowMa && currentPrice < currentFastMa && currentFastMa < currentMedMa && currentMedMa < currentSlowMa && _rsi < 48)
{
// Close short at profit
if (previousFastMa > currentMedMa && currentFastMa < currentMedMa && ((1.5 * currentPrice) > entryPrice) && _rsi < 50)
{
ClosePosition(shortPosition);
}
// Close short at Loss
else if (previousFastMa > currentMedMa && currentFastMa < currentMedMa && ((1.5 * currentPrice) < entryPrice) && _rsi < 50)
{
ClosePosition(shortPosition);
}
ExecuteMarketOrder(TradeType.Sell, SymbolName, VolumeInUnits, cBotsName);
}
}
#endregion OnTick
private double VolumeInUnits
{
get { return Symbol.QuantityToVolumeInUnits(Quantity); }
}
}
}
PanagiotisCharalampous
16 Nov 2020, 11:30 ( Updated at: 21 Dec 2023, 09:22 )
Hi CharlieBrown,
Did you debug your cBot? I get an exception as soon as I run it
Best Regards,
Panagiotis
Join us on Telegram
@PanagiotisCharalampous