Preguntas de un "tonto" - página 235

 
lazarev-d-m:

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.

 
sergeev:

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.

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í

 

lazarev-d-m:

es una especie de alternativa a MA para mí

mirando 1 bar en el futuro se puede tirar esta alternativa a la papelera
 

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 buffers
double         MainBuffer[];
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- indicator buffers mapping
   SetIndexBuffer(0,MainBuffer,INDICATOR_DATA);
   IndicatorSetString(INDICATOR_SHORTNAME,"NormSymbol");
   IndicatorSetInteger(INDICATOR_DIGITS,2);
   ArrayInitialize(MainBuffer, EMPTY_VALUE);

//---
   return(0);
  }
  
//+------------------------------------------------------------------+
//| 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 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 call

   return(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.

Yo pondría esto en el bloque de inicialización:

   nVizCount = (int)ChartGetInteger(0, CHART_VISIBLE_BARS);
   

y las variables se declararían a nivel global del programa:

int first,bar,nLowBar=0,nHighBar=0, nVizCount; 
 
Yedelkin:

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:

Gracias. ¿Es esto correcto en general?
 
Konstantin83: ¿Y todo es correcto en general?

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.

 
Yedelkin:

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.

¿Sabes por qué el indicador no dibuja la línea después de cerrar el terminal y reiniciar el terminal? Si se cambia a otro marco temporal, se dibuja.
 
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

if(nLowBar<0) Print("Ошибка, nLowBar=",nLowBar,", prev_calculated=",prev_calculated,", bar=",bar);
 

Yedelkin:

forward666 : necesito una visualización

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