Ставь лайки и следи за новостями
Поставь на него ссылку - пусть другие тоже оценят
Оцени его работу в терминале MetaTrader 5
- Просмотров:
- 2476
- Рейтинг:
- Опубликован:
- 2017.02.14 11:48
- Обновлен:
- 2022.03.23 10:08
-
Нужен робот или индикатор на основе этого кода? Закажите его на бирже фрилансеров Перейти на биржу
Советник показывает пример решения задачи: как определить момент, когда сработал отложенный ордер?
Как работает советник: в функции OnTradeTransaction() ожидаем транзакцию с типом "TRADE_TRANSACTION_DEAL_ADD":
TRADE_TRANSACTION_DEAL_ADD | Добавление сделки в историю. Осуществляется в результате исполнения ордера или проведения операций с балансом счета. |
Как только мы "поймали" такую транзакцию, то сразу вводим флаг "bln_find_order" поиска ордера и присваиваем переменной "ul_find_order" тикет ордера:
//| TradeTransaction function |
//+------------------------------------------------------------------+
void OnTradeTransaction(const MqlTradeTransaction &trans,
const MqlTradeRequest &request,
const MqlTradeResult &result)
{
//+------------------------------------------------------------------+
//| TRADE_TRANSACTION_DEAL_* |
//| The following fields in MqlTradeTransaction structure |
//| are filled for trade transactions related to deals handling |
//| (TRADE_TRANSACTION_DEAL_ADD, TRADE_TRANSACTION_DEAL_UPDATE |
//| and TRADE_TRANSACTION_DEAL_DELETE): |
//| •deal - deal ticket; |
//| •order - order ticket, based on which a deal has been performed;|
//| •symbol - deal symbol name; |
//| •type - trade transaction type; |
//| •deal_type - deal type; |
//| •price - deal price; |
//| •price_sl - Stop Loss price (filled, if specified in the order, |
//| •based on which a deal has been performed); |
//| •price_tp - Take Profit price (filled, if specified |
//| in the order, based on which a deal has been performed); |
//| •volume - deal volume in lots. |
//| •position - the ticket of the position that was opened, |
//| modified or closed as a result of deal execution. |
//| •position_by - the ticket of the opposite position. |
//| It is only filled for the out by deals |
//| (closing a position by an opposite one). |
//+------------------------------------------------------------------+
//--- get transaction type as enumeration value
ENUM_TRADE_TRANSACTION_TYPE type=trans.type;
//--- if transaction is result of addition of the transaction in history
if(type==TRADE_TRANSACTION_DEAL_ADD)
{
bln_find_order=true; // true -> you should look for a order
ul_find_order=trans.order;
}
}
В OnTick() мы все время проверяем состояние флага "bln_find_order" и как только флаг равен true — то начинаем поиск ордера.
- Сначала пытаемся по тикету найти этот ордер
- Если попытка удачная (это означает, что ордер уже записан в историю), определяем тип этого ордера. Для обращения за свойством ордера из торговой истории нужно использовать HistoryOrderGetInteger.
//| Expert tick function |
//+------------------------------------------------------------------+
void OnTick()
{
//---
if(bln_find_order) // true -> you should look for a order
{
static long counter=0;
Print("Attempt number ",counter);
ResetLastError();
if(HistoryOrderSelect(ul_find_order))
{
long type_order=HistoryOrderGetInteger(ul_find_order,ORDER_TYPE);
if(type_order==ORDER_TYPE_BUY_LIMIT || type_order==ORDER_TYPE_BUY_STOP ||
type_order==ORDER_TYPE_SELL_LIMIT ||type_order==ORDER_TYPE_SELL_STOP)
{
Print("The pending order ",ul_find_order," is found! Type of order is ",
EnumToString((ENUM_ORDER_TYPE)HistoryOrderGetInteger(ul_find_order,ORDER_TYPE)));
bln_find_order=false; // true -> you should look for a order
counter=0;
return;
}
else
{
Print("The order ",ul_find_order," is not pending");
bln_find_order=false; // true -> you should look for a order
return;
}
}
else
{
Print("Order ",ul_find_order," is not find, error#",GetLastError());
}
counter++;
}
}

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

Простейший осциллятор с использованием разницы цен открытия и закрытия свечей.

Пересечение двух iMA. Расчёт лота в процентах риска от маржи.

Индикатор XCHV с возможностью изменения таймфрейма индикатора во входных параметрах.