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

 

С включенной директивой #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() в красных рамках.
 

Здравствуйте,

Похоже, что в OrderTicket() есть ошибка.

Это не правильный тикет из истории MT5.


Вот мой код:

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);

  }

 
Cuong Le Van #:

Похоже, что в OrderTicket() есть ошибка.

Это не правильный билет из истории MT5

Очевидно, вы хотите его получить.

// Список изменений:
// 13.03.2019
// Добавить: Добавлена функция OrderTicketID() - PositionID of an MT5 transaction or MT5 position, and the ticket of a pending MT4 order.

Причины подробно описаны здесь.

 
fxsaber #:

Очевидно, вы хотите его получить.


Причины подробно описаны здесь.

Большое спасибо.

Все в порядке с

OrderTicketID()