Jede Anfängerfrage, um das Forum nicht zu überladen. Fachleute, gehen Sie nicht vorbei. Nirgendwo ohne dich - 6. - Seite 600

 

Grüße! :)

Ich habe ungefähr den gleichen Code wie dieser Indikator:

bool busy=false;

int start()
{
   int counted_bars=IndicatorCounted();
   if(counted_bars<0) return(-1);
   limit=Bars-counted_bars+1;
   limit=MathMin(bBars-1, limit);
   if(IndicatorCounted()>0) limit=1;
   
   FileWrite(han, TimeToStr(TimeCurrent(), TIME_MINUTES|TIME_SECONDS), Bars, IndicatorCounted());
   FileFlush(han);
   //if(busy=false) return(0);
   for (i=0; i<limit; i++)
   { 
      busy=true;
      FileWrite(han, TimeToStr(TimeCurrent(), TIME_MINUTES|TIME_SECONDS), DoubleToStr(i, 0), DoubleToStr(IndicatorCounted(), 0));
      FileFlush(han);
      Здесь идут сложные вычисления которые занимают минуты 3
   }

   busy=false;
}

Ich lasse es auf der M1-Karte fallen. Der Indikator hängt mit dem Terminal zusammen und führt angeblich Berechnungen durch.
Ich schließe es nach 15 Minuten gewaltsam und öffne das Protokoll:

Bild 1

Es stellt sich heraus, dass der Indikator nicht auf neu eingetroffene Ticks reagiert (das ist logisch), bis er das erste Mal berechnet. Aber es vergisst, dem Terminal während der Auswertung mitzuteilen, dass IndicatorConted() bereits einen Wert ungleich 0 zugewiesen sein muss.
Es stellt sich also heraus, dass eingehende Ticks, die zur Auswertung bestellt werden, sich den aktuellen Wert von IndicatorCounted() merken?

Ich habe versucht, es über die busy-Variable zu steuern (auskommentierter String - gleiches Ergebnis).

Ich habe es auch auf diese Weise versucht:

int start()
{
   FileWrite(han, TimeToStr(TimeCurrent(), TIME_MINUTES|TIME_SECONDS), Bars, IndicatorCounted());
   FileFlush(han);
   return(0);
   .
   .
   .
}

Natürlich funktionierte dieses Mal alles richtig:

Bild2

Was haben wir hier? Das System hat keine Zeit, einen neuen Wert in IndicatorCounted() zu schreiben? Mit anderen Worten, ich muss so etwas wie sleep() tun? Ich weiß, dass dies im Indikator nicht möglich ist.
Oder, wenn ein neuer Tick kommt, weil der alte Tick seine Berechnungen noch nicht beendet hat, merkt er sich, dass IndicatorCounte() immer noch gleich Null ist, und wenn seine Zeit gekommen ist, beginnt er die Berechnung mit dem alten Wert IndicatourCounted()=0?

Was ist zu tun? )

 
Expert:

Grüße! :)

Ich habe ungefähr den gleichen Code wie der Indikator:


Das sagt alles. Über diesen Code, über diese Antwort...zu schreiben?
 
peace1984:
Dies ist meine erste Erfahrung, urteilen Sie nicht zu hart:)
Um ehrlich zu sein, habe ich den Eindruck, dass sich der Prüfer an den vergangenen Wert der Variablen erinnert - vom letzten Test. Wie - ich weiß es nicht, ich habe nicht viel Zeit für die Fehlersuche. Vielleicht ist es ein Fehler im Terminal. Ich füge einfach einen Kommentar in den Code ein und gebe die Werte in das Protokoll ein. Es stellt sich also heraus, dass jedes Mal, wenn ich einen neuen Test ausführe, der Wert des vorherigen Tests in der sys-Variablen gespeichert wird. Was für ein Chaos. Vielleicht sieht jemand anderes, vielleicht ist mein Auge feucht...
Dateien:
11_1.mq4  8 kb
 
AlexeyVik:
Das sagt alles. Zu diesem Code, ungefähr diese Antwort...schreiben?


Der Punkt ist, dass der Rest des Codes irrelevant ist. Der Kern des Fehlers wird in diesem Beitrag beschrieben.
Im Allgemeinen hatte ich Angst, die Leute mit einem großen Beitrag zu verschrecken. Also habe ich es aufgebläht.

Kurz gefasst lässt sich das wie folgt formulieren: Wenn ein Indikator über einen längeren Zeitraum (mehr als eine Minute) berechnet wird, gibt IndicatorCounted() immer 0 zurück.

 
artmedia70:
Um ehrlich zu sein, habe ich den Eindruck, dass sich der Prüfer an den vergangenen Wert der Variablen erinnert - vom letzten Test. Wie - ich weiß es nicht, es bleibt nicht viel Zeit für eine Nachbesprechung. Vielleicht ein Fehler im Terminal. Ich füge einfach einen Kommentar in den Code ein und gebe die Werte in das Protokoll ein. Es stellt sich also heraus, dass jedes Mal, wenn ich einen neuen Test ausführe, der Wert des vorherigen Tests in der sys-Variablen gespeichert wird. Was für ein Chaos. Vielleicht sieht es jemand anders, vielleicht ist mein Auge feucht...

Sie haben nur vergessen, dass die Zeile

int       sys=(Sys<0)?0:Sys;

