Вопросы от начинающих MQL5 MT5 MetaTrader 5 - страница 815

 
pivomoe:
Я просто не могу понять, нормально ли то, что ..

Здесь многое трудно понять. В частности, разбираясь с последовательностью транзакций, я обнаружил, что в ряде случаев присутствуют несуразности.
Например, при открытии позиции сначала формально открывается рыночный ордер, который потом превращается в позицию. Однако, в процессе этой пулемётной серии транзакций есть такая ситуация, когда позиция уже открыта, а ордер ещё не закрыт. Ясно, что это одно и то же событие, но транзакции организованы поштучно, выдаются последовательно, и при таком подходе в принципе невозможно правильно отразить преобразование рыночного ордера в позицию.

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

Кстати о птичках.

Знаете ли вы, что рыночные ордера выдаются в этих транзакциях с нулевой ценой?
Вот, хочет человек, к примеру, открыть позицию Buy по цене 1.2000, Sl= 1.1000, Тр=1.3000.
При исполнении этой операции первым делом появляется транзакция, в которой отражён рыночный ордер, с такими данными: 
Sl= 1.1000, Тр=1.3000, т.е. с заданными циферками, а Price = 0 (равно нулю). Такой-себе рыночный ордер с нулевой ценой :) И думайте что хотите.

 
pivomoe:

Для удобства. Из MqlTradeTransaction вызывается небольшая функция. В которой уже путем перебора элементов класса находиться нужный элемент. И уже для этого элемента вызывается одна из функций класса, которая делает, что-то полезное.


Опишите, пожалуйста, более подробно, что именно Вы хотите получить? Зачем из OnTradeTransaction Вы что-то вызываете? 

Сначала просто словами, потом поправим в нужное русло.

 
User_mt5:
Исполняется пользовательская функция Abc(), в которой реализован длинный (по времени) алгоритм.
В течение времени исполнения этой функции имеют место события, например, - Trade, Timer и пр.
Можно ли не завершая исполнение функции Abc() узнать о том факте, что эти события произошли?

Нет. Пока одна функция считает, все остальное будет пропущено.

Это аналогично Функция Sleep() - то есть пока Ваша функция очень долго считает, её поведение анfлогично Sleep - все остальные события будут пропущены.

 
User_mt5:

...


Абсолютно всё прозрачно в OnTradeTransaction.

Первое: Структура MqlTradeTransaction заполняется по-разному в зависимости от типа торговой транзакции (ENUM_TRADE_TRANSACTION_TYPE).

читать здесь: Структура торговой транзакции (MqlTradeTransaction))

Второе: для визуализации результатов можно выдрать из примера OrderSendAsync этот блок кода

//+------------------------------------------------------------------+ 
//| TradeTransaction function                                        | 
//+------------------------------------------------------------------+ 
void OnTradeTransaction(const MqlTradeTransaction &trans, 
                        const MqlTradeRequest &request, 
                        const MqlTradeResult &result) 
  { 
//--- получим тип транзакции в виде значения перечисления  
   ENUM_TRADE_TRANSACTION_TYPE type=(ENUM_TRADE_TRANSACTION_TYPE)trans.type; 
//--- если транзакция является результатом обработки запроса, выведем только её название 
   if(type==TRADE_TRANSACTION_REQUEST) 
     { 
      Print(EnumToString(type)); 
      //--- выведем строковое описание обработанного запроса 
      Print("------------RequestDescription\r\n",RequestDescription(request)); 
      //--- выведем описание результата запроса 
      Print("------------ResultDescription\r\n",TradeResultDescription(result)); 
      //--- запомним тикет ордера для его удаления на следующей обработке в OnTick() 
      if(result.order!=0) 
        { 
         //--- удалим этот ордер по его тикету при следующем вызове OnTick() 
         order_ticket=result.order; 
         Print(" Тикет отложенного ордера ",order_ticket,"\r\n"); 
        } 
     } 
   else // для транзакций другого типа выведем полное описание 
//--- выведем описание полученной транзакции в Журнал 
      Print("------------TransactionDescription\r\n",TransactionDescription(trans));
 
//---      
  } 
//+------------------------------------------------------------------+ 
//| Возвращает текстовое описание транзакции                         | 
//+------------------------------------------------------------------+ 
string TransactionDescription(const MqlTradeTransaction &trans) 
  { 
//---  
   string desc=EnumToString(trans.type)+"\r\n"; 
   desc+="Symbol: "+trans.symbol+"\r\n"; 
   desc+="Deal ticket: "+(string)trans.deal+"\r\n"; 
   desc+="Deal type: "+EnumToString(trans.deal_type)+"\r\n"; 
   desc+="Order ticket: "+(string)trans.order+"\r\n"; 
   desc+="Order type: "+EnumToString(trans.order_type)+"\r\n"; 
   desc+="Order state: "+EnumToString(trans.order_state)+"\r\n"; 
   desc+="Order time type: "+EnumToString(trans.time_type)+"\r\n"; 
   desc+="Order expiration: "+TimeToString(trans.time_expiration)+"\r\n"; 
   desc+="Price: "+StringFormat("%G",trans.price)+"\r\n"; 
   desc+="Price trigger: "+StringFormat("%G",trans.price_trigger)+"\r\n"; 
   desc+="Stop Loss: "+StringFormat("%G",trans.price_sl)+"\r\n"; 
   desc+="Take Profit: "+StringFormat("%G",trans.price_tp)+"\r\n"; 
   desc+="Volume: "+StringFormat("%G",trans.volume)+"\r\n"; 
   desc+="Position: "+(string)trans.position+"\r\n"; 
   desc+="Position by: "+(string)trans.position_by+"\r\n"; 
//--- вернем полученную строку 
   return desc; 
  } 
//+------------------------------------------------------------------+ 
//| Возвращает текстовое описание торгового запроса                  | 
//+------------------------------------------------------------------+ 
string RequestDescription(const MqlTradeRequest &request) 
  { 
//--- 
   string desc=EnumToString(request.action)+"\r\n"; 
   desc+="Symbol: "+request.symbol+"\r\n"; 
   desc+="Magic Number: "+StringFormat("%d",request.magic)+"\r\n"; 
   desc+="Order ticket: "+(string)request.order+"\r\n"; 
   desc+="Order type: "+EnumToString(request.type)+"\r\n"; 
   desc+="Order filling: "+EnumToString(request.type_filling)+"\r\n"; 
   desc+="Order time type: "+EnumToString(request.type_time)+"\r\n"; 
   desc+="Order expiration: "+TimeToString(request.expiration)+"\r\n"; 
   desc+="Price: "+StringFormat("%G",request.price)+"\r\n"; 
   desc+="Deviation points: "+StringFormat("%G",request.deviation)+"\r\n"; 
   desc+="Stop Loss: "+StringFormat("%G",request.sl)+"\r\n"; 
   desc+="Take Profit: "+StringFormat("%G",request.tp)+"\r\n"; 
   desc+="Stop Limit: "+StringFormat("%G",request.stoplimit)+"\r\n"; 
   desc+="Volume: "+StringFormat("%G",request.volume)+"\r\n"; 
   desc+="Comment: "+request.comment+"\r\n"; 
//--- вернем полученную строку 
   return desc; 
  } 
//+------------------------------------------------------------------+ 
//| Возвращает текстовое описание результата обработки запроса       | 
//+------------------------------------------------------------------+ 
string TradeResultDescription(const MqlTradeResult &result) 
  { 
//--- 
   string desc="Retcode "+(string)result.retcode+"\r\n"; 
   desc+="Request ID: "+StringFormat("%d",result.request_id)+"\r\n"; 
   desc+="Order ticket: "+(string)result.order+"\r\n"; 
   desc+="Deal ticket: "+(string)result.deal+"\r\n"; 
   desc+="Volume: "+StringFormat("%G",result.volume)+"\r\n"; 
   desc+="Price: "+StringFormat("%G",result.price)+"\r\n"; 
   desc+="Ask: "+StringFormat("%G",result.ask)+"\r\n"; 
   desc+="Bid: "+StringFormat("%G",result.bid)+"\r\n"; 
   desc+="Comment: "+result.comment+"\r\n"; 
//--- вернем полученную строку 
   return desc; 
  }

и вставить его в советник, который навесить на график. Затем вручную можно открывать/закрывать позиции и смотреть на распечатки результатов во вкладке "Эксперты".

 
Vladimir Karputov:

Нет. Пока одна функция считает, все остальное будет пропущено.

Это аналогично Функция Sleep() - то есть пока Ваша функция очень долго считает, её поведение анfлогично Sleep - все остальные события будут пропущены.

Спасибо.  Это прискорбно.
И как же тогда эффективно использовать ресурс ПК? Опять зацикленный код и периодический опрос параметров?

 
Vladimir Karputov:

Абсолютно всё прозрачно в OnTradeTransaction.

Спасибо за ответ, я в общем-то так и сделал. Пока больше вопросов чем понимания..

 
Vladimir Karputov:

Опишите, пожалуйста, более подробно, что именно Вы хотите получить? Зачем из OnTradeTransaction Вы что-то вызываете? 

Сначала просто словами, потом поправим в нужное русло.

Я понял, что проблема не в OnTradeTransaction. Смотрите какой ужас у меня твориться:

Вот код.

 CPositionInfo PositionInfoKotiryemii,PositionInfoVedygii;
 
 if( !PositionInfoKotiryemii.Select("SBRF-3.18") )Print("Не удалось выбрать позицию по символ SBRF-3.18 ");
 if( !PositionInfoVedygii.Select("SBRF-12.17")   )Print("Не удалось выбрать позицию по символ SBRF-12.17 ");

 Print(PositionInfoKotiryemii.Symbol()," Объем ",PositionInfoKotiryemii.Volume()," ",PositionInfoVedygii.Symbol()," Объем ",PositionInfoVedygii.Volume());

А вот результат его выполнения

2017.09.22 10:30:12   Не удалось выбрать позицию по символ SBRF-12.17
2017.09.22 10:30:12    Объем 0.0  Объем 0.0

Меняю строки 2 и 3 местами. т.е код теперь такой

CPositionInfo PositionInfoKotiryemii,PositionInfoVedygii;
 
 if( !PositionInfoVedygii.Select("SBRF-12.17")   )Print("Не удалось выбрать позицию по символ SBRF-12.17 ");
 if( !PositionInfoKotiryemii.Select("SBRF-3.18") )Print("Не удалось выбрать позицию по символ SBRF-3.18 ");
 
 Print(PositionInfoKotiryemii.Symbol()," Объем ",PositionInfoKotiryemii.Volume()," ",PositionInfoVedygii.Symbol()," Объем ",PositionInfoVedygii.Volume());

Получаю вот такой, результат.

2017.09.22 10:30:12   Не удалось выбрать позицию по символ SBRF-12.17
2017.09.22 10:30:12   SBRF-3.18 Объем 1.0 SBRF-3.18 Объем 1.0

В обоих случаях никаких предупреждений компилятор не выдает. Прикрепил код эксперта на 80 строк и настройки тестирования. Брокер БКС. Версия 1730.

Ошибки - Инструменты - Пользовательский интерфейс - Справка по MetaEditor
Ошибки - Инструменты - Пользовательский интерфейс - Справка по MetaEditor
  • www.metatrader5.com
На данной вкладке отображается журнал компиляции программ, содержащий сообщения об использованных при компиляции файлах, а также ошибки и предупреждения, возникшие в этом процессе. — описание события. Иконки, расположенные слева от описания свидетельствуют о типе события. означает ошибку, — предупреждение, а — информационное сообщение; Если...
Файлы:
temp.mq5  7 kb
1.png  11 kb
 
pivomoe:

Я понял, что проблема не в OnTradeTransaction. Смотрите какой ужас у меня твориться:

Вот код.

А вот результат его выполнения

2017.09.22 10:30:12   Не удалось выбрать позицию по символ SBRF-12.17
2017.09.22 10:30:12    Объем 0.0  Объем 0.0

Меняю строки 2 и 3 местами. т.е код теперь такой

Получаю вот такой, результат.

2017.09.22 10:30:12   Не удалось выбрать позицию по символ SBRF-12.17
2017.09.22 10:30:12   SBRF-3.18 Объем 1.0 SBRF-3.18 Объем 1.0

В обоих случаях никаких предупреждений компилятор не выдает. Прикрепил код эксперта на 80 строк и настройки тестирования. Брокер БКС. Версия 1730.

Отвечу на выходных. Извините.

 

Кажется ошибка в том, что пытаетесь получить информацию о более чем 1 позиция, в 1 строка (Print).

В любой момент доступна только информация об 1 (выбранной) позиции :

- во втором случае все правильно, потому что последний Select возвращает true , что вы не проверили.

- а во первом случае : последний Select возвращает false , что вы тоже не проверили, и результат непредсказуем.

..... очевидно Select==false сбрасывает информацию предыдущего Select==true

Причина обращения: