Topics
Replies
_internet
28 Mar 2018, 11:15
Thanks that's great insight. Can I ask what you mean by official way? So if I used your way above, what would the program look like in terms of how it would change?
Didn't know that about OnBar, that makes a lot of sense. I'm wanting to open a position at the closing of the candle which registers the first MA cross. To your knowledge, would this work or would one need to wait to open a position at the open of the second candle after the MA cross is registered?
Thank you
@_internet
_internet
21 Mar 2018, 14:44
Hi Panagiotis,
Thank you for that. I used the suggestion of the reference window to use the time series option where I want to retrieve the EMA value a certain number of hours ago, i.e. 2, and input what was shown so thought this would work.
It says build succeeded, however gives the error messages
Warning EMA_TEST.cs: Error CS0169: The field 'cAlgo.EMA_TEST.rsi' is never used Warning EMA_TEST.cs: Error CS0649: Field 'cAlgo.EMA_TEST.EMA_9' is never assigned to, and will always have its default value null
The code I ran is 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 EMA_TEST : Robot { [Parameter()] public DataSeries SourceSeries { get; set; } [Parameter("EMA_9_period", DefaultValue = 9)] public int EMA_9_period { get; set; } [Parameter("EMA_3_period", DefaultValue = 3)] public int EMA_3_period { get; set; } [Parameter("Quantity (Lots)", DefaultValue = 1, MinValue = 0.01, Step = 0.01)] public double Quantity { get; set; } private RelativeStrengthIndex rsi; private ExponentialMovingAverage EMA_9; private ExponentialMovingAverage EMA_3; private const string label = "Strategy"; private Position longPosition; private Position shortPosition; private bool OpenBuyTrade; private bool OpenSellTrade; protected override void OnStart() { var EMA_9 = Indicators.ExponentialMovingAverage(SourceSeries, EMA_9_period); var EMA_3 = Indicators.ExponentialMovingAverage(SourceSeries, EMA_3_period); OpenBuyTrade = false; OpenSellTrade = false; } protected override void OnBar() { longPosition = Positions.Find(label, Symbol, TradeType.Buy); shortPosition = Positions.Find(label, Symbol, TradeType.Sell); var currentEMA_9 = EMA_9.Result.Last(1); var currentEMA_3 = EMA_3.Result.Last(1); var lastEMA_9 = EMA_9.Result.Last(2); var lastEMA_3 = EMA_3.Result.Last(2); var currentcandleopen = MarketSeries.Open.Last(0); if (OpenBuyTrade) { ExecuteMarketOrder(TradeType.Buy, Symbol, VolumeInUnits, label); OpenBuyTrade = false; } if (OpenSellTrade) { ExecuteMarketOrder(TradeType.Sell, Symbol, VolumeInUnits, label); OpenSellTrade = false; } if (EMA_3.Result.Last(2) <= EMA_9.Result.Last(2) && EMA_3.Result.Last(1) > EMA_9.Result.Last(1) && longPosition == null) { OpenBuyTrade = true; } else if (EMA_3.Result.Last(2) > EMA_9.Result.Last(2) && EMA_3.Result.Last(1) < EMA_9.Result.Last(1) && shortPosition == null) { OpenSellTrade = true; } if (longPosition != null && EMA_3.Result.Last(2) >= EMA_9.Result.Last(2) && EMA_3.Result.Last(1) < EMA_9.Result.Last(1)) ClosePosition(longPosition); if (shortPosition != null && EMA_3.Result.Last(2) <= EMA_9.Result.Last(2) && EMA_3.Result.Last(1) > EMA_9.Result.Last(1)) ClosePosition(shortPosition); } private long VolumeInUnits { get { return Symbol.QuantityToVolume(Quantity); } } } }
@_internet
_internet
21 Mar 2018, 11:13
P.S.
I should mention that the Syntax error above is written as follows: Error AssemblyInfo.cs: Syntax error, ']' expected
@_internet
_internet
21 Mar 2018, 11:12
Here's the code
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 EMA_Crossover_Strategy : Robot { [Parameter()] public DataSeries SourceSeries { get; set; } [Parameter()] public DateTime TimeSeries { get; set; } //Last(int index); [Parameter("EMA_9_period", DefaultValue = 9)] public int EMA_9_period { get; set; } [Parameter("EMA_3_period", DefaultValue = 3)] public int EMA_3_period { get; set; } [Parameter("Quantity (Lots)", DefaultValue = 1, MinValue = 0.01, Step = 0.01)] public double Quantity { get; set; } private RelativeStrengthIndex rsi; //private ExponentialMovingAverage EMA_9; //private ExponentialMovingAverage EMA_3; private const string label = "Strategy"; private Position longPosition; private Position shortPosition; private bool OpenBuyTrade; private bool OpenSellTrade; protected override void OnStart() { var EMA_9 = Indicators.ExponentialMovingAverage(SourceSeries, EMA_9_period); var EMA_3 = Indicators.ExponentialMovingAverage(SourceSeries, EMA_3_period); OpenBuyTrade = false; OpenSellTrade = false; } protected override void OnBar() { longPosition = Positions.Find(label, Symbol, TradeType.Buy); shortPosition = Positions.Find(label, Symbol, TradeType.Sell); var currentEMA_9 = EMA_9.Result.Last(1); var currentEMA_3 = EMA_3.Result.Last(1); var lastEMA_9 = EMA_9.Result.Last(2); var lastEMA_3 = EMA_3.Result.Last(2); var currentcandleopen = MarketSeries.Open.Last(0); if (OpenBuyTrade) { ExecuteMarketOrder(TradeType.Buy, Symbol, VolumeInUnits, label); OpenBuyTrade = false; } if (OpenSellTrade) { ExecuteMarketOrder(TradeType.Sell, Symbol, VolumeInUnits, label); OpenSellTrade = false; } if (EMA_3.Result.Last(2) <= EMA_9.Result.Last(2) && EMA_3.Result.Last(1) > EMA_9.Result.Last(1) && longPosition == null) { OpenBuyTrade = true; } else if (EMA_3.Result.Last(2) > EMA_9.Result.Last(2) && EMA_3.Result.Last(1) < EMA_9.Result.Last(1) && shortPosition == null) { OpenSellTrade = true; } if (longPosition != null && EMA_3.Result.Last(2) >= EMA_9.Result.Last(2) && EMA_3.Result.Last(1) < EMA_9.Result.Last(1)) ClosePosition(longPosition); if (shortPosition != null && EMA_3.Result.Last(2) <= EMA_9.Result.Last(2) && EMA_3.Result.Last(1) > EMA_9.Result.Last(1)) ClosePosition(shortPosition); } private long VolumeInUnits { get { return Symbol.QuantityToVolume(Quantity); } } } }
I'm also getting the error: Error CS1003: Syntax error, ']' expected
and: Error CS1730: Assembly and module attributes must precede all other elements defined in a file except using clauses and extern alias declarations.
Advice would be appreciated, thank you.
@_internet
_internet
29 Mar 2018, 23:21
That's fantastic thank you very much for the code and the advice. I've been looking for that insight about how to best choose which point to open at - the close or the open of the next bar, and what's involved in making the decision. Really helps a lot.
@_internet