Wenn die Eigenschaften des Indikators abgerufen werden, werden sie nicht ausgeführt.

Ich habe mich noch nicht eingehend damit befasst, aber vielleicht lässt sich damit das gewünschte Ergebnis erzielen?

extern int Sys=0;
int       sys;    // изменено
double    opb;
double    ops;
double    cb;
double    cs;
double    lot;
double    next_order;
int       i=0;
int       x;
double    max;
double    min;
int       ticket;
int       tip;
int       count;
bool      res;
double    bal;
double    sl;
datetime  d;
double    N;
//+------------------------------------------------------------------+
//| expert initialization function                                   |
//+------------------------------------------------------------------+
int init()
  {
   sys=(Sys<0)?0:Sys;  // добавлено
   bal=AccountBalance();
   return(0);
  }
 
AlexeyVik:

Sie haben nur vergessen, dass die Zeichenfolge

die Indikatoreigenschaften werden nicht ausgeführt, wenn die Eigenschaften abgerufen werden.

Ich habe mich noch nicht eingehend damit befasst, aber vielleicht wird damit das gewünschte Ergebnis erzielt?



Im Allgemeinen ein Berater. Aber HZ, keine Zeit für Experimente. Bei mir funktionieren alle EAs so, wie ich es geschrieben habe. Ich werde diesen Scheiß im Testgerät verfolgen müssen. Wenn ich genug Zeit habe.
 
Expert:


Der Punkt ist, dass der Rest des Codes irrelevant ist. Der Kern des Fehlers wird in diesem Beitrag beschrieben.
Im Allgemeinen hatte ich Angst, die Leute mit einem großen Beitrag zu verschrecken. Also habe ich es aufgebläht.

Kurz gefasst lässt sich das wie folgt formulieren: Wenn ein Indikator über einen längeren Zeitraum (mehr als eine Minute) berechnet wird, gibt IndicatorCounted() immer 0 zurück.


Das ist nicht der Punkt. Niemand braucht Ihren vollständigen Geheimcode. Schreiben Sie einfach einen vollständigen Testcode mit diesem Missverständnis. Und hier entlang.

bool busy=false;

int start()
{
   int counted_bars=IndicatorCounted();
   if(counted_bars<0) return(-1);
   limit=Bars-counted_bars+1;
   limit=MathMin(bBars-1, limit);
   if(IndicatorCounted()>0) limit=1;
   
   FileWrite(han, TimeToStr(TimeCurrent(), TIME_MINUTES|TIME_SECONDS), Bars, IndicatorCounted());
   FileFlush(han);
   //if(busy=false) return(0);
   for (i=0; i<limit; i++)
   { 
      busy=true;
      FileWrite(han, TimeToStr(TimeCurrent(), TIME_MINUTES|TIME_SECONDS), DoubleToStr(i, 0), DoubleToStr(IndicatorCounted(), 0));
      FileFlush(han);
      Здесь идут сложные вычисления которые занимают минуты 3
   }

   busy=false;
}

Wann haben Sie die hervorgehobene Zeile gelöscht? Telepathen werden nicht helfen, Normalsterbliche noch weniger...

Und dann ist da noch dieser Teil.

   int counted_bars=IndicatorCounted();
   if(counted_bars<0) return(-1);
   limit=Bars-counted_bars+1;
   limit=MathMin(bBars-1, limit);
   if(IndicatorCounted()>0) limit=1;

Ich weiß nicht, von welchem Programmierer es stammt, aber es ist etwas unzureichend geschrieben... Es ist nicht deine Schuld. Sie haben, wie viele andere auch, einfach den Code genommen und versucht, ihn zu reparieren...

Wenn die Variable counted_bars gleich der Anzahl der seit dem letzten Aufruf des Indikators (erste Zeile) unverändert gebliebenen Balken ist

Wie es kleiner als Null werden kann, dass es geprüft wird if(counted_bars < 0) werde ich nie verstehen können...

Der Rest ist auch Unsinn, aber ich bin zu faul, ihn zu analysieren...

 
AlexeyVik:

Sie haben nur vergessen, dass die Zeichenfolge

die Indikatoreigenschaften werden nicht ausgeführt, wenn die Eigenschaften abgerufen werden.

Ich habe mich noch nicht eingehend damit befasst, aber vielleicht wird damit das gewünschte Ergebnis erzielt?




Das habe ich versucht... es funktioniert nicht...
 
artmedia70:
In der Regel ein Berater. Aber HZ, keine Zeit für Experimente. Bei mir funktionieren alle EAs so, wie ich es geschrieben habe. Ich werde diesen Scheiß im Testgerät verfolgen müssen. Wenn ich genug Zeit habe.

Ja, natürlich, der Expert Advisor. Dann stellt sich eine weitere Frage: Warum wurde der EA als Basisindikator auf dem Chart platziert? Aber es ändert nichts daran, dass beim Neustart sowohl des Indikators als auch des EA die Variablen der globalen Ebene nicht neu initialisiert werden und die Zeile int sys=(Sys<0)?0:Sys; nicht ausgeführt wird.
 
peace1984:

Das habe ich versucht... es funktioniert nicht...
Wahrscheinlich habe ich es nicht genau so versucht.
Ich habe den Code in EA neu kompiliert und ihn ausgeführt. Wenn ich den Parameter Sys im Kommentar ändere, ändert sich dieser Wert.
Grund der Beschwerde: