Tutte le domande dei nuovi arrivati su MQL4 e MQL5, aiuto e discussione su algoritmi e codici - pagina 1519

 
Scusate se vi disturbo ancora, ma è sorta una domanda. C'è un indicatore Color Level per MT4, nel suo set ci sono segmenti di linea, che sono creati da TrendCreate trend line, che ha 4 punti di ancoraggio - data e prezzo, e se lo estendo ulteriormente come livello, devo premere Shift. È possibile cambiare la proprietà TrendCreate come HLineCreate, cioè avere il segmento come dal livello, o forse c'è un modo per fare il segmento da HLineCreate stesso? Intendo fare in modo che il segmento si comporti come un livello, non come una linea di tendenza
 
DYM:
Scusate se vi disturbo ancora, ma è sorta una domanda. C'è un indicatore Color Level per MT4, ha segmenti di linea nel suo set che sono creati da TrendCreate line che ha 4 punti di ancoraggio - data e prezzo, e se lo allunghi ulteriormente come livello devi tenere Shift. È possibile cambiare la proprietà TrendCreate come HLineCreate, cioè avere il segmento come dal livello, o forse c'è un modo per fare il segmento da HLineCreate stesso? Intendo fare in modo che il segmento si comporti come un livello, non come una linea di tendenza

La domanda non è chiara...

Perché tenere premuto Shift? Le linee si muovono come vuoi tu. Se ci si sposta dal punto centrale, la pendenza non cambia.

Se volete cambiare la lunghezza della linea nell'indicatore, aggiungete l'evidenziazione gialla al codice

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

extern   int               x_size         =  155;                 // длина объектов
 
Waaaaaaaaaaaaaaaaaaa. Aiutami a risolvere il problema. Non riesco a capire cosa c'è che non va. Non è nemmeno in fase di test nel tester. Cosa manca lì? Perché viene eseguito su ogni candela e non sulla freccia? Sto impazzendo già((((
File:
123.mq4  10 kb
 
MakarFX:

La domanda non è chiara...

Perché tenere premuto Shift? Le linee si muovono come vuoi tu. Se ci si sposta dal punto centrale, la pendenza non cambia.

Se volete cambiare la lunghezza della linea nell'indicatore, aggiungete la linea gialla evidenziata al codice

Ho fatto una gif, la prima linea ha proprietà di linea di tendenza, la seconda ha proprietà di livello (mi sembra così). Vorrei capire come si può fare in modo che un segmento di linea abbia le proprietà della seconda linea.

File:
line.gif  2022 kb
 
DYM:

Ho fatto una gif, la prima linea ha proprietà di linea di tendenza, la seconda linea ha proprietà di livello (beh, mi sembra così). Vorrei capire come un segmento di linea può avere le proprietà della seconda linea.

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, grazie, ma MT4 non funziona correttamente.


Puoi dirmi cosa aggiustare?

Questo codice dovrebbe funzionare:

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

questo codice dovrebbe funzionare:

Grazie mille! Funziona tutto... ora cercherò di capire la logica (la costruzione a zig-zag è difficile da capire per me).
 
MakarFX:
Grazie mille! Tutto funziona... ora cercherò di capire la logica (costruire uno zigzag è difficile da capire per me).

non ha controllato, l'ha eseguito - disegna

La logica è semplice: cercare il numero di barre in cui si verifica una delle condizioni e memorizzarlo nel codice

static int LastExt

e poi confrontare questa barra con quella successiva, se è una rottura di fase, memorizzeremo questa barra in int statico LastExt

 
Igor Makanu:

non ha controllato, l'ha eseguito - disegna

La logica è semplice: cercare il numero di barre in cui si verifica una delle condizioni e memorizzarlo nel codice

e poi si confronta questa barra con quella successiva e se c'è un'interruzione di fase, la si memorizza nell'int statico LastExt

Ora tutto è allineato nella mia testa) Grazie, Igor.

 
MakarFX:

Ho problemi con questo, capisco il punto di ancoraggio price1, ma non riesco a capire come fare la condizione. La mia variante non funziona.

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

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