Торговые функции

Группа функций, предназначенных для управления торговой деятельностью.

Торговые функции OrderSend(), OrderClose(), OrderCloseBy(), OrderDelete() и OrderModify() не могут быть вызваны из пользовательских индикаторов.

Торговые функции могут использоваться в экспертах и скриптах. Торговые функции могут быть вызваны только в том случае, если в свойствах соответствующего эксперта или скрипта включена галочка «Разрешить советнику торговать».

Для проведения торговых операций из экспертов и скриптов предусмотрен всего один поток, который запускается в программном торговом контексте (контекст автоматической торговли из экспертов и скриптов). Поэтому, если этот контекст занят торговой операцией какого-либо эксперта, то другой эксперт или скрипт не может в этот момент вызывать торговые функции из-за ошибки 146 (ERR_TRADE_CONTEXT_BUSY). Для определения возможности выполнять торговые операции необходимо использовать функцию IsTradeAllowed(). Для чёткого разделения доступа к торговому контексту можно использовать семафор на основе глобальной переменной, значение которой необходимо менять при помощи функции GlobalVariableSetOnCondition().

 

OrderClose

bool OrderClose(int ticket, double lots, double price, int slippage, color Color=CLR_NONE)

Закрытие позиции. Возвращает TRUE при успешном завершении функции. Возвращает FALSE при неудачном завершении функции. Чтобы получить информацию об ошибке, необходимо вызвать функцию GetLastError().

Параметры:

ticket — Уникальный порядковый номер ордера.
lots — Количество лотов для закрытия.
price — Цена закрытия.
slippage — Значение максимального проскальзывания в пунктах.
Color — Цвет стрелки закрытия на графике. Если параметр отсутствует или его значение равно CLR_NONE, то стрелка на графике не отображается.

Пример:

if(iRSI(NULL,0,14,PRICE_CLOSE,0)>75)
{
   OrderClose(order_id,1,Ask,3,Red);
   return(0);
}

 

OrderCloseBy

bool OrderCloseBy(int ticket, int opposite, color Color=CLR_NONE)

Закрытие одной открытой позиции другой позицией, открытой по тому же самому инструменту, но в противоположном направлении. Возвращает TRUE при успешном завершении функции. Возвращает FALSE при неудачном завершении функции. Чтобы получить информацию об ошибке, необходимо вызвать функцию GetLastError().

Параметры:

ticket — Уникальный порядковый номер закрываемого ордера.
opposite — Уникальный порядковый номер противоположного ордера.
Color — Цвет стрелки закрытия на графике. Если параметр отсутствует или его значение равно CLR_NONE, то стрелка на графике не отображается.

Пример:

if(iRSI(NULL,0,14,PRICE_CLOSE,0)>75)
{
   OrderCloseBy(order_id,opposite_id);
   return(0);
}

 

OrderClosePrice

double OrderClosePrice()

Возвращает цену закрытия выбранного ордера.
Ордер должен быть предварительно выбран с помощью функции OrderSelect().

Пример:

if(OrderSelect(10,SELECT_BY_POS,MODE_HISTORY)==true)
{
   datetime ctm=OrderOpenTime();
   if(ctm>0) Print("Open time for the order 10 ", ctm);
   ctm=OrderCloseTime();
   if(ctm>0) Print("Close time for the order 10 ", ctm);
}
else
   Print("OrderSelect failed error code is",GetLastError());

 

OrderCloseTime

datetime OrderCloseTime()

Возвращает время закрытия для выбранного ордера. Только закрытые ордера имеют время закрытия, не равное 0. Открытые или отложенные ордера имеют время закрытия, равное 0.
Ордер должен быть предварительно выбран с помощью функции OrderSelect().

Пример:

if(OrderSelect(10,SELECT_BY_POS,MODE_HISTORY)==true)
{
   datetime ctm=OrderOpenTime();
   int ticket=OrderTicket();
   if(ctm>0) Print("Время открытия ордера ? ",ticket," ",ctm);
   ctm=OrderCloseTime();
   if(ctm>0) Print("Время закрытия ордера ? ",ticket," ",ctm);
}
else
   Print("OrderSelect() вернул ошибку ",GetLastError());

 

OrderComment

string OrderComment()

Возвращает комментарий для выбранного ордера.
Ордер должен быть предварительно выбран с помощью функции OrderSelect().

Пример:

string comment;
 if(OrderSelect(10,SELECT_BY_TICKET)==false)
 {
 Print("OrderSelect() вернул ошибку - ",GetLastError());
 return(0);
 }
 comment = OrderComment();
 // ...

 

OrderCommission

double OrderCommission()

Возвращает значение рассчитанной комиссии для выбранного ордера.
Ордер должен быть предварительно выбран с помощью функции OrderSelect().

Пример:

if(OrderSelect(10,SELECT_BY_POS)==true)
   Print("Commission for the order 10 ",OrderCommission());
else
   Print("OrderSelect() вернул ошибку - ",GetLastError());

 

OrderDelete

bool OrderDelete(int ticket, color arrow_color=CLR_NONE)

Удаляет ранее установленный отложенный ордер. Возвращает TRUE при успешном завершении функции. Возвращает FALSE при неудачном завершении функции. Чтобы получить информацию об ошибке, необходимо вызвать функцию GetLastError().

Параметры:

ticket — Уникальный порядковый номер ордера.
arrow_color — Цвет стрелки на графике. Если параметр отсутствует или его значение равно CLR_NONE, то стрелка на графике не отображаются.

Пример:

if(Ask > var1)
{
   OrderDelete(order_ticket);
   return(0);
}

 

OrderExpiration

datetime OrderExpiration()

Возвращает дату истечения для выбранного отложенного ордера.
Ордер должен быть предварительно выбран с помощью функции OrderSelect().

Пример:

if(OrderSelect(10, SELECT_BY_TICKET)==true)
   Print("Order expiration for the order #10 is ",OrderExpiration());
else
   Print("OrderSelect() вернул ошибку - ",GetLastError());

 

OrderLots

double OrderLots()

Возвращает количество лотов для выбранного ордера.
Ордер должен быть предварительно выбран с помощью функции OrderSelect().

Пример:

if(OrderSelect(10,SELECT_BY_POS)==true)
   Print("lots for the order 10 ",OrderLots());
else
   Print("OrderSelect() вернул ошибку - ",GetLastError());

 

OrderMagicNumber

int OrderMagicNumber()

Возвращает идентификационное («магическое») число для выбранного ордера.
Ордер должен быть предварительно выбран с помощью функции OrderSelect().

Пример:

if(OrderSelect(10,SELECT_BY_POS)==true)
   Print("Magic number for the order 10 ", OrderMagicNumber());
else
   Print("OrderSelect() вернул ошибку - ",GetLastError());

 

OrderModify

bool OrderModify(int ticket, double price, double stoploss, double takeprofit, datetime expiration, color arrow_color=CLR_NONE)

Изменяет параметры ранее открытых позиций или отложенных ордеров. Возвращает TRUE при успешном завершении функции. Возвращает FALSE при неудачном завершении функции. Чтобы получить информацию об ошибке, необходимо вызвать функцию GetLastError().
Замечания: цену открытия и время истечения можно изменять только у отложенных ордеров.
Если в качестве параметров функции передать неизмененные значения, то в этом случае будет сгенерирована ошибка 1 (ERR_NO_RESULT).
На некоторых торговых серверах может быть установлен запрет на применение срока истечения отложенных ордеров. В этом случае при попытке задать ненулевое значение в параметре expiration будет сгенерирована ошибка 147 (ERR_TRADE_EXPIRATION_DENIED).

Параметры:

ticket — Уникальный порядковый номер ордера.
price — Новая цена открытия отложенного ордера.
stoploss — Новое значение StopLoss.
takeprofit — Новое значение TakeProfit.
expiration — Время истечения отложенного ордера.
arrow_color — Цвет стрелок модификации StopLoss и/или TakeProfit на графике. Если параметр отсутствует или его значение равно CLR_NONE, то стрелки на графике не отображаются.

Пример:

if(TrailingStop>0)
{
   OrderSelect(12345, SELECT_BY_TICKET);
   if(Bid-OrderOpenPrice()>Point*TrailingStop)
   {
       if(OrderStopLoss()<Bid-Point*TrailingStop)
       {
           OrderModify(OrderTicket(),OrderOpenPrice(),Bid-Point*TrailingStop,OrderTakeProfit(),0,Blue);
           return(0);
       }
   }
}

 

OrderOpenPrice

double OrderOpenPrice()

Возвращает цену открытия для выбранного ордера.
Ордер должен быть предварительно выбран с помощью функции OrderSelect().

Пример:

if(OrderSelect(10, SELECT_BY_POS)==true)
   Print("open price for the order 10 ",OrderOpenPrice());
else
   Print("OrderSelect() вернул ошибку - ",GetLastError());

 

OrderOpenTime

datetime OrderOpenTime()

Возвращает время открытия выбранного ордера.
Ордер должен быть предварительно выбран с помощью функции OrderSelect().

Пример:

if(OrderSelect(10, SELECT_BY_POS)==true)
   Print("open time for the order 10 ", OrderOpenTime());
else
   Print("OrderSelect() вернул ошибку - ",GetLastError());

 

OrderPrint

void OrderPrint()

Выводит данные ордера в журнал в виде строки следующего формата:
номер тикета; время открытия; торговая операция; количество лотов; цена открытия; стоп лосс; тейк профит; время закрытия; цена закрытия; комиссия; своп; прибыль; комментарий; магическое число; дата истечения отложенного ордера.
Ордер должен быть предварительно выбран с помощью функции OrderSelect().

Пример:

if(OrderSelect(10, SELECT_BY_TICKET)==true)
   OrderPrint();
else
   Print("OrderSelect() вернул ошибку - ",GetLastError());

 

OrderProfit

double OrderProfit()

Возвращает значение чистой прибыли (без учёта свопов и комиссий) для выбранного ордера. Для открытых позиций это — текущая нереализованная прибыль. Для закрытых ордеров — зафиксированная прибыль.
Ордер должен быть предварительно выбран с помощью функции OrderSelect().

Пример:

if(OrderSelect(10, SELECT_BY_POS)==true)
   Print("Profit for the order 10 ",OrderProfit());
else
   Print("OrderSelect() вернул ошибку - ",GetLastError());

 

OrderSelect

bool OrderSelect(int index, int select, int pool=MODE_TRADES)

Функция выбирает ордер для дальнейшей работы с ним. Возвращает TRUE при успешном завершении функции. Возвращает FALSE при неудачном завершении функции. Чтобы получить информацию об ошибке, необходимо вызвать функцию GetLastError().
Параметр pool игнорируется, если ордер выбирается по номеру тикета. Номер тикета является уникальным идентификатором ордера. Чтобы определить, из какого списка выбран ордер, необходимо проанализировать его время закрытия. Если время закрытия ордера равно 0, то ордер является открытым или отложенным и взят из списка открытых позиций терминала. Отличить открытую позицию от отложенного ордера можно по типу ордера. Если время закрытия ордера не равно 0, то ордер является закрытым или удаленным отложенным и был выбран из истории терминала. Отличить закрытый ордер от удаленного отложенного также можно по типу ордера.

Параметры:

index — Позиция ордера или номер ордера в зависимости от второго параметра.
select — Флаг способа выбора. Mожет быть одним из следующих величин:
SELECT_BY_POS — в параметре index передается порядковый номер позиции в списке,
SELECT_BY_TICKET — в параметре index передается номер тикета.
pool — Источник данных для выбора. Используется, когда параметр select равен SELECT_BY_POS. Mожет быть одной из следующих величин:
MODE_TRADES (по умолчанию) — ордер выбирается среди открытых и отложенных ордеров,
MODE_HISTORY — ордер выбирается среди закрытых и удаленных ордеров.

Пример:

if(OrderSelect(12470, SELECT_BY_TICKET)==true)
{
   Print("order #12470 open price is ", OrderOpenPrice());
   Print("order #12470 close price is ", OrderClosePrice());
}
else
   Print("OrderSelect() вернул ошибку - ",GetLastError());

 

OrderSend

int OrderSend(string symbol, int cmd, double volume, double price, int slippage, double stoploss, double takeprofit, string comment=NULL, int magic=0, datetime expiration=0, color arrow_color=CLR_NONE)

Основная функция, используемая для открытия позиции или установки отложенного ордера.
Возвращает номер тикета, который назначен ордеру торговым сервером или -1 в случае неудачи. Чтобы получить дополнительную информацию об ошибке, необходимо вызвать функцию GetLastError().

Замечания: При открытии рыночного ордера (OP_SELL или OP_BUY) в качестве цены открытия могут использоваться только самые последние цены Bid (для продажи) или Ask (для покупки). Если операция проводится по финансовому инструменту, отличному от текущего, то для получения последних котировок по этому инструменту необходимо воспользоваться функцией MarketInfo() с параметром MODE_BID или MODE_ASK. Нельзя использовать расчетную либо ненормализованную цену. Если запрашиваемой цены открытия не было в ценовом потоке либо запрашиваемая цена не нормализована в соответствии с количеством знаков после десятичной точки, то будет сгенерирована ошибка 129 (ERR_INVALID_PRICE). Если запрашиваемая цена открытия сильно устарела, то независимо от значения параметра slippage будет сгенерирована ошибка 138 (ERR_REQUOTE). Если же запрашиваемая цена устарела, но ещё присутствует в ценовом потоке, то позиция открывается по текущей цене и только в том случае, если текущая цена попадает в диапазон price+-slippage.

Цены StopLoss и TakeProfit не могут располагаться слишком близко к рынку. Минимальное расстояние стопов в пунктах можно получить, используя функцию MarketInfo() с параметром MODE_STOPLEVEL. В случае ошибочных, а также ненормализованных стопов генерируется ошибка 130 (ERR_INVALID_STOPS).

При установке отложенного ордера цена открытия не может быть слишком близкой к рынку. Минимальное расстояние отложенной цены от текущей рыночной цены в пунктах также можно получить, используя функцию MarketInfo() с параметром MODE_STOPLEVEL. В случае неправильной цены открытия отложенного ордера будет сгенерирована ошибка 130 (ERR_INVALID_STOPS).

На некоторых торговых серверах может быть установлен запрет на применение срока истечения отложенных ордеров. В этом случае при попытке задать ненулевое значение в параметре expiration будет сгенерирована ошибка 147 (ERR_TRADE_EXPIRATION_DENIED).

На некоторых торговых серверах может быть установлен лимит на общее количество открытых и отложенных ордеров. При превышении этого лимита новая позиция открыта не будет (отложенный ордер не будет установлен), и торговый сервер вернет ошибку 148 (ERR_TRADE_TOO_MANY_ORDERS).

Параметры:

symbol — Наименование финансового инструмента, с которым проводится торговая операция.
cmd — Торговая операция. Может быть любым из значений торговых операций.
volume — Количество лотов.
price — Цена открытия.
slippage — Максимально допустимое отклонение цены для рыночных ордеров (ордеров на покупку или продажу).
stoploss — Цена закрытия позиции при достижении уровня убыточности (0 в случае отсутствия уровня убыточности).
takeprofit — Цена закрытия позиции при достижении уровня прибыльности (0 в случае отсутствия уровня прибыльности).
comment — Текст комментария ордера. Последняя часть комментария может быть изменена торговым сервером.
magic — Магическое число ордера. Может использоваться как определяемый пользователем идентификатор.
expiration — Срок истечения отложенного ордера.
arrow_color — Цвет открывающей стрелки на графике. Если параметр отсутствует или его значение равно CLR_NONE, то открывающая стрелка не отображается на графике.

Пример:

int ticket;

if(iRSI(NULL,0,14,PRICE_CLOSE,0) < 25)
{
   ticket=OrderSend(Symbol(),OP_BUY,1,Ask,3,Bid-25*Point,Ask+25*Point,"My order #"+counter,16384,0,Green);
   if(ticket<0)
   {
      Print("OrderSend failed with error #", GetLastError());
      return(0);
   }
}

 

OrdersHistoryTotal

int OrdersHistoryTotal()

Возвращает количество закрытых позиций и удаленных ордеров в истории текущего счета, загруженной в клиентском терминале. Размер списка истории зависит от текущих настроек вкладки «История счета» терминала.

Пример:

// retrieving info from trade history
int i,accTotal=OrdersHistoryTotal();
for(i=0;i<accTotal;i++)
{
   //---- check selection result
   if(OrderSelect(i,SELECT_BY_POS,MODE_HISTORY)==false)
   {
      Print("Ошибка при доступе к исторической базе (", GetLastError(),")");
      break;
   }
   // работа с ордером ...
}

 

OrderStopLoss

double OrderStopLoss()

Возвращает значение цены закрытия позиции при достижении уровня убыточности (stop loss) для текущего выбранного ордера.
Ордер должен быть предварительно выбран с помощью функции OrderSelect().

Пример:

if(OrderSelect(ticket,SELECT_BY_POS)==true)
   Print("Stop loss value for the order 10 ", OrderStopLoss());
else
   Print("OrderSelect() вернул ошибку - ",GetLastError());

 

OrdersTotal

int OrdersTotal()

Возвращает общее количество открытых и отложенных ордеров.

Пример:

int handle=FileOpen("OrdersReport.csv",FILE_WRITE|FILE_CSV,"\t");
if(handle<0) 
   return(0);

// запишем заголовок в файл
FileWrite(handle,"#","Цена открытия","Время открытия","Символ","Лоты");
int total=OrdersTotal();

// записываем в файл только открытые ордера
for(int pos=0;pos<total;pos++)
{
   if(OrderSelect(pos,SELECT_BY_POS,MODE_TRADES)==false) continue;
   FileWrite(handle,OrderTicket(),OrderOpenPrice(),OrderOpenTime(),OrderSymbol(),OrderLots());
}

FileClose(handle);

 

OrderSwap

double OrderSwap()

Возвращает значение свопа для текущего выбранного ордера.
Ордер должен быть предварительно выбран с помощью функции OrderSelect().

Пример:

if(OrderSelect(order_id, SELECT_BY_TICKET)==true)
   Print("Swap for the order #", order_id, " ",OrderSwap());
else
   Print("OrderSelect() вернул ошибку - ",GetLastError());

 

OrderSymbol

string OrderSymbol()

Возвращает наименование финансового инструмента для текущего выбранного ордера.
Ордер должен быть предварительно выбран с помощью функции OrderSelect().

Пример:

if(OrderSelect(12, SELECT_BY_POS)==true)
   Print("symbol of order #", OrderTicket(), " is ", OrderSymbol());
else
   Print("OrderSelect() вернул ошибку - ",GetLastError());

 

OrderTakeProfit

double OrderTakeProfit()

Возвращает значение цены закрытия позиции при достижении уровня прибыльности (take profit) для текущего выбранного ордера
Ордер должен быть предварительно выбран с помощью функции OrderSelect().

Пример:

if(OrderSelect(12, SELECT_BY_POS)==true)
   Print("Order #",OrderTicket()," profit: ", OrderTakeProfit());
else
   Print("OrderSelect() вернул ошибку - ",GetLastError());

 

OrderTicket

int OrderTicket()

Возвращает номер тикета для текущего выбранного ордера.
Ордер должен быть предварительно выбран с помощью функции OrderSelect().

Пример:

if(OrderSelect(12, SELECT_BY_POS)==true)
   Print("Order #",OrderTicket()," profit: ", OrderTakeProfit());
else
   Print("OrderSelect() вернул ошибку - ",GetLastError());

 

OrderType

int OrderType()

Возвращает тип операции текущего выбранного ордера. Mожет быть одной из следующих величин:

OP_BUY — позиция на покупку,
OP_SELL — позиция на продажу,
OP_BUYLIMIT — отложенный ордер на покупку по достижении заданного уровня, текущая цена выше уровня,
OP_BUYSTOP — отложенный ордер на покупку по достижении заданного уровня, текущая цена ниже уровня,
OP_SELLLIMIT — отложенный ордер на продажу по достижении заданного уровня, текущая цена ниже уровня,
OP_SELLSTOP — отложенный ордер на продажу по достижении заданного уровня, текущая цена выше уровня.
Ордер должен быть предварительно выбран с помощью функции OrderSelect().

Пример:

int order_type;

if(OrderSelect(12, SELECT_BY_POS)==true)
{
   order_type=OrderType();
   // ...
}
else
   Print("OrderSelect() вернул ошибку - ",GetLastError());