Снова про индикаторы в Экспертах - вопрос к разработчикам

 
Добрый день, господа.

Снова встал больной вопрос: чем отличается расчет индикаторов в экспертах и "в реальной жизни"?

Я провел простой экперимент на примере знакомого мне индикатора ZigZag. Вот эксперт, который не торгует, а просто экспортируект котировки и значения индикатора в CSV, он вполне обычен, в нем интересны только последние 4 строки:

extern double TakeProfit = 50;
extern double Lots = 1;
extern double TrailingStop = 30;
extern datetime LastDate4Opening;// количество тиков до T0, когда обрывать торги

int ExtHandle;
string nameFile;
//+------------------------------------------------------------------+
//| expert initialization function                                   |
//+------------------------------------------------------------------+
int init()
  {
    nameFile=Symbol()+"_ZigZag_Expert";
   ExtHandle=FileOpen(nameFile+".csv",FILE_WRITE | FILE_CSV,";");
   if (ExtHandle==-1) {Alert("Не удалось открыть файл");return;}
   FileWrite(ExtHandle,"Time;Open;Close;Low;High;ZigZag");

   return(0);
  }
//+------------------------------------------------------------------+
//| expert deinitialization function                                 |
//+------------------------------------------------------------------+
int deinit()
  {
   FileClose(ExtHandle); ExtHandle=-1;   
   return(0);
  }
//+------------------------------------------------------------------+
//| expert start function                                            |
//+------------------------------------------------------------------+
int start()
  {
  double ZigZag;
  int cnt;
  
  cnt=1;
      ZigZag=iCustom(Symbol(),Period(),"ZigZag",0,cnt);
      FileWrite(ExtHandle,TimeToStr(Time[cnt]),Open[cnt],Close[cnt],Low[cnt],High[cnt],ZigZag);
   return(0);
  }



То есть создается такой эксперт, а потом запускается тестирование стратегии для него (я брал период EURUSD, 27.05.2004 - 27.06.2004, H1). Никаких сделок в результате не родится, но будет создан файл CSV.

Если построить график полученных значений Close и Zigzag в MS Excel (я бы приложил скриншот, но не понимаю, как это сделать здесь), то станут видны странные аномалии в индикаторе: минимумы и максимумы не чередуются и не образуют собственно "зигзага"; возможно несколько "минимумов" подряд и наоборот.

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

Так вот, вопрос: в чем различие расчета индикатора на графике и в эксперте? Для всех ли индикаторов происходит такая штука или только для некоторых (тогда - для каких)?

Заранее спасибо за помощь.

