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

 
Aleksey Vyazmikin #:

Ну, для меня кроссплатформенность подразумевает возможность комплексного переноса кода без редактирования

Это же не конвертер, а возможность торговлю писать в MT5 через простой MT4-style.

 
fxsaber #:

Это же не конвертер, а возможность торговлю писать в MT5 через простой MT4-style.

Возможно я не так понял, так как ухватился за идею возможности использования одного кода на двух платформах.

 
Aleksey Vyazmikin #:

Возможно я не так понял, так как ухватился за идею возможности использования одного кода на двух платформах.

Часть MT5-Маркета написана через эту библиотеку. Основная причина - легкость.


На тему ошибок.

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

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

fxsaber, 2017.02.08 14:16

Изучив GetLastError, сделал вывод, что дополнять его нецелесообразно.

// Список изменений:
// 08.02.2017:
//   Add: Переменные MT4ORDERS::LastTradeRequest и MT4ORDERS::LastTradeResult содержат соответствующие данные MT5-OrderSend.

Теперь можно получать полностью все данные MT5-OrderSend.
 

Print(MT4ORDERS::LastTradeResult.retcode); // Operation return code
Print(MT4ORDERS::LastTradeResult.retcode_external); // Return code of an external trading system 

Сами MT5-коды здесь. Сравните с MT4-кодами.


ЗЫ Обратите внимание, что в MT5 GetLastError() не возвращает торговые ошибки. Поэтому, если хочется делать, как в MT4, нужно генерировать свою соответствующую ошибку через SetUserError. Но и там  ERR_USER_ERROR_FIRST не даст достигнуть MT4-варианта.

 

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

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

fxsaber, 2022.07.20 00:39

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

Пример.

#define MT4ORDERS_BYPASS_MAXTIME 1000000 // Максимальное время (в мкс.) на ожидание синхронизации торгового окружения
#include <MT4Orders.mqh>

#define Ask SymbolInfoDouble(_Symbol, SYMBOL_ASK)

#define PRINT(A) Print(#A + " = " + (string)(A) + "\n")


void OnStart()
{
  const ulong Ticket = OrderSend(_Symbol, OP_BUY, 1, Ask, 0, 0, 0); // Открыли позицию на один лот.

  for (int i = 1; i <= 4; i++)    
    if (OrderSelect(Ticket, SELECT_BY_TICKET) && !OrderCloseTime())
    {
      OrderClose(OrderTicket(), 0.1 * i, OrderClosePrice(), 0); // Закрываем по 0.1, 0.2, 0.3, ... лота.
      
      if (OrderSelect(OrdersHistoryTotal() - 1, SELECT_BY_POS, MODE_HISTORY))
      {
        OrderPrint();
        
        PRINT(OrderLotsOpen()); // Объем позиции перед соответствующим закрытием. Берется из истории торговли.
      }
    }
}


Результат.

#50167020751 2022.07.20 09:58:58.401 buy 0.10 EURUSD 1.02471 0.00000 0.00000 2022.07.20 09:58:58.457 1.02468 0.00 0.00 -0.29 0
OrderLotsOpen() = 1.0

#50167020753 2022.07.20 09:58:58.401 buy 0.20 EURUSD 1.02471 0.00000 0.00000 2022.07.20 09:58:58.512 1.02468 0.00 0.00 -0.59 0
OrderLotsOpen() = 0.9

#50167020754 2022.07.20 09:58:58.401 buy 0.30 EURUSD 1.02471 0.00000 0.00000 2022.07.20 09:58:58.567 1.02468 0.00 0.00 -0.88 0
OrderLotsOpen() = 0.7

#50167020755 2022.07.20 09:58:58.401 buy 0.40 EURUSD 1.02471 0.00000 0.00000 2022.07.20 09:58:58.622 1.02468 0.00 0.00 -1.17 0
OrderLotsOpen() = 0.4
 

Особенность представления библиотекой закрытых позиций по сравнению с MT5.


Торговая ситуация.

  1. Открыт BuyLimit на 1 лот.
  2. BuyLimit исполнился частично на 0.4 лота в 12:00.
  3. Позиция на 0.4 лота закрылась в 13:00.
  4. Остаток BuyLimit исполнился - 0.6 лота в 14:00.
  5. Позиция на 0.6 лота закрылась в 15:00.

MT5 покажет, что была одна позиция, которая открылась в 12:00, а закрылась в 15:00. При этом цены открытия/закрытия этой позиции могут быть очень странными.


MT4Orders покажет, что было две позиции: одна открылась в 12:00 и закрылась в 13:00, другая - 14:00-15:00. Цены открытия/закрытия будут адекватными.

 
fxsaber #:

Часть MT5-Маркета написана через эту библиотеку. Основная причина - легкость.

Да это достижение. Однако, проверка ошибок при приеме в маркет не все ситуации воссоздает.

fxsaber #:

На тему ошибок.

Сами MT5-коды здесь. Сравните с MT4-кодами.


ЗЫ Обратите внимание, что в MT5 GetLastError() не возвращает торговые ошибки. Поэтому, если хочется делать, как в MT4, нужно генерировать свою соответствующую ошибку через SetUserError. Но и там  ERR_USER_ERROR_FIRST не даст достигнуть MT4-варианта.

Спасибо за информацию, я сам в этом не силен.

Правильно ли я понимаю, что достаточно заменить  

int er=GetLastError();

 на 

int er=MT4ORDERS::LastTradeResult.retcode_external;

и уже обрабатывать новые коды ошибок? 

Кстати, не нашел аналоги ошибок для MT5, в MT4 они: 135, 145, 146 - есть ли они?

 
Aleksey Vyazmikin #:

Да это достижение. Однако, проверка ошибок при приеме в маркет не все ситуации воссоздает.

К сожалению, у меня только теоретические представления о Маркете. Практики прохождения проверок не имею.

Правильно ли я понимаю, что достаточно заменить и уже обрабатывать новые коды ошибок?

Правильно. Только retcode. Аналог ResetLastError по той же схеме - присвоение нуля.

Кстати, не нашел аналоги ошибок для MT5, в MT4 они: 135, 145, 146 - есть ли они?

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

 
fxsaber #:

Правильно. Только retcode. Аналог ResetLastError по той же схеме - присвоение нуля.

Так может сброс ошибки интегрировать как то в Ваш класс можно? А то четверка в этом не нуждалась как то.

Или достаточно просто вызвать информацию о последней ошибки, а потом сразу её сбросить, т.е. поменять местами функции, что у Вас в примере?

fxsaber #:

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

Да вот искал такую таблицу и не нашел. Ошибки не всегда же в коде - бывают проблемы на стороне ДЦ.

Я так понял, что если проблема любого рода с работой с ордерами, то через GetLastError(); возвращается код 4756, что уже не плохо, если так.

 
Aleksey Vyazmikin #:

Так может сброс ошибки интегрировать как то в Ваш класс можно? А то четверка в этом не нуждалась как то.

Или достаточно просто вызвать информацию о последней ошибки, а потом сразу её сбросить, т.е. поменять местами функции, что у Вас в примере?

Не вижу необходимости сбрасывать. Сказал для доп. совместимости с тем, как, предполагаю, работают в MT4.

 
fxsaber #:

Не вижу необходимости сбрасывать. Сказал для доп. совместимости с тем, как, предполагаю, работают в MT4.

Я всё же уточню, это ошибки какие ниже вызываемым кодом?

Print(MT4ORDERS::LastTradeResult.retcode); // Operation return code

А то похожие вещи - что нужно не пойму - этот же код ниже возвращает ошибки из структуры  MqlTradeResult ?

Print(MT4ORDERS::LastTradeResult.retcode_external); // Return code of an external trading system 
Причина обращения: