FORTI. Problemi di applicazione - pagina 59

 
Aleksey Lebedev:
In PositionGet senza il PositionSelect prima.
PositionSelect è chiamato su ogni tick e prima dell'ultima uscita informativa nel blocco 3, funzionerà anche questo. Quindi questo non è ovviamente il motivo.
 
ALIV:

Michael, facciamo un altro "foglio" con i ritardi, sta diventando noioso. :))))

Quando andrai all'inaugurazione? :)))))))

Niente di nuovo qui :)

 
Yury Kirillov:
Ti sbagli, PositionSelect è chiamato su ogni tick e prima dell'ultima uscita informativa nel blocco 3, funzionerà anche questo. Quindi, la ragione non è ovviamente in questo caso.

A volte mi sbaglio, ma non è questo il caso, chiaramente in questo)

I valori dei dati di posizione al momento della chiamata di PositionSelect.

I valori non vengono aggiornati dopo OrderSend.

Se PositionSelect(...)==falso, non ha senso PositionGet.


Quindi: dopo OrderSend i dati di posizione possono essere recuperati non immediatamente... l'asincronia è un male.

 
Aleksey Lebedev:

A volte mi sbaglio, ma non è questo il caso, chiaramente in questo)

I valori dei dati di posizione al momento della chiamata di PositionSelect.

I valori non vengono aggiornati dopo OrderSend.

Se PositionSelect(...)==falso, non ha senso PositionGet.


Quindi: dopo OrderSend i dati di posizione possono essere recuperati non immediatamente... l'asincronia è un male.

Sono felicemente d'accordo - non mi vergogno di ammettere gli errori. Ma guarda: prima di arrivare al blocco 3, proprio all'inizio dell'handler OnTick() viene chiamata la PositionSelect() da te menzionata, e non viene eseguita la OrderSend(). Nel codice ho aggiunto intenzionalmente un contatore di ritardo di 1000 tick tra l'esecuzione dei blocchi 1, 2 e 3 - si tratta di asincronia, penso che nel tester questo sia più che sufficiente per fissare la posizione. Inoltre, ho cambiato la condizione nel blocco 3:

   {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))

Il risultato non è cambiato: l'ordine di chiudere la posizione viene eseguito, ma la dimensione della posizione rimane uguale a 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()))

non dovrebbe compilare... PositionSelect(_Symbol)

 
Aleksey Lebedev:

non dovrebbe compilare... PositionSelect(_Symbol)

Non ha compilato - stava eseguendo una vecchia istanza del programma...
 
Aleksey Lebedev:

non dovrebbe compilare... PosizioneSelezionare(_Simbolo

Corretto _Simbolo.

In conclusione: avevi ragione! Ora il blocco 3 non funziona, il che significa che la posizione non è selezionata. Grazie per il dialogo! :-)

I cucchiai sono stati ritrovati, ma i residui rimangono: se non c'è più posizione, come può il volume della posizione essere 1?

Il che non corrisponde alla documentazione:

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

Quindi chiamarePositionSelect() con un risultato di false non aggiorna le informazioni sulla posizione? Peccato!

 
Yury Kirillov:

Quindi chiamarePositionSelect() con un risultato di false non aggiorna le informazioni sulla posizione? Peccato!

Sì, ma è logico in linea di principio(PositionSelect() == false) - non c'è nessuna posizione e non c'è bisogno di interrogarla con PositionGet)
 
Mi sembra che sarebbe più logico pulire ancora la spazzatura nel buffer quando viene rilevata una posizione mancante. Non si sa mai...
 
Михаил:
Sono passati 10 mesi ormai.....
Little.... può aspettare tanto...