Fragen zu OrderSend() - Seite 2

 
Yedelkin:
Ich muss ein Thema wie dieses übersehen haben. Wo kann ich die Auftragsprüfungsfunktion von KimV sehen?
Es ist für 4 Personen, aber Sie können es sich ansehen, es könnte sich als nützlich erweisen. Sie können es auf seiner Website unter "Freie Bibliotheken" einsehen, Bibliothek bestellen.
 
-Alexey-:
Es ist für die 4. Version, aber Sie können es sich ansehen, es könnte nützlich sein. Sie können sie auf seiner Website in der Rubrik "Freie Bibliotheken", der Bibliothek für Bestellungen, durchsehen.

aus einer Vier funktioniert nicht. Ich benutze

PositionSelect

Wählt eine offene Position zur weiteren Bearbeitung aus. Gibt true zurück, wenn die Funktion erfolgreich abgeschlossen wurde. Gibt false zurück, wenn die Funktion fehlschlägt. Um die Informationen über den Fehler zu erhalten, rufen Sie die Funktion GetLastError() auf.

boolPositionSelect(
String-Symbol//Werkzeugname
);

Parameter

Symbol

[Bezeichnung des Finanzinstruments.

Zurückgegebener Wert

Wert vom Typ bool.

Hinweis

Für jedes Symbol kann zu einem bestimmten Zeitpunkt nur eine Position eröffnet werden, die das Ergebnis eines oder mehrerer Geschäfte ist. Positionen und aktive schwebende Aufträge, die auch auf der Registerkarte "Handel" des "Toolbox"-Panels des Kundenterminals angezeigt werden, sollten nicht verwechselt werden.

Die Funktion PositionSelect() kopiert die Daten zur Position in die Programmumgebung, und die nachfolgenden Aufrufe PositionGetDouble(), PositionGetInteger() und PositionGetString() geben die zuvor kopierten Daten zurück. Das bedeutet, dass die Position selbst vielleicht nicht mehr existiert (oder sich im Umfang, in der Richtung usw. geändert hat), aber die Daten dieser Position können immer noch abgerufen werden. Um die Erfassung frischer Positionsdaten zu gewährleisten, empfiehlt es sich, die Funktion PositionSelect() unmittelbar vor deren Beantragung aufzurufen.

 
sergey1294:

von einem Vierling nicht funktionieren wird. Ich verwende PositionSelect, um die Position zu definieren

Bei der Verwendung der Funktion PositionSelect() ist es alarmierend, dass sie "...false zurückgibt, wenn die Funktion fehlschlägt". Das heißt, dass false zurückgegeben wird , wenn die Funktion PositionSelect()fehlschlägt , nicht nur, wenn keine Position vorhanden ist. Mit anderen Worten, es kann nicht ausgeschlossen werden, dass die Funktion OrderSend() true zurückgibt, die Funktion PositionSelect() false zurückgibt und die Position trotzdem geöffnet wird.
 
papaklass:
Analysieren Sie diese Situationen in den Voralternationen eines Ticks oder auf verschiedenen Ticks?

OK, ich gehe von Folgendem aus:

Ein Tick ist eine Veränderung des Preises eines Instruments. Die Häufigkeit solcher Änderungen ist unvorhersehbar: von einigen pro Sekunde bis zu einigen pro Stunde. Dementsprechend dürfen die Funktionen OrderSend() und PositionSelect() nicht von der Aktivität der Ticks abhängen. Und da es so ist, denke ich, dass wir prüfen sollten, um die Duplizierung von Aufträgen zu vermeiden (und die entsprechenden Situationen zu analysieren), ohne Bezug auf das Verhalten (Häufigkeit) von Ticks.

Daher finde ich es schwierig, die Frage genau zu beantworten :/.

 
papaklass:

Das habe ich nicht gemeint, als ich meine Frage stellte. Der OnTick()-Ereignishandler wird ausgelöst, wenn der nächste Tick eintrifft. Aus diesem Grund formuliere ich meine Frage neu:

Analysieren Sie diese Situationen innerhalb eines OnTick()-Aufrufs oder in verschiedenen Aufrufen?

Wenn es nach dem Eintreffen eines neuen Ticks(Benutzerereignis) notwendig ist, eine Handelsanfrage an den Server zu senden, dann wird die Überprüfung der erfolgreichen Ausführung dieser Anfrage "innerhalb der Verarbeitung" des eingetroffenen Ticks (Ereignisses) durchgeführt. D.h. nach Ihrer Terminologie "innerhalb eines einzigen Aufrufs OnTick()". [und zwar unabhängig davon, wie viele Ticks (Ereignisse) während dieser Verarbeitung eingetroffen sind (eingetroffen sein müssen)].
 
papaklass:

Nun, ich kann immer noch nicht eine Antwort auf einen Tick erhalten Sie OrderSend() und PositionSelect() ausführen?

Ich möchte Ihnen vorschlagen, diese Abfragen nicht innerhalb eines Ticks (Auslösen von OnTick()), sondern bei zwei Ticks durchzuführen:

- beim ersten Ticken

d.h. wenn die Anfrage erfolgreich beantwortet wird, setzen Sie das Flag der Positionseröffnung auf buy=true und unterbrechen die Ausführung von OnTick() bis zum nächsten Tick (Auslösung des OnTick()) Operator Return.

- Beim zweiten Tick - PositionSelect().

In diesem Fall gibt es keine doppelte Positionseröffnung.

Keine Garantie, dass die Position bereits beim nächsten Tick eröffnet wird. Messen Sie, wie viel Zeit es dauert, eine Position zu eröffnen, wenn Sie eine Order manuell einstellen,

Ich empfehle Ihnen, die Auftragsausführungssteuerung nach OnTrade() zu verschieben, da dieses Ereignis nur als Serverantwort auf eine Handelsoperation erzeugt wird.

Allerdings ist mir nicht ganz klar, warum es 4 OnTrade()-Ereignisse pro Auftrag gibt?

Документация по MQL5: Стандартные константы, перечисления и структуры / Торговые константы / Свойства сделок
Документация по MQL5: Стандартные константы, перечисления и структуры / Торговые константы / Свойства сделок
  • www.mql5.com
Стандартные константы, перечисления и структуры / Торговые константы / Свойства сделок - Документация по MQL5
 
papaklass:

Nun, ich kann immer noch nicht eine Antwort auf einen Tick erhalten Sie OrderSend() und PositionSelect() ausführen?

Ihrer Terminologie zufolge werden meine Funktionen OrderSend() und PositionSelect() "innerhalb eines Ticks" ausgeführt.

papaklass:

...Ich möchte vorschlagen, dass diese Abfragen nicht innerhalb eines einzigen Ticks (Auslösen von OnTick()), sondern innerhalb von zwei Ticks ausgeführt werden:

- beim ersten Ticken

d.h. wenn die Anfrage erfolgreich beantwortet wird, setzen Sie das Flag zum Öffnen der Position in buy=true, und unterbrechen die Ausführung von OnTick() bis zum nächsten Tick (Auslösung des OnTick()) Operator Return.

- Beim zweiten Tick - PositionSelect().

Bei dieser Variante gibt es keine doppelte Eröffnung von Positionen.

Etwas früher habe ich geschrieben, dass die Ausführung der Funktionen OrderSend() und PositionSelect() nichts mit dem Kommen/Nichtkommen von Ticks zu tun hat . Und ich habe kurz erklärt, warum. Daher sollte die Prüfung "beim zweiten Tick - PositionSelect()" uns nicht in jedem möglichen Fall vor einer Verdoppelung der Aufträge bewahren.

 
Urain:

Obwohl es mir nicht ganz klar ist, warum es 4 OnTrade()-Ereignisse pro Auftrag gibt?

Es gab in der Vergangenheit einen Artikel darüber über OnTrade().

Urain:

Es gibt keine Garantie, dass die Position bereits beim nächsten Tick geöffnet wird...

Das ist in etwa das, was ich sage.
 
papaklass:

Nun, ich kann immer noch nicht eine Antwort auf einen Tick erhalten Sie OrderSend() und PositionSelect() ausführen?

Ich möchte Ihnen vorschlagen, diese Abfragen nicht innerhalb eines Ticks (Auslösen von OnTick()), sondern bei zwei Ticks durchzuführen:

- beim ersten Ticken

d.h. wenn die Anfrage erfolgreich beantwortet wird, setzen Sie das Flag der Positionseröffnung auf buy=true und unterbrechen die Ausführung von OnTick() bis zum nächsten Tick (Auslösung des OnTick()) Operator Return.

- Beim zweiten Tick - PositionSelect().

In diesem Fall gibt es keine doppelte Positionseröffnung.

Nein - nicht in einer Zecke. In der 1. Sekunde.

Hier ist eine Vereinfachung:

Wenn also keine Pause gemacht wird, werden 2 Aufträge hintereinander eröffnet. Aber ich habe es auf 3 Sekunden eingestellt - und ich bereue es nicht )))) Dennoch ist es die Eröffnung der Bestellung.


void OnTimer()
{
  while(true)
  {
     zOrderSend (_Symbol,0.1,ORDER_TYPE_BUY);

     Sleep (1); 

   if (PositionSelect(_Symbol)==true) {break;} 
  }
}
 

Die Abrechnung von Aufträgen im MT5 ist eine Wissenschaft für sich:Behandlung von Handelsereignissen im Expert Advisor mit der Funktion OnTrade()

Keine Pause bewahrt Sie vor dem erneuten Öffnen, es kann immer eine Situation eintreten, in der der Auftrag 1 Sekunde länger zur Ausführung benötigt.

ps: Und vergessen Sie nicht die Magie.

Grund der Beschwerde: