Машинное обучение в трейдинге: теория, модели, практика и алготорговля - страница 538

 
Mihail Marchukajtes:

Такой вот я програмист. Никто толком не объяснит, пока допетришь... Вообщем народ!!!!! Слушайте сюда. Сейчас будет Важный длиннопост......


так это эволюция типа.. сделай или умри называется :) я точно такой же программист

 
Mihail Marchukajtes:

 Вообщем народ!!!!! Слушайте сюда. Сейчас будет Важный длиннопост......

Учитель, жги!

 

Всем Вам прекрасно известно что я испытываю пылкие чувства к Открытому Интересу (ОИ), поскольку это ключевое звено при определении характера наторгованного объёма. С совокупностью с дельтой...ммммм.... просто пальчики оближешь.... ОИ конечно не панацея, но улучшения качества работы модели даже на 10% уже будет иметь высокий вес!!!! И о ЧУДО!!!! Я наконецтаки добрался до него в нутри дня, НО к сожалению такими возможностями обладает только МТ5, что и стало решающим фактором на переход с МТ4 в пользу пятёрки. Огромные слова благодарности Рафилю, который можно сказать с экономил кучу времени и дал хороший старт для перехода. ОИ уже пишется и есть стата за неделю. Этого конечно пока мало, но на ТФ М5 уже можно начинать пробовать, тем более что на Si на этом ТФ влияние спреда незначительно по сравнению с волатильностью инструмента в целом. Ну что.. данные есть, осталось дело за малым, как я думал. Обучить модель и посмотреть на что же способна связка Дельта+Объём+ОИ. Но вот не задача, как только начал делать индикаторы под модели, столкнулся, конечно с кучей проблем из за не знания Мкуль5, но победив их я думаю что уже вышел на финишную прямую и уткнулся вот в какую стену недопонимания со стороны столь прекрасного и могучего языка. Общий концепт ТС такой.

Дельта+AD(в место объёма буду брать именно это)+ОИ идут как индикаторы, где ОИ качается из фала и как ни странно с ним проблем нет, а вот с AD реально проблемы и я не могу понять почему.

Для подготовки обучающего множества я использую скрипт приложений ниже. Этот скрипт выгружает сигналы базовой стратегии в ксв файл. Далее строим модель и запихиваем её в другой индикатор. У меня их два. BuySi и SellSi, это те самые индикаторы, которые и содержат в себе ИИ. Для подачи входов эти индикаторы обращаются к набору индикаторов Дельта+AD+ОИ. Индикатор от индикатора, тем более в одном вложении... ну какие могут быть тут проблеммы... Ан нет... Они есть.... и я так думаю что только у меня в виду моих познаний в столько прекрассном и замечательном языке програмирования.... так... о чём это я... ах да.... Проблема в следующем:

Скрипт выгружает одни данные в файл, а во время тестирования в момент появления сигнала в принт выводятся другие значения. Тоесть один и тот же сигнал в файл пишет одно, а по факту в момент тестирования на вход подаётся совершенно другое. И вот ведь в чём парадокс. Инициализация хендла, да и само обращение к буферам было под копирку скопированно из скрипта. НО BuySi в момент тестирования загружает адекватные данные, потому как я проверил это руками. И что самое интересное ОИ грузит одинакого и в файл и на вход ИИ, а вот AD стандартный, терминаловский. В файле одни значения, по факту другие. Я так думаю, что это связанно именно вот с этим параметром, когда мы пытаемся вызвать индикатор для другого инструмента отличного от тестируемого. Проблема думаю в синхронизации котировок и значений индюков. Я так думаю что для такого решения может нужна какая предварительная подготовка? Поэтому собственно и воспрашаю у народа о помощи. Почему скрипт выгружает одни значения iAD, а в момент тестирования, эти значения отличаются и соотвественно сигналы начанают плясать. Когда индюки на графике, то есть расчитываются в процессе инициализации Картина выглядет следующим образом.

По моему шикарно. Сразу чувствуется влияние ОИ, но когда прогоняю в тестере, ТО картина меняется.. и не в лучшую сторону

Причём Тестер зачемто делает два прогона где сигналы тоже разняться. Для того чтоб индюки успели подкачать буфера. Расчёт ИИ делаю с задержкой и ошибка 4806 уже не всплывает, но пляшущие сигналы и разница в данных, абсалютно идентичного кода со СТАНДАРТНЫМ индикатором iAD меня изрядно изматало что я не поленился написать этот длинно пост, в надежде на помощь. Я так думаю проблема именно в iCustom, когда индюк вызывается на другом инструменте отличного от текущего. Просто так же начал моросить ОИ, но я потом его заставил принудительно грузить из конкретных файлов и всё прошло, НО что делать с iAD???

Вот так вызываю в скрипте, который создаёт фал с данными.

AD_H =iAD("BR-12.17",   0, VOLUME_REAL);  Sleep(1500);

далее, обращаюсь к буферу так...

  double AD(int index)
  {
   double MA[1];
   ResetLastError();
   if(CopyBuffer(AD_H,0,index,1,MA)<0)
     {
      PrintFormat("Failed to copy data from the iMA indicator, error code %d",GetLastError());
      return(0.0);
     }
   return NormalizeDouble(MA[0],Digits());
  }

И в последствии расчитываю вход так.

      double AD=(AD(i+1)-AD(i+PNT+1))*Cont;

Это всё в скрипте, а вот как это выгладет в индикаторе с ИИ, где хендл оформляется так...

AD_H =iAD("BR-12.17",   0, VOLUME_REAL);  

Обращение к буферу так...

  double AD(int index)
  {
   double MA[1];
   ResetLastError();
   if(CopyBuffer(AD_H,0,index,1,MA)<0)
     {
      PrintFormat("Failed to copy data from the iMA indicator, error code %d",GetLastError());
      return(0.0);
     }
   return NormalizeDouble(MA[0],Digits());
  }

Расчёт входа так....

      double AD=(AD(i+1)-AD(i+PNT+1))*Cont;

Это и понятно, ведь всё тупо копировалось. Но почему такая разница в конечном результате. Я всётаки думаю что это из за вызова индюка по другому инструменту. Там случайно ничего подготавливать не нужно, типа синхронизации или проверок какихнить перед тем как вызвать индикатор по другому инструменту. Кто что думает по этому поводу????

 
Vizard_:

Учитель, жги!


ООО Сразу видно.. серьёзная публика подтянулась. Думаю дебаты будут жаркими :-)

 

Причём сейчас скомпилировал индюк и он в принт вывел именно те данные которые пишет в файл. Но во время тестирования этот же сигнал на входе имеет уже другие значения. Как так???

 

Вижу кина не будет???? Печаль :-( 

 

Просто догадка, но -

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

 
Dr. Trader:

Просто догадка, но -

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


Нет. По АД никакие файлы не пишутся, всё берется напрямую с символа. Думаю это из за отсутствия проверки на синхронизацию. И ещё ошибка 4806 была постоянно. Ввел задержку на расмчёт основного индюка и ошибка пропала, а проблема осталась... :-(

 

Вот принт с терминала после компила.

2017.11.27 20:59:17.625 Buy_Si (Si-12.17,M5) 2017.11.23 11:05:00  1.0   -116.0   64.0   2292.0  -206.0   413   4

а вот с агента.

2017.11.27 20:59:38.318 2017.11.23 11:10:40   2017.11.23 11:05:00   1.0   -116.0   140.0   -1889.0  -993.0   1   4

Обрати внимание это один и тот же сигнал. время 11:05 -116 это ОИ которое берётся из файла, тоже одинаковое. Далее идут три значения АД с разных символов. Далее i бара ну и параметр понт.

Почему данные по АД разные. Проверку синхронизации вставил....?

 

Без кода ничего не понятно.

Нужно сделать простой советник с минимальным набором функционала чтобы просто считывать значения индикатора и писать их в лог (а лучше - в csv файл, чтоб удобней сравнивать потом). Сделать два запуска при которых результаты будут отличаться, и отправить всё это в сервисдеск вместе с кодом эксперта, пускай исправляют терминал.
Можно ещё туда код приатачить - https://www.mql5.com/ru/forum/1111/page2096 - знающие люди проверят и подтвердят или объяснят что не так.

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