Fehler, Irrtümer, Fragen - Seite 1126

 

Ich schreibe eine ToR für einen MT4 EA mit dem Schwerpunkt auf beschleunigter Datenverarbeitung.

Bitte geben Sie an, ob die Reihenfolge der Berechnungen oder Stichproben (wie lautet die korrekte Bezeichnung - repräsentativ?) für die Beschleunigung von Bedeutung ist.

Ich füge zwei Varianten in Form von Bildern mit Blockschaltbildern bei.

Wenn Sie können, schreiben Sie bitte, wie der Code aussehen sollte, wenn die selektive Ausführung der Blöcke wird - eine rein primitive Layout, und wird dies zu einer erheblichen Steigerung der Geschwindigkeit!

Dateien:
Logic_V_01.png  26 kb
Logic_V_02.png  30 kb
 
void OnStart()
{
        uchar max=0;
        for(int t=0;t<LONG_MAX;t++)   {max++;}    //так получаем предупреждение expression is always true, цикл работает
        for(int t=0;t<LONG_MAX+1;t++) {max++;}    //так предупреждение есть, но цикл не работает
        for(int t=0;t<ULONG_MAX;t++)  {max++;}    //так нет предупреждения и цикл не пашет
        Print("Done!");
}
 

Wie erklärt sich die Schließung einer Stelle in der Prüfstelle? Liegt es an der Ausweitung der Spanne?

Screenshots von der MetaTrader-Handelsplattform

EURUSD, M20, 2014.04.12

Alfa-Forex, MetaTrader 5, Real

temp_file_bildschirmfoto_63279.png

EURUSD, M20, 2014.04.12, Alfa-Forex, MetaTrader 5, Real


 
Crucian:

Wie erklärt sich die Schließung einer Stelle in der Prüfstelle? Ist es die Ausweitung der Spanne?

[img]https://charts.mql5.com/4/434/eurusd-m20-alfa-foreks-temp-file-screenshot-63279-png.png[/img]

Wenn sich die Spanne vergrößert hat (und nach dem Screenshot zu urteilen um 720 Punkte! auf fünf Stellen), dann ist alles richtig.

Die Verkaufsposition wurde zum Briefkurs geschlossen. Dies ist der Fall, wenn die Stopps gesetzt wurden.

Übrigens, Ihr BrokerAlfa-Forex hatgerade gigantische Spreads am Ende der Woche und am Anfang.

Wahrscheinlich wurden sie im Kursverlauf aufgezeichnet, und der Tester simulierte den Handel mit ihnen.

Stopps für das Wochenende sind gefährlich - sie werden nicht von der Lücke sowieso zu retten, und Streuung Ausweitung kann leicht fangen Sie.

 
Fleder:
for(int t=0;t<LONG_MAX+1;t++) {max++;}    //так предупреждение есть, но цикл не работает

Kein Fehler hier, daLONG_MAX+1< 0

for(int t=0;t<LONG_MAX;t++)   {max++;}    //так получаем предупреждение expression is always true, цикл работает
Hier gilt die Warnung (t<LONG_MAX immer wahr, wenn t int ) Endlosschleife
 
void OnStart()
{
  uchar max=0;
  for(int t=0;t<ULONG_MAX-1 e0;t++)  {max++;}      //так цикл работает, предупреждения нет так как ULONG_MAX-1e0 имеет тип double
  for(int t=0;t<ULONG_MAX-1;t++)    {max++;}      //а так нет и предупреждения тоже нет
  Print("Done!");
}
 
Fleder:
for(int t=0;t<ULONG_MAX-1;t++)    {max++;}      //а так нет и предупреждения тоже нет
Hier liegt kein Fehler vor, denn ULONG_MAX-1< 0, d.h. die Vergleichsoperation wird in int oder long umgewandelt - genauer gesagt liegt ein bitweiser Vergleich vor
 
A100:
Es gibt keinen Fehler, weil ULONG_MAX-1< 0, weil die Vergleichsoperation auf int reduziert ist

Wie ist das dann zu erklären?

void OnStart()
{
  long t=0;
  bool comp=(ULONG_MAX-1>t);
  Print("comp = ",comp);   //comp = true
  Print(ULONG_MAX-1);      //18446744073709551614
  Print(ULONG_MAX);        //18446744073709551615
}
 
A100:
Hier liegt kein Fehler vor, da ULONG_MAX-1< 0 ist, d.h. die Vergleichsoperation wird in int oder long umgewandelt

Meinen Sie den Vergleich im getesteten Ausdruck in der Schleife?

Weil es bei einem einfachen Vergleich nicht so aussieht.

 
A100:

Tauschen Sie sie einfach aus :)

Was bewirkt diese Umstellung? t war kleiner als ULONG_MAX-1 und ist es immer noch.

void OnStart()
{
  long t=0;
  Print( (t < ULONG_MAX-1) == (ULONG_MAX-1 < t)); //false
}