ZigZag как расчитать сформировавшийся луч, и поделить попалам?

 

Здравствуйте асы программинга, столкнулся с проблемой деления луча ZZ попалам, и выведения уровня середины луча, - как это сделать?..... мне сказали в ветке вопросов что последняя точка не расчитывается у зигзага.

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

   double ind1.up = iCustom(Symbol(), PERIOD_H1, "ZigZag_NK", ZZ_Depth1, 5, 3, 0, 1);
   double ind1.dn = iCustom(Symbol(), PERIOD_H1, "ZigZag_NK", ZZ_Depth1, 5, 3, 1, 1);
   if (ind1.up != EMPTY_VALUE  ) ind1.arr_1 =- 1;
	else if (ind1.dn != EMPTY_VALUE )   ind1.arr_1 = 1;  
   

   if ((Close_P)&& ind.arr_1 /2*Point){   // как вписать формулу что я не так делаю? 
   
   int slippage=3;
   for (int i=OrdersTotal()-1; i>=0; i--)
   {
    if (!OrderSelect(i,SELECT_BY_POS,MODE_TRADES)) break;
    if (OrderType()==OP_BUY ) OrderClose (OrderTicket(),OrderLots(),MarketInfo(OrderSymbol(),MODE_BID),slippage);
    if (OrderType()==OP_SELL) OrderClose (OrderTicket(),OrderLots(),MarketInfo(OrderSymbol(),MODE_ASK),slippage);
    }
    }
 

Я могу вам предложить расчет точек "штатного" зигзага мт4.

В т.ч. и по вашему вопросу "средней линии".

Устроит вас такой вариант ?

 
Да любой вариант можно
rid >>:

Я могу вам предложить расчет точек "штатного" зигзага мт4.

В т.ч. и по вашему вопросу "средней линии".

Устроит вас такой вариант ?


Да устроит.
 

Вот так я реализовал в своем советнике расчет точек:

#property copyright "Copyright © 2009, MQ ."
#property link      "MQL "
//-------------------------------------------------------------------+
//В версию  Внесены  след. изменения:
// Введен параметр StopLoss_Average
//При StopLoss_Average =True; стоплоссы ордеров выставляются строго на 
// средней линии между последними экстремуми зигзага.
//При StopLoss_Average== false стоплоссы ордеров выставляются в соотв. с
// заданными значениями StopLossBuy и StopLossSell

extern string     _  = "---- ОБЩИЕ ПАРАМЕТРЫ -----"; 
extern int       MAGIC = 2778609;
extern double    lots=0.1;
extern int       Time_=60;// время существования ордера в мин.
extern int       Slippage=3;
extern bool      StopLoss_Average =True;
extern string     __  = "---- ПАРАМЕТРЫ BUY -----"; 
extern bool       BUY=True;
extern int       StopLossBuy=0;
extern int       TakeProfitBuy=55;
extern int       Delta=10;
extern string     ___  = "---- ПАРАМЕТРЫ SELL -----"; 
extern bool       SELL=True;
extern int       StopLossSell=0;
extern int       TakeProfitSell=55;
extern int       Delta_=10;

extern string     ____  = "---- ПАРАМЕТРЫ ИНДИКАТОРА ZIG-ZAG -----"; 
extern int       ExtDepth     = 12;
extern int       ExtDeviation = 5;
extern int       ExtBackstep  = 3;
 int       ShiftBars    = 1;

Далее в функции СТАРТ  задаем расчет последних вершин зигзага

int ticket;
datetime ExpTime;
//-- Подключаемые модули --
#include <stderror.mqh>
#include <stdlib.mqh>
//==================================================
int start()
  {
 double // экстремумы Зиг-Зага
  y3=0, //предпоследнего экстремума
   y2=0,//значение последего экстремума
    y1=0,//тек. цена
     y0,//кончик посл. луча  
     zz;    //кончик 3-го экстр 
 int    x3, x2, x1, sh=ShiftBars;// номера баров  
 
  double price;
  double profit=0;
  ExpTime=TimeCurrent()+Time_*60;
  
  double stop;
 // Comment(zz,"_",y1,"_",y2,"_",y3);
  y0=iCustom(NULL, 0, "ZigZag", ExtDepth, ExtDeviation, ExtBackstep, 0, 1);
  double StopLevel = MarketInfo(Symbol(),MODE_STOPLEVEL); 
//=============================================================================
  // Берём три экстремума Зиг-Зага
   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++;
  
 

Потом, для наглядности, выводим на график отображение информации о вершинах зигзага.

              
 //----- Вывод информации на экран -----------------------------------------------
string info="";
string on_off="---------------------------------------------------"+  "\r\n";
if (BUY)     on_off=StringConcatenate  (on_off,"Сделки BUY разрешены ", "\r\n");
else         on_off=StringConcatenate (on_off,"Сделки BUY - отключ. ","\r\n");
if (SELL)    on_off=StringConcatenate (on_off,"Сделки SELL разрешены ","\r\n");
else         on_off=StringConcatenate (on_off,"Сделки SELL - отключ. ","\r\n");
on_off=StringConcatenate (on_off,"Экстремум= ",y1," на ",x1," баре","\r\n");
on_off=StringConcatenate (on_off,"Экстремум= ",y2," на ",x2," баре","\r\n");
info=StringConcatenate(info,on_off,"\r\n");
info=StringConcatenate(info,"\r\n");
Comment(info);    
//-----------------------------------------------                
                
      } // while (y3==0) 
//жжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжж  
//ЗДЕСЬ ИДЕТ ОТКРЫТИЕ И ЗАКРЫТИЕ ПОЗИЦИЙ
//жжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжж
  return(0);//конец функции int start()
  }    

Уже в таком виде советник будет выводить на график текущие последние экстремумы (мин и макс).

Посмотрите в тестере, в режиме ВИЗУАЛИЗАЦИЯ.

Надеюсь, теперь у вас затруднений не возникнет.

 

Чтобы рассчитаь середину между двумя экстремумами последнего луча достаточно взять:

double СЕРЕДИНА =MathAbs( (y1-y2)/2 );
 
rid >>:

Чтобы рассчитаь середину между двумя экстремумами последнего луча достаточно взять:



Спасибо огрмное, rid!


Прям полный расклад попробую, разобраться)

 
rid >>:

Чтобы рассчитаь середину между двумя экстремумами последнего луча достаточно взять:


double СЕРЕДИНА =MathAbs( (y1-y2)/2 );

А ещё лучше вот так:

double СЕРЕДИНА =MathAbs( (y1-y2)*0,5 );

не попадёте на деление нуля точно.

 
Urain >>:

А ещё лучше вот так:

не попадёте на деление нуля точно.

Urain Спасибо!

 

Чтобы потом дополнительных вычислений не делать:

СЕРЕДИНА = (y1+y2)*0,5;

 
nen >>:

Чтобы потом дополнительных вычислений не делать:

СЕРЕДИНА = (y1+y2)*0,5;

nen Спасибо!

Как раз хотел спросить у Вас как специалиста по ZZ есть подобный ZZ по которому можно расчитать так же идентично расчет как этот только что бы он не перерисовывался, может у Вас завалялась такая версия?

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