Великий и ужасный МТ4 навсегда (или как грамотно выработать стратегию перехода) - страница 11

 
secret:
Отложка, выставленная заранее. Цена касается её, но исполнение происходит позже, по худшей цене.

Нет, если лимитка исполнилась хуже — то брокера нафик, либо разбираться.

А если стоп, то это нормально, как бы. 20-30 мс вполне приемлемо, если ордер выводится куда-то дальше, а не просто плагином проверяется.

Ну а сколько там было тиков — вообще не важно.

 
Andrei Trukhanovich:

как это поможет если комиссия считается в долларах от объема в долларах?

Странно, но влияет валюта счета. Видимо, там при конвертации используется не текущий курс, а какой-то фиксированный. Плюс округление, если лот небольшой.

 

Нужно было кое-что для себя выяснить, и родился очень простой для воспроизведения пример, который показывает легкость работы с ордерами.


Итак, представим, что запущен советник, который классически работает в OnTick. Поскольку OnTick может прийтись на любое время состояния торгового окружения Терминала, то интересно посмотреть, что же советник может увидеть. Поэтому состояния, с которыми может столкнуться OnTick-советник, выцепил следующим способом.

#define TOSTRING(A) #A + " = " + (string)(A) + " "

void OnTradeTransaction( const MqlTradeTransaction&, const MqlTradeRequest&, const MqlTradeResult& )
{
  static int i = 0;
  
  Print(i++);
  
  if (HistorySelect(0, INT_MAX))
    Print(TOSTRING(PositionsTotal()) + TOSTRING(OrdersTotal()) + TOSTRING(HistoryDealsTotal()) + TOSTRING(HistoryOrdersTotal()));
        
  Print("----------------");
}

Этот код просто распечатывает, сколько текущих позиций/ордеров и сколько закрытых сделок/ордеров.


Запускаем и просто руками открываем позицию и закрываем. Больше ничего. У меня получилась такая распечатка (от запуска к запуску может меняться).

        // Открываем позицию руками.

        0
        PositionsTotal() = 0 OrdersTotal() = 1 HistoryDealsTotal() = 25 HistoryOrdersTotal() = 25 
        ----------------
        1
        PositionsTotal() = 0 OrdersTotal() = 1 HistoryDealsTotal() = 25 HistoryOrdersTotal() = 25 
        ----------------
        2
        PositionsTotal() = 0 OrdersTotal() = 1 HistoryDealsTotal() = 25 HistoryOrdersTotal() = 25 
        ----------------
        3
        PositionsTotal() = 0 OrdersTotal() = 1 HistoryDealsTotal() = 25 HistoryOrdersTotal() = 25 
        ----------------
        4
        PositionsTotal() = 0 OrdersTotal() = 1 HistoryDealsTotal() = 25 HistoryOrdersTotal() = 25 
        ----------------
        5 // Открывающий позицию ордер исчез полностью - нет среди живых и мертвых.
        PositionsTotal() = 0 OrdersTotal() = 0 HistoryDealsTotal() = 25 HistoryOrdersTotal() = 25 
        ----------------
        6 // Открылась позиция, но нет соответствующей ей сделки.
        PositionsTotal() = 1 OrdersTotal() = 0 HistoryDealsTotal() = 25 HistoryOrdersTotal() = 26 
        ----------------
        7
        PositionsTotal() = 1 OrdersTotal() = 0 HistoryDealsTotal() = 26 HistoryOrdersTotal() = 26 
        ----------------

        // Закрываем позицию руками.
        8 // Позиция и закрывающий ее ордер.
        PositionsTotal() = 1 OrdersTotal() = 1 HistoryDealsTotal() = 26 HistoryOrdersTotal() = 26 
        ----------------
        9
        PositionsTotal() = 1 OrdersTotal() = 1 HistoryDealsTotal() = 26 HistoryOrdersTotal() = 26 
        ----------------
        10
        PositionsTotal() = 1 OrdersTotal() = 1 HistoryDealsTotal() = 26 HistoryOrdersTotal() = 26 
        ----------------
        11
        PositionsTotal() = 1 OrdersTotal() = 1 HistoryDealsTotal() = 26 HistoryOrdersTotal() = 26 
        ----------------
        12 // Позиция закрыта, но закрывающий ее ордер продолжает висеть.
        PositionsTotal() = 0 OrdersTotal() = 1 HistoryDealsTotal() = 27 HistoryOrdersTotal() = 26 
        ----------------
        13 // Закрывающий позицию ордер полностью исчез - нет среди мертвых/живых.
        PositionsTotal() = 0 OrdersTotal() = 0 HistoryDealsTotal() = 27 HistoryOrdersTotal() = 26 
        ----------------
        14
        PositionsTotal() = 0 OrdersTotal() = 0 HistoryDealsTotal() = 27 HistoryOrdersTotal() = 26 
        ----------------
        15
        PositionsTotal() = 0 OrdersTotal() = 0 HistoryDealsTotal() = 27 HistoryOrdersTotal() = 27 
        ----------------

Итак, OnTick-советник может нарваться на любую из этих 16-ти ситуаций, интересные из которых прокомментировал выше.

Специально пример не подбирал. Запустил и запостил результат. Запуски могут давать и другие интересные варианты.


Мне удалось прокомментировать результаты, потому что я точно знал, что делал (руками открывал одну единственную позицию и закрывал ее).

Каково советнику, который не знает этого? Просто представим, что на счете параллельно работает несколько советников. Легкость разбора возникающей там каши из симбиоза ситуаций выше, думаю, очевидна.


Лаконичный код приложен, воспроизвести может каждый.

 
fxsaber:

Нужно было кое-что для себя выяснить, и родился очень простой для воспроизведения пример, который показывает легкость работы с ордерами.


Итак, представим, что запущен советник, который классически работает в OnTick. Поскольку OnTick может прийтись на любое время состояния торгового окружения Терминала, то интересно посмотреть, что же советник может увидеть. Поэтому состояния, с которыми может столкнуться OnTick-советник, выцепил следующим способом.

Этот код просто распечатывает, сколько текущих позиций/ордеров и сколько закрытых сделок/ордеров.


Запускаем и просто руками открываем позицию и закрываем. Больше ничего. У меня получилась такая распечатка (от запуска к запуску может меняться).

Итак, OnTick-советник может нарваться на любую из этих 16-ти ситуаций, интересные из которых прокомментировал выше.

Специально пример не подбирал. Запустил и запостил результат. Запуски могут давать и другие интересные варианты.


Мне удалось прокомментировать результаты, потому что я точно знал, что делал (руками открывал одну единственную позицию и закрывал ее).

Каково советнику, который не знает этого? Просто представим, что на счете параллельно работает несколько советников. Легкость разбора возникающей там каши из симбиоза ситуаций выше, думаю, очевидна.


Лаконичный код приложен, воспроизвести может каждый.

Вам следовало-бы разобраться сколько раз вызывается OnTradeTransaction и что в какой момент можно получить.

TRADE_TRANSACTION_ORDER_ADD

Добавление нового открытого ордера.

TRADE_TRANSACTION_ORDER_UPDATE

Изменение открытого ордера. К данным изменениям относятся не только явные изменения со стороны клиентского терминала или торгового сервера, но также и изменение его состояния при выставлении (например, переход из состояния ORDER_STATE_STARTED в ORDER_STATE_PLACED или из ORDER_STATE_PLACED в ORDER_STATE_PARTIAL и т.д.).

TRADE_TRANSACTION_ORDER_DELETE

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

TRADE_TRANSACTION_DEAL_ADD

Добавление сделки в историю. Осуществляется в результате исполнения ордера или проведения операций с балансом счета.

TRADE_TRANSACTION_DEAL_UPDATE

Изменение сделки в истории. Возможны ситуации, когда ранее исполненная сделка изменяется на сервере. Например, сделка была изменена во внешней торговой системе (бирже), куда она была выведена брокером.

TRADE_TRANSACTION_DEAL_DELETE

Удаление сделки из истории. Возможны ситуации, когда ранее исполненная сделка удаляется на сервере. Например, сделка была удалена во внешней торговой системе (бирже), куда она была выведена брокером.

TRADE_TRANSACTION_HISTORY_ADD

Добавление ордера в историю в результате исполнения или отмены.

TRADE_TRANSACTION_HISTORY_UPDATE

Изменение ордера, находящегося в истории ордеров. Данный тип предусмотрен для расширения функциональности на стороне торгового сервера.

TRADE_TRANSACTION_HISTORY_DELETE

Удаление ордера из истории ордеров. Данный тип предусмотрен для расширения функциональности на стороне торгового сервера.

TRADE_TRANSACTION_POSITION

Изменение позиции, не связанное с исполнением сделки. Данный тип транзакции свидетельствует именно о том, что позиция была изменена на стороне торгового сервера. У позиции может быть изменен объем, цена открытия, а также уровни Stop Loss и Take Profit. Информация об изменениях передается в структуре MqlTradeTransaction через обработчик OnTradeTransaction. Изменение позиции (добавление, изменение или ликвидация) в результате совершения сделки не влечет за собой появление транзакции TRADE_TRANSACTION_POSITION.

TRADE_TRANSACTION_REQUEST

Уведомление о том, что торговый запрос обработан сервером, и результат его обработки получен. Для транзакций данного типа в структуре MqlTradeTransaction необходимо анализировать только одно поле - type (тип транзакции). Для получения дополнительной информации необходимо анализировать второй и третий параметры функции OnTradeTransaction (request и result).

 
Alexey Viktorov:

Вам следовало-бы разобраться сколько раз вызывается OnTradeTransaction и что в какой момент можно получить.

Вроде, разжевал максимально.

Форум по трейдингу, автоматическим торговым системам и тестированию торговых стратегий

Великий и ужасный МТ4 навсегда (или как грамотно выработать стратегию перехода)

fxsaber, 2021.05.03 12:48

Итак, OnTick-советник может нарваться на любую из этих 16-ти ситуаций, интересные из которых прокомментировал выше.

 
fxsaber:
Вроде, разжевал максимально.

При каких делах OnTick() если вы всё это обрабатываете в OnTradeTransaction

Получите причину вызова OnTradeTransaction и соответственно обработайте то, что доступно при этом вызове.
 
Alexey Viktorov:

При каких делах OnTick() если вы всё это обрабатываете в OnTradeTransaction

Получите причину вызова OnTradeTransaction и соответственно обработайте то, что доступно при этом вызове.

Возможно, кто-то из форумчан объяснит. У меня не выходит.

 
Alexey Viktorov:

При каких делах OnTick() если вы всё это обрабатываете в OnTradeTransaction

Получите причину вызова OnTradeTransaction и соответственно обработайте то, что доступно при этом вызове.

В OnTick абсолютно все эти странности на месте. Просто сделать легко воспроизводимый пример с OnTick затруднительно. В качестве примера был выбран OnTradeTransaction, но сути это не меняет.

 
traveller00:

В OnTick абсолютно все эти странности на месте. Просто сделать легко воспроизводимый пример с OnTick затруднительно. В качестве примера был выбран OnTradeTransaction, но сути это не меняет.

Продолжайте подражать дон Кихоту…

 
fxsaber:

нет среди живых и мертвых

Было бы здорово обойти этот момент на уровне MT4Orders..

Сейчас случаются задвоения ордеров, к сожалению. Скорее всего, из-за этого.