Исполнение торговых операций – это жизненно важная функция любого робота. Роботы могут открывать рыночные и отложенные ордера, устанавливать уровни Stop Loss / Take Profit, модифицировать и закрывать ордера.

Как открыть торговую позицию

Для открытия торговой позиции, используется оператор Trade . Он содержит несколько методов отправки запросов на сервер, для открытия торговых позиций.

Например, чтобы робот создал и выполнил рыночный ордер на покупку100k единиц выбранного торгового инструмента, необходимо задать следующие параметры:

protected override void OnStart(){
  Trade.CreateBuyMarketOrder(Symbol, 100000);
}

В данном примере мы используем объект Trade и его метод CreateBuyMarketOrder , для создания и отправки рыночного ордера на сервер. Этот метод использует два параметра: symbol (символ) и volume (объем). Первым из них, мы используем Symbol - символ торгового инструмента, к которому прикреплен робот. Объем постоянен (в примере выше он равен 100k). В результате, новый рыночный ордер будет создан и отправлен на сервер.

Для создания различных ордеров, вы можете использовать следующие методы:

 
  • CreateBuyMarketOrder(symbol, volume)
  • CreateSellMarketOrder(symbol, volume)
  • CreateMarketOrder(tradeType, symbolCode, volume)
  • CreateBuyLimitOrder(symbol, volume, targetPrice)
  • CreateSellLimitOrder(symbol, volume, targetPrice)
  • CreateBuyStopOrder(symbol, volume, targetPrice)
  • CreateSellStopOrder(symbol, volume, targetPrice)

Как вы можете видеть, имеются разные методы для разных видов ордеров. У этих методов могут быть различные параметры, например, если вы хотите создать лимитный ордер (limit order), цена открытия (target price) должна быть задана заранее.

Открыв позицию, вы можете хранить ее в разделе переменных, чтобы иметь возможность ее закрыть или выполнять другие операции с ней в будущем:

private Position myPosition;
protected override void OnStart(){
  Trade.CreateBuyMarketOrder(Symbol, 100000);
}
protected override void OnPositionOpened(Position openedPosition){
  myPosition = openedPosition;
  Print("Position {0} is opened, entry price is {1}", myPosition.Id, myPosition.EntryPrice);
}

Здесь мы работаем с методом OnPositionOpened для получения кода новых открытых позиций, затем мы сохраняем это и печатаем сообщение в log робота.

Как закрыть торговую позицию

В примере ниже, я закрываю позицию, хранящуюся в myPosition , когда цена достигает отметки выше установленного уровня:

private Position myPosition;
protected override void OnTick(){
  if (myPosition != null && Symbol.Bid > 1.3808){
    Trade.Close(myPosition)
  }
}

Метод OnTick() активируется при появлении каждого нового тика, проверяет уровень bid цены и, если он выше установленного уровня, позиция закрывается. Также проверяется, имеется ли для данной позиции условие position != null , и если торговой позиции нет, закрыть ее невозможно. Для того, чтобы это сделать, мы используем оператор Close(position) , который направляет запрос на закрытие позиции на сервер.

Как установить уровни Stop Loss / Take Profit

Уровни stop loss и take profit могут быть установлены для существующих торговых позиций, мы можем их только модифицировать, пока они открыты. Для этого, мы используем метод OnPositionOpened. В примере ниже, установлены Stop Loss и Take Profit на 30 пунктов от цены открытия нового ордера:

protected override void OnPositionOpened(Position openedPosition){
  double newStopLoss = position.EntryPrice - 30 * Symbol.PipSize;
  double newTakeProfit = position.EntryPrice + 30 * Symbol.PipSize;
  Trade.ModifyPosition(position, newStopLossPrice, newTakeProfit);
}

Если вы не хотите устанавливать уровни Stop Loss и Take Profit для ваших торговых позиций, необходимо также вписать null. В примере ниже уровень Take Profit отмечен без установки значения Take Profit:

Trade.ModifyPosition(position, null, newTakeProfit);

Если вы хотите установить новый уровень Stop Loss, но оставить Take Profit таким, каким он был ранее, то мы можем взять значение старого уровня Take Profit:

Trade.ModifyPosition(position, newStopLoss, position.TakeProfit);