Любые вопросы новичков по MQL4 и MQL5, помощь и обсуждение по алгоритмам и кодам - страница 1519

 
Извините что снова беспокою, но появился вопрос. Есть индикатор Color Level для МТ4, у него в наборе есть отрезки линий, которые создаются из трендовой линии TrendCreate, имеющей 4 точки привязки - date и price, и если протянуть её дальше как уровень, придется зажимать Shift. Можно ли изменить свойство  TrendCreate как у HLineCreate, т.е. чтобы отрезок был как от уровня, или может есть возможность сделать отрезок самой HLineCreate? Имею ввиду чтобы отрезок вел себя как уровень, а не трендовая линия
 
DYM:
Извините что снова беспокою, но появился вопрос. Есть индикатор Color Level для МТ4, у него в наборе есть отрезки линий, которые создаются из трендовой линии TrendCreate, имеющей 4 точки привязки - date и price, и если протянуть её дальше как уровень, придется зажимать Shift. Можно ли изменить свойство  TrendCreate как у HLineCreate, т.е. чтобы отрезок был как от уровня, или может есть возможность сделать отрезок самой HLineCreate? Имею ввиду чтобы отрезок вел себя как уровень, а не трендовая линия

Вопрос не понятен...

Зачем зажимать Shift ? Линии двигаются как захочешь. Если двигать за центральную точку, то наклон не меняется.

если хочешь изменить длину линии в индикаторе, то добавь в код выделенное желтым

extern   int               x_coor         =  10;                  // Coordinate X
extern   int               y_coor         =  20;                  // Coordinate Y

extern   int               x_size         =  155;                 // длина объектов
 
