Fehler, Irrtümer, Fragen - Seite 307

 
Jager:

Wenn ich versuche, den usdjpy zu testen, erhalte ich eine Meldung wie diese:

und scheint unendlich lange zu laufen, bei 3000 habe ich es ausgeschaltet. Tests versucht, auf 2010.10.01 - 2010.10.10 zu wechseln, nur Eröffnungspreise.

bild 401

Auch ein anderer Remote-Agent lässt sich nicht starten, hier ist das Protokoll:

Auch gestern wurde ein ähnliches Muster beobachtet... Es sieht so aus, als ob die ganze Geschichte überladen war, und offenbar gab es dabei einige Probleme.

Ich habe wohl bis zum Ende des Prozesses gewartet oder das Terminal neu gestartet.

Ich habe gestern eine interessante Sache entdeckt. nachdem ich den EA neu kompiliert habe, funktionieren die Änderungen im Tester nicht, bis man das Terminal neu startet - das ist die Dose!!!

 
Im_hungry:
Vollständig unterstützend - vielleicht servicedesk? (schließen Sie es hundertmal)
Was soll das bringen? Sie wissen doch alle ganz genau...
 

Seit gestern haben die Experten ihr digitales Leben aufgenommen.

Beim Testen gibt er einen zufälligen Fokus aus... Er überspringt den OnInit()-Befehl auf magische Weise und erzeugt dann im DeInit()-Befehl ein Fehler-Array außerhalb des Bereichs.


Die Sache ist die, dass er mit denselben Parametern entweder startet und den gesamten Test durchführt oder aber abstürzt.

Документация по MQL5: Основы языка / Функции / Функции обработки событий
Документация по MQL5: Основы языка / Функции / Функции обработки событий
  • www.mql5.com
Основы языка / Функции / Функции обработки событий - Документация по MQL5
 
Im_hungry:

Hier ist die Herausforderung: Machen Sie den Indikatorparameter dynamisch. Wenn Sie eine Position schließen, ändern Sie einen der Indikatorparameter.

Nun meine Lösung:

Ich kann sagen, dass dieser Code funktioniert, wie das Testen zeigt ein anderes Ergebnis, aber es ist nicht klar, warum es funktioniert t.s. einmal in eine Weile, schaute ich in das Protokoll - 1 Woche alles funktioniert, wie es sollte, dann ist es Schleifen und gibt die gleichen Werte in den Puffer, obwohl dies unmöglich ist (2 Wochen die gleichen Werte in der Tester-Protokoll), wenn nicht Schleifen dann nur einen Fehler schreibt:

Nachricht über Alert

Soweit ich es verstanden habe, erstellt der Expert Advisor ein Handle eines Indikators, wenn ein neuer Balken erscheint, und verlangt gleichzeitig, die Puffer dieses Indikators zu kopieren. Dies funktioniert jedoch nicht, wenn die Berechnung der Indikatorpuffer einige Zeit in Anspruch nehmen kann. Mit anderen Worten: Das Indikator-Handle wurde zwar erfolgreich erstellt, aber die Indikatorpuffer wurden noch nicht berechnet.
Усреднение ценовых рядов без дополнительных буферов для промежуточных расчетов
Усреднение ценовых рядов без дополнительных буферов для промежуточных расчетов
  • 2010.10.25
  • Nikolay Kositsin
  • www.mql5.com
Статья о традиционных и не совсем традиционных алгоритмах усреднения, упакованных в максимально простые и достаточно однотипные классы. Они задумывались для универсального использования в практических разработках индикаторов. Надеюсь, что предложенные классы в определенных ситуациях могут оказаться достаточно актуальной альтернативой громоздким, в некотором смысле, вызовам пользовательских и технических индикаторов.
 
Yedelkin:
Soweit ich das verstanden habe, erstellt der Expert Advisor ein Indikator-Handle, wenn ein neuer Balken erscheint, und gleichzeitig müssen die Puffer dieses Indikators kopiert werden. Aber die Situation ist nicht geklärt, wenn die Berechnung der Indikatorpuffer einige Zeit in Anspruch nehmen kann. Mit anderen Worten: Das Indikator-Handle wurde zwar erfolgreich erstellt, aber die Indikatorpuffer wurden noch nicht berechnet.

