The CreateStopLimitOnEntry() Function allows you to set stops and limits on a placed entry order (in case the order was created without predefined stop and limit). It has 4 parameters:
1. | EntryOrder: TOrder; – the entry order, on which the conditional order is placed. |
2. | Rate: Double – the stop or limit rate. |
3. | OrderType: TOrderType — the order type. Values: otStop, otLimit. |
4. | OperationTag: String — the custom order tag. |
Example: Let us create a strategy that will place an Entry Stop Buy Order 40 points above the market rate when it is started, without a predefined stop and limit. Then it will set a stop 25 points below the entry order rate, and a limit 40 points above the entry order rate, once the difference between the close and the open rate of the last finished candle is bigger than 20 points.
We will use the candle history for this strategy. The procedure OnNewCandle will check the conditions every time a new candle appears. We will also use the procedure OnOrderChange to identify the order which was placed when the strategy started. After the Stop and Limit orders are created, the strategy will stop (terminate).
The script will be as follows:
const StrategyName='My Strategy';
var History: TCandleHistory; Account: TAccount; Amount, Point: Double; Stop, Limit, ESRate: Integer; MyOrder: TOrder;
procedure OnCreate; begin AddCandleHistorySetting(@History, 'Candle History', '', CI_1_Minute, 100); History.OnNewCandleEvent := @OnNewCandle; AddAccountSetting(@Account,'Account', ''); AddFloatSetting(@Amount, 'Amount(Lots)', 5); AddIntegerSetting(@Stop, 'Stop in pips', 25); AddIntegerSetting(@Limit, 'Limit in pips', 40); AddIntegerSetting(@ESRate, 'Entry Stop Distance in pips', 40); end;
procedure OnStart; begin Point := History.Instrument.PointSize; CreateEntryOrder(History.Instrument, Account, Amount, bsBuy, History.Instrument.Buy + ESRate*Point, NullRate, NullRate, otEStop, 'EntryStopBuy'); end;
// this procedure is used to identify the order when it is inserted procedure OnOrderChange(const Action: TDataModificationType; const Order: TOrder); begin if (Action = dmtInsert) and (Order.OrderType = otEStop) and (Order.Tag='EntryStopBuy') then MyOrder := Order; end;
procedure OnNewCandle; begin if History.Last(1).Close - History.Last(1).Open > 20*Point then begin CreateStopLimitOnEntry(MyOrder, MyOrder.Rate-(History.Instrument.Buy-History.Instrument.Sell) -Stop*Point,otStop,'Stop'); CreateStopLimitOnEntry(MyOrder, MyOrder.Rate-(History.Instrument.Buy-History.Instrument.Sell) +Limit*Point,otLimit,'Limit'); Terminate; end; end; |