ВАААААааааааааааа. Помогите решить проблему. Я не могу понять в чем дело. В тестере даже не тестируется. Что там не хватает? Почему выполняется на каждой свече , а не по стрелке? Я уже схожу с ума((((
Файлы:
123.mq4  10 kb
 
MakarFX:

Вопрос не понятен...

Зачем зажимать Shift ? Линии двигаются как захочешь. Если двигать за центральную точку, то наклон не меняется.

если хочешь изменить длину линии в индикаторе, то добавь в код выделенное желтым

сделал гифку, у первой линии свойства трендовой линии, у второй свойства уровня (ну это чисто мне так кажется). Хотелось бы понять как можно сделать у отрезка линии - свойства второй линии.

Файлы:
line.gif  2022 kb
 
DYM:

сделал гифку, у первой линии свойства трендовой линии, у второй свойства уровня (ну это чисто мне так кажется). Хотелось бы понять как можно сделать у отрезка линии - свойства второй линии.

double a=ObjectGetDouble(ChartID,name,OBJPROP_PRICE1);
double b=ObjectGetDouble(ChartID,name,OBJPROP_PRICE2);
if(b!=a) ObjectSetDouble(ChartID,name,OBJPROP_PRICE2,a);
 
MakarFX:

Игорь спасибо, но МТ4 некорректно работает.


Подскажи что нужно исправить

такой код должен работать:

#property copyright "IgorM"
#property link      "https://www.mql5.com/ru/users/igorm"
#property version   "1.00"
#property strict
#property indicator_chart_window
#property indicator_buffers 1
#property indicator_plots   1

// plot ZigZagZZ
#property indicator_label1  "ZigZagZZ"
#property indicator_type1   DRAW_SECTION
#property indicator_color1  clrDarkBlue
#property indicator_style1  STYLE_SOLID
#property indicator_width1  3
// input parameters
input int   Deviation=10;
// indicator buffers
double         ZZBuffer[];
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
// indicator buffers mapping
   SetIndexBuffer(0,ZZBuffer,INDICATOR_DATA);
   IndicatorSetInteger(INDICATOR_DIGITS,_Digits);
   SetIndexEmptyValue(0,0.0);
   //PlotIndexSetDouble(0,PLOT_EMPTY_VALUE,0.0);
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int OnCalculate(const int        rates_total,
                const int        prev_calculated,
                const datetime   &time[],
                const double     &open[],
                const double     &high[],
                const double     &low[],
                const double     &close[],
                const long       &tick_volume[],
                const long       &volume[],
                const int        &spread[])
  {
   static bool UP;
   static double max,min;
   static int LastExt=rates_total - 1;
   static const double dev=NormalizeDouble(Deviation*_Point,_Digits);
   int limit=LastExt;
   if(prev_calculated==0)
     {
      ArrayInitialize(ZZBuffer,0.0);
      limit = LastExt = rates_total - 1;
      if(low[0]<high[1]) { min=low[limit];  max=high[limit - 1];   UP=true;  }
      else               { max=high[limit]; min  = low[limit - 1]; UP=false; }
     }
   for(int i=limit; i>=0; i--)
     {
      ZZBuffer[i]=0.0;
      if(UP)
        {
         if(low[i]-min<=0.0) { min=low[i]; ZZBuffer[LastExt]=0.0; LastExt=i; ZZBuffer[i]=min; }
         else
           {
            if(high[i]-min-dev>0.0) { max=high[i]; LastExt=i; ZZBuffer[i]=max; UP=false; }
           }
        }
      else
        {
         if(high[i]-max>=0.0) { max=high[i]; ZZBuffer[LastExt]=0.0; LastExt=i; ZZBuffer[i]=max; }
         else
           {
            if(low[i]-max+dev<0.0) { min=low[i]; LastExt=i; ZZBuffer[i]=min; UP=true; }
           }
        }
     }
   return(rates_total);
  }
//+------------------------------------------------------------------+
 
Igor Makanu:

такой код должен работать:

Спасибо огромное! Все работает...теперь попробую разобраться в логике(построение зигзага плохо поддается моему пониманию).
 
MakarFX:
Спасибо огромное! Все работает...теперь попробую разобраться в логике(построение зигзага плохо поддается моему пониманию).

не проверял, запустил - рисует

логика простая - ищете номер бара в котором происходит выполнение одного из условий и запоминаете - в коде это 

static int LastExt

и потом сравниваете этот бар со следующим, если произошел излом ЗЗ, то запомним этот бар в static int LastExt 

 
Igor Makanu:

не проверял, запустил - рисует

логика простая - ищете номер бара в котором происходит выполнение одного из условий и запоминаете - в коде это 

и потом сравниваете этот бар со следующим, если произошел излом ЗЗ, то запомним этот бар в static int LastExt 

Вот теперь все выстроилось в голове) Спасибо Игорь.

 
MakarFX:

Что-то у меня не получается, понимаю что точка привязки price1, но ума не хватает составить условие. Мой вариант не работает.

extern ENUM_LINE_STYLE  line_st   =  STYLE_SOLID;         // 9. Стиль линий
extern int              line_wd   =  2;                   // 10. Толщина линий
// Координаты
extern int x_coor = 7;    // Сдвиг по оси X
extern int y_coor = 10;    // Сдвиг по оси Y
//-- глобальные переменные
string line[6] = {"line_1","line_2","line_3","line_4","line_5","line_6"};

void OnChartEvent(const int id,
                  const long &lparam,
                  const double &dparam,
                  const string &sparam)
  {
  
   datetime dt1     = 0;
   double   price1  = 0;
   datetime dt2     = 0;
   double   price2  = 0;
   int      window   = 0;
   int      x        = 0;
   int      y        = 0;

//+------------------------------------------------------------------+
   //--- Клик по 1 линии
   if(id==CHARTEVENT_OBJECT_CLICK)
     {
      string clickObject=sparam;
      if(clickObject==line[0])
        {
         string name="line_"+IntegerToString(MathRand()+100,0,' ');

         y=210;
         ChartXYToTimePrice(0,x_coor+25,y,window,dt1,price1);
         ChartXYToTimePrice(0,x_coor+157,y,window,dt2,price2);

         TrendCreate(0,name,0,dt1,price1,dt2,price2,color2,line_st,line_wd,false,true,false,false,false,0);
         
           price1=ObjectGetDouble(id,name,OBJPROP_PRICE1);
           price2=ObjectGetDouble(id,name,OBJPROP_PRICE2);
             if(price2!=price1) 
           {
            ObjectSetDouble(id,name,OBJPROP_PRICE2,price1);
           }

        }
     }
}
//+------------------------------------------------------------------+
Причина обращения: