Эксперт на ещё одну версию Зигзага. Что не так?

 

Проблема заключается в следующем: написал эксперт на Зигзаг (спасибо Киму - использовал часть его кода), который в МТ - эксперт работает. Делаю тоже со своим зигзагом - тишина, в то же время индикатор работает как положено.

Подскажите пожалуйста в чём может быть проблема?

(На всякий случай полные коды в прикреплённых файлах)

Вот часть кода эксперта зигзага изв мт:

  double y3=0, y2=0, y1=0, y0,zz;    // экстремумы Зиг-Зага
  int    x3, x2, x1, sh=ShiftBars;// номера баров
  double stop;
  
  y0=iCustom(NULL, 0, "ZigZag", ExtDepth, ExtDeviation, ExtBackstep, 0, 1);
  // Берём три экстремума Зиг-Зага
   while (y3==0) 
      {
      zz=iCustom(NULL, 0, "ZigZag", ExtDepth, ExtDeviation, ExtBackstep, 0, sh);
      if (zz!=0 && zz!=EMPTY_VALUE) 
         {
         if      (y1==0) { x1=sh; y1=zz; }
         else if (y2==0) { x2=sh; y2=zz; }
         else if (y3==0) { x3=sh; y3=zz; }
         }
      sh++;
      }  
//----
   if(!ExistPositions())
      {
      if(y0 != EMPTY_VALUE && y0>y1 && y1<y2 && y0>y2 && High[1]>=y0 && Close[2]<y0) 
         {
         stop = y1-StopIndent*Point;
         OrderSend(Symbol(), OP_BUY, Lot, Ask, 0, stop, 0, "", MAGIC, 0, Blue);
         return(0);
         }
      if(y0 != EMPTY_VALUE && y0<y1 && y1>y2 && y0<y2 && Low[1]<=y0 && Close[2]>y0)
         {
         stop = y1+StopIndent*Point;
         OrderSend(Symbol(), OP_SELL, Lot, Bid, 0, stop, 0, "", MAGIC, 0, Red);
         return(0);
         }
      } 

Пару слов о "моей" (насколько я знаю введена Артуром Мериллом и именно этот ЗЗ можно назвать классическим ) версии ЗигЗага: строится по ценам закрытия при изменении цены на х%. Я добавил ещё т.н. треки, чтобы можно было видеть все точки в которых "был" зигзаг. Вот основная часть кода:

   for (int i=Bars-1; i>=0; i--)
      {
      if (UseReverseInPoints)
         reverse = ReversePoints*Point;
      else
         reverse = NormalizeDouble(ReversePercent*Close[i]/100,Digits);
//--------------------------------
      if (up)
         {
         if (Close[i] > prev)
            {
            zz[i]=Close[i]; prev=Close[i]; zz[i+1]=EMPTY_VALUE; 
            trackUp[i]=Close[i]; trackDn[i]=EMPTY_VALUE;
            if (zz[i]>zz[lastmax])
               zz[lastmax]=EMPTY_VALUE;
            }
         else if (Close[i] < prev - reverse)
            {
            zz[i]=Close[i]; prev=Close[i]; up=false;
            lastmax=EMPTY_VALUE;
            trackDn[i]=Close[i]; trackUp[i]=EMPTY_VALUE;
            }
         else
            {
            zz[i]=EMPTY_VALUE;
            if (ShowNoChangeTrack)
               {
               trackUp[i]=prev; 
               trackDn[i]=EMPTY_VALUE;
               }
            if (zz[i+1] != EMPTY_VALUE)
               lastmax=i+1;
            }
         }
      else
         {
         if (Close[i] < prev)
            {
            zz[i]=Close[i]; prev=Close[i]; zz[i+1]=EMPTY_VALUE;
            trackDn[i]=Close[i]; trackUp[i]=EMPTY_VALUE;
            if (zz[i]<zz[lastmin])
               zz[lastmin]=EMPTY_VALUE;
            }
         else if (Close[i] > prev+reverse)
            {
            zz[i]=Close[i]; prev=Close[i]; up=true;
            lastmin=EMPTY_VALUE;
            trackUp[i]=Close[i]; trackDn[i]=EMPTY_VALUE;
            }
         else
            {
            zz[i]=EMPTY_VALUE;
            if (ShowNoChangeTrack)
               {
               trackDn[i]=prev; 
               trackUp[i]=EMPTY_VALUE;
               }
            if (zz[i+1] != EMPTY_VALUE)
               lastmin=i+1;
            }
         }         
      }

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

Файлы:
 
Не смог прикрепить одним махом все файлы, прикрепляю файл с индикатором Зигзага
Файлы:
 
... и файл с экспертом на ЗигЗаг, который идёт с МТ:
Файлы:
zzoexpert.mq4  4 kb
 

В эксперте вызывается "Classic ZigZag"

iCustom(NULL,0,"Classic ZigZag",ReversePercent,UseReverseInPoints,ReversePoints,ShowNoChangeTrack,0,1);

А файл выложили с именем "ClassicpZigZagj"

Может быть здесь нестыковка.

 
Talex:

В эксперте вызывается "Classic ZigZag"

iCustom(NULL,0,"Classic ZigZag",ReversePercent,UseReverseInPoints,ReversePoints,ShowNoChangeTrack,0,1);

А файл выложили с именем "ClassicpZigZagj"

Может быть здесь нестыковка.

Это при вставке добавились символы вместо пробелов, но проблемка была именно в имени, хотя вроде всё совпадало. Переименовал индикатор, вызвал его под новым именем и всё наладилось.

Спасибо за ответ.

 
Rone:

...проблемка была именно в имени, хотя вроде всё совпадало...

Ну если вместо пробелов вставились символы, то разница между именами, как раз в один пробел. Бывает ;)

 

Есть ещё вопрос, но уже не по зигзагу.

Можно ли каким либо образом узнать индекс бара, на котором была открыта/закрыта сделка? Т.е. есть функция, которая при тестировании записывает историю в файл, но хочется отследить (записать) и эффективность входов и выходов (по Булашёву), для чего надо знать максимальную и минимальную цену за время трейда. Представляю себе это так: зная индексы баров просто используем iHighest и iLowest и находим то, что нужно. Но вроде как есть только ф-ции OrderOpen(Close)Time() и OrderOpen(Close)Price(), которые возвращают соответственно дату и цену... Как же таки найти индексы этих баров?

 
Rone:

Есть ещё вопрос, но уже не по зигзагу.

Можно ли каким либо образом узнать индекс бара, на котором была открыта/закрыта сделка? Т.е. есть функция, которая при тестировании записывает историю в файл, но хочется отследить (записать) и эффективность входов и выходов (по Булашёву), для чего надо знать максимальную и минимальную цену за время трейда. Представляю себе это так: зная индексы баров просто используем est и est и находим то, что нужно. Но вроде как есть только ф-ции OrderOpen(Close)Time() и OrderOpen(Close)Price(), которые возвращают соответственно дату и цену... Как же таки найти индексы этих баров?

iBarShift() тебе поможет

 
Vinin:
Rone:

Есть ещё вопрос, но уже не по зигзагу.

Можно ли каким либо образом узнать индекс бара, на котором была открыта/закрыта сделка? Т.е. есть функция, которая при тестировании записывает историю в файл, но хочется отследить (записать) и эффективность входов и выходов (по Булашёву), для чего надо знать максимальную и минимальную цену за время трейда. Представляю себе это так: зная индексы баров просто используем est и est и находим то, что нужно. Но вроде как есть только ф-ции OrderOpen(Close)Time() и OrderOpen(Close)Price(), которые возвращают соответственно дату и цену... Как же таки найти индексы этих баров?

iBarShift() тебе поможет

Спасибо, всё получилось

 

Чтобы не заводить новую ветку, вопрос задам тут же. Пробую открыть ордер по-другому инструменту. Вот фрагмент кода для проверки:

   int ticket;
   double priceAsk,point,SL,TP;
   priceAsk = MarketInfo("USDCHF",MODE_ASK);
   point = MarketInfo("USDCHF",MODE_POINT);
   SL = priceAsk-StopLoss*point;
   TP = priceAsk+TakeProfit*point;
//----
   if(!ExistPositions())
      {
      if(Close[1]>Close[n]) 
         {
         ticket = OrderSend("USDCHF",OP_BUY,0.1,priceAsk,5,SL,TP,"",1234,0,Aqua);
         if (ticket<0)
            {
            Print("OrderSend ERROR #",GetLastError());
            return(0);
            }
         }
...

В журнале вот такие записи:

2008.06.27 23:14:39 2008.06.27 20:00 Proba GBPUSD,H1: unknown symbol name USDCHF for OrderSend function
2008.06.27 23:14:39 2008.06.27 19:00 Proba GBPUSD,H1: OrderSend ERROR #4106

При этом, если тестировать эксперт по чифу позиции открываются без проблем.

Подскажите пожалуйста:

Почему при тестировании на "своём" символе нет проблем, если же взять другой пишет "unknown"?

Что надо изменить, чтобы открывались позиции по другому интсрументу?

ЗЫ. На форуме нашёл практически такой же вопрос, там человек сам разобрался, но в чём была проблема к сожалению не написал...