Как-то сложно доверять собственной стратегии, когда не уверен в методах проверки... :(

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


Ну, представил, и что? Все равно, Зигзаг выдаст "пилу", он так устроен. А при использовании в Советнике - не выдает. Я могу письмом скриншот прислать, если скажешь, куда...
 
индикаторы выполняются в вызываемом потоке. либо в интерфейсном потоке, если просто используются на графиках. либо в потоке эксперта (скрипта или индикатора), но в этом случае вызванный индикатор просто рассчитывается, нигде не отображаясь
 
индикаторы выполняются в вызываемом потоке. либо в интерфейсном потоке, если просто используются на графиках. либо в потоке эксперта (скрипта или индикатора), но в этом случае вызванный индикатор просто рассчитывается, нигде не отображаясь


Да, это я понимаю. Вопрос в том, почему в разных потоках (на графике и в экспрте) они считаются по разному?

Я так понимаю, что в эксперте индикатор считается неверно. Поправьте меня, если я не прав.
 
Я немного раскрасил твой вариант.
//+------------------------------------------------------------------+
//|                                                    UR_Zigzag.mq4 |
//|                                                               UR |
//|                             http://www.metaquotes.ru/forum/6423/ |
//+------------------------------------------------------------------+
#property copyright "UR"
#property link      "http://www.metaquotes.ru/forum/6423/"

extern double TakeProfit = 50;
extern double Lots = 1;
extern double TrailingStop = 30;
extern datetime LastDate4Opening;// количество тиков до T0, когда обрывать торги

int ExtHandle,zigCounter;
string nameFile;

//+------------------------------------------------------------------+
//|  Set arrow                                                       |
//+------------------------------------------------------------------+
void SetArrow(datetime _time,double _price,string _Description ,int _arrowType, color _arrowColor)
   {
   ObjectCreate(_Description,OBJ_ARROW,0,_time,_price);
   ObjectSet(_Description,OBJPROP_ARROWCODE,_arrowType);
   ObjectSet(_Description,OBJPROP_COLOR,_arrowColor);
   //ObjectSetText(_Description,_Description);
   }


//+------------------------------------------------------------------+
//| expert initialization function                                   |
//+------------------------------------------------------------------+
int init()
  {
    nameFile=Symbol()+"_ZigZag_Expert";
   ExtHandle=FileOpen(nameFile+".csv",FILE_WRITE | FILE_CSV,";");
   if (ExtHandle==-1) {Alert("Не удалось открыть файл");return;}
   FileWrite(ExtHandle,"Time;Open;Close;Low;High;ZigZag");

   return(0);
  }
//+------------------------------------------------------------------+
//| expert deinitialization function                                 |
//+------------------------------------------------------------------+
int deinit()
  {
   FileClose(ExtHandle); ExtHandle=-1;   
   return(0);
  }
//+------------------------------------------------------------------+
//| expert start function                                            |
//+------------------------------------------------------------------+
int start()
  {
  double ZigZag;
  int cnt;
  
  cnt=1;
      ZigZag=iCustom(Symbol(),Period(),"ZigZag",0,cnt);
      if (ZigZag>0.0) {SetArrow(Time[cnt],ZigZag,zigCounter,159,Yellow);zigCounter++;}
      FileWrite(ExtHandle,TimeToStr(Time[cnt]),Open[cnt],Close[cnt],Low[cnt],High[cnt],ZigZag);
   return(0);
  }



Прогнал в тестере на Евре в твоем интервале по Опен прайс.



Единственный вопрос может быть по 4 июня.

 
Скорей всего, это связано с алгоритмом обработки внешнего бара (по свингам Ганна мне это знакомо) в самом индикаторе ZigZag (в коде не было обработки такой ситуации, насколько я помню стандартный Zigzag).

Сам рисунок я разместил здесь - "MQL4: Вопросы по MQL4." , а посте вставил только ссылку на него.

Так что это опять доказывает, что в МТ4 можно использовть для бектеста стратегии с использованием стандартного Зигзага (только медленно).
"Сделать женщину счастливой легко - только дорого" Н.Фоменко ("Русское радио")
 
Скорей всего, это связано с алгоритмом обработки внешнего бара (по свингам Ганна мне это знакомо) в самом индикаторе ZigZag (в коде не было обработки такой ситуации, насколько я помню стандартный Zigzag).


Гм. Надо бы подучить матчасть :)

А что такое "обработка внешнего бара"? И можно ли пример того, как с нею бороться?

Я делал на Close, а не на Open. И у меня получается, что ситуация "а-ля 4 июня" получается едва ли не чаще, чем корректные значения.

Сам рисунок я разместил здесь - "MQL4: Вопросы по MQL4." , а посте вставил только ссылку на него.


Ок, спасибо за совет. Т.е. вот просто вываливаем рисунки на форуме в этом треде и потом вставляем их куда хотим, так?

Кстати, а "раскраска" состояла в рисовании желтых точек, да? А красная ломаная - это штатный ZigZag?
 
Прогони советника - ты все увидишь сам. Рисунки вываливать там может и не очень хорошо, но пока никто не ругался :)
А если нужен головняк с внешними барами ... - http://forex.kbpauk.ru/showflat.php/Cat/0/Number/54085/page/0/fpart/19/vc/1
если дойдешь до конца - не пожалеешь :)
 
Прогони советника - ты все увидишь сам.


Прогнал - и перестал понимать :)

Вот смотри, желтые точки - это бары, в которых Зигзаг внутри эксперта был ненулевым, так? Но Зигзаг устроен так, что если перед сначала был "минимум" (срабатывание, при котором Зигзаг стал равен Low данного бара), то следующее срабатываение будет "максимумом" (такое, при котором Зигзаг станет равен High данного бара). Т.е. не обязательно будет, но >95% - точно:)

А на том скриншоте, который ты выложил, между 28 мая и 1 июня есть аж 10 (!) "минимумов" подряд.

Но самое интересное, что красная кривая на этьой картинке - Зигзаг выполненный в потоке "рисование графика" - показывает все нормально, и за весь месяц - только одна аномалия (4 июня).
 
Только недавно разбирали алгоритм Zigzaga на этом форуме, поищи. Иначе как слепой с глухим.
Причина обращения: