FORTS. Fragen der Durchsetzung - Seite 59

 
Aleksey Lebedev:
In PositionGet ohne vorheriges PositionSelect.
PositionSelect bei jedem Tick und vor der letzten Infoausgabe in Block 3 aufgerufen wird, funktioniert es auch. Dies ist also offensichtlich nicht der Grund.
 
ALIV:

Michael, lass uns noch ein "Blatt" mit Verspätungen machen, es wird langweilig. :))))

Wann werden Sie zur Eröffnung gehen? :)))))))

Das ist nichts Neues :)

 
Yury Kirillov:
Du liegst falsch: PositionSelect wird bei jedem Tick und vor der letzten Infoausgabe in Block 3 aufgerufen, also funktioniert es auch. Der Grund liegt also offensichtlich nicht in diesem Fall.

Manchmal liege ich falsch, aber das ist nicht der Fall, eindeutig in diesem Fall)

Die Werte der Positionsdaten zum Zeitpunkt des Aufrufs von PositionSelect.

Die Werte werden nach OrderSend nicht aktualisiert.

Wenn PositionSelect(...)==false ist, hat PositionGet keinen Sinn.


Daher: Nach OrderSend können die Positionsdaten nicht sofort abgeholt werden... die Asynchronität ist ein Übel.

 
Aleksey Lebedev:

Manchmal liege ich falsch, aber das ist nicht der Fall, eindeutig in diesem Fall)

Die Werte der Positionsdaten zum Zeitpunkt des Aufrufs von PositionSelect.

Die Werte werden nach OrderSend nicht aktualisiert.

Wenn PositionSelect(...)==false ist, hat PositionGet keinen Sinn.


Daher: Nach OrderSend können die Positionsdaten nicht sofort abgerufen werden... Asynchronität ist ein Übel.

Dem stimme ich gerne zu - ich schäme mich nicht, Fehler zuzugeben. Aber sehen Sie: Bevor wir in Block 3 einsteigen, wird ganz am Anfang des Handlers OnTick() die von Ihnen erwähnte PositionSelect() aufgerufen, und es wird kein OrderSend() ausgeführt. Im Code habe ich absichtlich einen Verzögerungszähler von 1000 Ticks zwischen der Ausführung der Blöcke 1, 2 und 3 hinzugefügt - es geht um Asynchronität, ich denke, im Tester ist das mehr als genug, um die Position zu fixieren. Darüber hinaus habe ich die Bedingung in Block 3 geändert:

   {if((gTicks>3000)&&(Step==2)&&(PositionSelect()))
   {
      Print("INFO>> *** VOLUME=",PositionGetDouble(POSITION_VOLUME),
                        " *** ID=",PositionGetInteger(POSITION_IDENTIFIER),
                        " *** TYPE=",EnumToString((ENUM_POSITION_TYPE)PositionGetInteger(POSITION_TYPE)),
                        " *** OrdersTotal()=",OrdersTotal());
      Step=3;
      return;
   }}//if((gTicks>3000)&&(Step==2))

Das Ergebnis hat sich nicht geändert: Der Auftrag zur Schließung der Position wird ausgeführt, aber die Positionsgröße bleibt gleich 1.

2015.10.27 18:55:14.986 2015.10.26 10:00:02   INFO>> *** VOLUME=1.0 *** ID=2 *** TYPE=POSITION_TYPE_SELL *** OrdersTotal()=0

:-(

 
   {if((gTicks>3000)&&(Step==2)&&(PositionSelect()))

sollte nicht kompiliert werden... PositionAuswählen(_Symbol)

 
Aleksey Lebedev:

sollte nicht kompiliert werden... PositionAuswählen(_Symbol)

Es wurde nicht kompiliert - es wurde eine alte Instanz des Programms ausgeführt...
 
Aleksey Lebedev:

sollte nicht kompiliert werden... PositionAuswählen(_Symbol

Korrigiert _Symbol.

Fazit: Sie hatten Recht! Jetzt funktioniert Block 3 nicht, was bedeutet, dass die Position nicht ausgewählt ist. Vielen Dank für den Dialog! :-)

Die Löffel wurden gefunden, aber die Rückstände bleiben: Wenn es keine Position mehr gibt, wie kann dann das Volumen der Position gleich 1 sein?

Das stimmt nicht mit der Dokumentation überein:

Функция PositionSelect() копирует данные о позиции в программное окружение, и последующие вызовы PositionGetDouble(), PositionGetInteger() и PositionGetString() 
возвращают ранее скопированные данные. Это означает, что самой позиции может уже и не быть (или же она изменилась по объему, направлению и т.д.), 
а данные этой позиции можно еще получать. Для гарантированного получения свежих данных о позиции рекомендуется вызывать функцию PositionSelect() 
непосредственно перед обращением за ними.

Der Aufruf vonPositionSelect() mit dem Ergebnis "false" führt also nicht zur Aktualisierung der Positionsdaten? Schade!

 
Yury Kirillov:

Der Aufruf vonPositionSelect() mit dem Ergebnis "false" führt also nicht zur Aktualisierung der Positionsdaten? Schade!

Ja, aber es ist im Prinzip logisch(PositionSelect() == false) - es gibt keine Position und es besteht keine Notwendigkeit, sie mit PositionGet abzufragen)
 
Es scheint mir logischer zu sein, den Müll im Puffer auch dann zu löschen, wenn eine fehlende Position festgestellt wird. Nur für den Fall...
 
Михаил:
Es sind jetzt 10 Monate vergangen.....
Little.... kann so lange warten...
Grund der Beschwerde: