OnTradeTransaction(): нет Magic number, нет комментария, и & either-or символы? - страница 2

 
Carl Schreiber #:

Но и сделка не является хорошим решением! Вот пример вручную открытой позиции на продажу: в качестве сделки - покупка????


Вставьте такой код в функцию  OnTradeTransaction()

  if(trans.type == TRADE_TRANSACTION_DEAL_ADD)
    Print(EnumToString(trans.type), " ; ", EnumToString(trans.deal_type)

Запустите советник и откройте позицию.

Если вам надо работать с отложенными ордерами, то надо использовать соответствующий тип транзакции.

 
Alexey Viktorov #:

На мой взгляд ненадёжный и запутанный вариант.

Допустим пришёл тип TRADE_TRANSACTION_REQUEST увидели магик… Где его хранить? В локальной переменной? Так она при следующем типе транзакции обнулится. В переменной глобального уровня или статической переменной? А когда её следует обнулить? Ведь иметь в переменной устаревшее значение, на мой взгляд опасно. Описывать варианты возможных проблем не хочется, да и в двух словах не получится. 

Я всего лишь пытался донести до человека, что согласно Документации поля MqlTradeRequest заполняются только при обработке транзакции типа  TRADE_TRANSACTION_REQUEST.

И задачи хранить магик у топикстартера  вроде бы не было... он просто удивлялся, что нуль в магике ))

Документация по MQL5: Константы, перечисления и структуры / Структуры данных / Структура торгового запроса
Документация по MQL5: Константы, перечисления и структуры / Структуры данных / Структура торгового запроса
  • www.mql5.com
Структура торгового запроса - Структуры данных - Константы, перечисления и структуры - Справочник MQL5 - Справочник по языку алгоритмического/автоматического трейдинга для MetaTrader 5
 

И ещё важно знать, что функция  OnTradeTransaction() реагирует на ВСЕ транзакции ВСЕХ инструментов.

Если советник поставлен на график EURUSD а открыть позицию по USDJPY то советник нормально отреагирует на эту транзакцию. 

Следовательно обязательно надо проверять символ сделки.

  if(trans.type == TRADE_TRANSACTION_DEAL_ADD && trans.symbol == _Symbol)
    Print(EnumToString(trans.type), " ; ", EnumToString(trans.deal_type)
 
Carl Schreiber #:

Но и сделка не является хорошим решением! Вот пример вручную открытой позиции на продажу: в качестве сделки - покупка????

Это Вы явно распечатали поля структуры, которые просто не заполнились... DEAL_TYPE_BUY = 0. Поле просто не может быть пустым, соот-но обнулено было. К торговой операции продажи не имело отношения.

 
Denis Kirichenko #:

Я всего лишь пытался донести до человека, что согласно Документации поля MqlTradeRequest заполняются только при обработке транзакции типа  TRADE_TRANSACTION_REQUEST.

И задачи хранить магик у топикстартера  вроде бы не было... он просто удивлялся, что нуль в магике ))

Это понятно. Но ведь посмотреть надо не просто так, а наверняка надо чуть позже использовать. Вот и получается, что магик в одной транзакции, а направление сделки в другой… И как их объединить, не совсем понятно. Или я просто мало экспериментировал…

 
Alexey Viktorov #:

Это понятно. Но ведь посмотреть надо не просто так, а наверняка надо чуть позже использовать. Вот и получается, что магик в одной транзакции, а направление сделки в другой… И как их объединить, не совсем понятно. Или я просто мало экспериментировал…

Ещё и последовательность транзакций не гарантирована ))

Отправка торгового запроса на покупку приводит к цепи торговых транзакций, которые совершаются на торговом счете: 1) запрос  принимается на обработку, 2) далее для счета создается соответствующий ордер на покупку, 3) затем происходит исполнение ордера, 4) удаление исполненного ордера из списка действующих, 5) добавление в историю ордеров, 6) далее добавляется соответствующая сделка в историю и 7) создается новая позиция. Все эти действия являются торговыми транзакциями. Приход каждой такой транзакции в терминал является событием TradeTransaction. При этом очередность поступления этих транзакций в терминал не гарантирована, поэтому нельзя свой торговый алгоритм строить на ожидании поступления одних торговых транзакций после прихода других.

Во время обработки торговых транзакций экспертом при помощи обработчика OnTradeTransaction(), терминал продолжает обрабатывать вновь поступающие торговые транзакции. Таким образом, состояние торгового счета может измениться уже в процессе работы OnTradeTransaction(). Например, пока MQL5-программа обрабатывает событие добавления нового ордера, он может быть исполнен, удален из списка открытых и перемещен в историю. В дальнейшем программа будет уведомлена о всех этих событиях.

Документация по MQL5: Константы, перечисления и структуры / Торговые константы / Типы торговых транзакций
Документация по MQL5: Константы, перечисления и структуры / Торговые константы / Типы торговых транзакций
  • www.mql5.com
Типы торговых транзакций - Торговые константы - Константы, перечисления и структуры - Справочник MQL5 - Справочник по языку алгоритмического/автоматического трейдинга для MetaTrader 5
 
Denis Kirichenko #:

Ещё и последовательность транзакций не гарантирована ))

Это точно. Я помню об этом, но не смог найти сейчас где это написано.

Не знаю как сейчас, а когда я экспериментировал, TRADE_TRANSACTION_REQUEST приходила последней.

 
Это лишь показывает, что OnTradeTransaction() предназначена на стороне сервера для регистрации исполненных ордеров и бронирований, но оставляет пользователя терминала, чьи деньги (возможно, большие деньги) управляются с ее помощью, более или менее в одиночестве.
Это раздражает меня, и я не думал и не ожидал такого от серьезного финансового программного обеспечения.
 
Carl Schreiber #:
Это лишь показывает, что OnTradeTransaction() предназначена на стороне сервера для регистрации исполненных ордеров и бронирований, но оставляет пользователя терминала, чьи деньги (возможно, большие деньги) управляются с ее помощью, более или менее в одиночестве.
Это раздражает меня, и я не думал и не ожидал такого от серьезного финансового программного обеспечения.

Возможно вы ждёте от этой функции не то, что она может дать.

Если взять лопату и пойти косить траву, то плохо будет получаться.

 
Alexey Viktorov #:

Возможно вы ждёте от этой функции не то, что она может дать.

Если взять лопату и пойти косить траву, то плохо будет получаться.

В противном случае, какова цель этой функции, которая автоматически вызывается для торговых событий (но не для всех)?