Quaisquer perguntas de recém-chegados sobre MQL4 e MQL5, ajuda e discussão sobre algoritmos e códigos - página 372

 
PokrovMT5:

Maxim, bom dia! Obrigado pela variante, a minha é quase a mesma, também funciona, masAlekseu Fedotov o sugeriu e eu escrevi que há uma idéia de como corrigi-la?



Se você não se importar em redesenhar (por exemplo, você recalculará de qualquer forma, como agora) - devolva da função OnCalculate o lugar de onde você quer recalcular, no seu caso - a barra da hora anterior.

taxas de retorno_total-iBarShift(_Símbolo,_Período,tempo[0]-TimeMinute(tempo[0])*60-TimeSeconds(tempo[0])-1 ); // sobre isto, escrito "fora de mão e não verificado", para demonstrar a abordagem.

 
MakarFX Eu fiz, mas isso não resolve a questão para
// #property  copyright "Copyright © 2005, Yura Prokofiev"
// #property  link      "Yura.prokofiev@gmail.com"
#property  strict
#property  indicator_separate_window
#property  indicator_buffers 3
 
extern int      Barrs  = 10;     // Баров для расчета
extern string   simvol = "EURGBP";
double Buf_0[], Buf_1[], Buf_2[];

void OnInit()
{
   SetIndexStyle(0,DRAW_NONE);
   SetIndexStyle(1,DRAW_HISTOGRAM,STYLE_SOLID,2,Yellow);
   SetIndexStyle(2,DRAW_HISTOGRAM,STYLE_SOLID,2,Red);
   IndicatorDigits((int)SymbolInfoInteger(simvol,SYMBOL_DIGITS));

   SetIndexBuffer(0,Buf_0);
   SetIndexBuffer(1,Buf_1);
   SetIndexBuffer(2,Buf_2);

   IndicatorShortName("Fisher "+simvol);
   SetIndexLabel(1,NULL);
   SetIndexLabel(2,NULL);
}

int start()
{
   int    i, limit, counted_bars=IndicatorCounted();
   double prev,current;
   double Value=0, Value1=0, Value2=0, Fish=0, Fish1=0, Fish2=0;
   double price, MinL=0, MaxH=0;

   if(counted_bars>0) counted_bars--;
   limit=Bars-counted_bars;

   for(i=0; i<limit; i++)
   {
      MaxH = iHigh(simvol,   0, iHighest(simvol,  0, MODE_HIGH,Barrs,i));
      MinL = iLow (simvol,   0, iLowest (simvol,  0, MODE_LOW, Barrs,i));
      price = (iHigh(simvol, 0, i) + iLow(simvol, 0, i))/2;
      if(MaxH != MinL)
      Value = 0.33*2*((price-MinL)/(MaxH-MinL)-0.5) + 0.67*Value1;     
      Value=MathMin(MathMax(Value,-0.999),0.999); 
      Buf_0[i]=0.5*MathLog((1+Value)/(1-Value))+0.5*Fish1;
      Value1=Value;
      Fish1=Buf_0[i];
   }
   bool up=true;
   for(i=limit-2; i>=0; i--)
   {
      current=Buf_0[i];
      prev=Buf_0[i+1];
      if(((current<0)&&(prev>0))||(current<0))   up= false;    
      if(((current>0)&&(prev<0))||(current>0))   up= true;
      Buf_1[i]=0;  Buf_2[i]=0;
      if(!up) Buf_2[i]=current;
      else    Buf_1[i]=current;
   }
   return 0;
}

Antigo inferior , novo superior

O cronograma do gráfico utilizado é aquele em que se encontra o indicador - zeros

 
YarTrade:

Você pode me dizer como reiniciar o buffer quando uma nova barra aparece, mas para que os dados anteriores não sejam apagados e sejam exibidos no gráfico. Por alguma razão não posso zerar o buffer e quando apareceuma nova barra, novos dados são sobrepostos aos antigos dados acumulados. O que estou errado em meu código? Obrigado pelo esclarecimento.

Quando uma nova barra aparece, o terminal acrescenta novos itens nulos aos amortecedores. Nas linhas 3 ... 6 está exatamente zerando-os. Tudo o resto é salvo
 
STARIJ:
Quando uma nova barra aparece, o terminal acrescenta novos elementos nulos aos amortecedores. Nas linhas 3 ... ... 6 são exatamente zerados. Todos os outros elementos são preservados

Por que as barras do histograma crescem imediatamente com o aparecimento de uma nova barra e continuam a crescer, mas a próxima barra cresce quando a próxima barra aparece e a anterior cresce?

 
YarTrade:

Por que as barras no histograma imediatamente após o aparecimento de uma nova barra têm o crescimento da barra anterior, e depois continuam a crescer, e a próxima barra tem, no aparecimento da próxima barra, o crescimento da anterior?

Você tem um resumo
V2 = V1 + V2;
 
Olá a todos, não consigo descobrir sozinho, algum tipo de poltergeist, embora eu possa estar desatento.
int ticket_order=0;
void OnTick()
{
  if(OrdersTotal()==0)
   {
    // километр кода
    ticket_order=OrderSend(Symbol(),up_down,lots,Ask,3,0,0);
    }
    if(OrdersTotal()==1)
   {
     OrderSelect(ticket_order,SELECT_BY_TICKET);
     bool Ans=OrderModify(ticket_order,Price,SL,TP,0);
    }
}
     
   
Eu não sei o que culpar, talvez eu deva usar OrderModify() ou OrderSelect para enviar um bilhete por referência e mudá-lo de alguma forma?
 
ijonhson: mensagem de erro bilhete errado(OrderModify())
Havia um semelhante. Reorganizar a primeira e segunda declarações condicionais junto com a coragem - pode ajudar.
 
STARIJ:

Antigo inferior, novo superior

O cronograma do gráfico utilizado é aquele em que se encontra o indicador - zeros

Obrigado ENORME. Era isso que eu queria.
 
ijonhson:
Saudações a todos, não consigo descobrir sozinho,

Isto torna mais fácil encontrar o erro:

if ( OrderSelect(ticket_order,SELECT_BY_TICKET) )
  if ( OrderModify(ticket_order,Price,SL,TP,0) ) {}
Mas acho que antes de OrderSelect() deveria ser tiket_order=(correct_ticket)
 
ijonhson:
Olá a todos, não consigo me entender, algum tipo de poltergeist, embora eu possa estar desatentoEm tal conexão no testador de estratégia, o bilhete de erro (OrderModify()), e na n-ésima ordem, não na primeira ou segunda, eu não sei o que culpar, talvez na OrderModify(), ou OrderSelect bilhete é passado por referência e de alguma forma muda lá?
Você seleciona o pedido por bilhete e depois, após um quilômetro de código, tenta modificá-lo. Mas pode já estar fechado naquele momento.
Razão: