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

 
fxsaber #:

В Тестере для первого удачного выполнения MT5-OrderSend/OrderSendAsync всегда MqlTradeResult.request_id == 0.

Считаю это поведение недоработкой со стороны MQ, т.к. request_id должен начинаться с единицы.


Это одна из причин, почему в MT4Orders реализация OrderSendAsync для Тестера не сделана. Есть и другая менее веская причина (из книги).

Thank you for the additional information!
 

Прошу прощения, не осилил всю ветку. Чтобы получить количество открытых позиций без ордеров, есть какая-то перегрузка OrdersTotal() или надо писать подобный код каждый раз:

int GetOpenTradesCount()
{
    int count = 0;
    for (int i = 0; i < OrdersTotal(); i++)
    {
        if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) // Select order by position
        {
            if (OrderType() == OP_BUY || OrderType() == OP_SELL) // Only count market orders
            {
                count++;
            }
        }
    }
    return count;
}
 
mbjen #:

Чтобы получить количество открытых позиций без ордеров, есть какая-то перегрузка OrdersTotal() или надо писать подобный код каждый раз:

#include <MT4Orders.mqh>

int GetOpenTradesCount1()
{
  return(PositionsTotal());
}

int GetOpenTradesCount2()
{
  return(OrdersTotal() - OrdersTotal(false));
}

Ваш исходный вариант лучше тем, что посчитает MT5-ордер на открытие позиции, как открытую позицию. Чего не сделает GetOpenTradesCount1.

Ваш исходный вариант лучше тем, что не будет учитывать MT5-ордер на закрытие позиции. Чего не сделает GetOpenTradesCount2.

 
fxsaber #:

OrdersTotal(false)

'OrdersTotal' - wrong parameters count 

 
mbjen #:

OrdersTotal(false)

'OrdersTotal' - wrong parameters count 

#include <MT4Orders.mqh>
 
fxsaber #:
аа инклюд был ниже в коде. Спасибо.
 
fxsaber #:

Ваш исходный вариант лучше тем, что посчитает MT5-ордер на открытие позиции, как открытую позицию. Чего не сделает GetOpenTradesCount1.

Ваш исходный вариант лучше тем, что не будет учитывать MT5-ордер на закрытие позиции. Чего не сделает GetOpenTradesCount2.

а если Virtual библиотека еще подключена, то ругается на OrdersTotal(false)

 
// Список изменений:
// 26.03.2025
//   Fix: OrderType лучше обрабатывает виды балансовых операций.
//   Fix: В ByPass-режиме при работе с историей торговли уменьшено количество обращений к HistorySelect.
//   Add: Макрос MT4ORDERS_LIBRARY включает library-режим работы библиотеки: #import "MT4Orders.ex5".
 

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

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

fxsaber, 2025.03.26 10:50

// Список изменений:
// 26.03.2025
//   Fix: OrderType лучше обрабатывает виды балансовых операций.
//   Fix: В ByPass-режиме при работе с историей торговли уменьшено количество обращений к HistorySelect.
//   Add: Макрос MT4ORDERS_LIBRARY включает library-режим работы библиотеки: #import "MT4Orders.ex5".

Были справедливые замечания, что библиотека вызывает серьезное замедление компиляции. Поэтому добавлен альтернативный полноценный режим работы библиотеки в виде импортируемой EX5-library.


Скорость компиляции.

Замеры скорости компиляции на MT4/5 (MT5 - максимальная оптимизация X64_Regular) следующего кроссплатформенного скрипта.

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

Как Вы учили язык MQL4/5?

fxsaber, 2024.12.03 14:30

#define MT4ORDERS_LIBRARY // library-режим работы библиотеки: #import "MT4Orders.ex5".
#include <MT4Orders.mqh> // https://www.mql5.com/ru/code/16006

bool Buy( const double Lots = 0.1, const string Symb = NULL, const string Comm = NULL )
{
  return(OrderSend(Symb, OP_BUY, Lots, SymbolInfoDouble(Symb, SYMBOL_ASK), 0, 0, 0, Comm) != -1);
}

bool Sell( const double Lots = 0.1, const string Symb = NULL, const string Comm = NULL )
{
  return(OrderSend(Symb, OP_SELL, Lots, SymbolInfoDouble(Symb, SYMBOL_BID), 0, 0, 0, Comm) != -1);
}

void OnStart()
{
  Buy();
  Sell();
}

MT4_b1440 MT5_b4885 + MT4Orders MT5_b4885 + MT4Orders_library
90 msec 5050 msec 255 msec
 6.0 KBytes  125.4 KBytes  13.3 KBytes

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


Происходит и соответствующее влияние на размер EX5.


Как включить.

Нужно только один раз создать файл MQL5\Libraries\MT4Orders.mq5 из двух строк и  скомпилировать его.

#property library

// #define MT4ORDERS_BYPASS_MAXTIME 1000000 // Максимальное время (в мкс.) на ожидание синхронизации торгового окружения
// #define MT4ORDERS_AUTO_VALIDATION // Торговые приказы отправляются только в случае успешной проверки на корректность
// #define MT4ORDERS_ORDERS_SORT // Формирование сортированной по времени закрытия/удаления истории MT4-ордеров.
#include <MT4Orders.mqh> // https://www.mql5.com/ru/code/16006


После чего в своем коде перед включением MT4Orders прописать макрос.

#define MT4ORDERS_LIBRARY // library-режим работы библиотеки: #import "MT4Orders.ex5".
#include <MT4Orders.mqh> // https://www.mql5.com/ru/code/16006


И библиотека перестанет влиять на длительность компиляции.


Внешние признаки режима.

При запуске своей программы можно увидеть наличие вызова MT4Orders во вкладке Зависимости.

DLL не используются, открытый исходный код.

Учебник по MQL5: Расширенные средства языка / Разработка и подключение библиотек двоичных форматов / Создание ex5-библиотек и export функций
Учебник по MQL5: Расширенные средства языка / Разработка и подключение библиотек двоичных форматов / Создание ex5-библиотек и export функций
  • www.mql5.com
Для описания библиотеки следует добавить в исходный код главного (компилируемого) модуля директиву #property library (обычно, в начало файла)...
 
fxsaber #:

Были справедливые замечания, что библиотека вызывает серьезное замедление компиляции. Поэтому добавлен альтернативный полноценный режим работы библиотеки в виде импортируемой EX5-library.


Скорость компиляции.

Замеры скорости компиляции на MT4/5 (MT5 - максимальная оптимизация X64_Regular) следующего кроссплатформенного скрипта.


MT4_b1440 MT5_b4885 + MT4Orders MT5_b4885 + MT4Orders_library
90 msec 5391 msec 255 msec

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


Как включить.

Нужно только один раз создать файл MQL5\Libraries\MT4Orders.mq5 из двух строк и  скомпилировать его.


После чего в своем коде перед включением MT4Orders прописать макрос.


И библиотека перестанет влиять на длительность компиляции.


Внешние признаки режима.

При запуске своей программы можно увидеть наличие вызова MT4Orders во вкладке Зависимости.

DLL не используются, открытый исходный код.

Хреновый вариант..грабли на ровном месте

слишком часто ex5 объявляют "устаревшим"  - и на директивы #import это также распространяется