Errores, fallos, preguntas - página 2016

 
fxsaber:

Todo el CopyBuffer es INF allí.

Con un algoritmo de conteo deslizante, bastan dos precios DBL_MAX al principio para que todo el buffer se convierta en INF

DBL_MAX + DBL_MAX = INF

y entonces INF no saldrá del cálculo

Debe cambiar el código de todos los indicadores para ignorar EMPTY_VALUE
 
A100:

Con un algoritmo de conteo deslizante, sólo se necesitan dos precios DBL_MAX al principio para que todo el buffer se convierta en INF

DBL_MAX + DBL_MAX = INF

y entonces el INF ya no escapará de los cálculos

Esta variante es bastante probable porque es DBL_MAX la que se llena de valores por debajo del periodo MAA. Entonces hay un error en el promedio del algoritmo recurrente - MODE_SMA.

Así es. He hecho algunos cambios y funciona.

// Вычисляем Машку от Машки через хэндл самого себя
#property indicator_separate_window 
#property indicator_buffers 1 
#property indicator_plots   1 

#property  indicator_type1   DRAW_LINE 
#property  indicator_color1  clrRed 
#property  indicator_style1  STYLE_SOLID 
#property  indicator_width1  1 

input bool CustomData = false; // true - кастомный режим для iCustom
input int MAPeriod = 1 e1;      // Период МАшки

string GetMyName( void )
{
  const int Length = StringLen(TerminalInfoString(TERMINAL_DATA_PATH) + "\\MQL5\\Indicators\\");
  const string Path = MQLInfoString(MQL_PROGRAM_PATH);
  
  return(StringSubstr(Path, Length, StringLen(Path) - Length - 4));
}

double Buffer[];
const bool Init = SetIndexBuffer(0, Buffer, INDICATOR_DATA);

const int handleMA = CustomData ? iMA(NULL, PERIOD_CURRENT, 100, 0, MODE_SMA, PRICE_OPEN) // от этой МАшки будет брать другую Машку, но не напрямую, а кастомно
                                : iMA(NULL, PERIOD_CURRENT, MAPeriod, 0, MODE_SMA, iCustom(_Symbol, PERIOD_CURRENT, GetMyName(), true));

int Replace( double &Array[], const double NewValue = 1 e3, const double PrevValue = EMPTY_VALUE )
{
  for (int i = ArraySize(Array) - 1; i >= 0; i--)
    if (Array[i] == PrevValue)
      Array[i] = NewValue;
      
  return(0);
}

int OnCalculate( const int rates_total,      // размер входных таймсерий 
                 const int prev_calculated,  // обработано баров на предыдущем вызове
                 const datetime& time[],     // Time 
                 const double& open[],       // Open 
                 const double& high[],       // High 
                 const double& low[],        // Low 
                 const double& close[],      // Close 
                 const long& tick_volume[],  // Tick Volume 
                 const long& volume[],       // Real Volume 
                 const int& spread[] )       // Spread 
{
  return(prev_calculated + CopyBuffer(handleMA, 0, prev_calculated, rates_total - prev_calculated, Buffer) + Replace(Buffer));
}

Se puede afirmar con seguridad que el algoritmo recurrente iMA no tiene en cuenta el caso en el que DBL_MAX se introduce en la entrada. Un error.


@A100, ¡Gracias!

 

El MetaEditor se cuelga al intentar compilar un archivo adjunto

Si no se cuelga enseguida, espere un rato o vaya a la línea de resumen y vea el tiempo de compilación

Archivos adjuntos:
Test0.mq5  1 kb
 

¿Por qué no mostrar el número de pedido/transacción en una ventana emergente al pasar el ratón? Lo pedí hace mil años, ¡qué falta hace!

 
fxsaber:


return(prev_calculated + CopyBuffer(handleMA, 0, prev_calculated, rates_total - prev_calculated, Buffer) + Replace(Buffer));

Estas construcciones deben evitarse. El orden de ejecución de los operandos no está regulado en C++, por lo que depende de cada compilador. Las excepciones son los operadores && y ||, donde los operandos se ejecutan siempre de izquierda a derecha.

 
Alexey Navoykov:

Estas construcciones deben evitarse. El orden de ejecución de los operandos no está regulado en C++, por lo que depende de cada compilador. Las excepciones son && y ||, donde los operandos se ejecutan siempre de izquierda a derecha.

Bueno, ¡estamos en MQL!

 
fxsaber:

Bueno, ¡estamos en MQL!

En ninguna parte de la documentación dice nada específico sobre un orden concreto. Así que pueden cambiarlo a su antojo en cualquier momento.

Ya me he puesto en contacto con el servicio de atención al cliente una vez para aclarar este asunto.

 

Hola. ¿Puede decirme qué funciones se pueden utilizar para obtener la lista de indicadores que se muestran en el gráfico y sus parámetros? Sólo he encontrado una función que devuelve el número de indicadores en el gráfico

Списки наложенных объектов - Дополнительные возможности - Графики котировок, технический и фундаментальный анализ - Справка по MetaTrader 5
Списки наложенных объектов - Дополнительные возможности - Графики котировок, технический и фундаментальный анализ - Справка по MetaTrader 5
  • www.metatrader5.com
У каждого графика можно посмотреть списки наложенных объектов: индикаторов, аналитических объектов и советников. Там же можно можно редактировать их свойства и удалять их с графика. Список индикаторов Индикаторы сгруппированы на наложенные на основное окно графика и на те, что открыты в отдельных окнах. Выберите индикатор и нажмите "Свойства...
 
Aleksandr Teleguz:

Hola. ¿Puede decirme qué funciones se pueden utilizar para obtener la lista de indicadores que se muestran en el gráfico y sus parámetros? Sólo he encontrado la función que devuelve el número de indicadores en el gráfico

IndicatorParameters (+ IndicatorRelease)

Документация по MQL5: Доступ к таймсериям и индикаторам / IndicatorParameters
Документация по MQL5: Доступ к таймсериям и индикаторам / IndicatorParameters
  • www.mql5.com
//| Script program start function                                    |                          +                                    p,                                                                        parameters[p].integer_value,                                    parameters[p].double_value...
 
Alexey Navoykov:

En ninguna parte de la documentación dice nada específico sobre un orden concreto. Así que pueden cambiarlo a su antojo en cualquier momento.

No me molesto con eso. Hay muchas cosas que no se describen allí.

De la parte superior de mi cabeza

  • Ordenar los registros del historial de operaciones por tiempo en MT4/5.
  • Posibilidad de inicializar variables globales/estáticas por función - apareció hace relativamente poco.
  • Configuración de las directivas del preprocesador en una línea - aunque pronto se desactivará.
  • Ejecución de los operandos de izquierda a derecha.
  • OrderSend está sincronizado al 99% con el entorno comercial.
  • ChartApplyTemplate es asíncrono.
  • Y hay muchas otras sutilezas no documentadas. Y luego hay casos en los que la documentación no se corresponde con la realidad. Y esto no es un error, sino un raro error que simplemente no se menciona.

El precedente fue un rechazo al casting, pero había una razón para ello.

Así que no usar algo sólo porque no está descrito es una decisión cuestionable.


Creo que un código así no causaría dudas a los programadores.

int Replace( double &Array[], int );

return(prev_calculated + Replace(Buffer, CopyBuffer(handleMA, 0, prev_calculated, rates_total - prev_calculated, Buffer)));

Sin embargo, no es muy agradable. Tiene sentido escribir MyCopyBuffer pero es feo mostrar en un código corto que lo necesitas para evitar un error. Por lo tanto, el uso de la prioridad de ejecución del operando no documentado es justo para mostrar que se trata de una solución temporal.