ma crossover help
ma crossover help
14 Jan 2019, 14:41
Guys i have a sma crossover cbot working...the problem is i want the bot to add 1k units if the gross profit from previous close is < 0 (more like a form of martingale). tnx
Replies
missyeam
14 Jan 2019, 15:14
so this is my ma cross over cbot code...i now want to add 1k units everytime the gross profit from previous close is < 0
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 ClickAlgoSchoolSMA : Robot
{
#region User defined parameters
[Parameter("Instance Name", DefaultValue = "001")]
public string InstanceName { get; set; }
[Parameter("Lot Size", DefaultValue = 0.1)]
public double LotSize { get; set; }
[Parameter("Source SMA #1")]
public DataSeries SourceSma1 { get; set; }
[Parameter("Source SMA #2")]
public DataSeries SourceSma2 { get; set; }
[Parameter("Period SMA #1", DefaultValue = 5, MinValue = 1, MaxValue = 100)]
public int PeriodsSma1 { get; set; }
[Parameter("Period SMA #2", DefaultValue = 20, MinValue = 1, MaxValue = 100)]
public int PeriodsSma2 { get; set; }
[Parameter("Calculate OnBar", DefaultValue = false)]
public bool CalculateOnBar { get; set; }
#endregion
#region Indicator declarations
private SimpleMovingAverage _sma1 { get; set; }
private SimpleMovingAverage _sma2 { get; set; }
#endregion
#region cTrader events
protected override void OnStart()
{
// construct the indicators
_sma1 = Indicators.SimpleMovingAverage(SourceSma1, PeriodsSma1);
_sma2 = Indicators.SimpleMovingAverage(SourceSma2, PeriodsSma2);
}
protected override void OnTick()
{
if (CalculateOnBar)
{
return;
}
ManagePositions();
}
protected override void OnBar()
{
if (!CalculateOnBar)
{
return;
}
ManagePositions();
}
protected override void OnStop()
{
// unused
}
#endregion
#region Position management
private void ManagePositions()
{
if (_sma1.Result.LastValue > _sma2.Result.LastValue)
{
if (!IsPositionOpenByType(TradeType.Buy))
{
OpenPosition(TradeType.Buy);
}
ClosePosition(TradeType.Sell);
}
if (_sma1.Result.LastValue < _sma2.Result.LastValue)
{
if (!IsPositionOpenByType(TradeType.Sell))
{
OpenPosition(TradeType.Sell);
}
ClosePosition(TradeType.Buy);
}
}
private void OpenPosition(TradeType type)
{
long volume = Symbol.QuantityToVolume(LotSize);
// open a new position
ExecuteMarketOrder(type, this.Symbol, volume, InstanceName, null, null);
}
private void ClosePosition(TradeType type)
{
var p = Positions.Find(InstanceName, this.Symbol, type);
if (p != null)
{
ClosePosition(p);
}
}
#endregion
#region Position Information
private bool IsPositionOpenByType(TradeType type)
{
var p = Positions.FindAll(InstanceName, Symbol, type);
if (p.Count() >= 1)
{
return true;
}
return false;
}
#endregion
}
}
@missyeam
PanagiotisCharalampous
14 Jan 2019, 15:27
Thanks missyearm,
Let me know if the below works for you
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 ClickAlgoSchoolSMA : Robot { #region User defined parameters [Parameter("Instance Name", DefaultValue = "001")] public string InstanceName { get; set; } [Parameter("Lot Size", DefaultValue = 0.1)] public double LotSize { get; set; } [Parameter("Source SMA #1")] public DataSeries SourceSma1 { get; set; } [Parameter("Source SMA #2")] public DataSeries SourceSma2 { get; set; } [Parameter("Period SMA #1", DefaultValue = 5, MinValue = 1, MaxValue = 100)] public int PeriodsSma1 { get; set; } [Parameter("Period SMA #2", DefaultValue = 20, MinValue = 1, MaxValue = 100)] public int PeriodsSma2 { get; set; } [Parameter("Calculate OnBar", DefaultValue = false)] public bool CalculateOnBar { get; set; } #endregion #region Indicator declarations private SimpleMovingAverage _sma1 { get; set; } private SimpleMovingAverage _sma2 { get; set; } #endregion #region cTrader events double _volume; protected override void OnStart() { // construct the indicators _sma1 = Indicators.SimpleMovingAverage(SourceSma1, PeriodsSma1); _sma2 = Indicators.SimpleMovingAverage(SourceSma2, PeriodsSma2); _volume = Symbol.QuantityToVolume(LotSize); Positions.Closed += Positions_Closed; } private void Positions_Closed(PositionClosedEventArgs obj) { if (obj.Position.NetProfit < 0) _volume += 1000; else _volume = Symbol.QuantityToVolume(LotSize); } protected override void OnTick() { if (CalculateOnBar) { return; } ManagePositions(); } protected override void OnBar() { if (!CalculateOnBar) { return; } ManagePositions(); } protected override void OnStop() { // unused } #endregion #region Position management private void ManagePositions() { if (_sma1.Result.LastValue > _sma2.Result.LastValue) { if (!IsPositionOpenByType(TradeType.Buy)) { OpenPosition(TradeType.Buy); } ClosePosition(TradeType.Sell); } if (_sma1.Result.LastValue < _sma2.Result.LastValue) { if (!IsPositionOpenByType(TradeType.Sell)) { OpenPosition(TradeType.Sell); } ClosePosition(TradeType.Buy); } } private void OpenPosition(TradeType type) { // open a new position ExecuteMarketOrder(type, this.Symbol, _volume, InstanceName, null, null); } private void ClosePosition(TradeType type) { var p = Positions.Find(InstanceName, this.Symbol, type); if (p != null) { ClosePosition(p); } } #endregion #region Position Information private bool IsPositionOpenByType(TradeType type) { var p = Positions.FindAll(InstanceName, Symbol, type); if (p.Count() >= 1) { return true; } return false; } #endregion } }
Best Regards,
Panagiotis
@PanagiotisCharalampous
missyeam
14 Jan 2019, 16:03
Thanks @ Panagiotis...i backtested this..it has a little problem...it creates a new position extra...eg. if gross profit is >0 @ 11k, it starts the next trade @ 12k, not from 1k (starting volume)
eg. 1k....gross profit= -0.5
2k...gross profit = -0.76
3k.. gross profit = 1.2
4k! (not 1k here)....but since the third trade was successful...i wanted the 4th trade to start @ 1k
Thanks
@missyeam
PanagiotisCharalampous
14 Jan 2019, 16:23
Hi missyeam,
Can you give me backtesting parameters and dates to check this?
Best Regards,
Panagiotis
@PanagiotisCharalampous
PanagiotisCharalampous
14 Jan 2019, 17:30
Hi missyeam,
I changed the code a bit. See below
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 ClickAlgoSchoolSMA : Robot { #region User defined parameters [Parameter("Instance Name", DefaultValue = "001")] public string InstanceName { get; set; } [Parameter("Lot Size", DefaultValue = 0.1)] public double LotSize { get; set; } [Parameter("Source SMA #1")] public DataSeries SourceSma1 { get; set; } [Parameter("Source SMA #2")] public DataSeries SourceSma2 { get; set; } [Parameter("Period SMA #1", DefaultValue = 5, MinValue = 1, MaxValue = 100)] public int PeriodsSma1 { get; set; } [Parameter("Period SMA #2", DefaultValue = 20, MinValue = 1, MaxValue = 100)] public int PeriodsSma2 { get; set; } [Parameter("Calculate OnBar", DefaultValue = false)] public bool CalculateOnBar { get; set; } #endregion #region Indicator declarations private SimpleMovingAverage _sma1 { get; set; } private SimpleMovingAverage _sma2 { get; set; } #endregion #region cTrader events double _volume; protected override void OnStart() { // construct the indicators _sma1 = Indicators.SimpleMovingAverage(SourceSma1, PeriodsSma1); _sma2 = Indicators.SimpleMovingAverage(SourceSma2, PeriodsSma2); _volume = Symbol.QuantityToVolume(LotSize); } protected override void OnTick() { if (CalculateOnBar) { return; } ManagePositions(); } protected override void OnBar() { if (!CalculateOnBar) { return; } ManagePositions(); } protected override void OnStop() { // unused } #endregion #region Position management private void ManagePositions() { if (_sma1.Result.LastValue > _sma2.Result.LastValue) { ClosePosition(TradeType.Sell); if (!IsPositionOpenByType(TradeType.Buy)) { OpenPosition(TradeType.Buy); } } if (_sma1.Result.LastValue < _sma2.Result.LastValue) { ClosePosition(TradeType.Buy); if (!IsPositionOpenByType(TradeType.Sell)) { OpenPosition(TradeType.Sell); } } } private void OpenPosition(TradeType type) { // open a new position ExecuteMarketOrder(type, this.Symbol, _volume, InstanceName, null, null); } private void ClosePosition(TradeType type) { var p = Positions.Find(InstanceName, this.Symbol, type); if (p != null) { ClosePosition(p); if (p.NetProfit < 0) { _volume += 1000; } else { _volume = Symbol.QuantityToVolume(LotSize); } } } #endregion #region Position Information private bool IsPositionOpenByType(TradeType type) { var p = Positions.FindAll(InstanceName, Symbol, type); if (p.Count() >= 1) { return true; } return false; } #endregion } }
Best Regards,
Panagiotis
@PanagiotisCharalampous
PanagiotisCharalampous
14 Jan 2019, 14:43
Hi missyeam,
If you post your cBot code, we might be able to help you.
Best Regards,
Panagiotis
@PanagiotisCharalampous