Fragen von Neueinsteigern zu MQL4 und MQL5, Hilfe und Diskussion über Algorithmen und Codes - Seite 372

 
PokrovMT5:

Maxim, guten Tag! Vielen Dank für die Variante, meine ist fast das gleiche, es funktioniert auch, aberAlekseu Fedotov schlug es vor und ich schrieb, dass es eine Idee, wie es zu korrigieren?



Wenn Ihnen die Neuberechnung nichts ausmacht (z. B. weil Sie sie ohnehin neu berechnen werden, wie jetzt), geben Sie in der Funktion OnCalculate die Stelle zurück, von der aus Sie die Neuberechnung vornehmen möchten, in Ihrem Fall den Balken der vorherigen Stunde.

return rates_total-iBarShift(_Symbol,_Period,time[0]-TimeMinute(time[0])*60-TimeSeconds(time[0])-1 ); // etwa so, aus der Hand geschrieben und nicht geprüft, um den Ansatz zu demonstrieren.

 
MakarFX Das habe ich getan, aber das löst das Problem nicht für
// #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;
}

Unten alt, oben neu

Der verwendete Chart-Zeitrahmen ist derjenige, in dem die Indikator-Nullen stehen

 
YarTrade:

Können Sie mir bitte sagen, wie ich den Puffer zurücksetzen kann, wenn ein neuer Balken erscheint, aber so, dass die vorherigen Daten nicht gelöscht werden, sondern im Diagramm angezeigt werden. Aus irgendeinem Grund kann ich den Puffer nicht auf Null zurücksetzen, und wennein neuer Balkenerscheint, werden die alten akkumulierten Daten mit neuen Daten überlagert. Was mache ich in meinem Code falsch? Danke für die Klarstellung.

Wenn ein neuer Balken erscheint, fügt das Terminal den Puffern neue Nullposten hinzu. In Zeile 3 ... 6 ist genau die Nullstellung. Alles andere wird gespeichert
 
STARIJ:
Wenn ein neuer Balken erscheint, fügt das Terminal neue Nullelemente zu den Puffern hinzu. In Zeile 3 ... ... 6 sind genau auf Null gesetzt. Alle anderen Elemente bleiben erhalten

Warum wachsen die Balken im Histogramm sofort mit dem Erscheinen eines neuen Balkens und wachsen weiter, aber der nächste Balken wächst, wenn der nächste Balken erscheint und der vorherige nicht?

 
YarTrade:

Warum weisen die Balken im Histogramm unmittelbar nach dem Erscheinen eines neuen Balkens das Wachstum des vorherigen Balkens auf und wachsen dann weiter, während der nächste Balken beim Erscheinen des nächsten Balkens das Wachstum des vorherigen Balkens aufweist?

Sie haben eine Summierung
V2 = V1 + V2;
 
Hallo zusammen, ich kann es selbst nicht herausfinden, eine Art Poltergeist, obwohl ich vielleicht unaufmerksam bin.
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);
    }
}
     
   
Ich weiß nicht, was zu tadeln, vielleicht sollte ich OrderModify() oder OrderSelect verwenden, um ein Ticket per Referenz zu senden und es irgendwie zu ändern?
 
ijonhson: Fehlermeldung falsches Ticket(OrderModify())
Es gab einen ähnlichen Fall. Ordnen Sie die erste und zweite bedingte Anweisung zusammen mit den Eingeweiden neu an - das könnte helfen.
 
STARIJ:

Unten alt, oben neu

Der Zeitrahmen des verwendeten Charts ist derjenige, in dem die Indikator-Nullen stehen

Vielen Dank HUGE. Das ist es, was ich wollte.
 
ijonhson:
Ich grüße euch alle, kann es selbst nicht herausfinden,

So lässt sich der Fehler leichter finden:

if ( OrderSelect(ticket_order,SELECT_BY_TICKET) )
  if ( OrderModify(ticket_order,Price,SL,TP,0) ) {}
Aber ich denke, vor OrderSelect() sollte es tiket_order=(correct_ticket) heißen.
 
ijonhson:
Hallo alle, ich kann mich nicht verstehen, eine Art von Poltergeist, obwohl ich unaufmerksam sein kannIn einer solchen Kombination in der Strategie-Tester, der Fehler falsches Ticket (OrderModify()), und auf der n-ten Ordnung, nicht auf der ersten oder zweiten, ich weiß nicht, was zu tadeln, vielleicht in OrderModify(), oder OrderSelect Ticket wird durch Referenz übergeben und es irgendwie ändert?
Sie wählen die Bestellung per Ticket aus und versuchen dann, nach einem Kilometer Code, diese zu ändern. Es kann aber sein, dass sie zu diesem Zeitpunkt bereits geschlossen ist.