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_buffers1#property indicator_plots1#property indicator_type1 DRAW_LINE#property indicator_color1 clrRed#property indicator_style1 STYLE_SOLID#property indicator_width1 1inputbool CustomData = false; // true - кастомный режим для iCustominputint MAPeriod = 1 e1; // Период МАшкиstring GetMyName( void )
{
constint Length = StringLen(TerminalInfoString(TERMINAL_DATA_PATH) + "\\MQL5\\Indicators\\");
conststring Path = MQLInfoString(MQL_PROGRAM_PATH);
return(StringSubstr(Path, Length, StringLen(Path) - Length - 4));
}
double Buffer[];
constbool Init = SetIndexBuffer(0, Buffer, INDICATOR_DATA);
constint 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[], constdouble NewValue = 1 e3, constdouble PrevValue = EMPTY_VALUE )
{
for (int i = ArraySize(Array) - 1; i >= 0; i--)
if (Array[i] == PrevValue)
Array[i] = NewValue;
return(0);
}intOnCalculate( constint rates_total, // размер входных таймсерий constint prev_calculated, // обработано баров на предыдущем вызовеconstdatetime& time[], // Time constdouble& open[], // Open constdouble& high[], // High constdouble& low[], // Low constdouble& close[], // Close constlong& tick_volume[], // Tick Volume constlong& volume[], // Real Volume constint& 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.
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.
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.
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
У каждого графика можно посмотреть списки наложенных объектов: индикаторов, аналитических объектов и советников. Там же можно можно редактировать их свойства и удалять их с графика. Список индикаторов Индикаторы сгруппированы на наложенные на основное окно графика и на те, что открыты в отдельных окнах. Выберите индикатор и нажмите "Свойства...
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
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.
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_VALUECon 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.
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
¿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!
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.
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!
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
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)
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
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.
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.