Domande di OrderSend() - pagina 2

 
Yedelkin:
Devo essermi perso un topic come questo. Dove posso vedere la funzione di controllo degli ordini di KimV?
È per 4, ma potete controllare, potrebbe tornarvi utile. Potete controllarlo sul suo sito web sotto: "biblioteche gratuite", ordinando la biblioteca.
 
-Alexey-:
È per la quarta versione, ma puoi dargli un'occhiata, può essere utile. Potete dare un'occhiata sul suo sito, nella sezione "biblioteche gratuite", la biblioteca per gli ordini.

da un quattro non funzionerà. Io uso

PositionSelect

Seleziona una posizione aperta per ulteriori manipolazioni. Restituisce true se la funzione si completa con successo. Restituisce false se la funzione fallisce. Per ottenere le informazioni sull'errore, chiamate la funzione GetLastError().

boolPositionSelect(
simbolo stringa//nome dello strumento
);

Parametri

simbolo

[Nome dello strumento finanziario.

Valore restituito

Valore di tipo bool.

Nota

Per ogni simbolo, solo una posizione può essere aperta in qualsiasi momento, che è il risultato di uno o più scambi. Le posizioni e gli ordini pendenti attivi che sono anche visualizzati nella scheda "Trade" del pannello "Toolbox" del terminale client non devono essere confusi.

La funzione PositionSelect() copia i dati sulla posizione nell'ambiente del programma, e le chiamate successive PositionGetDouble(), PositionGetInteger() e PositionGetString() restituiscono i dati precedentemente copiati. Questo significa che la posizione stessa potrebbe non esistere più (o potrebbe essere cambiata in volume, direzione, ecc.), ma i dati di questa posizione possono ancora essere recuperati. Per garantire l'acquisizione di dati di posizione freschi, si raccomanda di chiamare la funzione PositionSelect() immediatamente prima di richiederli.

 
sergey1294:

da un quadruplo non funzionerà. Uso PositionSelect per definire la posizione

Quando si usa la funzione PositionSelect(), è allarmante che essa "...restituisce false se la funzione fallisce". Cioè, viene restituito false se la funzione PositionSelect()fallisce , non solo se non c'è posizione. In altre parole, non si può escludere la situazione se la funzione OrderSend() restituisce true, la funzione PositionSelect() restituisce false, e la posizione si apre ancora.
 
papaklass:
State analizzando queste situazioni nelle prealternative di una zecca o su diverse zecche?

Ok, procedo da quanto segue:

Un tick è un cambiamento nel prezzo di uno strumento. La frequenza di questi cambiamenti è imprevedibile: da alcuni al secondo a diversi all'ora. Di conseguenza, le funzioni OrderSend() e PositionSelect() non devono dipendere dall'attività dei tick. E poiché è così, penso che dovremmo controllare per evitare la duplicazione degli ordini (e analizzare le situazioni corrispondenti) senza relazione al comportamento (frequenza) dei tick.

Quindi trovo difficile rispondere alla domanda in modo preciso :/.

 
papaklass:

Non è quello che intendevo quando ho fatto la mia domanda. Il gestore dell'evento OnTick() viene attivato quando arriva il prossimo tick. Per questo motivo, riformulo la mia domanda:

Analizzate queste situazioni all'interno di una chiamata OnTick() o diverse?

Se dopo l'arrivo di un nuovo tick(evento utente) è necessario inviare una richiesta di compravendita al server, allora il controllo dell'esecuzione corretta di questa richiesta viene eseguito "all'interno dell'elaborazione" del tick (evento) arrivato. Cioè, secondo la vostra terminologia, "entro una singola chiamata OnTick()". [e indipendentemente da quanti tick (eventi) sono arrivati (devono essere arrivati) durante questa elaborazione].
 
papaklass:

Beh, non riesco ancora ad avere una risposta: su un tick esegui OrderSend() e PositionSelect()?

Voglio suggerirvi di fare queste interrogazioni non entro un tick (innescando OnTick()), ma su due tick:

- sul primo segno di spunta

cioè se la richiesta ha successo, si imposta il flag di apertura della posizione su buy=true, e si interrompe l'esecuzione di OnTick() fino al prossimo tick (innesco di OnTick() operator return.

- Al secondo tick - PositionSelect().

In questo caso non si ha la duplicazione dell'apertura della posizione.

Nessuna garanzia che la posizione sia già aperta al prossimo tick. Misura il tempo necessario per aprire una posizione quando si imposta un ordine manualmente,

Ti consiglio di spostare il controllo dell'esecuzione dell'ordine a OnTrade(), questo evento viene generato solo come risposta del server a un'operazione di trading.

Anche se non mi è molto chiaro perché ci sono 4 eventi OnTrade() per ordine?

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

Beh, non riesco ancora ad avere una risposta: su un tick esegui OrderSend() e PositionSelect()?

Secondo la vostra terminologia, risulta che le mie funzioni OrderSend() e PositionSelect() sono eseguite "entro un tick".

cartapesta:

...voglio suggerire che queste query siano eseguite non entro un singolo tick (innesco di OnTick()), ma entro due tick:

- sul primo segno di spunta

cioè se la richiesta risponde con successo, si imposta la bandiera per aprire la posizione in buy=true, e si interrompe l'esecuzione di OnTick() fino al prossimo tick (innesco di OnTick() operatore di ritorno.

- Al secondo tick - PositionSelect().

In questa variante non avrete un'apertura duplicata delle posizioni.

Poco prima ho scritto che l'esecuzione delle funzioni OrderSend() e PositionSelect() non ha niente a che vedere con l'arrivo o il non arrivo dei tick. E ho spiegato brevemente perché. Pertanto, il controllo "sul secondo tick - PositionSelect()" non dovrebbe salvarci dal raddoppio degli ordini in tutti i casi possibili.

 
Urain:

Anche se non mi è molto chiaro perché ci sono 4 eventi OnTrade() per ordine?

C'era un articolo in passato su OnTrade().

Urain:

Non c'è garanzia che la posizione sia già aperta al prossimo tick...

Questo è più o meno quello che sto dicendo.
 
papaklass:

Beh, non riesco ancora ad avere una risposta: su un tick esegui OrderSend() e PositionSelect()?

Voglio suggerirvi di fare queste interrogazioni non entro un tick (innescando OnTick()), ma su due tick:

- sul primo segno di spunta

cioè se la richiesta risponde con successo, si imposta il flag di apertura della posizione su buy=true, e si interrompe l'esecuzione di OnTick() fino al prossimo tick (innesco di OnTick() operatore di ritorno.

- Al secondo tick - PositionSelect().

In questo caso non si ha la duplicazione dell'apertura della posizione.

No - non nella zecca. Nel 1° secondo.

Ecco una semplificazione:

quindi - se senza pausa aprirà 2 ordini di fila. Ma l'ho impostato per 3 secondi - e non me ne pento )))) Tuttavia, è l'apertura dell'ordine.


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

     Sleep (1); 

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

La contabilità degli ordini in MT5 è tutta una scienza:Gestire gli eventi di compravendita nell'Expert Advisor usando la funzione OnTrade()

Nessuna pausa vi salverà dalla riapertura, può sempre verificarsi una situazione in cui l'ordine impiegherà 1 secondo in più per essere eseguito.

ps: E non dimenticare la magia.

Motivazione: