С включенной директивой #define MT4ORDERS_FASTHISTORY_OFF не компилируется - выдает кучу ошибок.
Ранее приходилось эту директиву включать, потому что без неё не доступен некоторый функционал (вот тут обсуждали), используемый в статье. Если функционал по-прежнему урезанный, желательно поправить.
что такой простой код не работал корректно в MT5 со старой версией библиотеки. Было бы очень желательно указать как минимум в шапке комменатриев исходника. а поиск соответствующего выхода как раз обложен условной компиляцией на MT4ORDERS
Возник интерес, возможно ли обойти по скорости Тестер там, где на это не должно быть шансов?
Написал советник "без шансов" - максимально оптимизированный по скорости.
#include <MT4Orders.mqh> // https://www.mql5.com/ru/code/16006inputint inAmountMagics = 50; // Сколько ТС эмулировать// Для каждой ТС открываем позицию и отложку. MT4-код для лаконичности.voidOnInit()
{
MqlTick Tick;
if (SymbolInfoTick(_Symbol, Tick))
for (int i = 0; i < inAmountMagics; i++)
{
OrderSend(_Symbol, OP_BUY, 1, Tick.ask, 0, 0, 0, NULL, i);
OrderSend(_Symbol, OP_BUYLIMIT, 1, Tick.ask - 1e4*_Point, 0, 0, 0, NULL, i);
}
}
// Сбор информации с нужных позиций/ордеров. Максимально быстрый MT5-код.double CountOrders( constint Type, constint Magic )
{
double Res = 0;
if (Type <= OP_SELL)
{
for (int i = PositionsTotal() - 1; i >= 0; i--)
if (PositionGetTicket(i) && (PositionGetInteger(POSITION_TYPE) == Type) && PositionGetInteger(POSITION_MAGIC) == Magic)
Res += PositionGetDouble(POSITION_PRICE_OPEN) + PositionGetDouble(POSITION_PRICE_CURRENT) +
PositionGetDouble(POSITION_TP) + PositionGetDouble(POSITION_SL);
}
elsefor (int i = OrdersTotal(true) - 1; i >= 0; i--)
if (OrderGetTicket(i) && (OrderGetInteger(ORDER_TYPE) == Type) && OrderGetInteger(ORDER_MAGIC) == Magic)
Res += OrderGetDouble(ORDER_PRICE_OPEN) + OrderGetDouble(ORDER_PRICE_CURRENT) +
OrderGetDouble(ORDER_TP) + OrderGetDouble(ORDER_SL);
return(Res);
}
// Число для контроля корректности альтернативных реализаций.double OnTesterValue = 0;
doubleOnTester() { return(OnTesterValue); }
voidOnTick()
{
// Симулируем работу по всем ТС.for (int i = 0; i < inAmountMagics; i++)
OnTesterValue += CountOrders(POSITION_TYPE_BUY, i) +
CountOrders(POSITION_TYPE_SELL, i) +
CountOrders(ORDER_TYPE_BUY_LIMIT, i) +
CountOrders(ORDER_TYPE_SELL_LIMIT, i);
}
По коду можно возразить, что написан быть медленным. Но в коде эмулируется работа многих "ТС". А много ТС именно так и работают - в первую очередь находят свои позиции/ордера.
OnTester result 54790620.97344553
EURCAD,M1: 192394 ticks, 1440 bars generated. Environment synchronized in 0:00:00.023. Test passed in 0:01:21.775 (including ticks preprocessing 0:00:00.016).
81 секунда на выполнение. Для одного дня по реальным тикам что-то очень много. Но что есть.
// Список изменений:// 20.07.2022// Add: Добавлена OrderLotsOpen() - полный объем позиции/ордера перед закрытием/удалением. Корректно работает только в ByPass-режиме.
На том же примере (открыли 1 лот и закрыли постепенно его по 0.1, 0.2, 0.3 и 0.4 лота), но с другой визуализацией.
В верхней части картинки OrderLotsOpen() в красных рамках.
bool isCopyHistory2(string u_symbol, int master_ticket)
{
int ticket_copy;
bool is_exists = false;
// Получение информации из истории торговлиfor(int i = 0; i < OrdersHistoryTotal(); i++)
{
//---- проверить результат выбораif(OrderSelect(i, SELECT_BY_POS, MODE_HISTORY) == false)
{
Print("Access to history failed with error (", GetLastError(), ")");
continue;
}
// немного работы с порядком
ticket_copy = (int)extract_master_ticket(OrderComment());
if(ticket_copy == master_ticket)
{
//print-for-debug
Print("c ticket: ", OrderTicket()); // ==> это неправильный тикет на MT5
is_exists = true;
break;
}
}
//---if(!is_exists)
Print("New Signal #" + (string)master_ticket);
return(is_exists);
}
// Список изменений:// 13.03.2019// Добавить: Добавлена функция OrderTicketID() - PositionID of an MT5 transaction or MT5 position, and the ticket of a pending MT4 order.
С включенной директивой #define MT4ORDERS_FASTHISTORY_OFF не компилируется - выдает кучу ошибок.
Ранее приходилось эту директиву включать, потому что без неё не доступен некоторый функционал (вот тут обсуждали), используемый в статье. Если функционал по-прежнему урезанный, желательно поправить.
С включенной директивой #define MT4ORDERS_FASTHISTORY_OFF не компилируется - выдает кучу ошибок.
Это исторический рудимент, удалить который руки не доходят.
MQ столько головной боли создали, что только навороченные варианты стоит использовать.
Должно быть масштабное обновление библиотеки, несмотря на странное отсутствие баг-репортов. Пока не готово.
OrderSelect(i, SELECT_BY_POS)В этой операции всегда на младших индексах стоят открытые позиции, на старших - отложенные ордера.
С помощью этого факта можно несколько ускорять поиск нужных MT4-ордеров.
Возник интерес, возможно ли обойти по скорости Тестер там, где на это не должно быть шансов?
Написал советник "без шансов" - максимально оптимизированный по скорости.
По коду можно возразить, что написан быть медленным. Но в коде эмулируется работа многих "ТС". А много ТС именно так и работают - в первую очередь находят свои позиции/ордера.
81 секунда на выполнение. Для одного дня по реальным тикам что-то очень много. Но что есть.81 секунда на выполнение. Для одного дня по реальным тикам что-то очень много. Но что есть.
Форум по трейдингу, автоматическим торговым системам и тестированию торговых стратегий
Библиотеки: Virtual
fxsaber, 2023.03.01 20:36
Контрольная сумма совпадает. Получилось ускориться почти в два раза.
Непросто, но получилось.
Написал советник "без шансов" - максимально оптимизированный по скорости.
Форум по трейдингу, автоматическим торговым системам и тестированию торговых стратегий
Библиотеки: MT4Orders
fxsaber, 2022.07.20 00:39
На том же примере (открыли 1 лот и закрыли постепенно его по 0.1, 0.2, 0.3 и 0.4 лота), но с другой визуализацией.

В верхней части картинки OrderLotsOpen() в красных рамках.Здравствуйте,
Похоже, что в OrderTicket() есть ошибка.
Это не правильный тикет из истории MT5.
Вот мой код:
Похоже, что в OrderTicket() есть ошибка.
Это не правильный билет из истории MT5
Очевидно, вы хотите его получить.
Причины подробно описаны здесь.
Очевидно, вы хотите его получить.
Причины подробно описаны здесь.
Большое спасибо.
Все в порядке с
OrderTicketID()