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

 
Oleksii Chepurnyi #:

Это видел, спасибо. Но нужно постоянно корректировать. И без ордеров депозитных в истории

Число корректировок может быть любым. Если без отражения в истории, то получим несовпадение истории с текущим торговым окружением. Не представляю сценария применения такого.

 
fxsaber #:

Число корректировок может быть любым. Если без отражения в истории, то получим несовпадение истории с текущим торговым окружением. Не представляю сценария применения такого.

Сценарий достаточно специфический ) Но да, с ордерами в истории правильнее ) Спасибо!

 
fxsaber #:

Несколько часов ломал голову, почему при Оптимизации Агенты стали потреблять в 5-10 раз больше памяти (до трех гигабайтов на агента), чем раньше. Из-за такого дикого потребления утыкался в нехватку памяти, пришлось отключать больше половины агентов.


Почти поверил, что дело в параллельности. А причина оказалась неожиданной.


Раньше торговал через Virtual, но случайно отключил его. И оказалось, что если в Тестере оптимизируете в реальном окружении (99.9% так делают), то история торговли MT5 выжирает огромное количество памяти! И получается, что каждый Агент генерирует столько MT5-истории, что вся память на машине забивается. Но стоит только переключить историю в Virtual, как все проходит без каких-либо затыков с этой стороны.


Отсюда неожиданный вывод. Что если хотите оптимизировать ТС на всех Агентах (включая Облако), то иногда просто необходимо отказываться от MT5-истории в пользу Virtual. Это даст не только скорость на каждого Агента, но и позволит включить всех Агентов, не упираясь в потолок по RAM.

Не только история торговли потребляет память. Ниже MT4-Style код проблемного для Тестера советника.

// Держит ордер на постоянном расстоянии от текущей цены.

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

#define VIRTUAL_TESTER // Запуск в виртуальном торговом окружении
#include <fxsaber\Virtual\Virtual.mqh> // https://www.mql5.com/ru/code/22577

#define Ask SymbolInfoDouble(_Symbol, SYMBOL_ASK)

input double inOffset = 0.1;

void OnTick()
{
  const double Price = NormalizeDouble(Ask * (1 - inOffset), _Digits);
  
  if (!OrderSelect(0, SELECT_BY_POS))
    OrderSend(_Symbol, OP_BUYLIMIT, 1, Price, 0, 0, 0);
  else if (OrderOpenPrice() != Price)
    OrderModify(OrderTicket(), Price, 0, 0, 0);
}


Бэктест через реальное окружение.

Core 1  EURUSD,M1: 951289 ticks, 7179 bars generated. Test passed in 0:00:05.212 (including ticks preprocessing 0:00:00.109).
Core 1  1072 Mb memory used including 36 Mb of history data, 64 Mb of tick data


Виртуальное.

Core 1  EURUSD,M1: 951289 ticks, 7179 bars generated. Environment synchronized in 0:00:00.019. Test passed in 0:00:00.285.
Core 1  EURUSD,M1: total time from login to stop testing 0:00:00.304 (including 0:00:00.019 for history data synchronization)
Core 1  310 Mb memory used including 36 Mb of history data, 64 Mb of tick data


Выделил числа для сравнения. История торговли содержит только один ордер.

Тестер стратегий MetaTrader 5: ошибки, баги, предложения по улучшению работы
Тестер стратегий MetaTrader 5: ошибки, баги, предложения по улучшению работы
  • 2022.09.05
  • www.mql5.com
В настоящий момент тестер стратегий MetaTrader 5 подвергается глубокой переработки командой MQ...
 

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

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

fxsaber, 2022.02.19 03:22

В Virtual входят только следующие файлы.

Virtual.mqh
Orders.mqh
HistoryOrders.mqh
Order.mqh
Order_Base.mqh


Только сущности из этих файлов являются частью Virtual. Для обывателя нужны только эти три метода.

VIRTUAL::Create
VIRTUAL::SelectByHandle
VIRTUAL::NewTick

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


И больше ничего не нужно знать для ответа на ваши вопросы, если хотите решать их через Virtual.


Сами вопросы носят общий характер, не зависящий от реализации. Вам непонятно, как с помощью виртуальных окружений (не обязательно Virtual, любых) наделить Netting возможностью торговли, как на хедже? Или как скрыть SL/TP? Но эти вопросы не относятся непосредственно к Virtual. Приводил какие-то примеры. Наверное, стоит сначала вообще понять, что такое виртуальное окружение. А потом самому дойти до понимания возможных сценариев применения.


Возможно, кто-то из пользователей выскажется на темы применения Virtual. Могу ошибаться, но если кому-то и приглянулась данная реализация виртуального окружения, то простотой: три метода.

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


Поэтому рекомендую просто вникнуть в само понятие виртуального окружения, без оглядки на Virtual.

Как в общем виде решается задача, выделенная в тексте выше.

  1. Открывается TerminalHedge и на нем запускаются советники.
  2. Открывается TerminalNetting.
  3. На TerminalHedge вычисляется суммарная нетто-позиция и сравнивается с позицией на TerminalNetting.
  4. Если есть различия, на TerminalNetting меняется соответствующим образом открытая позиция, чтобы различия между двумя терминала по общей нетто-позиции исчезли.

Это весь алгоритм, который можно делать даже руками.


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


VIRTUAL::Create

Эта функция запустит TerminalHedge. Т.е. ее выполнить нужно только один раз для п.2.


VIRTUAL::SelectByHandle

Эта функция переключается между терминалами: TerminalHedge и TerminalNetting. Для реализации алгоритма п.3-4 нужно сначала переключиться на TerminalHedge и посчитать там нетто-позицию. Затем переключиться на TerminalNetting и подправить там нетто-позицию, чтобы все соответствовало.


VIRTUAL::NewTick

Эта третья последняя функция, которая нужна для решения задачи. TerminalHedge должен получать тики. Если вы запустили настоящий терминал, то там автоматически идут тики. А вот если "запустили" через Virtual, то там тики автоматически не идут. Их нужно туда "пробрасывать". Грубо говоря, в самом начале OnTick нужно переключиться на TerminalHedge и выполнить эту функцию.


От Virtual нужны всего три функции и больше ничего! Все остальное делается так, как если бы были параллельно открыты несколько терминалов.

 

Генеральный вопрос: Virtual & MT4Orders вообще позволяет перенести советник на неттинговый счёт ? Есть истории успеха в виде нормальных примеров где подсмотреть  ?? ;-)

(про хеджинг->неттинг и Virtual и Mt4Orders)

есть нюансы :-) Точнее неясности.

1) Как обращаться с историей ? используя MT4Orders и Virtual на неттинге совершенно гарантировано получаю ошибку при OrderSelect(ticket,SELECT_BY_TICKET) когда позиция закрыта.
Историю а-ля хеджинг, очевидно надо как-то получать, где-то хранить и каким-то образом передавать в "виртуализированный Mt4Orders"

2) До отдельного тест-кейса не доведено, поэтому не баг, а просто стойкое ощущение: Если использовать Sync из библиотеки Virtual то есть проблемы со StopLoss - они просто иногда "забываются".

3) как оно (подобная синхронизация) будет работать если на неттинге запущены его советники, которые тоже торгуют и соотв. меняют тоже совокупную позицию. 

 
Maxim Kuznetsov #:

Генеральный вопрос: Virtual & MT4Orders вообще позволяет перенести советник на неттинговый счёт ? Есть истории успеха в виде нормальных примеров где подсмотреть  ?? ;-)

(про хеджинг->неттинг и Virtual и Mt4Orders)

есть нюансы :-) Точнее неясности.

1) Как обращаться с историей ? используя MT4Orders и Virtual на неттинге совершенно гарантировано получаю ошибку при OrderSelect(ticket,SELECT_BY_TICKET) когда позиция закрыта.
Историю а-ля хеджинг, очевидно надо как-то получать, где-то хранить и каким-то образом передавать в "виртуализированный Mt4Orders"

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

2) До отдельного тест-кейса не доведено, поэтому не баг, а просто стойкое ощущение: Если использовать Sync из библиотеки Virtual то есть проблемы со StopLoss - они просто иногда "забываются".

Это не библиотечный mqh. А просто часть примера в этой ветке. Не надо использовать в своем коде примеры.

3) как оно (подобная синхронизация) будет работать если на неттинге запущены его советники, которые тоже торгуют и соотв. меняют тоже совокупную позицию. 

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

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

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

fxsaber, 2022.10.10 09:09

  1. Открывается TerminalHedge и на нем запускаются советники.
  2. Открывается TerminalNetting.
  3. На TerminalHedge вычисляется суммарная нетто-позиция и сравнивается с позицией на TerminalNetting.
  4. Если есть различия, на TerminalNetting меняется соответствующим образом открытая позиция, чтобы различия между двумя терминала по общей нетто-позиции исчезли.

Это весь алгоритм, который можно делать даже руками.

 
fxsaber #:

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

Это не библиотечный mqh. А просто часть примера в этой ветке. Не надо использовать в своем коде примеры.

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

идея-то понятна..только 3 дня потеряно а попытке просто "взять и использовать" Virtual для переноса в неттинг. Идея к сожалению потерпела фиаско  

Virtual не для этого.

 
Maxim Kuznetsov #:

идея-то понятна..только 3 дня потеряно а попытке просто "взять и использовать" Virtual для переноса в неттинг. Идея к сожалению потерпела фиаско  

Virtual не для этого.

Значит, ничего не поняли. Не знаю причин, почему такое происходит.

 

нет смысла использовать библиотеку автор которой увиливает от прямо поставленных вопросов по её использованию. 

к тому-же низкоуровневую. Для которой (в смысле портирования советника из хедж в неттинг) ещё и сверху гору всего надо делать. 

для прогона к тестере/оптимизаторе наверное она пойдёт. Отчего нет - посмотрел там позицию, тут позицию, принял меры. 

 
Maxim Kuznetsov #:

нет смысла использовать библиотеку автор которой увиливает от прямо поставленных вопросов по её использованию.

Вам предоставили возможность работать в нескольких параллельно работающих "терминалах".

к тому-же низкоуровневую. Для которой (в смысле портирования советника из хедж в неттинг) ещё и сверху гору всего надо делать. 

Каждый сам решает, что будет делать с этими "терминалами".

для прогона к тестере/оптимизаторе наверное она пойдёт. Отчего нет - посмотрел там позицию, тут позицию, принял меры. 

Сценариев использования Virtual очень много, как и их реализаций. Единственный минус на данный момент - отсутствие мультивалютности.


К сожалению, не смогли разобраться в инструменте. Бывает.


Из тех, кто вовсю использует Virtual, точно никто не будет расписывать другими словами, что это и как используется. Сам очень постарался, чтобы на простых аналогиях донести. Жаль своего времени.

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