Библиотеки: Virtual - страница 44

 
Oleksii Chepurnyi #:

В Virtual\Orders.mqh

#define MAX_ORDERS 100

Если заменить, например на 500, ничего не сломается?

Этот параметр отвечает за максимальное количество живых позиций/ордеров в одном виртуальном окружении.

Единственное, когда может возникнуть проблема, если сохранили в файл виртуальное окружение со старым значением, а потом попробовали его загрузить с новым значением.

Т.е. проблема больше гипотетическая.


Один раз нарвался на нехватку значения 100, когда снепшотил реальное окружение, где по одному символу оказалось PositionsTotal+OrdersTotal > 100. Поэтому у самого стоит значение 200.

 
fxsaber #:Поэтому у самого стоит значение 200.

Заказчик 500 попросил ) И, скорее всего, будет мало )

 
Oleksii Chepurnyi #:

Заказчик 500 попросил ) И, скорее всего, будет мало )

Для скорости нигде не стоит проверка на выход за массив. Так что в случае превышения советник остановится с соответствующей ошибкой. Ставьте с запасом.

 
fxsaber #:

Для скорости нигде не стоит проверка на выход за массив. Так что в случае превышения советник остановится с соответствующей ошибкой. Ставьте с запасом.

Да, нарвался на out of range. Спасибо!

 

В качестве проверки понимания взаимодействия окружений привожу решение следующей задачи.

Сохранить отложки (например, перед выходными) на торговом счете, а затем восстановить их (например, после выходных).

Forum on trading, automated trading systems and testing trading strategies

Is it possible to save orders?

fxsaber, 2023.08.03 19:48

// Saves pending orders and loads them into the terminal.
#property script_show_inputs

input bool inSave = true; // Save - true, Load - false

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

#define VIRTUAL_SNAPSHOT_REFRESHTIME 1000
#define VIRTUAL_SNAPSHOT_WITHOUT_HISTORY
#include <fxsaber\Virtual\Virtual.mqh> // https://www.mql5.com/ru/code/22577

void OnStart()
{
  if (inSave) // Save
  {
    VIRTUAL::Snapshot(VIRTUAL_SNAPSHOT_REFRESHTIME, -1, false, "");
    VIRTUAL::Save(__FILE__);
  }
  else if (VIRTUAL::SelectByHandle(VIRTUAL::Create(__FILE__))) // Load
    for (uint i = OrdersTotal(); (bool)i--;)
      if (OrderSelect(i, SELECT_BY_POS) && (OrderType() > OP_SELL)) // Pending order
      {
        OrderPrint();

        // If the order does not exist, send the order.
        if (_V(0, !OrderSelect(_V(1, OrderTicket()), SELECT_BY_TICKET, MODE_TRADES) || OrderCloseTime()))
          Print("OrderSend - " +
                (string)!!_V(0, OrderSendAsync(_V(1, OrderSymbol()), _V(1, OrderType()), _V(1, OrderLots()),
                                               _V(1, OrderOpenPrice()), 0, _V(1, OrderStopLoss()), _V(1, OrderTakeProfit()),
                                               _V(1, OrderComment()), _V(1, OrderMagicNumber()), _V(1, OrderExpiration()))));
        else
          Print("Order - exist.");
      }
}

Например, выставлены отложки. Сохраняем их скриптом (inSave = true) и удаляем отложки (все или часть) перед новостями средствами GUI.

После новостей восстанавливаем удаленные отложки запуском скрипта (inSave = false).

 

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

https://www.mql5.com/ru/blogs/post/754137

Борьба со свопами - 2.
Борьба со свопами - 2.
  • www.mql5.com
Форекс-скальперы на свопах несут существенные издержки . Ниже на их примере представлен простой подход, позволяющий наглядно проанализировать любую историю торговли. Фильтр торговой истории. В
 
Повторение подхода написания боевых советников.

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

MQL4 отслеживание закрытия ордера по TP

fxsaber, 2023.10.16 08:58

Представьте, что у вас есть два счета.

  1. Демо-счет, на котором запущен ваш советник. Причем сетевое и электрическое соединения идеальные. Даже торговый сервер не перезагружается брокером.
  2. Реальный счет. На нем случаются сюрпризы: сеть нестабильная, электричество пропадает, брокер свой сервер перезагружает и т.д.

И стоит задача, как бы на реальном счете торговать так, как на идеальном демо-счете? Для этого, конечно, используют копир: сравнивают, что сейчас на демо и на реале, и выравнивают состояние реала до демо.

Заметьте, что копир ничего не запоминает. Он просто на каждом тике сравнивает один счет с другим. Это, наверное, самое надежное решение в алготрейдинге.


Встает вопрос, как создать такой идеальный демо-счет? Некоторые делают так.

  1. Создают виртуальное окружение - демо-счет внутри советника.
  2. При запуске советника загружают историю тиков, например, за месяц. И пробрасывают ее в виртуальное окружение - на демо-счете советник "проторговал" на этих тиках.
  3. На каждом новом тике берутся все ново-поступившие тики (чтобы не было пропусков) и пробрасываются в виртуальное окружение. В итоге имеем "демо-счет с советником".
  4. Внутри советника есть копир, который копирует с виртуального окружения на реальный счет ордера.

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

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

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

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

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

fxsaber, 2023.11.14 17:49

Все точно также, как должно работать у торговых копиров и на внешних крипто-биржах.

 
Разное представление CloseBy.
// Разное представление CloseBy.

sinput bool inCloseBy = true;

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

#define VIRTUAL_SNAPSHOT_REFRESHTIME 1000 // Время жизни снепшота для обновления. В MT5 требует подключенной MT4Orders.mqh
#include <fxsaber\Virtual\Virtual.mqh> // https://www.mql5.com/ru/code/22577

#define Bid SymbolInfoDouble(_Symbol, SYMBOL_BID)
#define Ask SymbolInfoDouble(_Symbol, SYMBOL_ASK)

void OnTick()
{
  static datetime PrevTime = 0;
  
  if (TimeCurrent() - PrevTime > 3600)
  {
    if (!OrderSelect(0, SELECT_BY_POS))
      OrderSend(_Symbol, OP_BUY, 0.5, Ask, 0, 0, 0); // Открыли позицию.
    else if (OrdersTotal() == 1)
      OrderSend(_Symbol, !OrderType(), 0.3, OrderType() ? Ask : Bid, 0, 0, 0); // Открыли противоположную.
    else
      OrderCloseBy(OrderSelect(1, SELECT_BY_POS) ? OrderTicket() : 0, OrderTicket()); // Схлопнули.
      
    PrevTime = TimeCurrent();
  }
}

void OnDeinit( const int )
{
  VIRTUAL::Snapshot(VIRTUAL_SNAPSHOT_REFRESHTIME, -1, false, "", inCloseBy);
}

#define REPORT_TESTER             // В тестере будут автоматически записываться отчеты
#define REPORT_BROWSER            // Создание отчета с запуском браузера - требует разрешения DLL.
#include <Report.mqh> // https://www.mql5.com/ru/code/18801


Результат.

Сверху обычное представление, снизу - альтернативное. В рамках одно и то же, для сравнения.

Отображение CloseBy-операций - 2
Отображение CloseBy-операций - 2
  • www.mql5.com
Ранее говорилось о доскональном представлении CloseBy-операций в MT5. Теперь же пойдет речь об упрощенном представлении того же самого. CloseBy-операции встречаются по разным причинам. Это может быть
 

Здравствуйте! Спасибо за библиотеку.
Сравнивал распечатки сделок полученные от виртуального и реального тестеров. Появилось несколько предложений по доработке:

Поставьте пожалуйста
#define MAX_ORDERS 1000
100 тоже не хватило. Памяти немного возьмет. При апдейтах не хотелось бы каждый раз искать и править.

---------------------------
Тестер свопы расчитывает по умолчанию, думаю надо и в виртуальном тестере сделать так же (видимо при переносе ордера в историю). А может лучше в активых ордерах в начале новых суток, чтобы текущая эквити была точнее (добавив в ее расчет свопы). Код станет без лишних вставок. А то кто-то так и не разберется, что своп надо отдельно считать.
Сейчас делаю так в OnTester.  
for (int v = 0 ; v <= VIRTUAL::Total(); v++){
      if (VIRTUAL::SelectByIndex(v)){
         VIRTUAL::CalcSwaps();
...

------------------------------
Тестер MT отказывает в части сделок из за Market closed
Проверил спецификацию и правда на Alp... с 23:55 до 00:15 торговля закрыта.
Хорошо бы и виртуальному тестеру отклонять сделки по этому времени, для более точного соответствия.
И заодно и в MT4Orders, добавить проверку, чтобы и в тестерах и в реале не пытаться торговать при закрытой торговле.
Тут код с примером как сделать https://www.mql5.com/ru/forum/390928#comment_45855346
                                  #    open date               T  Prof  Pip Comis Swap
2022.05.30 23:59:30   660 2022.05.30 23:55:00 0 -0.15 -15 -0.04   0.0 должен быть отклонен по Market closed
2022.05.30 23:59:30   661 2022.05.30 23:55:00 1 -0.15 -15 -0.04   0.0 должен быть отклонен по Market closed

--------------------------------
Давно не интересовался расчетом комиссии. Хотелось бы уйти от ее указания в коде или через input. Была идея сделать одну тестовую сделку и из нее взять комиссию, но это нарушит стратегию.  А может MQ дали возможность ее узнать запросом?

П.С. при сравнении получил полное соответствие по суммам, кроме отклоненных по Market closed и 2 сделки в виртуальном имели большее проскальзывание ТП, чем в реальном. Остальные 600+ сделок точно совпали.
Ошибка Market closed в тестере
Ошибка Market closed в тестере
  • 2022.03.15
  • www.mql5.com
Прогоняю советник в тестере на реальных тиках. И получаю странную ошибку - рынок работает, свечи идут, сигнал формируется, а заявка не выставляется...