Помогите найти ошибку в эксперте

 
Вопрос вот в чем, после работы с индикатором(ами) мне захотелось сделать эксперт, чтобы протестировать и по возможности оптимизировать свои индикаторы и торговую стратегию. Начал с простого, написал код эксперта по анологии с учебником (большое спасибо автору). Единственное это изменил условия возникновения  торговых сигналов, на основе собственного индикатора которого тоже вписал в код эксперта. Скомпилировал, все ок, но ни одной сделки на тестере....... Появляется ошибка TestGenerator: unmatched data error, но как я понял можно чтобы она была. Мне бы хотя бы увидеть хоть один сгенерируемый сигнал на покупку или продажу. Вопрос вот какой, если вставить в скрипт эксперта в init start, то есть в основной код, код индикатора(100% рабочего, т.к. сам по себе индикатор работает), он будет рассчитываться? То есть я сначала рассчитываю индикатор для всей истории, потом анализирую есть ли условие открытию ордера. Меня смущает что на тестере индикатор
может работать не корректно, либо вообще не работать....
Вот какой код условий и одна строка из индикатора у меня в эксперте, все остальное точно как в эксперте из учебника, разве что функцию "int New_Stop(int Parametr)" я не использовал. Код эксперта в уебнике (https://book.mql4.com/ru/samples/expert)
//---------------------торговые критерии-------------------------------//
   //предварительный рассчет индикатора--------------------------------//
   counted = Bars-counted_bars-1;
   i=counted;
   while (i>=0)
      {
      adp[i]=MathAbs((Close[i]+Open[i])/2.0);
      i--;
      }
   //рассмотрение основных критерий------------------------------------//
if (adp[0]>gh) //покупаем--// gh константа
   {
   Opn_B=true;
   Cls_S=true;
   }
if (adp[0]<gh) //продаем---//  gh константа
   {
   Opn_S=true;
   Cls_B=true;
   }
//--------------------Закрытие ордеров---------------------------------//
Правильно ли я вставил код индикатора в торгующий эксперт? Сигналы могут быть сгенерированными на каждом тике, как я понимаю, но хотелось бы чтобы они генерировались только после формирования к примеру часового бара. Как  это сделать?

Заранее спасибо...
 
Не знаю как в учебнике, но на практие код индикатора напрямую в код эксперта вставлять без доработки напильником нельзя.

Лучше почитайте про функцию iCustom(). Вы можете использовать свой индикатор из эксперта без дополнительных телодвижений. Не самый быстрый способ, но для вас, пожалуй, самый надежный.
 
Предположим я выкинул код самого иникатора. Скомпилировал индикатор, положил его где надо, привязал его к коду эксперта функцией . А как будут браться значения этого индикатора? Для текущего тика? Хотелось бы чтобы рассматривалось значение для последних трех. Или можно самому указать в функции:
 
double iCustom( string symbol, int timeframe, string name, ..., int mode, int shift)
где номер бара от которого нужно значение индикатора, это последняя переменная в фунции iCustom, int shift???

И хочеться все-таки ещё помимо этого про второй вопрос выяснить. Про то как генерировать сигналы только в начале формирования нового бара, это наверно надо какой-то фильтр воткнуть в самое начало кода, где проходят проверки введенных параметров для индикатора и т.д. Только как это изобразить в коде mql4 ?
 
где номер бара от которого нужно значение индикатора, это последняя переменная в фунции iCustom, int shift???
Да.

И хочеться все-таки ещё помимо этого про второй вопрос выяснить. Про то как генерировать сигналы только в начале формирования нового бара, это наверно надо какой-то фильтр воткнуть в самое начало кода, где проходят проверки введенных параметров для индикатора и т.д. Только как это изобразить в коде mql4 ?

int start()
{
    static datetime prevBarTime = 0;
 
    if( prevBarTime == Time[ 0 ] ) return( 0 );
    prevBarTime = Time[ 0 ];
 
    ....
}

Тело функции start(), отмеченное в коде как "...." будет выполняться только на каждом новом баре, а не на каждом тике.
 
Спасибо сейчас попробую это сделать.
Вопрос вдогонку) ошибка TestGenerator: unmatched data error не кретическая, то есть и сней работать должен?
 
Смотря как посмотреть. Если вас устраивают результаты, полученные на некорректных данных, то не критическая. Если не устраивают, то нужно перезакачать котировки.
 
KING:
Предположим я выкинул код самого иникатора. Скомпилировал индикатор, положил его где надо, привязал его к коду эксперта функцией iCustom. А как будут браться значения этого индикатора? Для текущего тика? Хотелось бы чтобы рассматривалось значение для последних трех. Или можно самому указать в функции:

double iCustom( string symbol, int timeframe, string name, ..., int mode, int shift)
где номер бара от которого нужно значение индикатора, это последняя переменная в фунции iCustom, int shift???

И хочеться все-таки ещё помимо этого про второй вопрос выяснить. Про то как генерировать сигналы только в начале формирования нового бара, это наверно надо какой-то фильтр воткнуть в самое начало кода, где проходят проверки введенных параметров для индикатора и т.д. Только как это изобразить в коде mql4 ?


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

Например, про использование в эксперте значений пользовательских индикаторов - Совместное использование программ.

Про то, как генерировать сигналы в начале нового бара посмотрите Массивы , Задача 27.

 
//---------------------торговые критерии-------------------------------//
   indi0 = iCustom (NULL,0,"Average_Direct",2,0);
   indi1 = iCustom (NULL,0,"Average_Direct",2,1);
  
  
if (indi1<indi0 && indi1<0 && indi0>0) //покупаем--//
   {
   Opn_B=true;
   Cls_S=true;
   }
if (indi1>indi0 && indi1>0 && indi0<0) //продаем---//
   {
   Opn_S=true;
   Cls_B=true;
   }
Результаты на некорректных данных это плохо, но сейчас хотя бы одну сделку совершенную увидеть.
Вот измененный код, ни одной сделки, все равно....
 
SK. писал (а):
KING:

Предположим я выкинул код самого иникатора. Скомпилировал индикатор, положил его где надо, привязал его к коду эксперта функцией iCustom. А как будут браться значения этого индикатора? Для текущего тика? Хотелось бы чтобы рассматривалось значение для последних трех. Или можно самому указать в функции:



double iCustom( string symbol, int timeframe, string name, ..., int mode, int shift)

где номер бара от которого нужно значение индикатора, это последняя переменная в фунции iCustom, int shift???



И хочеться все-таки ещё помимо этого про второй вопрос выяснить. Про то как генерировать сигналы только в начале формирования нового бара, это наверно надо какой-то фильтр воткнуть в самое начало кода, где проходят проверки введенных параметров для индикатора и т.д. Только как это изобразить в коде mql4 ?



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



Например, про использование в эксперте значений пользовательских индикаторов - Совместное использование программ.



Про то, как генерировать сигналы в начале нового бара посмотрите Массивы , Задача 27.


Сегодня уже точно не почитаю, хватит. МоЗГ ЛОпнеТ у меня скоро, просто охота увидеть рабочий эксперт, пусть каряво но рабочий. Я посмотрел в учебник, я про массивы уже читал с утра, только забыл к ночи) ups
 
KING:
Сегодня уже точно не почитаю, хватит. МоЗГ ЛОпнеТ у меня скоро, просто охота увидеть рабочий эксперт, пусть каряво но рабочий. Я посмотрел в учебник, я про массивы уже читал с утра, только забыл к ночи) ups


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

Но лучше неторопясь разобраться.

 
И проблема все таки имеется... В код эксперта я вставил код для работы только на начало бара
int start()
{
    static datetime prevBarTime = 0;
 
    if( prevBarTime == Time[ 0 ] ) return( 0 );
    prevBarTime = Time[ 0 ];
 
    ....
}
Потом я в сделал так, чтобы эксперт писал в журнал значения обрабатываемого индикатора. Как оказалось предпоследнее значение это значение индикатора на предпоследнем баре, а текущее это значение следующего тика открывающего новый бар, следующий за предыдущим, следовательно сделки не могли совершаться так как не было необходимых условий, в силу малого различия в значениях индикатора на текущем и предыдущем тике. Поэтому я сделал так, чтобы  iCustom выдавала значения предпоследнего и последнего бара (то есть поменял последние цифры в iCustom 0 на 1, 1 на 2)
double indi0=iCustom(NULL,0,"Average_Direct",2,1);
   double indi1=iCustom(NULL,0,"Average_Direct",2,2);
   
  
//-------------------------------------------------------------- 5b --
   if (indi1<indi0 && indi1<=0.0 && indi0>0.0) //покупаем--//
    {
    Opn_B=true;
    Cls_S=true;
    }
   if (indi1>indi0 && indi1>=0.0 && indi0<0.0) //продаем---//
    {
    Opn_S=true;
    Cls_B=true;
    }
Теперь в журнале я начел находить подходящие условия для открытия позиции, но она все равно не открывается.
В журнал я начал выводить значения следующих переменных чтобы посмотреть может ошибка где-то в коде дальше, но обнаружил что проходит изменение сигналов Opn_B,Cls_S,Opn_S,Cls_B. Не выполняется if, и я не могу разобраться где я допустил ошибку при задании условия.
Предположим что
indi1=6
indi0=50
Хе-хе-хе, вот излагал свои мысли и понял, что все относительно 25 надо, а не 0 рассматривать и пошли сделочки)))

Спасибо, и мне и Вам.
Причина обращения: