Questo diagramma mostra che quando un ordine a mercato viene piazzato usando OrderSendAsync in MetaQuotes-Demo, è impossibile catturare in modo affidabile l'ordine corrispondente che viene piazzato finché l'ordine non viene eseguito o rifiutato. Cioè non ci sono meccanismi semplici in MT5 per valutare i risultati intermedi del loro OrderSendAsync.
Il punto in poche parole è questo: se c'è un ordine a mercato, consideratelo anche una "posizione". Tra virgolette perché è una posizione avvolta. Il codice evidenziato di solito non appare da nessuna parte. Ma evita di riaprire le posizioni. La cosa più interessante qui è evidenziata in rosso. La necessità di questo chip non è immediatamente evidente.
for (int i = OrdersTotal() - 1; i >= 0; i--)
if (OrderGetTicket(i) && (OrderGetInteger(ORDER_TYPE) <= ORDER_TYPE_SELL) &&
!OrderGetInteger(ORDER_POSITION_ID) && (OrderGetString(ORDER_SYMBOL) == Symb))
Res++; // если мы сюда попадаем при проверке состояния, не запускать стратегию вообще, т.к. это промежуточное состояние.
Potrebbe non esserci un segnale di trading nel prossimo tick. Io stesso uso l'MT4-style, quindi non posso fare a meno di vedere queste "posizioni" senza mettermi nei guai.
Il punto in poche parole è questo: se c'è un ordine a mercato, consideratelo anche una "posizione". Tra virgolette, perché è una posizione incartata. Il codice evidenziato di solito non appare da nessuna parte. Ma evita di riaprire le posizioni. La cosa più interessante qui è evidenziata in rosso. La necessità di questo chip non è immediatamente evidente.
La questione è che ci sono i cosiddetti ordini di chiusura del mercato. Lo stesso SL/TP. Ovviamente, non vorremmo vedere tali ordini di mercato come "posizioni". E non vorremmo che anche gli ordini che abbiamo piazzato si chiudessero. Quindi la condizione evidenziata è il filtro appropriato.
for (int i = OrdersTotal() - 1; i >= 0; i--)
if (OrderGetTicket(i) && (OrderGetInteger(ORDER_TYPE) <= ORDER_TYPE_SELL) &&
!OrderGetInteger(ORDER_POSITION_ID) && (OrderGetString(ORDER_SYMBOL) == Symb))
Res++;
SZY Inserisci questo codice qui e controlla il risultato sul server demo.
Invito tutti gli interessati a discutere questa questione. La mia opinione su questo argomento è la seguente:
Invia l'ordine al server
Un ordine a mercato appare e può essere eventualmente cancellato, ma lo abbiamo già contato come posizione?
for (int i = OrdersTotal() - 1; i >= 0; i--)
if (OrderGetTicket(i) && (OrderGetInteger(ORDER_TYPE) <= ORDER_TYPE_SELL) &&
!OrderGetInteger(ORDER_POSITION_ID) && (OrderGetString(ORDER_SYMBOL) == Symb))
Res++;
Questo ciclo aggiunge una posizione se viene trovato un ordine che non ha un identificatore di posizione (l'ID è zero).
Abbiamo restituito un'altra posizione.
Cosa succede se l'ordine viene cancellato dal server?
...
Penso che quando si calcolano gli ordini di mercato, dovremmo restituire WRONG_VALUE, per esempio, se ne abbiamo trovato uno - le posizioni non possono essere meno di zero. Questo sarà un segnale che c'è un ordine di mercato non registrato. Ma non per aggiungere il numero di posizioni.
L'opzione giusta con un semplice esempio
Penso che sia meglio se l'ordine non è ancora stato contabilizzato nella posizione, aspettare che venga contabilizzato.
Non capisco l'idea.
Questo diagramma mostra che quando un ordine a mercato viene piazzato usando OrderSendAsync in MetaQuotes-Demo, è impossibile catturare in modo affidabile l'ordine corrispondente che viene piazzato finché l'ordine non viene eseguito o rifiutato. Cioè non ci sono meccanismi semplici in MT5 per valutare i risultati intermedi del loro OrderSendAsync.
sembra essere in tema,
Vorrei sottolineare che questo codice :
funziona perfettamente sulla DEMO (result=request),
ma su REAL - è impossibile ottenere un risultato (risultato=0,0). ... A meno che non aspetti qualche secondo.
Sembra essere nel soggetto,
Vorrei sottolineare che tale codice :
Su DEMO funziona perfettamente (result=request),
ma su REAL - è impossibile ottenere il risultato (risultato=0.0). ... A meno che non aspetti qualche secondo.
Mancano dati - registri, valori dei campi della struttura dopo OrderSend, nome del server commerciale.
Il punto in poche parole è questo: se c'è un ordine a mercato, consideratelo anche una "posizione". Tra virgolette perché è una posizione avvolta. Il codice evidenziato di solito non appare da nessuna parte. Ma evita di riaprire le posizioni. La cosa più interessante qui è evidenziata in rosso. La necessità di questo chip non è immediatamente evidente.
Potrebbe non esserci un segnale di trading nel prossimo tick. Io stesso uso l'MT4-style, quindi non posso fare a meno di vedere queste "posizioni" senza mettermi nei guai.
Mancano dati - registri, valori dei campi della struttura dopo OrderSend, nome del server commerciale.
2018.02.20 15:20:35.845 Trades ordine #66745055 comprare 0.01 / 0.01 EURUSDeur a mercato fatto in 610.625 ms
2018.02.20 15:20:35.935 Transazioni affare #5461453 comprare 0.01 EURUSDeur a 1.23403 fatto (basato sull'ordine #66745055)
2018.02.20 15:20:35.845 TestBUY (EURUSDeur,M15) retcode=10009 deal=0 order=66745055
Se la richiesta è soddisfatta (10009) , perché trattare=0
Se la richiesta è fatta (10009), perché deal=0
È quasi dove la discussione è iniziata. I link hanno tutti i dettagli.
C'è una soluzione per far funzionare perfettamente OrderSend, ma sarebbe pubblicità.
L'opzione giusta con un semplice esempio
Il punto in poche parole è questo: se c'è un ordine a mercato, consideratelo anche una "posizione". Tra virgolette, perché è una posizione incartata. Il codice evidenziato di solito non appare da nessuna parte. Ma evita di riaprire le posizioni. La cosa più interessante qui è evidenziata in rosso. La necessità di questo chip non è immediatamente evidente.
La questione è che ci sono i cosiddetti ordini di chiusura del mercato. Lo stesso SL/TP. Ovviamente, non vorremmo vedere tali ordini di mercato come "posizioni". E non vorremmo che anche gli ordini che abbiamo piazzato si chiudessero. Quindi la condizione evidenziata è il filtro appropriato.
for (int i = OrdersTotal() - 1; i >= 0; i--) if (OrderGetTicket(i) && (OrderGetInteger(ORDER_TYPE) <= ORDER_TYPE_SELL) && !OrderGetInteger(ORDER_POSITION_ID) && (OrderGetString(ORDER_SYMBOL) == Symb)) Res++;SZY Inserisci questo codice qui e controlla il risultato sul server demo.
Invito tutti gli interessati a discutere questa questione. La mia opinione su questo argomento è la seguente:
for (int i = OrdersTotal() - 1; i >= 0; i--) if (OrderGetTicket(i) && (OrderGetInteger(ORDER_TYPE) <= ORDER_TYPE_SELL) && !OrderGetInteger(ORDER_POSITION_ID) && (OrderGetString(ORDER_SYMBOL) == Symb)) Res++;Questo ciclo aggiunge una posizione se viene trovato un ordine che non ha un identificatore di posizione (l'ID è zero).
Abbiamo restituito un'altra posizione.
Cosa succede se l'ordine viene cancellato dal server?
...
Penso che quando si calcolano gli ordini di mercato, dovremmo restituire WRONG_VALUE, per esempio, se ne abbiamo trovato uno - le posizioni non possono essere meno di zero. Questo sarà un segnale che c'è un ordine di mercato non registrato. Ma non per aggiungere il numero di posizioni.