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

 
azolotta:
Bien, entonces cómo rehago el código si necesito, por ejemplo, seleccionar el máximo de las últimas 3 barras (que cumplen las condiciones en el if) y colocar un punto en él (¡justo en este máximo!), luego también encontrar el punto mínimo.

Inténtalo de esta manera, pero no estoy seguro

//+------------------------------------------------------------------+
//|                                                           AZ.mq4 |
//|                        Copyright 2020, MetaQuotes Software Corp. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Anastasiya Zolotareva"
#property link      "insta"
#property version   "1.00"
#property strict
#property indicator_chart_window
#property indicator_buffers 5
//--- plot myAZ
#property indicator_label1  "myAZ"
#property indicator_color1  Black
#property indicator_color2  Blue
#property indicator_color3  Orange
#property indicator_color4  Blue
#property indicator_color5  Orange
#property indicator_style1 STYLE_SOLID
#property indicator_style2 STYLE_SOLID
#property indicator_style3 STYLE_SOLID
#property indicator_style4 STYLE_SOLID
#property indicator_style5 STYLE_SOLID
#property indicator_width1 1
#property indicator_width2 1
#property indicator_width3 1
#property indicator_width4 1
#property indicator_width5 1

extern int barsToProcess=200; //количество последних баров в истории
//--- indicator buffers
double myAZBuffer[];
double ExtHighBuffer01[];
double ExtLowBuffer01[];
double ExtHighBuffer02[];
double ExtLowBuffer02[];
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
//---- drawing settings
   SetIndexStyle(0,DRAW_NONE);
   SetIndexStyle(1,DRAW_ARROW);
   SetIndexShift(1,-2);
   SetIndexStyle(2,DRAW_ARROW);
   SetIndexShift(2,-2);
   SetIndexStyle(3,DRAW_ARROW);
   SetIndexShift(3,-3);
   SetIndexStyle(4,DRAW_ARROW);
   SetIndexShift(4,-3);

//--- indicator buffers mapping
   SetIndexBuffer(0,myAZBuffer);
   SetIndexBuffer(1,ExtHighBuffer01);
   SetIndexBuffer(2,ExtLowBuffer01);
   SetIndexBuffer(3,ExtHighBuffer02);
   SetIndexBuffer(4,ExtLowBuffer02);
   IndicatorShortName("AZ");
//---
   return(0);
  }
//+------------------------------------------------------------------+
//|         deinit                                                         |
//+------------------------------------------------------------------+
int deinit()
  {
//----
  return(0);
  }
//+------------------------------------------------------------------+
//| 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[])
  {
   if((rates_total-prev_calculated-barsToProcess)<=0)return(0);
   int limit, val_index;
   if(barsToProcess>0) limit=barsToProcess; 
   else
   limit=rates_total-prev_calculated-barsToProcess-1;
  
   for(int n=limit;n>=0;n--)
     {
      if(Close[n+1]>Open[n+1] && Open[n+2]>=Close[n+2])
        {
         val_index=iLowest(NULL,0,MODE_LOW,3,n+1);
         myAZBuffer[n]=Low[val_index];
         ExtLowBuffer01[n]=Low[val_index];
        }
      else
      if(Open[n+1]>Close[n+1] && Close[n+2]>=Open[n+2])
        {
         val_index=iHighest(NULL,0,MODE_HIGH,3,n+1);
         myAZBuffer[n]=High[val_index];
         ExtHighBuffer01[n]=High[val_index];
        }
      else
      if(Close[n+1]>Open[n+1] && Open[n+3]>Close[n+3])
        {
         val_index=iLowest(NULL,0,MODE_LOW,3,n+1);
         myAZBuffer[n]=Low[val_index];
         ExtLowBuffer02[n]=Low[val_index];
        }
      else
      if(Close[n+1]<Open[n+1] && Close[n+3]>Open[n+3])
        {
         val_index=iHighest(NULL,0,MODE_HIGH,3,n+1);
         myAZBuffer[n]=High[val_index];
         ExtHighBuffer02[n]=High[val_index];
        }
     }
//--- return value of prev_calculated for next call
   return(rates_total);
  }
 
MakarFX:

Inténtalo de esta manera, pero no estoy seguro

Lamentablemente, el desplazamiento de turno no es la opción correcta. Estoy pensando que tal vez debería tratar de insertar mi código en el zigzag estándar. Lo estoy intentando ahora, pero de momento sin éxito. ¿Qué piensa usted, puedo ir a través de zigzag? Porque al final tengo que encontrar vértices conectados alternativamente, como alta-baja-alta, y si me encuentro con una opción de alta-alta, o baja-baja, a continuación, estos segundos altos y bajos no incluyen en la matriz, y esperar a que el contrario.

 
azolotta:

Por desgracia, el cambio de turno no es una opción. Estoy pensando que tal vez debería intentar insertar mi código en el zigzag estándar. Ahora estoy hurgando, pero de momento sin resultado. ¿Cree usted que es posible ir a través de zigzag? Porque al final tengo que conectar tops encontrados alternativamente, como alto-bajo-alto, y si me encuentro con una opción de alta-baja o baja-baja, a continuación, estos segundos máximos y mínimos no deben incluir en las matrices, y esperar a que el contrario.

No. El anterior debe ponerse a cero y el actual debe añadirse a la memoria intermedia del indicador.

 
azolotta:

Por desgracia, el cambio de turno no es una opción. Estoy pensando que tal vez debería intentar insertar mi código en el zigzag estándar. Ahora estoy hurgando, pero de momento sin resultado. ¿Qué piensa usted, puedo ir a través de zigzag? Porque al final tengo que encontrar vértices conectados alternativamente, como alta-baja-alta, y si me encuentro con una opción de alta-alta, o baja-baja, a continuación, estos segundos altos y bajos no incluyen en la matriz, y esperar a que el contrario.

En cualquier caso, habrá un retraso, es decir, hasta que no se cumplan las condiciones de 2-3 barras anteriores, no se dibujará.

¿Entiendo que necesitamos un zig-zag desde el alto hasta el bajo?
 
MakarFX:

En cualquier caso, habrá un retraso, es decir, hasta que no se cumplan las condiciones de 2-3 barras anteriores, no se dibujará.

¿Supongo que tengo que ir en zig-zag de los altos a los bajos?

Sí, lo ideal es un zig-zag de máximos a mínimos (por lo que estos máximos y mínimos están en mis condiciones en si, y si hay dos o más máximos/mínimos seguidos, entonces estos segundos máximos/mínimos no deberían aparecer, y deberíamos esperar a la reversión). Me basta con mostrar los últimos 6 mínimos y 6 máximos en el indicador. Y luego quiero llamar a estos puntos de zig-zag encontrados en el script/asesor para otras necesidades.

 

¡Hola!

¿Puede alguien indicar por qué no se muestran valores a través del modo de depuración?

Parece que después de actualizar el programa mt5, el problema comenzó

¿Y qué significa el rojo en la columna - Valores?

 
Mikhail Toptunov:

¡Hola!

¿Puede alguien indicar por qué no se muestran valores a través del modo de depuración?

Parece que después de actualizar el programa mt5, el problema comenzó

¿Y qué significa el color rojo del valor en la columna - Valores?

1. Por favor, facilite una información mínima (las tres primeras líneas de la ficha del diario tras reiniciar el terminal)

2) Actualizar la construcción

 
azolotta:

Sí, lo ideal es un zig-zag de máximos a mínimos (para que estos máximos y mínimos estén en mis condiciones en si, y si hay dos o más máximos/mínimos seguidos, entonces estos segundos máximos/mínimos no deberían aparecer, sino esperar a un retroceso). Me basta con mostrar los últimos 6 mínimos y 6 máximos en mi indicador. Y luego quiero llamar a estos puntos de zig-zag encontrados en el script/asesor para otras necesidades.

No soy programador y no sé cómo ayudar aún, pero lo pensaré...
 
MakarFX:
No soy programador y no sé cómo ayudar aún, pero lo pensaré...
//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,                                                           |
//+----------------------------------------------------------------------------+
//|  Версия   : 07.10.2006                                                     |
//|  Описание : Возвращает экстремум ЗигЗага по его номеру.                    |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    sy - наименование инструмента   (NULL или "" - текущий символ)          |
//|    tf - таймфрейм                  (      0     - текущий ТФ)              |
//|    ne - номер экстремума           (      0     - последний)               |
//|    dp - ExtDepth                                                           |
//|    dv - ExtDeviation                                                       |
//|    bs - ExtBackstep                                                        |
//+----------------------------------------------------------------------------+
double GetExtremumZZPrice(string sy="", int tf=0, int ne=0, int dp=12, int dv=5, int bs=3) {
  if (sy=="" || sy=="0") sy=Symbol();
  double zz;
  int    i, k=iBars(sy, tf), ke=0;

  for (i=1; i<k; i++) {
    zz=iCustom(sy, tf, "ZigZag", dp, dv, bs, 0, i);
    if (zz!=0) {
      ke++;
      if (ke>ne) return(zz);
    }
  }
  Print("GetExtremumZZPrice(): Экстремум ЗигЗага номер ",ne," не найден");
  return(0);
}

indicador estándarZigZagpersonalizado y devuelve su nivel de precio. La función acepta los siguientes parámetros opcionales:
  • sy- Nombre del instrumento."" oNULL- símbolo actual. El valor por defecto esNULL.
  • tf- Marco temporal. Valor por defecto 0- símbolo actual.
  • ne- Número extremo. 0- último, 1- anterior, 2- anterior, etc.
  • dp,dv,bs- Parámetros ZigZaga: ExtDepth, ExtDeviation, ExtBackstep.

Переход на новые рельсы: пользовательские индикаторы в MQL5
Переход на новые рельсы: пользовательские индикаторы в MQL5
  • www.mql5.com
Я не буду перечислять все новые возможности и особенности нового терминала и языка. Их действительно много, и некоторые новинки вполне достойны освещения в отдельной статье. Вы не увидите здесь кода, написанного по принципам объектно-ориентированного программирования — это слишком серьезная тема для того, чтобы просто быть упомянутой в контексте как дополнительная вкусность для кодописателей. В этой статье остановимся подробней на индикаторах, их строении, отображении, видах, а также особенностях их написания по сравнению с MQL4.
 
Iurii Tokman:

indicador personalizado estándarZigZag y devuelve su nivel de precio. La función acepta los siguientes parámetros opcionales:
  • sy- Nombre del instrumento."" oNULL- símbolo actual. El valor por defecto esNULL.
  • tf- Marco temporal. Valor por defecto 0- símbolo actual.
  • ne- Número extremo. 0- último, 1- anterior, 2- anterior, etc.
  • dp,dv,bs- Parámetros de ZigZaga: ExtDepth, ExtDeviation, ExtBackstep.

esto no es adecuado, se necesitan extremos no zigzagueantes