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

 
Vitaly Muzichenko:

Aquí está el retocado, el original es simplemente sombrío.

P.S. Dot.mq4 - original completo

Perdón por el largo tiempo, estuve ocupado con el trabajo.

Aquí tienes:

//+------------------------------------------------------------------+
//|                                                      VMTest1.mq5 |
//|                                  Copyright 2021, MetaQuotes Ltd. |
//|                             https://mql5.com/ru/users/artmedia70 |
//+------------------------------------------------------------------+
#property copyright "Copyright 2021, MetaQuotes Ltd."
#property link      "https://mql5.com/ru/users/artmedia70"
#property version   "1.00"
#property indicator_separate_window
#property indicator_buffers 7
#property indicator_plots   3
//--- plot ARR
#property indicator_label1  "MaOSC"
#property indicator_type1   DRAW_COLOR_ARROW
#property indicator_color1  clrLimeGreen,clrOrangeRed,clrSilver
#property indicator_style1  STYLE_SOLID
#property indicator_width1  1
//--- plot ArrUP
#property indicator_label2  "Up"
#property indicator_type2   DRAW_ARROW
#property indicator_color2  clrBlue
#property indicator_style2  STYLE_SOLID
#property indicator_width2  1
//--- plot ArrDN
#property indicator_label3  "Down"
#property indicator_type3   DRAW_ARROW
#property indicator_color3  clrCrimson
#property indicator_style3  STYLE_SOLID
#property indicator_width3  1
//---
#include <MovingAverages.mqh>

//--- input parameters
input uint     InpA=40;
//--- indicator buffers
double         BufferMAOSC[];
double         BufferColorsARR[];
double         BufferArrUP[];
double         BufferArrDN[];
double         BufferMAV[];
double         BufferMAA[];
double         BufferTMP[];
//--- gv
int a=0;
int per=0;
int val=0;
int handle_mav=INVALID_HANDLE;
int handle_maa=INVALID_HANDLE;
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- indicator buffers mapping
   SetIndexBuffer(0,BufferMAOSC,INDICATOR_DATA);
   SetIndexBuffer(1,BufferColorsARR,INDICATOR_COLOR_INDEX);
   SetIndexBuffer(2,BufferArrUP,INDICATOR_DATA);
   SetIndexBuffer(3,BufferArrDN,INDICATOR_DATA);
   SetIndexBuffer(4,BufferMAV,INDICATOR_CALCULATIONS);
   SetIndexBuffer(5,BufferMAA,INDICATOR_CALCULATIONS);
   SetIndexBuffer(6,BufferTMP,INDICATOR_CALCULATIONS);
   
//--- setting a code from the Wingdings charset as the property of PLOT_ARROW
   PlotIndexSetInteger(0,PLOT_ARROW,159);
   PlotIndexSetInteger(1,PLOT_ARROW,225);
   PlotIndexSetInteger(2,PLOT_ARROW,226);
//---
   ArraySetAsSeries(BufferMAOSC,true);
   ArraySetAsSeries(BufferColorsARR,true);
   ArraySetAsSeries(BufferArrUP,true);
   ArraySetAsSeries(BufferArrDN,true);
   ArraySetAsSeries(BufferMAV,true);
   ArraySetAsSeries(BufferMAA,true);
   ArraySetAsSeries(BufferTMP,true);
//---
   a=(InpA<4 ? 4 : InpA);
   per=(int)floor(sqrt(a));
   val=(int)floor(a/1.9);
//---
   handle_mav=iMA(NULL,PERIOD_CURRENT,val,0,MODE_SMA,PRICE_LOW);
   if(handle_mav==INVALID_HANDLE)
     {
      Print("Не удалось создать хэндл индикатора MA(",val,"), ошибка ",GetLastError());
      return INIT_FAILED;
     }
   handle_maa=iMA(NULL,PERIOD_CURRENT,a,0,MODE_SMA,PRICE_LOW);
   if(handle_maa==INVALID_HANDLE)
     {
      Print("Не удалось создать хэндл индикатора MA(",a,"), ошибка ",GetLastError());
      return INIT_FAILED;
     }
//---
   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 limit=rates_total-prev_calculated;
   if(limit>1)
     {
      limit=rates_total-2;
      ArrayInitialize(BufferMAOSC,EMPTY_VALUE);
      ArrayInitialize(BufferColorsARR,2);
      ArrayInitialize(BufferArrUP,EMPTY_VALUE);
      ArrayInitialize(BufferArrDN,EMPTY_VALUE);
      ArrayInitialize(BufferMAV,0);
      ArrayInitialize(BufferMAA,0);
      ArrayInitialize(BufferTMP,0);
     }
//--- Подготовка данных
   int count=(limit>1 ? rates_total : 1),copied=0;
   copied=CopyBuffer(handle_mav,0,0,count,BufferMAV);
   if(copied!=count) return 0;
   copied=CopyBuffer(handle_maa,0,0,count,BufferMAA);
   if(copied!=count) return 0;

//--- Предварительный расчёт
   for(int i=limit;i>WRONG_VALUE;i--)
      BufferTMP[i]=2.0*BufferMAV[i]-BufferMAA[i];
      
//--- Расчёт индикатора
   if(SimpleMAOnBuffer(rates_total,prev_calculated,a,per,BufferTMP,BufferMAOSC)==0)
      return 0;
   for(int i=limit;i>WRONG_VALUE;i--)
     {
      BufferArrUP[i]=EMPTY_VALUE;
      BufferArrDN[i]=EMPTY_VALUE;
      BufferColorsARR[i]=(BufferMAOSC[i]>BufferMAOSC[i+1] ? 0 : BufferMAOSC[i]<BufferMAOSC[i+1] ? 1 : 2);
      if((BufferColorsARR[i]==0 && BufferColorsARR[i+1]==1) || (BufferColorsARR[i]==0 && BufferColorsARR[i+1]==2))
         BufferArrUP[i]=BufferMAOSC[i];
      if((BufferColorsARR[i]==1 && BufferColorsARR[i+1]==0) || (BufferColorsARR[i]==1 && BufferColorsARR[i+1]==2))
         BufferArrDN[i]=BufferMAOSC[i];
     }
//--- return value of prev_calculated for next call
   return(rates_total);
  }
//+------------------------------------------------------------------+
 
Valeriy Yastremskiy:

Entiendo esta idea, es útil, pero no me sirve en este caso. Necesito cronometrar el Tester: botón de parada pulsado en el indicador

no es seguro que después de pulsar el botón las impresiones se escriban en el registro

así que trate de escribir cada nueva barra en el archivo de todas las funciones de trabajo con el medio ambiente - la prohibición de comercio, las pruebas, la terminación del programa.....https://docs.mql4.com/ru/check

si no hay ayuda, no puedes, entonces busca algo por medio de WinAPI

HH: haga un botón y haga clic en él - presione, haga todas las acciones, y luego deje que el visualizador termine la ejecución ociosamente, imho más rápido que la búsqueda

 
Igor Makanu:

no es seguro que las impresiones se escriban en el registro después de pulsar el botón

así que trate de escribir en el archivo de cada nueva barra de todas las funciones para trabajar con el medio ambiente - la prohibición de la negociación, las pruebas, la terminación del programa.....

Si no ayuda, entonces no se puede, entonces buscar algo por medio de WinAPI

HH: Haga un botón y púlselo - púlselo, haga todas las acciones, y luego deje que el visualizador termine el recorrido sin hacer nada, imho más rápido que buscar

Botón de parada de impresión en el cargador del probador: botón de parada pulsado

Pero no lo he encontrado en los documentos. Para el Asesor Experto la parada es llamada por OnDynit, para el indicador sólo la impresión en el diario. El indicador deja de probar y ya está. En realidad hay una pausa. Pero no está impreso en la revista.

Nota

En general, no es difícil eliminar el indicador o cerrar la ventana manualmente. Pero la pregunta es interesante. Es como el acceso al tiempo real a través de una solicitud a un símbolo de terceros) Se supone que de alguna manera el seguimiento del final de la prueba con el botón de parada).

 
Valeriy Yastremskiy:

Impresión del botón de parada en el cargador del probador: botón de parada pulsado

Pero no lo he encontrado en los documentos. Para el Asesor Experto la parada es llamada por OnDeinit, para el indicador solo se imprime en el diario. El indicador deja de probar y ya está. En realidad hay una pausa. Pero no está impreso en la revista.

Nota

En general, no es difícil eliminar el indicador o cerrar la ventana manualmente. Pero la pregunta es interesante. Es como el acceso al tiempo real a través de una solicitud a un símbolo de terceros) Parece que debe de alguna manera el seguimiento de la final de la parada del botón de prueba).

no sé

busque en el foro IsTesting() - encontró discusiones similares

ZZY: Creo que el registro imprime la terminal, pero necesito el código MQL para hacerlo

ZZZY: escribir EA, imho, la visualización del indicador es tedioso ))))

 
Artyom Trishkin:

Siento haber tardado tanto, he estado ocupado con el trabajo.

Aquí tienes:

Los cambios son drásticos, pero esa no es la cuestión.

Me ocuparé de iMAOnArray, ese era el objetivo

Gracias.

 
Vitaly Muzichenko:

Los cambios son dramáticos, pero eso no es lo importante.

Me ocuparé de iMAOnArray, ese era el objetivo

Gracias.

Es que aquí todo es exactamente igual que allí. Pero en MQL5 es tan fácil como eso.

 

Hola. Por qué al borrar una constante no descrita enObjectCreate();

Por ejemplo, ¿z_order o hidden? ¿Causará un error después de la compilación? No participan en el trazado de la línea.

bool VLineCreate(const long            chart_ID=0,        // ID графика 
                 const string          name="VLine",      // имя линии 
                 const int             sub_window=0,      // номер подокна 
                 datetime              time=0,            // время линии 
                 const color           clr=clrRed,        // цвет линии 
                 const ENUM_LINE_STYLE style=STYLE_SOLID, // стиль линии 
                 const int             width=1,           // толщина линии 
                 const bool            back=false,        // на заднем плане 
                 const bool            selection=true,    // выделить для перемещений 
                 const bool            ray=true,          // продолжение линии вниз 
                 const bool            hidden=true,       // скрыт в списке объектов 
                 const long            z_order=0)         // приоритет на нажатие мышью 
  { 
//--- если время линии не задано, то проводим ее через последний бар 
   if(!time) 
      time=TimeCurrent(); 
//--- сбросим значение ошибки 
   ResetLastError(); 
//--- создадим вертикальную линию 
   if(!ObjectCreate(chart_ID,name,OBJ_VLINE,sub_window,time,0)) 
     { 
      Print(__FUNCTION__, 
            ": не удалось создать вертикальную линию! Код ошибки = ",GetLastError()); 
      return(false); 
     } 
 
Дмитрий:

Hola. Por qué al borrar una constante no descrita enObjectCreate();

Por ejemplo, ¿z_order o hidden? ¿Causará un error después de la compilación? No participan en el trazado de la línea.

Al eliminar uno de los parámetros de la función de entrada, tenga cuidado con las comas y los paréntesis de cierre.

 
Alexey Viktorov:

Al eliminar uno de los parámetros de entrada de una función, tenga cuidado con las comas y los corchetes de cierre.

Alexey, gracias. En primer lugar, presté atención a la puntuación. El script se ha reducido al mínimo, dejado necesario para ObjectCreate()(punto de anclaje, symv, Y TD). Y resulta que sólo en la cabecera esas constantes en el código en cualquier lugar no se producen) en este y surgió la pregunta, ¿por qué eliminar al menos un error se produce. Y surge la pregunta, puede haber condiciones obligatorias con una lista de constantes en la cabecera. función cabecera))?
 
Dzmitry Zaitsau:
Alexey, gracias. En primer lugar, presté atención a la puntuación. El script se redujo al mínimo, dejé lo necesario para ObjectCreate()(punto de anclaje, symv, Y TD). Y resulta que sólo en la cabecera esas constantes en el código en cualquier lugar no se producen) en este y surgió la pregunta, ¿por qué eliminar al menos un error se produce. Y surge la pregunta, puede haber condiciones obligatorias con una lista de constantes en la cabecera. función cabecera))?

Si pudieras escribir qué error aparece, sería más fácil de entender, de lo contrario sale como telepatía - adivina qué error tengo)

Razón de la queja: