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

 
C-4:
¿Qué quiere decir con "alinear"? ¿Normalizar la mantisa por el número de decimales? - Para eso está la función NormalizeDouble. Si es otra cosa, descríbala con más detalle.

A la entrada cualquier doble positivo, a la salida redondeado al precio real que puede haber en este instrumento.

Si el paso de precio es 0,25, entonces redondea a 0,25. Algo así:

double RoundPrice(const double price)
{
   if(price<=0) return(-1);
   double tick_size=SymbolInfoDouble(Symbol(),SYMBOL_TRADE_TICK_SIZE);
   double p=round(price/tick_size);
   return(NormalizeDouble(p*tick_size,_Digits));
}

Pero dicho esto, si hay una compensación (como 0,13; 0,38; 0,63; 0,88), entonces cuenta. Entonces:

en la entrada 1.0 en la salida 1.13;

1,25 como entrada y 1,38 como salida;

1,5 ---> 1,63...

A nivel de la API, esto podría codificarse en un par de comandos de lenguaje ensamblador y es claramente una función básica. Pensé que había uno =/

 
cómo hacer una actualización a la nueva compilación a través de Live update. Dónde está la actualización en vivo
 
Newalligator:
cómo hacer una actualización a la nueva compilación a través de Live update. Dónde está esta actualización en vivo
Debería abrir una cuenta de demostración en el servidor MetaQuotes-Demo y conectarse a ella de vez en cuando para comprobar las actualizaciones. Cómo abrir una cuenta demo en el servidor MetaQuotes-Demo
 
Gracias por la respuesta, opero en vivo y MT5 está siempre encendido. No estoy seguro de si se actualizará automáticamente, pero si no es así, ¿dónde está la actualización en vivo?
 
Newalligator:
Gracias por la respuesta, opero en vivo y MT5 está siempre encendido. Si el propio programa me pide que me actualice, está bien, pero si no, ¿dónde está esa actualización en vivo?
Cuando se conecte a su cuenta en el servidor de MetaQuotes-Demo, el MetaTrader comprobará las actualizaciones automáticamente. Si hay una actualización, se descargará automáticamente la nueva versión.
 

Buen día a todos! Hay un problema - no puedo usar las lecturas de otro indicador personalizado en un indicador personalizado. Estoy casi seguro de que lo estoy haciendo mal, pero pegaré el código de todos modos:

int OnCalculate(const int rates_total, const int prev_calculated, const int begin, const double &price[]) {
   
   if(rates_total < iPeriod ) {
      return(0);
   }
   
   int first;
   
   if ( prev_calculated == 0 ) {
      first = iPeriod + begin;
   } else {
      first = prev_calculated - 1;
   }
      
   // Пользовательский индикатор ROC для EURUSD   
   double aRocRatesEURUSD[];
   int iRocHandleEURUSD = iCustom("EURUSD", 0, "Examples\\ROC");   
   CopyBuffer(iRocHandleEURUSD, 0, 0, rates_total, aRocRatesEURUSD);

   for(int bar = first; bar < rates_total; bar++) {

En este código, el búfer del indicador Rate Of Changes(aRocRatesEURUSD) no está disponible. No entiendo cómo conectar este indicador correctamente, por favor ayúdenme a entenderlo.

 
jommerbot:

Buen día a todos! Hay un problema - no puedo usar las lecturas de otro indicador personalizado en un indicador personalizado. Estoy casi seguro de que lo estoy haciendo mal, pero pegaré el código de todos modos:

En este código, el búfer del indicador Rate Of Changes(aRocRatesEURUSD) no está disponible. No puedo entender cómo conectar este indicador correctamente, por favor ayúdenme a entenderlo.

Los indicadores deben ser declarados en OnInit():

//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
// Пользовательский индикатор ROC для EURUSD   
   double aRocRatesEURUSD[];
   int iRocHandleEURUSD = iCustom("EURUSD", 0, "Examples\\ROC");   
  }
De lo contrario, resulta que se crea un nuevo indicador personalizado cada vez que se llama a OnCalculate().
 
barabashkakvn:

Los manejadores de los indicadores deben ser declarados en OnInit():

Esto tampoco funciona. La matriz del buffer termina vacía o llena de valores a la izquierda.
 
jommerbot:
Esto tampoco funciona. Como resultado, el array con el buffer está vacío o lleno de valores a la izquierda.
Sin embargo, es correcto declarar los manejadores de los indicadores en OnInit(). Otra cuestión es por qué hay que escribir cada vez que llega un nuevo tick (la función OnCalculate())
rates_total,      // размер входных таймсерий

al buffer

aRocRatesEURUSD

? Esto puede ralentizar mucho el terminal. Y además, esta es una historia muy profunda.

Creo que le resultará interesante leer el artículoLos principios del recálculo económico de los indicadores

Y también lea la ayuda de la función OnCalculate().

 

Vale, incluso en el caso más sencillo no funciona:

#property indicator_chart_window
#property indicator_buffers 1
#property indicator_plots   1
#property  indicator_type1   DRAW_LINE
#property  indicator_color1  Red

double ExtLineBuffer[];   
int iRocHandleEURUSD;  
int iPlotShift = 0;
int iPeriod = 6;
 
void OnInit() {
   SetIndexBuffer(0, ExtLineBuffer, INDICATOR_DATA);
   PlotIndexSetInteger(0, PLOT_SHIFT, iPlotShift);
   PlotIndexSetInteger(0, PLOT_DRAW_BEGIN, iPeriod - 1);
   
   int iRocHandleEURUSD = iCustom("EURUSD", 0, "Examples\\ROC");    
   if( iRocHandleEURUSD == INVALID_HANDLE )
   {
      Print("Не удалось получить хендл индикатора ROC EURUSD");  
   }
}

int OnCalculate(const int rates_total, const int prev_calculated, const int begin, const double &price[]) {
   
   if(rates_total < iPeriod ) {
      return(0);
   }
   
   int first;
   double aRocRatesEURUSD[]; 
   
   if ( prev_calculated == 0 ) {
      first = iPeriod + begin;
   } else {
      first = prev_calculated - 1;
   }
   
   for(int bar = first; bar < rates_total; bar++) {
      CopyBuffer(iRocHandleEURUSD, 0, bar, 1, aRocRatesEURUSD);
      Print(aRocRatesEURUSD[ 0 ]);   
      ExtLineBuffer[ bar ] = NormalizeDouble(aRocRatesEURUSD[ 0 ], SYMBOL_DIGITS);
   }
     
   return(rates_total);
}

No entiendo dónde está mi error. Copiar el mismo buffer del indicador en el EA y en el script funciona, pero no en el indicador. La manija del indicador se inicializa sin error.