Помогите описать кусочек кода. Хочу прикрутить уровни Фибоначи к зигзагу.

 

Помогите описать кусочек кода. Хочу прикрутить уровни Фибоначи к зигзагу. Логика простая, на коррекции входим в продажи или покупки. Так же смотрим на последнее движение зигзага. Проблема в описании экстремумов зигзага. У зигзага экстремум формируется не чаще чем раз в пять свечей, а в моем коде все как то криво! 

Прошу помощи в общем кому не сложно помочь!

вот код:   for(int i=5;i<=20;i++)

     {

     if(Low1>lowM15[i]){Low1=lowM15[i];}

     if(highM15[i]-Low1>(highM15[1]-Low1)*0.12){indLow1=i;break;}

     }

     for(int i=indLow1;i<=indLow1+40;i++)

     {

     if(High2<highM15[i]){High2=highM15[i];}

     if((High2-Low1)*0.12<High2-lowM15[i]){break;}

     }

     }

     if((High2-Low1)*0.39<highM15[1]-Low1){Sell=true;}

На картинках условия для входа.

Файлы:
bj_sle9_1.jpg  120 kb
3d_x0e7_2.jpg  135 kb
 
vitaliy9999999:

Помогите описать кусочек кода. Хочу прикрутить уровни Фибоначи к зигзагу. Логика простая, на коррекции входим в продажи или покупки. Так же смотрим на последнее движение зигзага. Проблема в описании экстремумов зигзага. У зигзага экстремум формируется не чаще чем раз в пять свечей, а в моем коде все как то криво! 

Прошу помощи в общем кому не сложно помочь!

вот код:   for(int i=5;i<=20;i++)

     {

     if(Low1>lowM15[i]){Low1=lowM15[i];}

     if(highM15[i]-Low1>(highM15[1]-Low1)*0.12){indLow1=i;break;}

     }

     for(int i=indLow1;i<=indLow1+40;i++)

     {

     if(High2<highM15[i]){High2=highM15[i];}

     if((High2-Low1)*0.12<High2-lowM15[i]){break;}

     }

     }

     if((High2-Low1)*0.39<highM15[1]-Low1){Sell=true;}

На картинках условия для входа.

1. Вставляйте код правильно, а не в виде простыни текста.

2. Всегда в редакторе применяйте стилизатор - Вы сразу будете видеть свои ошибки:

   for(int i=5;i<=20;i++)
     {
      if(Low1>lowM15[i])
        {
         Low1=lowM15[i];
        }
      if(highM15[i]-Low1>(highM15[1]-Low1)*0.12)
        {
         indLow1=i;break;
        }
     }
   for(int i=indLow1;i<=indLow1+40;i++)
     {
      if(High2<highM15[i])
        {
         High2=highM15[i];
        }
      if((High2-Low1)*0.12<High2-lowM15[i])
        {
         break;
        }
     }
  }

if((High2-Low1)*0.39<highM15[1]-Low1)
  {
   Sell=true;
  }

Как только код будет исправным, можно будет дальше его наполнять.

 
Vladimir Karputov:

1. Вставляйте код правильно, а не в виде простыни текста.

2. Всегда в редакторе применяйте стилизатор - Вы сразу будете видеть свои ошибки:

Как только код будет исправным, можно будет дальше его наполнять.

Насчет скобочки я согласен. Я просто вырвал кусок кода из тела программы... у меня сложность в расчете эктремумов зигзага, что бы наложить на них уровни фибо. у индикатора зигзаг задается количество свечь в которых индикатор не может нарисовать две вершины. Я в принципе рассчитал движение на 12 процентов, но как задать количество свеч? 

 
vitaliy9999999:

Насчет скобочки я согласен. Я просто вырвал кусок кода из тела программы... у меня сложность в расчете эктремумов зигзага, что бы наложить на них уровни фибо. у индикатора зигзаг задается количество свечь в которых индикатор не может нарисовать две вершины. Я в принципе рассчитал движение на 12 процентов, но как задать количество свеч? 

Есть пример работы с фракталами:

... Способы привязки объектов. В приведенном там скрипте показано, как получать значения индикатора iFractals на последних 1000 барах и как потом вывести  на график по десять последних фракталов вверх и вниз. 

Вам с зигзагом нужно делать аналогично. 
 

Сейчас как раз работаю с ZZ, сделал функцию по вершинам.

input int   ExtDepth=48;
input int   ExtDeviation= 5;
input int   ExtBackstep = 3;

int      handle_ZZ=0;
double   ZigZagVizual[];   // визуализация зиг-зага
double   ZigZagHighs[];   // верхние переломы зиг-зага
double   ZigZagLows[];   // нижние переломы зиг-зага

double          ZZ_High_Price[];    //Максимальная цена отрезка
datetime        ZZ_High_Time[];     //Время образования максимальной цены вершины
double          ZZ_Low_Price[];     //Минимальная цена отрезка
datetime        ZZ_Low_Time[];      //Время образования минимальной цены вершины
double          ZZ_Start_Price[];   //Начальная цена отрезка
datetime        ZZ_Start_Time[];    //Время начала отрезка
double          ZZ_Stop_Price[];    //Конечная (текущая для последнего) цена отрезка
datetime        ZZ_Stop_Time[];     //Время окончания отрезка
int             ZZ_Vektor[];        //Вектор направления отрезка


int OnInit()
  {
         handle_ZZ=iCustom(Symbol(),PERIOD_CURRENT,"Examples\\ZigZag_",ExtDepth,ExtDeviation,ExtBackstep);
      if(handle_ZZ==INVALID_HANDLE)
        {
         PrintFormat("Failed to create handle of the handle_ZZ indicator for the symbol %s/%s, error code %d",
                     Symbol(),EnumToString(Period()),GetLastError());
         return(INIT_FAILED);
        } 

   return(INIT_SUCCEEDED);
  }

void OnTick()
  { 
	ZZ();

	Print ("ZZ_Start_Price=",ZZ_Start_Price[0]," ZZ_Stop_Price=",ZZ_Stop_Price[0]);
	Print ("ZZ_Start_Time=",ZZ_Start_Time[0]," ZZ_Stop_Time="+ZZ_Stop_Time[0]);
  }

void ZZ()
{
   ArrayFree(ZigZagHighs);
   ArrayFree(ZigZagLows);
   ArrayFree(ZigZagVizual);

//      Скопируем верхние и нижние переломы зиг-зага в буферы:
   int BarTotal=Bars(Symbol(),PERIOD_CURRENT);
   CopyBuffer(handle_ZZ,1,0,BarTotal,ZigZagHighs);
   CopyBuffer(handle_ZZ,2,0,BarTotal,ZigZagLows);
//      Скопируем визуализацию переломов зиг-зага в буферы:
   CopyBuffer(handle_ZZ,0,0,BarTotal,ZigZagVizual);

// Увеличим размер буферов до количества баров
   int arrSize=MathMax(ArraySize(ZigZagHighs),ArraySize(ZigZagLows));
   ArrayFree(ZZ_High_Price);
   ArrayFree(ZZ_High_Time);
   ArrayFree(ZZ_Low_Price);
   ArrayFree(ZZ_Low_Time);
   ArrayResize(ZZ_High_Price,arrSize);
   ArrayResize(ZZ_High_Time,arrSize);
   ArrayResize(ZZ_Low_Price,arrSize);
   ArrayResize(ZZ_Low_Time,arrSize);

//--Уберем промежутки между ZZ
   int A=0;
   int B=0;

   double ZZ_High=0.0;
   double ZZ_Low=0.0;

   for(int i=arrSize-1; i>0; i--)
     {
      ZZ_High=ZigZagHighs[i];
      ZZ_Low=ZigZagLows[i];
      if(ZZ_High>0 && ZigZagVizual[i]>0)
        {
         ZZ_High_Price[A]=ZZ_High;
         ZZ_High_Time[A]=iTime(Symbol(),PERIOD_CURRENT,BarTotal-i-1);
         A++;
        }
      if(ZZ_Low>0 && ZigZagVizual[i]>0)
        {
         ZZ_Low_Price[B]=ZZ_Low;
         ZZ_Low_Time[B]=iTime(Symbol(),PERIOD_CURRENT,BarTotal-i-1);
         B++;
        }
     }

//--Узнаем максимальное число отрезков
   int arrSizeOtrezok=MathMax(A*2,B*2)+1;

   ArrayFree(ZZ_Start_Price);
   ArrayFree(ZZ_Start_Time);
   ArrayFree(ZZ_Stop_Price);
   ArrayFree(ZZ_Stop_Time);
   ArrayResize(ZZ_Start_Price,arrSizeOtrezok);
   ArrayResize(ZZ_Start_Time,arrSizeOtrezok);
   ArrayResize(ZZ_Stop_Price,arrSizeOtrezok);
   ArrayResize(ZZ_Stop_Time,arrSizeOtrezok);

   ArrayFree(ZZ_Vektor);
   ArrayResize(ZZ_Vektor,arrSizeOtrezok);


   int VektorLast=0; //--Вектор последнего отрезка

//--Определим вектор последнего отрезка
   if(ZZ_High_Time[0]>ZZ_Low_Time[0]) VektorLast=1;
   if(ZZ_High_Time[0]<ZZ_Low_Time[0]) VektorLast=-1;
   Print(VektorLast);

   bool Chetniy=false;
   double ChetniyN=0;

   for(int i=0; i<arrSizeOtrezok-1; i++)
     {
      Chetniy=true;
      ChetniyN=i;
      if(i>0 && NormalizeDouble(ChetniyN/2,0)-ChetniyN/2>0)Chetniy=false;
      if(VektorLast==1)
      {
      if(Chetniy==false)//2
           {
            int N=(i-1)/2;
            ZZ_Start_Price[i-1]=ZZ_Low_Price[N];
            ZZ_Start_Time[i-1]=ZZ_Low_Time[N];
            ZZ_Stop_Price[i-1]=ZZ_High_Price[N];
            ZZ_Stop_Time[i-1]=ZZ_High_Time[N];
            ZZ_Vektor[i-1]=1;
     
            ZZ_Start_Price[i]=ZZ_High_Price[N+1];
            ZZ_Start_Time[i]=ZZ_High_Time[N+1];
            ZZ_Stop_Price[i]=ZZ_Low_Price[N];
            ZZ_Stop_Time[i]=ZZ_Low_Time[N];
            ZZ_Vektor[i]=-1;
            }
       }     
      if(VektorLast==-1)
      {
      if(Chetniy==false)//2
           {
            int N=(i-1)/2;
            ZZ_Start_Price[i-1]=ZZ_High_Price[N];
            ZZ_Start_Time[i-1]=ZZ_High_Time[N];
            ZZ_Stop_Price[i-1]=ZZ_Low_Price[N];
            ZZ_Stop_Time[i-1]=ZZ_Low_Time[N];
            ZZ_Vektor[i-1]=-1;
     
            ZZ_Start_Price[i]=ZZ_Low_Price[N+1];
            ZZ_Start_Time[i]=ZZ_Low_Time[N+1];
            ZZ_Stop_Price[i]=ZZ_High_Price[N];
            ZZ_Stop_Time[i]=ZZ_High_Time[N];
            ZZ_Vektor[i]=1;
            }
       }        
     }
 
Aleksey Vyazmikin:

Сейчас как раз работаю с ZZ, сделал функцию по вершинам.

Если можно, то прокомментируйте что делает этот код, и как его использовать?

 
Vitaly Muzichenko:

Если можно, то прокомментируйте что делает этот код, и как его использовать?

Обновил код выше (правда пока нет возможности проверить) - надеюсь там понятней.

Код определяет время и цену начала и окончания отрезков ЗЗ и их вектор направленности.

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

Так как код основан на логике, последовательности направления векторов "+1/-1/+1/-1", то в случае выкрутасов стандартного ЗЗ "+1/+1/-1/+1" - могут быть сбои. Но, это бывает не столь часто, поэтому пока для меня не столь критично, зато работать может с любым ЗЗ.

Добавлю, забыл отметить, что номер отрезка с права налево идет, и все это хранится в массиве.

PS не забываем вызов функции ZZ();

Расчет лучше делать по необходимости, конечно...

 

Когда то я решал подобную задачу для ZigZag: https://www.mql5.com/ru/code/18319

Думаю, что Вам это поможет.


Удачи.

ZigZag 2 луча
ZigZag 2 луча
  • голосов: 21
  • 2017.05.22
  • Valeriy Medvedev
  • www.mql5.com
К стандартному зигзагу добавлены уровни поддержки и сопротивления.