Fragen von Neueinsteigern zu MQL4 und MQL5, Hilfe und Diskussion über Algorithmen und Codes - Seite 1519

 
Entschuldigen Sie, dass ich Sie noch einmal störe, aber ich habe eine Frage. Es gibt einen Color-Level-Indikator für MT4, in seinem Set gibt es Liniensegmente, die von TrendCreate Trendlinie, die 4 Ankerpunkte hat - Datum und Preis, und wenn ich es weiter als ein Niveau zu verlängern, muss ich Shift drücken erstellt werden. Ist es möglich, die TrendCreate-Eigenschaft wie die HLineCreate zu ändern, d.h. das Segment ab der Ebene zu haben, oder gibt es vielleicht eine Möglichkeit, das Segment durch HLineCreate selbst zu machen? Ich möchte, dass sich das Segment wie ein Niveau und nicht wie eine Trendlinie verhält.
 
DYM:
Entschuldigen Sie, dass ich Sie noch einmal störe, aber ich habe eine Frage. Es gibt einen Color-Level-Indikator für MT4, er hat Liniensegmente in seinem Set, die aus TrendCreate-Linie, die 4 Ankerpunkte hat - Datum und Preis, und wenn Sie es weiter strecken als ein Niveau müssen Sie Shift halten. Ist es möglich, die TrendCreate-Eigenschaft wie die HLineCreate zu ändern, d.h. das Segment ab der Ebene zu haben, oder gibt es vielleicht eine Möglichkeit, das Segment durch HLineCreate selbst zu machen? Ich möchte, dass sich das Segment wie ein Niveau und nicht wie eine Trendlinie verhält.

Die Frage ist nicht klar...

Warum die Umschalttaste gedrückt halten? Die Linien bewegen sich, wie Sie wollen. Wenn Sie sich um den Mittelpunkt bewegen, ändert sich die Neigung nicht.

Wenn Sie die Länge der Linie im Indikator ändern möchten, fügen Sie die gelbe Markierung zum Code hinzu

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

extern   int               x_size         =  155;                 // длина объектов
 
Waaaaaaaaaaaaaaaaaaaaa. Helfen Sie mir, das Problem zu lösen. Ich kann nicht herausfinden, was los ist. Es wird nicht einmal im Testprogramm getestet. Was fehlt da noch? Warum wird sie bei jeder Kerze ausgeführt und nicht bei dem Pfeil? Ich drehe schon durch((((
Dateien:
123.mq4  10 kb
 
MakarFX:

Die Frage ist nicht klar...

Warum die Umschalttaste gedrückt halten? Die Linien bewegen sich, wie Sie wollen. Wenn Sie sich um den Mittelpunkt bewegen, ändert sich die Neigung nicht.

Wenn Sie die Länge der Linie im Indikator ändern möchten, fügen Sie die gelbe Markierung zum Code hinzu

Ich habe ein Gif erstellt, die erste Linie hat die Eigenschaften einer Trendlinie, die zweite hat die Eigenschaften eines Niveaus (scheint mir so). Ich würde gerne verstehen, wie man einen Linienabschnitt mit den Eigenschaften der zweiten Linie versehen kann.

Dateien:
line.gif  2022 kb
 
DYM:

Ich habe ein Gif erstellt, die erste Linie hat die Eigenschaften einer Trendlinie, die zweite Linie hat die Eigenschaften eines Niveaus (jedenfalls scheint es mir so). Ich möchte gerne verstehen, wie ein Linienabschnitt die Eigenschaften der zweiten Linie haben kann.

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, ich danke dir, aber MT4 funktioniert nicht richtig.


Können Sie mir sagen, was zu tun ist?

Dieser Code sollte funktionieren:

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

sollte dieser Code funktionieren:

Herzlichen Dank! Es funktioniert alles... jetzt werde ich versuchen, die Logik herauszufinden (die Zick-Zack-Konstruktion ist für mich schwer zu verstehen).
 
MakarFX:
Vielen Dank! Alles funktioniert...jetzt werde ich versuchen, die Logik herauszufinden (ein Zickzack zu bauen ist für mich schwer zu verstehen).

nicht überprüft, ausgeführt - es zieht

Die Logik ist einfach - es wird nach der Anzahl der Balken gesucht, in denen eine der Bedingungen auftritt, und diese im Code gespeichert

static int LastExt

und vergleichen dann diesen Balken mit dem nächsten. Wenn es sich um einen Phasenwechsel handelt, speichern wir diesen Balken in static int LastExt

 
Igor Makanu:

nicht überprüft, ausgeführt - es zieht

Die Logik ist einfach - es wird nach der Anzahl der Balken gesucht, in denen eine der Bedingungen auftritt, und diese im Code gespeichert

und dann vergleichen Sie diesen Balken mit dem nächsten, und wenn es eine Unterbrechung in der Phase gibt, speichern Sie diese in static int LastExt

Jetzt habe ich alles im Kopf.) Danke, Igor.

 
MakarFX:

Ich habe Probleme mit diesem, ich verstehe, dass der Ankerpunkt Preis1 ist, aber ich bin nicht klug genug, um eine Bedingung zu machen. Meine Variante funktioniert nicht.

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

        }
     }
}
//+------------------------------------------------------------------+
Grund der Beschwerde: