Toute question des nouveaux arrivants sur MQL4 et MQL5, aide et discussion sur les algorithmes et les codes. - page 1519

 
Désolé de vous déranger à nouveau, mais une question s'est posée. Il existe un indicateur de niveau de couleur pour MT4, dans son ensemble il y a des segments de ligne, qui sont créés à partir de TrendCreate trend line, qui a 4 points d'ancrage - date et prix, et si je l'étend plus loin comme un niveau, je dois appuyer sur Shift. Est-il possible de modifier la propriété de TrendCreate comme celle de HLineCreate, c'est-à-dire d'avoir le segment à partir du niveau, ou peut-être y a-t-il un moyen de faire le segment par HLineCreate lui-même ? Je veux dire que le segment doit se comporter comme un niveau et non comme une ligne de tendance.
 
DYM:
Désolé de vous déranger à nouveau, mais une question s'est posée. Il y a un indicateur Color Level pour MT4, il a des segments de ligne dans son jeu qui sont créés à partir de TrendCreate ligne qui a 4 points d'ancrage - date et prix, et si vous l'étirez plus loin comme un niveau, vous devez tenir Shift. Est-il possible de modifier la propriété de TrendCreate comme celle de HLineCreate, c'est-à-dire d'avoir le segment à partir du niveau, ou peut-être y a-t-il un moyen de faire le segment par HLineCreate lui-même ? Je veux dire que le segment doit se comporter comme un niveau et non comme une ligne de tendance.

La question n'est pas claire...

Pourquoi maintenir la touche Shift ? Les lignes bougent comme vous le souhaitez. Si vous vous déplacez par le point central, la pente ne change pas.

Si vous voulez modifier la longueur de la ligne dans l'indicateur, ajoutez la surbrillance jaune au code

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

extern   int               x_size         =  155;                 // длина объектов
 
Waaaaaaaaaaaaaaaaaaaaa. Aidez-moi à résoudre ce problème. Je n'arrive pas à comprendre ce qui ne va pas. Ce n'est même pas testé dans le testeur. Qu'est-ce qui manque ici ? Pourquoi est-il exécuté sur chaque bougie, et non sur la flèche ? Je deviens déjà fou((((
Dossiers :
123.mq4  10 kb
 
MakarFX:

La question n'est pas claire...

Pourquoi maintenir la touche Shift ? Les lignes bougent comme vous le souhaitez. Si vous vous déplacez par le point central, la pente ne change pas.

Si vous voulez changer la longueur de la ligne dans l'indicateur, ajoutez la ligne jaune en surbrillance au code

J'ai fait un gif, la première ligne a les propriétés d'une ligne de tendance, la seconde a les propriétés d'un niveau (c'est ce qui me semble). J'aimerais comprendre comment on peut faire en sorte qu'un segment de ligne ait les propriétés de la deuxième ligne.

Dossiers :
line.gif  2022 kb
 
DYM:

J'ai fait un gif, la première ligne a les propriétés d'une ligne de tendance, la deuxième ligne a les propriétés d'un niveau (enfin, c'est ce qu'il me semble). Je voudrais comprendre comment un segment de ligne peut avoir les propriétés de la deuxième ligne.

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

Igor, merci, mais MT4 ne fonctionne pas correctement.


Pouvez-vous me dire ce qu'il faut réparer ?

Ce code devrait fonctionner :

#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:

ce code devrait fonctionner :

Merci beaucoup ! Tout fonctionne... maintenant je vais essayer de comprendre la logique (la construction en zig-zag est difficile à comprendre pour moi).
 
MakarFX:
Merci beaucoup ! Tout fonctionne...maintenant je vais essayer de comprendre la logique(construire un zigzag est difficile pour moi à comprendre).

n'a pas vérifié, l'a fait fonctionner - il tire

La logique est simple : rechercher le nombre de barres dans lesquelles l'une des conditions se produit et le stocker dans le code.

static int LastExt

et ensuite comparer cette barre avec la suivante, si c'est une rupture de phase, nous mémoriserons cette barre dans static int LastExt

 
Igor Makanu:

n'a pas vérifié, l'a fait fonctionner - il tire

La logique est simple : rechercher le nombre de barres dans lesquelles l'une des conditions se produit et le stocker dans le code.

et ensuite vous comparez cette barre avec la suivante et s'il y a une rupture de phase, vous la stockez dans static int LastExt

Maintenant tout s'aligne dans ma tête) Merci, Igor.

 
MakarFX:

J'ai des difficultés avec ceci, je comprends le point d'ancrage price1, mais je n'arrive pas à trouver comment faire la condition. Ma variante ne fonctionne pas.

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);
           }

        }
     }
}
//+------------------------------------------------------------------+