Библиотеки: MT4Orders - страница 76

 
fxsaber #:

EX5 из телеграма выдает false?

Наверное, это самый надежный способ исключить несоответствие версий исходников.

 
Пишите в EX5 личные сообщения, сейчас у меня нет доступа к телеграм
 

С включенной директивой #define MT4ORDERS_FASTHISTORY_OFF не компилируется - выдает кучу ошибок.

Ранее приходилось эту директиву включать, потому что без неё не доступен некоторый функционал (вот тут обсуждали), используемый в статье. Если функционал по-прежнему урезанный, желательно поправить.

Библиотеки: MT4Orders - Попробуйте отключить этот медленный режим. Выделенная ссылка отвечает за игнорирование закрытых позиций по CloseBy, а поиск соответствующего выхода
Библиотеки: MT4Orders - Попробуйте отключить этот медленный режим. Выделенная ссылка отвечает за игнорирование закрытых позиций по CloseBy, а поиск соответствующего выхода
  • 2019.09.27
  • www.mql5.com
что такой простой код не работал корректно в MT5 со старой версией библиотеки. Было бы очень желательно указать как минимум в шапке комменатриев исходника. а поиск соответствующего выхода как раз обложен условной компиляцией на MT4ORDERS
 
Stanislav Korotky #:

С включенной директивой #define MT4ORDERS_FASTHISTORY_OFF не компилируется - выдает кучу ошибок.

Это исторический рудимент, удалить который руки не доходят.

MQ столько головной боли создали, что только навороченные варианты стоит использовать.

Должно быть масштабное обновление библиотеки, несмотря на странное отсутствие баг-репортов. Пока не готово.

 
OrderSelect(i, SELECT_BY_POS)

В этой операции всегда на младших индексах стоят открытые позиции, на старших - отложенные ордера.

С помощью этого факта можно несколько ускорять поиск нужных MT4-ордеров.

 

Возник интерес, возможно ли обойти по скорости Тестер там, где на это не должно быть шансов?

Написал советник "без шансов" - максимально оптимизированный по скорости.

#include <MT4Orders.mqh> // https://www.mql5.com/ru/code/16006

input int inAmountMagics = 50; // Сколько ТС эмулировать

// Для каждой ТС открываем позицию и отложку. MT4-код для лаконичности.
void OnInit()
{
  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( const int Type, const int 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);
  }
  else
    for (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;
double OnTester() { return(OnTesterValue); }

void OnTick()
{
  // Симулируем работу по всем ТС.
  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 секунда на выполнение. Для одного дня по реальным тикам что-то очень много. Но что есть.
 
fxsaber #:

81 секунда на выполнение. Для одного дня по реальным тикам что-то очень много. Но что есть.

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

Библиотеки: Virtual

fxsaber, 2023.03.01 20:36

OnTester result 54790620.97344553
EURCAD,M1: 192394 ticks, 1440 bars generated. Environment synchronized in 0:00:00.023. Test passed in 0:00:46.653 (including ticks preprocessing 0:00:00.016).

Контрольная сумма совпадает. Получилось ускориться почти в два раза.

Непросто, но получилось.

 
fxsaber #:

Написал советник "без шансов" - максимально оптимизированный по скорости.

Простой способ ускорения.
 

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

Библиотеки: MT4Orders

fxsaber, 2022.07.20 00:39

// Список изменений:
// 20.07.2022
//   Add: Добавлена OrderLotsOpen() - полный объем позиции/ордера перед закрытием/удалением. Корректно работает только в ByPass-режиме.

На том же примере (открыли 1 лот и закрыли постепенно его по 0.1, 0.2, 0.3 и 0.4 лота), но с другой визуализацией.


В верхней части картинки OrderLotsOpen() в красных рамках.
 

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

Билд 3802, __MT4ORDERS__ "2022.07.20" 

Условная функция, вызываемая в эксперте на каждом тике. Тест в тестере стратегий мт5.  

	datetime get_last_order_close_time () {
                datetime last_close_time=0;

                for ( int i = OrdersHistoryTotal() - 1; i >= 0; i-- ) {
                        if ( !OrderSelect ( i, SELECT_BY_POS, MODE_HISTORY )) {
                                continue;
                        }
         		last_close_time=OrderCloseTime();
		        return last_close_time;
                }

                return last_close_time;
        }

Количество сделок в районе 26 тысяч. Время теста  около 1 часа 10 минут.

Убираем функцию из кода, время теста стало около 17 минут.

Переписываю эту же функцию с использованием функционала МТ5:

	datetime get_last_order_close_timeMT5 () {
                datetime last_close_time=0;
                HistorySelect(0,TimeCurrent()); 

                for ( int i = HistoryDealsTotal() - 1; i >= 0; i-- ) {
                        
                        ulong ticket=HistoryDealGetTicket(i);
                        
                        if((ENUM_DEAL_ENTRY)HistoryDealGetInteger(ticket,DEAL_ENTRY)==DEAL_ENTRY_OUT)
                        {
                           last_close_time=(datetime)HistoryDealGetInteger(ticket,DEAL_TIME);
                           return last_close_time;
                        }                       
                }

                return last_close_time;
        }

Время теста в районе 18 минут.

Откатываю библиотеку до версии  __MT4ORDERS__ "2020.01.12" и компилю эксперта  в билде 2980.

Время работы эксперта с функцией get_last_order_close_time  - в районе 20 минут.

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