Preguntas de los principiantes MQL5 MT5 MetaTrader 5 - página 1253

 
Vladimir Karputov:

La optimización la hacen los AGENTES (en su caso, los AGENTES LOCALES).

Para ver los registros del agente local: haga clic con el botón derecho en la pestaña Log y vaya a la carpeta del agente

Esa es la cuestión, no hay errores. Todo está comprobado. Quizá haya un cortafuegos o algo así.

Archivos adjuntos:
 
Aleksandr Dziuba:

Esa es la cuestión, no hay errores. Todo cuenta. ¿Tal vez haya cortafuegos o algo así?

Haz una sola prueba, una sola pasada. No es una optimización, sino una sola pasada. Así podrás ver el registro.

 
Vladimir Karputov:

Realice una sola prueba, una sola pasada. No se trata de una optimización, sino de una sola pasada. Así podrás ver el registro con seguridad.

¿Qué quieres decir con "visual"? Bueno, tengo el registro. No veo nada malo ahí. Los parámetros son todos pasados. Incluso corrió, pero la salida sigue siendo 20.000.

Archivos adjuntos:
20200924.log  17 kb
 
Aleksandr Dziuba:

¿Qué quieres decir con "visual"? Bueno, tengo el registro. No veo nada malo en ello. Los parámetros son todos pasados. Incluso se ejecutó. Pero el balance de salida fue de 20000 y todavía lo es.

Por lo tanto, cambie el código para que démensajes de error cuando haya errores o si no se puede realizar la operación comercial. O en general, el código está mal y no da señales. Los milagros no ocurren.

Документация по MQL5: Константы, перечисления и структуры / Коды ошибок и предупреждений / Ошибки компиляции
Документация по MQL5: Константы, перечисления и структуры / Коды ошибок и предупреждений / Ошибки компиляции
  • www.mql5.com
Импортируемая функция не может иметь такого параметра (нельзя передавать указатель, класс или структуру, содержащую динамический массив, указатель, класс и т.д.) Недопустимый возвращаемый тип. Например, такая ошибка будет выдана для функций, импортированных из...
 
Vladimir Karputov:

Por lo tanto, cambie el código para que démensajes de error cuando se produzcan errores o si la operación no se puede ejecutar. O el código es defectuoso y no da ninguna señal. No hay milagros.

Sí.

Por lo tanto, la optimización no está incluida en Ontick. Se está procesando OnInit. Pero no se genera On-Tick. Este es el problema.

He integrado los puntos de impresión ( ) en las entradas y en las salidas. Sólo la entrada se escribe en el registro.

P.D.

Yo me encargo de los errores. La fuerza de la costumbre. Llevo escribiendo programas desde 1987.

 
Aleksandr Dziuba:

Sí.

En general, la optimización no está incluida en Ontick. Se procesa OnInit. Pero no se genera On Tick. El problema.

He integrado los puntos de impresión ( ) en las entradas y en las salidas. Sólo la entrada se escribe en el registro.

P.D.

Yo me encargo de los errores. La fuerza de la costumbre. Llevo escribiendo programas desde 1987.

Sólo los telépatas podrán ayudar sin el código, y ahora todos los telépatas están de vacaciones, pues es una pena.

 
Vladimir Karputov:

Sin el código, sólo los telépatas pueden ayudar, y ahora, por suerte, todos los telépatas están de vacaciones.

He encontrado la razón. Por alguna razón, los indicadores no se recalculan en Ontick (no da el número de barras recalculadas). Tal vez tenga que actualizar las comillas.

Sin embargo, he perdido mi agradecimiento. Me he vuelto más inteligente. He aprendido dónde se escriben los registros.

 

Convertido un indicador simple de MQL4 -> MQL5, pero no hay señal en las últimas barras. Por favor, ayúdenme a encontrar la razón. El código fuente y el resultado están en el archivo adjunto. Pondré aquí el convertido también.

#property indicator_chart_window
#property indicator_plots   4
#property indicator_buffers 4
#property indicator_color1 PaleVioletRed
#property indicator_color2 DeepSkyBlue
#property indicator_color3 Red
#property indicator_color4 LimeGreen

input int  dist2           = 21;       // Distance#2
input int  dist1           = 14;       // Distance#1

double b1[];
double b2[];
double b3[];
double b4[];

int    handle_atr;
int    min_rates_total;
double atr[];