Ja, ich stimme zu - deshalb habe ich dieses Design ausprobiert:

//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
{ 
   if (isNewBar()==true && proverkaHANDLA()==true)
     {
      if (!PositionSelect(Symbol1) && !PositionSelect(Symbol2))
         {
          BSOpen();
         }
     }    
}
//+==================================================================+
bool proverkaHANDLA()
{
  ArraySetAsSeries(Sp1Buffer,true);
  ArraySetAsSeries(Sp2Buffer,true);
//----------------------
  vhandle=iCustom(NULL,0,"МТ5",Symbol1,100,Lots,1,Close());
  if(vhandle<0)
    {
     Alert("Ошибка при создании индиката: ",GetLastError());
     return(0);
    }
  if(CopyBuffer(vhandle,0,0,50,Sp1Buffer)<0 || CopyBuffer(vhandle,1,0,50,Sp2Buffer)<0)
    {
     Alert("Ошибка копирования буферов индикатора номер ошибки:",GetLastError());
     return(0);
    }
  return (true);
}

Im Moment funktioniert es! Vielen Dank für Ihre Hilfe

 

Aber von Zeit zu Zeit macht es schlapp:

Alert: Ошибка копирования буферов индикатора номер ошибки:4806
 
Im_hungry:

Ja, ich stimme zu - deshalb habe ich dieses Design ausprobiert:

Bis jetzt klappt es! Vielen Dank für Ihre Hilfe

Ein solches Konstrukt überspringt die Fälle, in denen "der Handle erstellt wurde, aber die Indikatorpuffer noch nicht berechnet wurden". Da die Konstruktion selbst einmal pro Periode aufgerufen wird, können Sie versuchen, die Funktion CopyBuffer() mehrfach aufzurufen. D.h. wenn CopyBuffer()<0, dann wird die Funktion wiederholt aufgerufen, solange es der gewählte Zeitraum erlaubt (innerhalb des gewählten Zeitraums).
 
Im_hungry:

Aber hin und wieder ist das der Fall:

Nun, das ist richtig. Ihre Funktion proverkaHANDLA() ist ein unabhängiger Block, der sich intern nur einmal aufCopyBuffer() bezieht. Wennalso die Puffer nicht berechnet werden, wird sie immer wieder auftauchen. Bislang behandelt Ihre Funktion proverkaHANDLA() die Situation "Handle erstellt, aber Indikatorpuffer noch nicht berechnet" nicht, sondern ignoriert sie.

 
Yedelkin:
Diese Konstruktion überspringt die Fälle, in denen "der Griff erstellt wurde, aber die Indikatorpuffer noch nicht berechnet wurden". Da die Konstruktion selbst einmal pro Periode aufgerufen wird, können Sie versuchen, die Funktion CopyBuffer() wiederholt aufzurufen. D.h. wenn CopyBuffer()<0, dann wiederholter Aufruf der Funktion, solange es der gewählte Zeitraum erlaubt (innerhalb des gewählten Zeitraums).

Das heißt, solange CopyBuffer>0 ist, wird er berechnet, und der neue Parameter (Close()

erscheint bei Schließung der Position. Das heißt, wir müssen While in einer Schleife durchlaufen. Das sieht dann so aus.

if(!PositionSelect(Symbol1) && !PositionSelect(Symbol2))
  {
   While (vhandle>0)
    {
     if(CopyBuffer(vhandle,0,0,50,Sp1Buffer)<0 || CopyBuffer(vhandle,1,0,50,Sp2Buffer)<0)
      {
       Alert("Ошибка копирования буферов индикатора номер ошибки:",GetLastError());
       return(0);
      }
    }
  }
 
Versuchen Sie, in der Hilfe über BarsCalculated zu lesen, die übrigens das richtige Beispiel liefert.