No recalcula 0 bar por la misma razón que no se empieza con 0.
Mi barra 0 no se calcula según la fórmula.
Buffer[0]=price[0];
Y luego, basándose en el movimiento del precio, el indicador se pondrá al día con la tendencia
Por ejemplo, si el precio se ha alejado del indicador y no se moverá, entonces duranteel "período" de la vela el indicador se pondrá al día con el precio, esto es una especie de alternativa a MA para mí
Mi primer indicador. Quiero escalar el símbolo de 0 a 100. ¿Lo estoy haciendo bien? Y cómo hacer que la barra actual no recalcule (en el probador da tirones, pero no en el gráfico)
#property indicator_separate_window#property indicator_minimum 0#property indicator_maximum 100#property indicator_buffers 1#property indicator_plots 1//--- plot Label1#property indicator_label1 "Main"#property indicator_type1 DRAW_LINE#property indicator_color1 clrRed#property indicator_style1 STYLE_SOLID#property indicator_width1 1//--- indicator buffersdouble MainBuffer[];
//+------------------------------------------------------------------+//| Custom indicator initialization function |//+------------------------------------------------------------------+intOnInit()
{
//--- indicator buffers mappingSetIndexBuffer(0,MainBuffer,INDICATOR_DATA);
IndicatorSetString(INDICATOR_SHORTNAME,"NormSymbol");
IndicatorSetInteger(INDICATOR_DIGITS,2);
ArrayInitialize(MainBuffer, EMPTY_VALUE);
//---return(0);
}
//+------------------------------------------------------------------+//| Custom indicator iteration function |//+------------------------------------------------------------------+intOnCalculate(constint rates_total,
constint prev_calculated,
constdatetime &time[],
constdouble &open[],
constdouble &high[],
constdouble &low[],
constdouble &close[],
constlong &tick_volume[],
constlong &volume[],
constint &spread[])
{
int first,bar,nLowBar=0,nHighBar=0;
int nVizCount = (int)ChartGetInteger(0, CHART_VISIBLE_BARS);
if(prev_calculated==0) // проверка на первый старт расчёта индикатора
{
first=0; // стартовый номер для расчёта всех баров
}
else
{
first=prev_calculated-1; // стартовый номер для расчёта новых баров
}
//---- основной цикл расчёта индикатораfor(bar=first; bar<rates_total; bar++)
{
nLowBar =ArrayMinimum(low, bar, nVizCount);
nHighBar=ArrayMaximum(high, bar, nVizCount);
if(nLowBar>0 && nHighBar>0 && high[nHighBar]-low[nLowBar]!=0)
{
MainBuffer[bar]=((close[bar] -low[nLowBar])/(high[nHighBar]-low[nLowBar]))*100;
}
else
{
MainBuffer[bar]=EMPTY_VALUE;
}
}
//--- return value of prev_calculated for next callreturn(rates_total);
}
Konstantin83: cómo hacer que la barra actual no se recalcule
Memoriza la hora de apertura de la barra actual y la compara con el mismo valor del tick entrante. Sólo recalcula el valor de la barra actual cuando los valores no coinciden.
Memoriza la hora de apertura de la barra actual y la compara con el mismo valor del tick entrante. Sólo recalcula el valor de la barra actual cuando los valores no coinciden.
Konstantin83: ¿Sabes por qué después de cerrar el terminal con el indicador y reiniciar el terminal el indicador no dibuja una línea? Si se cambia a otro marco temporal, se sorteará.
El terminal necesita un tiempo para "levantarse", sincronizar sus bases de datos con el servidor, etc. al arrancar. Si el indicador se inicia al mismo tiempo, es posible que no haya datos para el cálculo del indicador. Pruebe la solución más sencilla: insertar un retraso de dos o tres segundos en OnInit().
La buena solución es imprimir toda la información importante cuando se busca el área del problema. Como
Cambiado a esto
Parece que funciona.sus arrays no están serializados.
por eso es esto.
Buffer[i+1]=Buffer[i]+delta;asomándose al futuro
No recalcula 0 bar - por la misma razón - su inicio - no comienza con 0.
sus arrays no están serializados.
por eso es esto.
asomarse al futuro.
No recalcula 0 bar por la misma razón que no se empieza con 0.
Mi barra 0 no se calcula según la fórmula.
Y luego, basándose en el movimiento del precio, el indicador se pondrá al día con la tendencia
Por ejemplo, si el precio se ha alejado del indicador y no se moverá, entonces duranteel "período" de la vela el indicador se pondrá al día con el precio, esto es una especie de alternativa a MA para mí
lazarev-d-m:
es una especie de alternativa a MA para mí
Mi primer indicador. Quiero escalar el símbolo de 0 a 100. ¿Lo estoy haciendo bien? Y cómo hacer que la barra actual no recalcule (en el probador da tirones, pero no en el gráfico)
Memoriza la hora de apertura de la barra actual y la compara con el mismo valor del tick entrante. Sólo recalcula el valor de la barra actual cuando los valores no coinciden.
Yo pondría esto en el bloque de inicialización:
y las variables se declararían a nivel global del programa:
Memoriza la hora de apertura de la barra actual y la compara con el mismo valor del tick entrante. Sólo recalcula el valor de la barra actual cuando los valores no coinciden.
Yo pondría esto en el bloque de inicialización:
No he notado nada más. Los artículos sugieren una estructura similar. Hay una comprobación de la división por cero.
Sí, para evitar recalcular, también puedes comparar prev_calculado y rates_total, por lo que recuerdo.
No he notado nada más. Los artículos sugieren una estructura similar. Hay una comprobación de la división por cero.
Sí, para evitar recalcular, también puedes comparar prev_calculado y rates_total, por lo que recuerdo.
El terminal necesita un tiempo para "levantarse", sincronizar sus bases de datos con el servidor, etc. al arrancar. Si el indicador se inicia al mismo tiempo, es posible que no haya datos para el cálculo del indicador. Pruebe la solución más sencilla: insertar un retraso de dos o tres segundos en OnInit().
La buena solución es imprimir toda la información importante cuando se busca el área del problema. Como
Yedelkin:
Todavía no he encontrado ninguna ayuda para el comercio en vivo - sólo trate de abrir y cerrar una posición en una cuenta de demostración.
Aquí está: https://www.mql5.com/ru/forum/6343/page96#comment_419028