Для удобства. Из MqlTradeTransaction вызывается небольшая функция. В которой уже путем перебора элементов класса находиться нужный элемент. И уже для этого элемента вызывается одна из функций класса, которая делает, что-то полезное.
Опишите, пожалуйста, более подробно, что именно Вы хотите получить? Зачем из OnTradeTransaction Вы что-то вызываете?
Сначала просто словами, потом поправим в нужное русло.
User_mt5: Исполняется пользовательская функция Abc(), в которой реализован длинный (по времени) алгоритм. В течение времени исполнения этой функции имеют место события, например, - Trade, Timer и пр. Можно ли не завершая исполнение функции Abc() узнать о том факте, что эти события произошли?
Нет. Пока одна функция считает, все остальное будет пропущено.
Это аналогично Функция Sleep() - то есть пока Ваша функция очень долго считает, её поведение анfлогично Sleep - все остальные события будут пропущены.
Второе: для визуализации результатов можно выдрать из примера OrderSendAsync этот блок кода
//+------------------------------------------------------------------+ //| TradeTransaction function | //+------------------------------------------------------------------+ voidOnTradeTransaction(constMqlTradeTransaction &trans,
constMqlTradeRequest &request,
constMqlTradeResult &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(constMqlTradeTransaction &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(constMqlTradeRequest &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(constMqlTradeResult &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;
}
и вставить его в советник, который навесить на график. Затем вручную можно открывать/закрывать позиции и смотреть на распечатки результатов во вкладке "Эксперты".
Опишите, пожалуйста, более подробно, что именно Вы хотите получить? Зачем из 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.
На данной вкладке отображается журнал компиляции программ, содержащий сообщения об использованных при компиляции файлах, а также ошибки и предупреждения, возникшие в этом процессе. — описание события. Иконки, расположенные слева от описания свидетельствуют о типе события. означает ошибку, — предупреждение, а — информационное сообщение; Если...
Для удобства. Из MqlTradeTransaction вызывается небольшая функция. В которой уже путем перебора элементов класса находиться нужный элемент. И уже для этого элемента вызывается одна из функций класса, которая делает, что-то полезное.
Опишите, пожалуйста, более подробно, что именно Вы хотите получить? Зачем из OnTradeTransaction Вы что-то вызываете?
Сначала просто словами, потом поправим в нужное русло.
Исполняется пользовательская функция Abc(), в которой реализован длинный (по времени) алгоритм.
В течение времени исполнения этой функции имеют место события, например, - Trade, Timer и пр.
Можно ли не завершая исполнение функции Abc() узнать о том факте, что эти события произошли?
Нет. Пока одна функция считает, все остальное будет пропущено.
Это аналогично Функция Sleep() - то есть пока Ваша функция очень долго считает, её поведение анfлогично Sleep - все остальные события будут пропущены.
...
Абсолютно всё прозрачно в OnTradeTransaction.
Первое: Структура MqlTradeTransaction заполняется по-разному в зависимости от типа торговой транзакции (ENUM_TRADE_TRANSACTION_TYPE).
читать здесь: Структура торговой транзакции (MqlTradeTransaction))
Второе: для визуализации результатов можно выдрать из примера OrderSendAsync этот блок кода
и вставить его в советник, который навесить на график. Затем вручную можно открывать/закрывать позиции и смотреть на распечатки результатов во вкладке "Эксперты".
Нет. Пока одна функция считает, все остальное будет пропущено.
Это аналогично Функция Sleep() - то есть пока Ваша функция очень долго считает, её поведение анfлогично Sleep - все остальные события будут пропущены.
Спасибо. Это прискорбно.
И как же тогда эффективно использовать ресурс ПК? Опять зацикленный код и периодический опрос параметров?
Абсолютно всё прозрачно в OnTradeTransaction.
Спасибо за ответ, я в общем-то так и сделал. Пока больше вопросов чем понимания..
Опишите, пожалуйста, более подробно, что именно Вы хотите получить? Зачем из OnTradeTransaction Вы что-то вызываете?
Сначала просто словами, потом поправим в нужное русло.
Я понял, что проблема не в 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.
Я понял, что проблема не в 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
Форум по трейдингу, автоматическим торговым системам и тестированию торговых стратегий
Новая версия платформы MetaTrader 5 build 1730: Проекты в MetaEditor и синтетические инструменты
Renat Fatkhullin, 2017.12.28 08:59
В 1730 билде мы нашли и исправили эту ошибку(теперь сбрасываем кеш при неудаче поиска), в результате чего проявилась ваша ошибка
В любой момент доступна только информация об 1 (выбранной) позиции :
Вы констатируете факт или справку ? С помощью поиска нигде ничего подобного не нашел.