Topics
Replies
b0risl33t
08 Oct 2012, 19:18
Done It
Maybe not the best but it works :d
[Parameter("Max Losses", DefaultValue = 4, MinValue = 1, MaxValue = 10)] public int Losses {get; set; } private int _consecutiveLosses; protected override void OnPositionClosed(Position closedPosition) { { if (closedPosition.GrossProfit <= closedPosition.Commissions) { _consecutiveLosses++; } else { _consecutiveLosses = 0; } } if (closedPosition.GrossProfit > 0) { ExecuteOrder(InitialVolume, GetTradeCommand()); } else if (_consecutiveLosses < Losses) { ExecuteOrder((int)_position.Volume * 2, GetTradeCommand()); } else { OnStart(); } }
@b0risl33t
b0risl33t
08 Oct 2012, 18:08
Thank you for the reply
I am still learning c++ :P i never even looked at it before 4 days ago. Im still a real newbie but i am willing to learn so thanks for pointing me in the right direction.
What i am trying to achive is for the robot to restart its multiplyer if it has reached say 5 losses, but i want to be able to modify how many losses required with a parameter.
Example
InitialVolume
- 1 lot - Loss
- 2 lots - Loss
- 4 lots - Loss
- 8 Lots - Loss
4 Lots reached now the robot should reset and restart with InitialVolume
Hope this makes sense.
In mean time i will try and figure it out.
Thank You
@b0risl33t
b0risl33t
08 Oct 2012, 17:09
I think this works
using System; using cAlgo.API; using cAlgo.Indicators; namespace cAlgo.Robots { [Robot] public class SampleMartingaleRobot : Robot { [Parameter("Initial Volume", DefaultValue = 10000, MinValue = 0)] public int InitialVolume { get; set; } [Parameter("Stop Loss", DefaultValue = 40)] public int StopLoss { get; set; } [Parameter("Take Profit", DefaultValue = 40)] public int TakeProfit { get; set; } private Random random = new Random(); private Position position; protected override void OnStart() { ExecuteOrder(InitialVolume, TradeType.Sell); ExecuteOrder(InitialVolume, TradeType.Buy); } private void ExecuteOrder(int volume, TradeType tradeType) { Trade.CreateMarketOrder(tradeType, Symbol, volume); } protected override void OnPositionOpened(Position openedPosition) { position = openedPosition; Trade.ModifyPosition(openedPosition, GetAbsoluteStopLoss(openedPosition, StopLoss), GetAbsoluteTakeProfit(openedPosition, TakeProfit)); } protected override void OnPositionClosed(Position closedPosition) { if (closedPosition.GrossProfit > 0 && closedPosition.TradeType == TradeType.Sell) { ExecuteOrder(InitialVolume, TradeType.Sell); } else if (closedPosition.GrossProfit < 0 && closedPosition.TradeType == TradeType.Sell) { ExecuteOrder((int) position.Volume * 2, position.TradeType); } else if (closedPosition.GrossProfit > 0 && closedPosition.TradeType == TradeType.Buy) { ExecuteOrder(InitialVolume, TradeType.Buy); } else { ExecuteOrder((int) position.Volume * 2, position.TradeType); } } protected override void OnError(Error error) { if (error.Code == ErrorCode.BadVolume) Stop(); } private TradeType GetRandomTradeCommand() { return random.Next(2) == 0 ? TradeType.Buy : TradeType.Sell; } private double GetAbsoluteStopLoss(Position position, int stopLossInPips) { return position.TradeType == TradeType.Buy ? position.EntryPrice - Symbol.PipSize * stopLossInPips : position.EntryPrice + Symbol.PipSize * stopLossInPips; } private double GetAbsoluteTakeProfit(Position position, int takeProfitInPips) { return position.TradeType == TradeType.Buy ? position.EntryPrice + Symbol.PipSize * takeProfitInPips : position.EntryPrice - Symbol.PipSize * takeProfitInPips; } } }
@b0risl33t
b0risl33t
08 Oct 2012, 16:39
Ok i made this but not sure what i done wrong :( i get a member modefier protected must procede member name and type error. here is code
using cAlgo.API; using cAlgo.API.Indicators; namespace cAlgo.Robots { [Robot] public class MartingaleMA : Robot { [Parameter("Initial Volume", DefaultValue = 10000, MinValue = 0)] public int InitialVolume { get; set; } [Parameter("Stop Loss", DefaultValue = 40, MinValue = 0)] public int StopLoss { get; set; } [Parameter("Take Profit", DefaultValue = 40, MinValue = 0)] public int TakeProfit { get; set; } [Parameter("Max Losses", DefaultValue = 4, MinValue = 1, MaxValue = 10)] public int consecutiveLosses {get; set; } [Parameter("Source")] public DataSeries Source { get; set; } [Parameter("Period", DefaultValue = 14, MinValue = 1)] public int Period { get; set; } [Parameter("Moving Average Type", DefaultValue = MovingAverageType.Simple)] public MovingAverageType MovingAverageType { get; set; } private Position _position; private MovingAverage _movingAverage; private _consecutiveLosses protected override void OnStart() { _movingAverage = Indicators.MovingAverage(Source, Period, MovingAverageType); ExecuteOrder(InitialVolume, GetTradeCommand()); } private void ExecuteOrder(int volume, TradeType tradeType) { Trade.CreateMarketOrder(tradeType, Symbol, volume); } protected override void OnPositionOpened(Position openedPosition) { _position = openedPosition; Trade.ModifyPosition(openedPosition, GetAbsoluteStopLoss(openedPosition, StopLoss), GetAbsoluteTakeProfit(openedPosition, TakeProfit)); } private double GetAbsoluteStopLoss(Position pos, int stopLossInPips) { return pos.TradeType == TradeType.Buy ? pos.EntryPrice - Symbol.PipSize * stopLossInPips : pos.EntryPrice + Symbol.PipSize * stopLossInPips; } private double GetAbsoluteTakeProfit(Position pos, int takeProfitInPips) { return pos.TradeType == TradeType.Buy ? pos.EntryPrice + Symbol.PipSize * takeProfitInPips : pos.EntryPrice - Symbol.PipSize * takeProfitInPips; } protected override void OnPositionClosed(Position closedPosition) { if (closedPosition.GrossProfit < 0) { _consecutiveLosses++; } else if (closedPosition.GrossProfit > 0) { _consecutiveLosses = 0; } else if (closedPosition.GrossProfit > 0) { ExecuteOrder(InitialVolume, GetTradeCommand()); } else if (_consecutiveLosses < consecutiveLosses) { ExecuteOrder((int)_position.Volume * 2, GetTradeCommand()); } else { Stop() } } private TradeType GetTradeCommand() { var lastIndex = MarketSeries.Close.Count - 1; double close = MarketSeries.Close[lastIndex - 1]; double lastClose = MarketSeries.Close[lastIndex - 2]; if (_movingAverage.Result.IsRising() && close > lastClose) return TradeType.Buy; if (_movingAverage.Result.IsFalling() && close < lastClose) return TradeType.Sell; return _position.TradeType; } protected override void OnError(Error error) { if (error.Code == ErrorCode.BadVolume) Stop(); } } }
Any ideas?
Thanks
@b0risl33t
b0risl33t
08 Oct 2012, 15:40
Thanks for quick reply.
I will try and make that work, i will post my results here
thanks
@b0risl33t
b0risl33t
07 Oct 2012, 23:36
Cant figure this out what am i doin wrong
Cant figure out why i get else as an error here. And is closedPosition.TradeType will tell me what was the trade type on last position?
if (closedPosition.GrossProfit > 0) { ExecuteOrder(InitialVolume, closedPosition.TradeType); } else if (closedPosition.TradeType == TradeType.Buy); { ExecuteOrder((int) position.Volume * 2, TradeType.Sell); } else { ExecuteOrder((int) position.Volume * 2, TradeType.Buy); }
@b0risl33t
b0risl33t
07 Oct 2012, 21:07
Little Change
I have tryed to modify the code to execute orders Depending on the Last candle close value but still cant get it to work :( please help. Im Still a real noob at this but desperate to learn all this :D
[Parameter("Initial Volume", DefaultValue = 10000, MinValue = 0)] public int InitialVolume { get; set; } [Parameter("Stop Loss", DefaultValue = 40)] public int StopLoss { get; set; } [Parameter("Take Profit", DefaultValue = 40)] public int TakeProfit { get; set; } private Position position; protected override void OnStart() { ExecuteOrder(InitialVolume, TradeCommand()); } private void ExecuteOrder(int volume, TradeType tradeType) { Trade.CreateMarketOrder(tradeType, Symbol, volume); } protected override void OnPositionOpened(Position openedPosition) { position = openedPosition; Trade.ModifyPosition(openedPosition, GetAbsoluteStopLoss(openedPosition, StopLoss), GetAbsoluteTakeProfit(openedPosition, TakeProfit)); } protected override void OnPositionClosed(Position closedPosition) { if (closedPosition.GrossProfit > 0) { ExecuteOrder(InitialVolume, TradeCommand()); } else { ExecuteOrder((int) position.Volume * 2, position.TradeType); } } protected override void OnError(Error error) { if (error.Code == ErrorCode.BadVolume) Stop(); } private TradeType TradeCommand() { if (Trade.IsExecuting) return; var lastIndex = MarketSeries.Close.Count - 1; double close = MarketSeries.Close[lastIndex - 1]; double lastClose = MarketSeries.Close[lastIndex - 2]; if (close > lastClose) { TradeType.Buy; } else if (close < lastClose) { TradeType.Sell; } } private double GetAbsoluteStopLoss(Position position, int stopLossInPips) { return position.TradeType == TradeType.Buy ? position.EntryPrice - Symbol.PipSize * stopLossInPips : position.EntryPrice + Symbol.PipSize * stopLossInPips; } private double GetAbsoluteTakeProfit(Position position, int takeProfitInPips) { return position.TradeType == TradeType.Buy ? position.EntryPrice + Symbol.PipSize * takeProfitInPips : position.EntryPrice - Symbol.PipSize * takeProfitInPips; } } }
@b0risl33t
b0risl33t
09 Oct 2012, 15:21
Ohh Yehhh :P
Thanks
@b0risl33t