//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit() {

   SetIndexBuffer(0,b1,INDICATOR_DATA);
   SetIndexBuffer(1,b2,INDICATOR_DATA);
   SetIndexBuffer(2,b3,INDICATOR_DATA);
   SetIndexBuffer(3,b4,INDICATOR_DATA);
   
   ArraySetAsSeries(b1,true);
   ArraySetAsSeries(b2,true);
   ArraySetAsSeries(b3,true);
   ArraySetAsSeries(b4,true);

   PlotIndexSetInteger(0,PLOT_DRAW_TYPE,DRAW_LINE);
   PlotIndexSetInteger(1,PLOT_DRAW_TYPE,DRAW_LINE);
   PlotIndexSetInteger(2,PLOT_DRAW_TYPE,DRAW_ARROW);
   PlotIndexSetInteger(3,PLOT_DRAW_TYPE,DRAW_ARROW);

      PlotIndexSetInteger(2,PLOT_ARROW,159);
      PlotIndexSetInteger(3,PLOT_ARROW,159);
   
   ResetLastError();
   handle_atr = iATR(NULL,PERIOD_CURRENT,50);
   if(handle_atr==INVALID_HANDLE) {
      Print("   ***   ATR handle was unable to create. Error ",GetLastError());
      return INIT_FAILED;
   }

   PlotIndexSetDouble(0,PLOT_EMPTY_VALUE,EMPTY_VALUE);
   PlotIndexSetDouble(1,PLOT_EMPTY_VALUE,EMPTY_VALUE);
   PlotIndexSetDouble(2,PLOT_EMPTY_VALUE,EMPTY_VALUE);
   PlotIndexSetDouble(3,PLOT_EMPTY_VALUE,EMPTY_VALUE);
   
   PlotIndexSetString(0,PLOT_LABEL,"SuperSignals Upper");
   PlotIndexSetString(1,PLOT_LABEL,"SuperSignals Lower");
   PlotIndexSetString(2,PLOT_LABEL,"SuperSignals Sell");
   PlotIndexSetString(3,PLOT_LABEL,"SuperSignals Buy");

        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[]) {
                
   int counted_bars=prev_calculated;
   int i,limit;
   
   ArraySetAsSeries(Low,true);
   ArraySetAsSeries(High,true);

   if(counted_bars<0) return 0;
   if(counted_bars>0) counted_bars--;
           limit=rates_total-counted_bars;
           limit=MathMax(limit,dist1);
           limit=MathMax(limit,dist2);

   for (i = limit-1; i >= 0; i--) {
         int hhb1 = ArrayMaximum(High,i-dist1/2,dist1);
         int llb1 = ArrayMinimum(Low, i-dist1/2,dist1);
         int hhb  = ArrayMaximum(High,MathMax(0,i-dist2/2),dist2);
         int llb  = ArrayMinimum(Low, MathMax(0,i-dist2/2),dist2);

            b1[i] = EMPTY_VALUE;
            b2[i] = EMPTY_VALUE;
            b3[i] = EMPTY_VALUE;
            b4[i] = EMPTY_VALUE;
         
         ArraySetAsSeries(atr,true);
         int copied=CopyBuffer(handle_atr,0,0,limit,atr);
         if (copied<=0) Print("   ***   ATR failed to copy.");
         double tr = atr[i];

                      b1[i] = High[hhb];
                      b2[i] = Low[llb];
         if (i==hhb1) b3[i] = High[hhb1]+tr/2;
         if (i==llb1) b4[i] = Low[llb1] -tr/2;
    }
   
   return rates_total;
}
//+------------------------------------------------------------------+

El resultado.


 
Grigori.S.B:

Convertido un indicador simple de MQL4 -> MQL5, pero no hay señal en las últimas barras. Por favor, ayúdenme a encontrar la razón. El código fuente y el resultado están en el archivo adjunto. Pondré aquí el convertido también.

El resultado.


El culpable puede ser algo que no se hace lógicamente entre las plataformas

Preste atención a los diferentes parámetros de entrada

MT4

ArrayMaximum
Ищет в одномерном числовом массиве максимальный элемент.

int  ArrayMaximum(
   const void&   array[],             // массив для поиска
   int           count=WHOLE_ARRAY,   // количество проверяемых
   int           start=0              // с какого индекса начинаем поиск
   );

MT5

ArrayMaximum
Ищет максимальный элемент в первом измерении многомерного числового массива.

int  ArrayMaximum(
   const void&   array[],             // массив для поиска
   int           start=0,             // с какого индекса начинаем поиск
   int           count=WHOLE_ARRAY    // количество проверяемых
   );
 
Vitaly Muzichenko:

El culpable podría ser algo que no se hace lógicamente entre plataformas

Tenga en cuenta los diferentes parámetros de entrada

MT4

MT5

Gracias Vitaliy.

El orden de las variables en este lugar es correcto. Las he intercambiado durante la conversión. También las funciones iHighest / iLowest estaban en MQL4.

Esto es otra cosa. Ya me he devanado los sesos.

Razón de la queja: