Perguntas de um "boneco" - página 235

 
lazarev-d-m:

Mudou para isto

Parece estar a funcionar.

as suas matrizes não são serializadas.

é por isso que é isto.

Buffer[i+1]=Buffer[i]+delta;

espreitar para o futuro


Não recalcula 0 barra - pela mesma razão - o seu início - não começa com 0.

 
sergeev:

as suas matrizes não são serializadas.

por isso é que é isto.

a espreitar o futuro.


Não recalcula 0 barra pela mesma razão que não se começa com 0.

A minha barra 0 não é calculada de acordo com a fórmula.

Buffer[0]=price[0]; 

E depois, com base no movimento dos preços, o indicador irá acompanhar a tendência

Por exemplo, se o preço se afastou do indicador e não se vai mexer, então durante o"período" do indicador de vela irá recuperar o preço, esta é para mim uma espécie de alternativa ao MA

 

lazarev-d-m:

é uma espécie de alternativa ao MA para mim

olhando 1 barra para o futuro pode atirar esta alternativa em segurança para o caixote do lixo
 

O meu primeiro indicador. Quero escalar o símbolo de 0 a 100. Estou a fazê-lo bem? E como fazer com que a barra actual não seja recalculada (no testador, ela sacode, mas não no 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: como fazer com que a barra actual não seja recalculada

Memorizar a hora de abertura da barra actual e compará-la com o mesmo valor do tick de entrada. Só recalcular o valor da barra actual quando os valores não coincidirem.

Eu colocaria isto no bloco de inicialização:

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

e as variáveis seriam declaradas a nível global do programa:

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

Memorizar a hora de abertura da barra actual e compará-la com o mesmo valor do tick de entrada. Só recalcular o valor da barra actual quando os valores não coincidirem.

Eu colocaria isto no bloco de inicialização:

Obrigado. Será isto correcto em geral?
 
Konstantin83: E tudo está correcto em geral?

Não reparei em mais nada. Os artigos sugerem uma estrutura semelhante. Há um controlo de divisão por zero.

Sim, para evitar um novo cálculo, também se pode comparar o calculado_previamente e as taxas_total, tanto quanto me lembro.

 
Yedelkin:

Não reparei em mais nada. Os artigos sugerem uma estrutura semelhante. Há um controlo de divisão por zero.

Sim, para evitar um novo cálculo, também se pode comparar o calculado_previamente e as taxas_total, tanto quanto me lembro.

Sabe porque é que o indicador não traça a linha depois de fechar o terminal e reiniciar o terminal? Se mudar para outro período de tempo, este é desenhado.
 
Konstantin83: Sabe porque é que depois de fechar o terminal com o indicador e reiniciar o terminal o indicador não traça uma linha? Se mudar para outro período de tempo, este será desenhado.

O terminal precisa de algum tempo para "se levantar", sincronizar as suas bases de dados com o servidor, etc., ao arrancar. Se o indicador for iniciado ao mesmo tempo, pode não haver dados para o cálculo do indicador. Experimente a solução mais fácil: inserir um atraso de dois ou três segundos no OnInit().

A boa solução é imprimir toda a informação importante quando se procura a área problemática. Como

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

Yedelkin:

forward666 : precisa de uma visualização

Ainda não encontrei qualquer ajuda para negociação ao vivo - basta tentar abrir e fechar uma posição numa conta de demonstração.

Aqui está: https://www.mql5.com/ru/forum/6343/page96#comment_419028