No, l'ultima registrazione dell'attività di trading è nel secondo registro.
E questo è corretto in termini di priorità:
2021.05.0510:32:35.896 Trades '160122203': market buy 0.01 EURUSD placed for execution
2021.05.0510:32:35.931 Trades '160122203': order #2249869869 buy 0.01 / 0.01 EURUSD at market done in81.962 ms
2021.05.0510:32:35.931 Trades '160122203': deal #2240398230 buy 0.01 EURUSD at 1.19876 done (based on order #2249869869)
2021.05.0510:32:35.931 Trades '160122203': market sell 0.01 EURUSD, close #2249869868 buy 0.01 EURUSD 1.198762021.05.0510:32:35.978 Trades '160122203': accepted market sell 0.01 EURUSD, close #2249869868 buy 0.01 EURUSD 1.198762021.05.0510:32:35.978 Trades '160122203': market sell 0.01 EURUSD, close #2249869868 buy 0.01 EURUSD 1.19876 placed for execution
2021.05.0510:32:36.009 Trades '160122203': order #2249869870 sell 0.01 / 0.01 EURUSD at market done in77.026 ms
2021.05.0510:32:36.009 Trades '160122203': deal #2240398231 sell 0.01 EURUSD at 1.19876 done (based on order #2249869870)
2021.05.0510:32:36.009 Scripts script Test (EURUSD,M1) removed
Qui sono tornato all'opzione senza stampe e di nuovo c'è una posizione rimasta dopo l'esecuzione. Si scopre che è necessario tenere una sorta di pausa dopo l'esecuzione degli scambi. Amico, che stampella.
Di conseguenza, l'uso è il seguente: IsSync() restituisce false - l'ambiente di trading nel terminale è storto, altrimenti possiamo procedere come al solito.
Stampe aggiunte. Ora rimangono due posizioni, come previsto:
Risultato:
Aggiungere Trade.ResultRetcodeDescription()
#include <Trade\Trade.mqh>
voidOnStart()
{
CTrade Trade;
while (!IsStopped() && (PositionsTotal() <= 1)) // Закончим, когда появится более одной позиции.if (PositionsTotal() == 1)
{
Trade.PositionClose(PositionGetTicket(0)); // Если есть позиция - закрываем.Print("Закрытие, т. к. PositionsTotal() равно 1");
}
elseif (!OrdersTotal())
{
printf("Перед открытием. PositionsTotal: %d, OrdersTotal: %d", PositionsTotal(), OrdersTotal());
Trade.Buy(0.01); // Если нет позиции и ордера - открываем позицию.Print(Trade.ResultRetcodeDescription());printf("После открытия. PositionsTotal: %d, OrdersTotal: %d", PositionsTotal(), OrdersTotal());
}
Print("Выход. PostionsTotal: ", PositionsTotal());
}
#define PRINT(A) Print(#A + " = " + (string)(A))
#include <Trade\Trade.mqh>
voidOnStart()
{
CTrade Trade;
while (!IsStopped() && (PositionsTotal() <= 1)) // Закончим, когда появится более одной позиции.if (PositionsTotal() == 1)
{
Trade.PositionClose(PositionGetTicket(0)); // Если есть позиция - закрываем.Print("Закрытие, т. к. PositionsTotal() равно 1");
}
elseif (!OrdersTotal())
{
printf("Перед открытием. PositionsTotal: %d, OrdersTotal: %d", PositionsTotal(), OrdersTotal());
Trade.Buy(0.01); // Если нет позиции и ордера - открываем позицию.
PRINT(Trade.ResultRetcodeDescription());
PRINT(Trade.ResultDeal());
PRINT(Trade.ResultOrder());
PRINT(Trade.ResultComment());
printf("После открытия. PositionsTotal: %d, OrdersTotal: %d", PositionsTotal(), OrdersTotal());
}
Print("Выход. PostionsTotal: ", PositionsTotal());
}
Risultato:
2021.05.0511:36:14.566 Test (EURUSD,M1) Перед открытием. PositionsTotal: 0, OrdersTotal: 02021.05.0511:36:14.646 Test (EURUSD,M1) Trade.ResultRetcodeDescription() = done at 0.000002021.05.0511:36:14.646 Test (EURUSD,M1) Trade.ResultDeal() = 02021.05.0511:36:14.646 Test (EURUSD,M1) Trade.ResultOrder() = 22498746452021.05.0511:36:14.646 Test (EURUSD,M1) Trade.ResultComment() = Request executed
2021.05.0511:36:14.646 Test (EURUSD,M1) После открытия. PositionsTotal: 2, OrdersTotal: 12021.05.0511:36:14.646 Test (EURUSD,M1) Выход. PostionsTotal: 2
Questo non è assolutamente il caso, poiché la condizione per inviare un ordine a mercato per aprire una posizione è PositionsTotal == OrdersTotal == 0.
No, l'ultima registrazione dell'attività di trading è nel secondo registro.
E questo è corretto in termini di priorità:
Qui sono tornato all'opzione senza stampe e di nuovo c'è una posizione rimasta dopo l'esecuzione. Si scopre che è necessario tenere una sorta di pausa dopo l'esecuzione degli scambi. Amico, che stampella.
Beh, chi lo aggiornerà? ))
ma quando c'è una posizione aperta - lo script la chiude e non fa altro
\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
Inoltre, se provo ad aprire una posizione lo script la chiude istantaneamente
è riuscito a scrivere IsSynchronized(). Il codice è un po' pesante. Non ho ancora deciso in quale forma pubblicarla.
Come funziona? È un po' trovato ma un po' assente? Qual è il succo o il principio della soluzione?
Ma quando c'è una posizione aperta, lo script la chiude e non fa altro.
Non tutti i server riprodurranno l'apertura di due posizioni. Nel vostro caso, è il terzo lato (un lato - due posizioni, l'altro - una posizione).
E questo è giusto in termini di sequenze:
Forum sul trading, sistemi di trading automatico e test di strategie di trading
Il grande e potente MT4 per sempre (o come scegliere la strategia di migrazione)
Ihor Herasko, 2021.05.05 09:35
Ed è tutto qui in termini di ordinazione:
Le linee evidenziate confermano la sequenza.
PositionsTotal = 1 - invia un ordine di chiusura.
La chiusura avviene dopo il completamento dell'esecuzione dello script. La cache di stampa è un po' distorta.
Come mai? E' come se si trovasse, ma come se non ci fosse?
Non ho ancora trovato il tempo di pubblicarlo. Lo pubblicherò entro 24 ore.
Qual è l'essenza o il principio della soluzione?
Analizza la corrispondenza tra la storia del trading e l'ambiente di trading attuale. In questo caso, non ci sono rallentamenti.
Controlla anche Result.order.
Di conseguenza, l'uso è il seguente: IsSync() restituisce false - l'ambiente di trading nel terminale è storto, altrimenti possiamo procedere come al solito.
Stampe aggiunte. Ora rimangono due posizioni, come previsto:
Risultato:
Aggiungere Trade.ResultRetcodeDescription()
Anche ResultDeal / ResultOrder / ResultComment e Order.Stato
Sicuramente ci sarà una risposta lì
StatoAggiungere Trade.ResultRetcodeDescription()
E anche ResultDeal / ResultOrder / ResultComment e Order.Stato
Sicuramente ci sarà una risposta lì
StatoFatto:
Risultato:
Aggiungere Trade.ResultRetcodeDescription()
E anche ResultDeal / ResultOrder / ResultComment e Order.Stato
Sicuramente ci sarà una risposta.
StatoQuesto non è assolutamente il caso, poiché la condizione per inviare un ordine a mercato per aprire una posizione è PositionsTotal == OrdersTotal == 0.