Tutte le domande dei nuovi arrivati su MQL4 e MQL5, aiuto e discussione su algoritmi e codici - pagina 372

 
PokrovMT5:

Maxim, buon giorno! Grazie per la variante, la mia è quasi la stessa, funziona anche, maAlekseu Fedotov l'ha suggerito e ho scritto che c'è un'idea su come correggerla?



Se non vi dispiace ridisegnare (per esempio, lo ricalcolerete comunque, come adesso) - restituite dalla funzione OnCalculate il luogo da cui volete ricalcolarlo, nel vostro caso - la barra dell'ora precedente.

return rates_total-iBarShift(_Symbol,_Period,time[0]-TimeMinute(time[0])*60-TimeSeconds(time[0])-1 ); // su questo, scritto "di getto e non controllato", per dimostrare l'approccio.

 
MakarFX L'ho fatto, ma questo non risolve il problema per
// #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;
}

In basso vecchio, in alto nuovo

Il timeframe del grafico utilizzato è quello in cui l'indicatore - zeri sta

 
YarTrade:

Potete per favore dirmi come resettare il buffer quando appare una nuova barra, ma in modo che i dati precedenti non vengano cancellati, ma visualizzati sul grafico. Per qualche motivo non riesco ad azzerare il buffer e quando appareuna nuova barra, i nuovi dati si sovrappongono ai vecchi dati accumulati. Cosa sbaglio nel mio codice? Grazie per il chiarimento.

Quando appare una nuova barra, il terminale aggiunge nuovi elementi nulli ai buffer. Nelle linee 3 ... 6 è esattamente l'azzeramento. Tutto il resto è salvato
 
STARIJ:
Quando appare una nuova barra, il terminale aggiunge nuovi elementi nulli ai buffer. Nelle linee 3 ... ... 6 sono esattamente azzerati. Tutti gli altri elementi sono conservati

Perché le barre dell'istogramma crescono immediatamente con l'apparizione di una nuova barra e continuano a crescere, ma la barra successiva cresce quando appare quella precedente?

 
YarTrade:

Perché le barre nell'istogramma immediatamente dopo l'apparizione di una nuova barra hanno la crescita della barra precedente, e poi continuano a crescere, e la barra successiva ha, all'apparizione della barra successiva, la crescita della precedente?

Hai un riassunto
V2 = V1 + V2;
 
Ciao a tutti, non riesco a capire me stesso, una sorta di poltergeist, anche se posso essere disattento.
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);
    }
}
     
   
Non so a cosa dare la colpa, forse dovrei usare OrderModify() o OrderSelect per inviare un biglietto per riferimento e cambiarlo in qualche modo?
 
ijonhson: messaggio di errore errato ticket(OrderModify())
Ce n'era uno simile. Riorganizzare la prima e la seconda dichiarazione condizionale insieme alle viscere - potrebbe aiutare.
 
STARIJ:

In basso vecchio, in alto nuovo

Il timeframe del grafico utilizzato è quello in cui l'indicatore - zeri sta

Grazie ENORME. Questo è quello che volevo.
 
ijonhson:
Saluti a tutti, non riesco a capirlo da solo,

Questo rende più facile trovare l'errore:

if ( OrderSelect(ticket_order,SELECT_BY_TICKET) )
  if ( OrderModify(ticket_order,Price,SL,TP,0) ) {}
Ma penso che prima di OrderSelect() dovrebbe essere tiket_order=(correct_ticket)
 
ijonhson:
Ciao a tutti, non riesco a capire me stesso, una sorta di poltergeist, anche se posso essere disattentoIn una tale combinazione nel tester di strategia, aerror ticket errato (OrderModify()), e sul n-esimo ordine, non sul primo o secondo, non so a cosa dare la colpa, forse in OrderModify(), o OrderSelect ticket viene passato per riferimento e in qualche modo cambia?
Si seleziona l'ordine per biglietto e poi, dopo chilometri di codice, si cerca di modificarlo. Ma potrebbe essere già chiuso in quel momento.