Merkmale der Sprache mql5, Feinheiten und Techniken - Seite 97

 
Artyom Trishkin:

Es gab also bereits eine Lösung in der KB:

Aber nicht für das Drehbuch. Und es ist ziemlich schwer für EA, weil es vorschlägt, im Falle einer undefinierten Situation aus OnTick abzustürzen. Und diese Situation könnte irgendwo tief im Inneren des Expert Advisors auftreten. Und nicht nur, dass wir da raus müssen, um aus OnTick herauszukommen, sondern es kann auch notwendig sein, z.B. zwei Positionen auf einmal zu öffnen (a la Cart). Die zweite sollte aber nur geöffnet werden, wenn die erste erfolgreich geöffnet wurde. In diesem Fall ist der Rauswurf aus OnTick nach dem ersten OrderSend, gelinde gesagt, nicht gut.

 
fxsaber:

Aber nicht für das Drehbuch. Und es ist ziemlich schwer für den EA, weil es vorgeschlagen wird, aus OnTick in einer undefinierten Situation abzustürzen. Und diese Situation könnte irgendwo tief in den Eingeweiden von Expert Advisor auftreten. Und nicht nur, dass wir da raus müssen, um aus OnTick herauszukommen, sondern es kann auch notwendig sein, z.B. zwei Positionen auf einmal zu öffnen (a la Cart). Die zweite sollte aber nur geöffnet werden, wenn die erste erfolgreich abgeschlossen wurde. In diesem Fall ist es gelinde gesagt nicht gut, nach dem ersten OrderSend aus OnTick herausgeschmissen zu werden.

Das Skript kann sich auf die angegebene Anzahl von Positionen beschränken.

Fachberater... In einem EA müssen wir dies in der Logik der Positionseröffnungsfunktionen berücksichtigen - sie werden vom EA aufgerufen und geben das Ergebnis ihrer Arbeit zurück. Das Ergebnis der Marktorder wird als false zurückgegeben. Und dann wird der EA mit der ihm innewohnenden Logik arbeiten. Ja, ich stimme zu, dass es schwieriger ist, in einigen vorgefertigten EAs zu implementieren, als solche Wahrscheinlichkeiten sofort zu berücksichtigen. Aber deshalb gibt es ja den Zweig - damit andere das Wissen kennen und nutzen können.

 
Artyom Trishkin:

Das Skript kann verlangsamt werden, bis eine bestimmte Anzahl von Positionen empfangen wird.

Der EA kann auch verlangsamt werden.

Der Expert Advisor... Im Expert Advisor müssen wir dies in der Logik der Funktion der Positionseröffnung berücksichtigen - sie werden vom EA aufgerufen und geben das Ergebnis ihrer Arbeit zurück. Das Ergebnis wird als "false" zurückgegeben, wenn es einen Marktauftrag gibt. Und dann wird der EA mit der ihm innewohnenden Logik arbeiten. Ja, ich stimme zu, dass es schwieriger ist, in einigen vorgefertigten EAs zu implementieren, als solche Wahrscheinlichkeiten sofort zu berücksichtigen. Aber dafür ist die Branche ja da - um andere zu informieren und das Wissen zu nutzen.

Man muss nur eine Weile warten, bis der Handel vorbei ist. Das Verlassen des TS bis zum nächsten Tick ist eine schlechte Entscheidung.

 
fxsaber:

Sie können auch die Geschwindigkeit des Beraters verringern.

Man muss nur ein bisschen warten, bis der Handel vorbei ist. Das Verlassen des TS bis zum nächsten Tick ist eine unheimliche Entscheidung.

Nun, in diesem Code ist das Warten auf die eingestellte Zeit einfach erledigt. Aber man kann nicht stundenlang warten - es wird eine bestimmte Zeit lang auf eine bestimmte Anzahl von Versuchen gewartet, eine gültige Umgebung zu erhalten, und dann mit dem Ergebnis beendet. Andernfalls, wenn Sie lange warten, kann sich das Handelsumfeld stark verändern, und es ist zu spät, den Borjomi zu trinken :)

//+------------------------------------------------------------------+
//| Заполняет массивы тикетов позиций                                |
//+------------------------------------------------------------------+
bool FillingListTickets(const uint number_of_attempts)
  {
//--- Проверка состояния окружения
   int n=0,attempts=int(number_of_attempts<1 ? 1 : number_of_attempts);
   while(IsUncertainStateEnv(symb,InpMagic) && n<attempts && !IsStopped())
     {
      n++;
      Sleep(sleep);
     }
   if(n>=attempts && IsUncertainStateEnv(symb,InpMagic))
     {
      Print(__FUNCTION__,": Uncertain state of the environment. Please try again.");
      return false;
     }
//---
 
Artyom Trishkin:

Nun, dieser Code wartet eine bestimmte Zeit, aber man kann nicht stundenlang warten - er wartet auf eine bestimmte Anzahl von Versuchen, eine gültige Umgebung zu erhalten. Aber man kann nicht stundenlang warten - es wird einige Zeit gewartet, bis eine bestimmte Anzahl von Versuchen unternommen wurde, um eine gültige Umgebung zu erhalten, und dann wird das Ergebnis angezeigt. Andernfalls, wenn Sie lange warten, kann sich das Handelsumfeld stark verändern, und es ist zu spät, den Borjomi zu trinken :)

Ja, ich habe die Wartezeit nicht bemerkt. Das reicht aus. Damals war ich viel aufmerksamer.

 

Imho ist die Fokussierung aufPositionsTotal() in jedem Fall die falsche Entscheidung. Während der Verarbeitung Ihrer Anfrage könnte eine andere Position auf dem Konto eröffnet/geschlossen werden, z.B. wenn mehrere EAs arbeiten. Was hindert Sie daran, die Antwort des Servers zu überprüfen, wie sie von den Entwicklern vorgesehen ist?

Tatsächlich sehe ich in PositionsTotal überhaupt keinen Sinn, außer für die allgemeine Kontrolle. Ein EA sollte eindeutig die Ticks seiner Positionen kontrollieren und nur mit ihnen arbeiten.

 

Nach der Verwendung von ChartIndicatorGet() muss unbedingt die Funktion IndicatorRelease(handle) aufgerufen werden. Es wird im Beispiel der Funktion ChartIndicatorGet() beschrieben, aber nicht in der Funktionsbeschreibung! Die Entwickler wollten die Dokumentation korrigieren, haben es aber nicht getan. Aufgrund der Schließung des SD wird dies wahrscheinlich nie geschehen.

Ich persönlich hatte das Problem einer "hängenden" Anzeige. Vom Gespräch mit dem SD:

Ah, d.h., als ich den X-Indikator auf dem Chart ausgeführt habe, hat er alle Indikatoren durchsucht und mit derFunktionChartIndicatorGet() eine Kopieentdeckt- er hat den Zähler erhöht. Ich habe den ersten X-Indikator gelöscht - Zähler dekrementiert, aber den zweiten vergessen - er hat einen "hängenden" Indikator, weil sein Griff nicht gereinigt wurde?

Ja, genau so funktioniert es. Daher funktioniert OnDeinit nicht.

 

Forum zum Thema Handel, automatisierte Handelssysteme und Testen von Handelsstrategien

Wie importiere ich historische Daten in csv zu einem benutzerdefinierten Symbol mit CustomRatesUpdate?

fxsaber, 2018.08.19 12:01

// Sets the maximum size of an array.
template <typename T>
int ArrayResize( T &Array[] )
{
  int MinSize = ArraySize(Array);
  int MaxSize = INT_MAX;
  int AvgSize;
  
  while ((MinSize < MaxSize - 1) && !IsStopped())
  {
    AvgSize = (int)((MinSize + (long)MaxSize) >> 1);        
    
//    ArrayFree(Array);
    
    if (ArrayResize(Array, (int)AvgSize) == AvgSize)
      MinSize = AvgSize;
    else
      MaxSize = AvgSize;
  }
  
  return(ArrayResize(Array, MinSize));
}
 
Der englische Teil des Forums zeigte
// Обмен значениями между двумя числовыми переменными
#define  SWAP(A, B) { A += B; B = A - B; A -= B; }
 
fxsaber:
Der englische Teil des Forums zeigte

Wozu? Um ein paar Bytes Speicherplatz zu sparen? Außerdem erhält man mit double unterschiedliche Zahlen (== wird falsch sein) und Ganzzahlen können überlaufen.

Grund der Beschwerde: