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

 
fxsaber:

Вы же умеете это делать.

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

я в своем примере распринтовал  состояние теста Print(VIRTUAL::ToString());  - там все корректно посчиталось

а дальше в OnTick()  будет браться баланс из AccountInfoDouble(ACCOUNT_BALANCE) , я я хочу видеть "продолжение" работы на том же балансе, что и тестировал с помощью VIRTUAL::Tester(Ticks, System, 10000, false); 

 
Igor Makanu:

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

я в своем примере распринтовал  состояние теста Print(VIRTUAL::ToString());  - там все корректно посчиталось

а дальше в OnTick()  будет браться баланс из AccountInfoDouble(ACCOUNT_BALANCE) , я я хочу видеть "продолжение" работы на том же балансе, что и тестировал с помощью VIRTUAL::Tester(Ticks, System, 10000, false); 

Так просто не удаляйте виртуальное торговое окружение, раз оно Вам дальше нужно. ACCOUNT_BALANCE возвращает баланс выбранного окружения.


Похоже, Вы еще не до конца поняли, что такое Virtual, поэтому и стали писать свою реализацию VIRTUAL::ToString.

Работайте, как с реалом. Хотите посмотреть историю - делайте это так, как будто нет никакого VIRTUAL. Баланс - аналогично.


ЗЫ Виртуальных считалок всегда было много. Принципиальное отличие Virtual от них - не нужно знать API считалки. Пишите AccountInfoDouble(ACCOUNT_BALANCE) или TimeCurrent() и все это работает в выбранном виртуальном окружении без каких-либо изменений в коде.

 
fxsaber:

Похоже, Вы еще не до конца поняли, что такое Virtual, поэтому и стали писать свою реализацию VIRTUAL::ToString.

Работайте, как с реалом. Хотите посмотреть историю - делайте это так, как будто нет никакого VIRTUAL. Баланс - аналогично.

конечно не понял - по крайней мере с первого раза, это третий подход к этому коду - два предыдущие были вообще неудачные, сейчас хоть что то прояснилось

время еще нужно окончательно разобраться с возможностями  Virtual 

спасибо за поддержку этого кода!

 
Igor Makanu:

конечно не понял - по крайней мере с первого раза, это третий подход к этому коду - два предыдущие были вообще неудачные, сейчас хоть что то прояснилось

Немного добавил кода в Ваш.

input datetime inFrom = D'2020.03.01';
input double Lots = 1;
input int Interval = 100;  // Время жизни позиции
input bool Example = true; // Какой пример кода выбрать

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

// Переворотная ТС
void System()
{
   if (!OrderSelect(OrdersTotal() - 1, SELECT_BY_POS))
      OrderSend(_Symbol, OP_BUY, Lots, SymbolInfoDouble(_Symbol, SYMBOL_ASK), 100, 0, 0); // Если нет позиции - открываем
   else if (TimeCurrent() - OrderOpenTime() > Interval) // Если позиция прожила больше заданного времени
   {
      // Перевернули позицию
      OrderClose(OrderTicket(), OrderLots(), OrderClosePrice(), 100);
      OrderSend(_Symbol, 1 - OrderType(), Lots, OrderClosePrice(), 100, 0, 0);
   }
}

bool IsTester = true;
//+------------------------------------------------------------------+
int OnInit()
{
   MqlTick Ticks[];

   CopyTicksRange(_Symbol, Ticks, COPY_TICKS_INFO, (long)inFrom * 1000);         // Взяли тики
   VIRTUAL::Tester(Ticks, OnTick, 0, false);                                     // Прогнали по ним ТС. false - не закрывали в конце.
   
   IsTester = false;
   return(INIT_SUCCEEDED);
}

void OnTick()
{
   if (!IsTester)
   {
     string Str = NULL;
     
     for (int i = OrdersTotal() - 1; i >= 0; i--)
       if (OrderSelect(i, SELECT_BY_POS))
         Str += OrderToString() + "\n"; // https://www.mql5.com/en/forum/217716#comment_5922998
        
     Comment(Str);
   }

  System();
}


Вы увидите на чарте в реальном времени состояние ордеров в виртуальном окружении. Заметьте, что для этого не нужно писать VIRTUAL::ToString(). Все, как в реале.

VIRTUAL::Tester - это очень простая функция. Ввел ее для небольшого удобства, т.к. она вся из 10-ка строк. Она создает вирутальное окружение и на каждом тике массива запускает выбранную функцию. В коде - OnTick.


Поэтому ввел IsTester-переменную, чтобы пока OnTick вызывается при прогоне по массиву тиков, не вызывался дорогостоящий Comment.

 
fxsaber:

Немного добавил кода в Ваш.

Да, этот пример искал! Отлично!

Спасибо!

UPD^

в 3 строки подключил копир сделок, все прекрасно работает из Virtual в реал

#include <fxsaber\Virtual\Virtual.mqh> // https://www.mql5.com/ru/code/22577
#include <IgorM\CMTCopy.mqh>
CMTCopyBase * MTCOPY = new CMTCopyTransmitter("MTCopy");
...
void OnTick()
{
   if (!IsTester)
   {
     MTCOPY.Update();
 
Igor Makanu:

Да, этот пример искал! Отлично!

Заменяйте System() на любую другую, будто написана для реального торгового окружения. Обязана пахать.

Упоминание Virtual только в OnInit нужно.

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

 
Igor Makanu:

в 3 строки подключил копир сделок, все прекрасно работает из Virtual в реал

Именно в этой простоте и вся фишка. Копир должен работать и в обратном направлении. И Virtual->Virtual.

 
fxsaber:

Именно в этой простоте и вся фишка. Копир должен работать и в обратном направлении. И Virtual->Virtual.

не вопрос, будет работать - делал простую реализацию именно под мастер, он просто информацию об открытых ордерах обновляет по приходу тика

а сам копировщик (слейв) еще буду дописывать, пока просто синхронизирует от мастера 100% открытых ордеров, тут в общем зависит от задач,обмен без проблем на 100 мс работает.... проверил переключил ТФ на Virtual из последнего Вашего примера, примерно за минуту слил демо 5000 $  на спреде на МТ4 )   ))))

 
fxsaber:

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

Вот скрин моего боевого советника.

Запускаю советник. Он создает четыре торговых окружения, где в каждом запускается своя ТС.

После этого по тикам прогоняется каждая, выдавая HTML-отчет через Report. Т.е. при запуске сразу в браузере вижу отчет по каждом из ТС. Это позволяет быстро убедиться, что не ошибся во входных и сделать другие оценки.

Далее ТС-ки продолжают торговать в вирутальных окружениях. И работает синхронизатор, которые эти виртуальные окружения копирует на реал (с учетом отложек, реджектов, частичных исполнений и других приколов).


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


Ну и на скрине немного горячих клавиш. Могу в любой момент через них посмотреть на чарте и в HTML состояние виртуальных окружений и части реала, что с каждым синхронизируется. Также увидеть Summary-отчет сразу по всем окружениям. Видна некоторая статистика по синхронизации. Основная часть - в Логе. Если какой-то проблемный участок (OrderCloseBy, например, не может схлопнуть позы на реале), то просто Алерт.


Фактически, никакого GUI, только голый текст и HTML с графиками и таблицами.


Сами ТС-ки пишу без каких-либо проверок, ведь они запускаются в виртуальном торговом окружении. А там, как и в штатном Тестере, быть не может никаких проблем. Идеальное исполнение. По итогу получается, что пишешь только торговую логику, не отвлекаясь на остальную ерунду. Код получается лаконичным и быстрым для Оптимизации.


В итоге, написал ТС для Тестера без каких-либо заморочек для реала. А дальше в пару строк подключаешь эту ТС к боевому советнику.


У меня все ТС написаны в mq4. В Оптимизаторе их кручу через MT4Orders. Подключаю к кроссплатформенному боевому советнику инклудом этого mq4 и парой строк

int OnInit()
{
  SYNC_EA::AddSystem(new SYSTEM(...)); // 1-я ТС
  SYNC_EA::AddSystem(new SYSTEM(...)); // 2-я ТС
  SYNC_EA::AddSystem(new SYSTEM(...)); // 3-я ТС
  SYNC_EA::AddSystem(new SYSTEM(...)); // 4-я ТС
  
  ArrayFree(HistoryTicks);
    
  OnTick();  
  
  return(SYNC_EA::GetAmount() ? INIT_SUCCEEDED : INIT_FAILED);
}


Схема на практике себя полностью оправдала. Сталкивался с кучей жутких багов исполнения у брокеров. Подобная реализация боевого советника обошла все без проблем.

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


ЗЫ И, конечно, боевой советник запускается в штатном Тестере. Т.е. его можно прогнать на истории, как обычный, и убедиться, что все отлично.

ТС-ка в EX4 занимает 36 Кб, в EX5 - 250 КБ.

Она же в боевом советнике в EX4 - 0.5 МБ, EX5 - 1 МБ.

 
fxsaber:

Вот скрин моего боевого советника.

Запускаю советник. Он создает четыре торговых окружения, где в каждом запускается своя ТС.

После этого по тикам прогоняется каждая, выдавая HTML-отчет через Report. Т.е. при запуске сразу в браузере вижу отчет по каждом из ТС. Это позволяет быстро убедиться, что не ошибся во входных и сделать другие оценки.

Далее ТС-ки продолжают торговать в вирутальных окружениях. И работает синхронизатор, которые эти виртуальные окружения копирует на реал (с учетом отложек, реджектов, частичных исполнений и других приколов).


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


Ну и на скрине немного горячих клавиш. Могу в любой момент через них посмотреть на чарте и в HTML состояние виртуальных окружений и части реала, что с каждым синхронизируется. Также увидеть Summary-отчет сразу по всем окружениям. Видна некоторая статистика по синхронизации. Основная часть - в Логе. Если какой-то проблемный участок (OrderCloseBy, например, не может схлопнуть позы на реале), то просто Алерт.


Фактически, никакого GUI, только голый текст и HTML с графиками и таблицами.


Сами ТС-ки пишу без каких-либо проверок, ведь они запускаются в виртуальном торговом окружении. А там, как и в штатном Тестере, быть не может никаких проблем. Идеальное исполнение. По итогу получается, что пишешь только торговую логику, не отвлекаясь на остальную ерунду. Код получается лаконичным и быстрым для Оптимизации.


В итоге, написал ТС для Тестера без каких-либо заморочек для реала. А дальше в пару строк подключаешь эту ТС к боевому советнику.


У меня все ТС написаны в mq4. В Оптимизаторе их кручу через MT4Orders. Подключаю к кроссплатформенному боевому советнику инклудом этого mq4 и парой строк


Схема на практике себя полностью оправдала. Сталкивался с кучей жутких багов исполнения у брокеров. Подобная реализация боевого советника обошла все без проблем.

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


ЗЫ И, конечно, боевой советник запускается в штатном Тестере. Т.е. его можно прогнать на истории, как обычный, и убедиться, что все отлично.

ТС-ка в EX4 занимает 36 Кб, в EX5 - 250 КБ.

Она же в боевом советнике в EX4 - 0.5 МБ, EX5 - 1 МБ.

Допустим. Но, зачем Вам имитация продолжения движения? Зачем Ontick?