Cualquier pregunta de los recién llegados sobre MQL4 y MQL5, ayuda y discusión sobre algoritmos y códigos - página 1519

 
Perdona que te moleste de nuevo, pero me ha surgido una duda. Hay un indicador de nivel de color para MT4, en su conjunto hay segmentos de línea, que se crean a partir de TrendCreate línea de tendencia, que tiene 4 puntos de anclaje - la fecha y el precio, y si se estira más como un nivel, hay que pulsar Shift. ¿Es posible cambiar la propiedad TrendCreate como la HLineCreate, es decir, tener el segmento a partir del nivel, o tal vez hay una manera de hacer el segmento por HLineCreate sí mismo? Me refiero a que el segmento se comporte como un nivel, no como una línea de tendencia
 
DYM:
Perdona que te moleste de nuevo, pero me ha surgido una duda. Hay un indicador de nivel de color para MT4, tiene segmentos de línea en su conjunto que se crean a partir de TrendCreate línea que tiene 4 puntos de anclaje - la fecha y el precio, y si me extiendo más como un nivel que tengo que mantener Shift. ¿Es posible cambiar la propiedad TrendCreate como la HLineCreate, es decir, tener el segmento a partir del nivel, o tal vez hay una manera de hacer el segmento por HLineCreate sí mismo? Me refiero a que el segmento se comporte como un nivel, no como una línea de tendencia

La pregunta no es clara...

¿Por qué mantener pulsada la tecla Shift? Las líneas se mueven como tú quieras. Si se mueve por el punto central, la pendiente no cambia.

Si quiere cambiar la longitud de la línea en el indicador, añada el resaltado amarillo al código

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

extern   int               x_size         =  155;                 // длина объектов
 
Waaaaaaaaaaaaaaa. Ayúdame a resolver el problema. No puedo entender qué es lo que está mal. Ni siquiera se está probando en el probador. ¿Qué falta ahí? ¿Por qué se ejecuta en cada vela y no en la flecha? Me estoy volviendo loco ya((((
Archivos adjuntos:
123.mq4  10 kb
 
MakarFX:

La pregunta no es clara...

¿Por qué mantener pulsada la tecla Shift? Las líneas se mueven como tú quieras. Si se mueve por el punto central, la pendiente no cambia.

Si quiere cambiar la longitud de la línea en el indicador, añada el amarillo resaltado al código

He hecho un gif, la primera línea tiene propiedades de línea de tendencia, la segunda tiene propiedades de nivel (a mí me lo parece). Me gustaría entender cómo se puede hacer que un segmento de línea tenga las propiedades de la segunda línea.

Archivos adjuntos:
line.gif  2022 kb
 
DYM:

He hecho un gif, la primera línea tiene propiedades de línea de tendencia, la segunda línea tiene propiedades de nivel (bueno, a mí me lo parece). Me gustaría entender cómo un segmento de línea puede tener las propiedades de la segunda línea.

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, gracias, pero MT4 no funciona correctamente.


¿Puede decirme qué hay que arreglar?

Este código debería funcionar:

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

este código debería funcionar:

¡Muchas gracias! Todo funciona... ahora intentaré averiguar la lógica (la construcción en zig-zag me resulta difícil de entender).
 
MakarFX:
¡Muchas gracias! Todo funciona...ahora trataré de entender la lógica(construir un zigzag me resulta difícil de entender).

no lo comprobó, lo ejecutó - dibuja

La lógica es sencilla: busca el número de barras en las que se da una de las condiciones y lo almacena en el código

static int LastExt

y luego comparamos esta barra con la siguiente, si es una ruptura de fase, memorizaremos esta barra en static int LastExt

 
Igor Makanu:

no lo comprobó, lo ejecutó - dibuja

La lógica es sencilla: busca el número de barras en las que se da una de las condiciones y lo almacena en el código

y luego se compara esta barra con la siguiente y si hay un corte de fase, se almacena en static int LastExt

Ahora todo está alineado en mi cabeza) Gracias, Igor.

 
MakarFX:

Estoy teniendo problemas con esto, entiendo el punto de anclaje precio1, pero no puedo averiguar cómo hacer la condición. Mi variante no funciona.

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

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