CCI robot
CCI robot
18 Sep 2012, 14:27
Hi guys,
tried to create a cci robot (on the basic of rsi robot) but there seems to be an error:
ERROR 12: } expected (but where??)
In a next step I will combine the cci with another indi but this comes later.
// // The "Sample CCI Robot" will create a buy order when the Commodity Channel Index indicator crosses the level 1, // and a Sell order when the CCI indicator crosses the level -1. The order is closed be either a Stop Loss, defined in // the "Stop Loss" parameter, or by the opposite CCI crossing signal (buy orders close when CCI crosses the -1 level // and sell orders are closed when CCI crosses the 1 level). // // The robot can generate only one Buy or Sell order at any given time. // // ------------------------------------------------------------------------------------------------- using System; using cAlgo.API; using cAlgo.API.Indicators; namespace cAlgo.Robots { [Robot] public class CCIRobot : Robot { [Parameter("Source")] public DataSeries Source { get; set; } [Parameter("Periods", DefaultValue = 21)] public int Periods { get; set; } [Parameter("Stop Loss (pips)", DefaultValue = 10)] public int StopLoss { get; set; } [Parameter("Volume", DefaultValue = 10000, MinValue = 0)] public int Volume { get; set; } private Position position; private CommodityChannelIndex cci; protected override void OnStart() { cci = Indicators.CommodityChannelIndex(Source, Periods); } protected override void OnTick() { if (Trade.IsExecuting) return; if (cci.Result.LastValue < 0 && (position == 1 || position.TradeType == TradeType.Sell)) { OpenPosition(TradeType.Buy); } if (cci.Result.LastValue > 0 && (position == -1 || position.TradeType == TradeType.Buy)) { OpenPosition(TradeType.Sell); } } private void OpenPosition(TradeType command) { if (position != 1) { Trade.Close(position); position = 1; } { if (position != -1) { Trade.Close(position); position = -1; } Trade.CreateMarketOrder(command, Symbol, Volume); } protected override void OnPositionOpened(Position openedPosition) { position = openedPosition; Trade.ModifyPosition(openedPosition, GetAbsoluteStopLoss(openedPosition, StopLoss), 1); } { position = openedPosition; Trade.ModifyPosition(openedPosition, GetAbsoluteStopLoss(openedPosition, StopLoss), -1); } private double GetAbsoluteStopLoss(Position position, int stopLossInPips) { return position.TradeType == TradeType.Buy ? position.EntryPrice - Symbol.PipSize * stopLossInPips : position.EntryPrice + Symbol.PipSize * stopLossInPips; } } }
Replies
admin
19 Sep 2012, 14:13
( Updated at: 23 Jan 2024, 13:11 )
Hello misado,
Your code needs some modification in order to work properly.
First you need to make sure the position is not null before accessing it.
So, your code could be modified to this:
if (cci.Result.LastValue < 0 && (_position == null || _position.TradeType == TradeType.Sell) )
{
OpenPosition(TradeType.Buy);
}
if (cci.Result.LastValue > 0 && (_position == null || _position.TradeType == TradeType.Buy))
{
OpenPosition(TradeType.Sell);
}
Please visit this link to understand how to code using Position.
[/docs/reference/calgo/api/position]
Also, when you use Trade.ModifyPosition to modify the stop loss and take profit, you need to provide the full take profit or stop loss price not the pips.
In other words this: Trade.ModifyPosition(openedPosition,GetAbsoluteStopLoss(openedPosition,StopLoss),1);
means this: Take Profit Hit will occur when the currency quote will equal 1.
Therefore, if we want Take Profit to be equal to the entry price plus 1 pip, we need
takeprofit = _position.EntryPrice + Symbol.PipSize
More here: [/docs/reference/calgo/api/internals/itrade/modifyposition]
Please visit this link to understand more about using Trade and it's member methods:
[/docs/reference/calgo/api/internals/itrade]
@admin
admin
20 Sep 2012, 15:19
Then you need to modify your if statement to the following:
if (cci.Result.LastValue > 1 && (_position == null || _position.TradeType == TradeType.Sell) )
{
OpenPosition(TradeType.Buy);
}
else if (cci.Result.LastValue < -1 && (_position == null || _position.TradeType == TradeType.Buy))
{
OpenPosition(TradeType.Sell);
}
@admin
misado
20 Sep 2012, 16:17
I've changed it but still have error 11!
// // The "Sample CCI Robot" will create a buy order when the Commodity Channel Index indicator crosses the level 1, // and a Sell order when the CCI indicator crosses the level -1. The order is closed be either a Stop Loss, defined in // the "Stop Loss" parameter, or by the opposite CCI crossing signal (buy orders close when CCI crosses the -1 level // and sell orders are closed when CCI crosses the 1 level). // // The robot can generate only one Buy or Sell order at any given time. // // ------------------------------------------------------------------------------------------------- using System; using cAlgo.API; using cAlgo.API.Indicators; namespace cAlgo.Robots { [Robot] public class CCIRobot : Robot { [Parameter("Source")] public DataSeries Source { get; set; } [Parameter("Periods", DefaultValue = 21)] public int Periods { get; set; } [Parameter("Stop Loss (pips)", DefaultValue = 10)] public int StopLoss { get; set; } [Parameter("Volume", DefaultValue = 10000, MinValue = 0)] public int Volume { get; set; } private Position position; private CommodityChannelIndex cci; protected override void OnStart() { cci = Indicators.CommodityChannelIndex(Periods); } protected override void OnTick() { if (Trade.IsExecuting) return; if (cci.Result.LastValue > 1 && (_position == null || _position.TradeType == TradeType.Sell)) { OpenPosition(TradeType.Buy); } if (cci.Result.LastValue < -1 && (_position == null || _position.TradeType == TradeType.Buy)) { OpenPosition(TradeType.Sell); } } private void OpenPosition(TradeType command) { if (position != null) { Trade.Close(position); position = null; } Trade.CreateMarketOrder(command, Symbol, Volume); } protected override void OnPositionOpened(Position openedPosition) { position = openedPosition; Trade.ModifyPosition(openedPosition, GetAbsoluteStopLoss(openedPosition, StopLoss), 1); } { position = openedPosition; Trade.ModifyPosition(openedPosition, GetAbsoluteStopLoss(openedPosition, StopLoss), -1); } private double GetAbsoluteStopLoss(Position position, int stopLossInPips) { return position.TradeType == TradeType.Buy ? position.EntryPrice - Symbol.PipSize * stopLossInPips : position.EntryPrice + Symbol.PipSize * stopLossInPips; } } }
@misado
admin
24 Sep 2012, 17:29
The error I am seeing in your code is this:
You are declaring a variable:
private Position position ;
then you are referencing a variable that does not exist:
_position ==null
position and _position are two different names.
The easiest way to fix this is just change the declaration to:
private Position _position
@admin
sktrader
19 Sep 2012, 12:26
Hi,
I looked at your code and there are a few mistakes.
First of all this is not possible: position = 1. What are you trying to do here?
Here are some corrections:
@sktrader