Sì, questo è anche il mio punto. Si scopre che lo script riesce a chiudere una delle posizioni, quando in realtà ce ne sono due, ma PositionsTotal() restituisce 1. E poi, dopo la chiusura, la condizione di fine ciclo è soddisfatta, cioè PositionsTotal() restituisce 2.
È possibile inserire delle stampe per vedere completamente cosa succede.
Le stampe possono essere inserite per vedere pienamente cosa sta succedendo.
Sì, per confermare che il ragionamento è corretto:
#include <Trade\Trade.mqh>
voidOnStart()
{
CTrade Trade;
while (!IsStopped() && (PositionsTotal() <= 1)) // Закончим, когда появится более одной позиции.if (PositionsTotal() == 1)
{
Trade.PositionClose(PositionGetTicket(0)); // Если есть позиция - закрываем.Print("Закрытие, т. к. PositionsTotal() равно 1");
}
elseif (!OrdersTotal())
{
Trade.Buy(0.01); // Если нет позиции и ордера - открываем позицию.
Print("Открытие. PositionsTotal: ", PositionsTotal());
}
Print("Выход. PostionsTotal: ", PositionsTotal());
}
Risultato:
2021.05.0510:11:43.393 Test (EURUSD,M1) Открытие. PositionsTotal: 02021.05.0510:11:43.488 Test (EURUSD,M1) Закрытие, т. к. PositionsTotal() равно 12021.05.0510:11:43.535 Test (EURUSD,M1) CTrade::OrderSend: market sell 0.01 position #2249868517 EURUSD [position closed]
2021.05.0510:11:43.535 Test (EURUSD,M1) Закрытие, т. к. PositionsTotal() равно 12021.05.0510:11:43.615 Test (EURUSD,M1) Открытие. PositionsTotal: 02021.05.0510:11:43.697 Test (EURUSD,M1) Закрытие, т. к. PositionsTotal() равно 12021.05.0510:11:43.777 Test (EURUSD,M1) Открытие. PositionsTotal: 02021.05.0510:11:43.859 Test (EURUSD,M1) Закрытие, т. к. PositionsTotal() равно 12021.05.0510:11:43.941 Test (EURUSD,M1) Открытие. PositionsTotal: 02021.05.0510:11:44.023 Test (EURUSD,M1) Открытие. PositionsTotal: 12021.05.0510:11:44.101 Test (EURUSD,M1) Закрытие, т. к. PositionsTotal() равно 12021.05.0510:11:44.101 Test (EURUSD,M1) Выход. PostionsTotal: 2
In effetti, la posizione è lasciata solo appesa.
P. S. Corretto il post, perché ho messo la cosa sbagliata nel codice a causa del copia-incolla.
Nel registro, è probabile che l'ora dell'ultimo record di scambio segua l'ora del record di chiusura dello script.
Ti riferisci a queste due voci?
2021.05.0510:11:44.101 Test (EURUSD,M1) Закрытие, т. к. PositionsTotal() равно 12021.05.0510:11:44.101 Test (EURUSD,M1) Выход. PostionsTotal: 2
Penso che qui sia tutto corretto in termini di ordine. Ci sono infatti due posizioni ma PositionsTotal() non ha ancora ricevuto un aggiornamento. Pertanto, restituisce 1 e la posizione è chiusa. E dopo l'esecuzione dell'operazione di scambio, viene aggiornato allo stato che corrisponde a quello che esisteva prima dell'esecuzione dell'operazione di scambio. Quindi, otteniamo 2.
Il problema è stato discusso per molto tempo. Quasi tutti l'hanno incontrato. È la prima volta che è stato trovato un codice stabile e riproducibile.
Una soluzione è stata trovata.
E qual è la soluzione?
Qual è stata la difficoltà nel trovare un codice di riproduzione stabile? Un'azione per aprire o chiudere, e la successiva con una decisione basata sul numero di posizioni nel mercato o nella storia.
Ho aggiunto delle stampe. Ora rimangono due posizioni, come previsto:
#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); // Если нет позиции и ордера - открываем позицию.printf("После открытия. PositionsTotal: %d, OrdersTotal: %d", PositionsTotal(), OrdersTotal());
}
Print("Выход. PostionsTotal: ", PositionsTotal());
}
Risultato:
2021.05.0510:22:50.583 Test (EURUSD,M1) Перед открытием. PositionsTotal: 0, OrdersTotal: 02021.05.0510:22:50.663 Test (EURUSD,M1) После открытия. PositionsTotal: 0, OrdersTotal: 12021.05.0510:22:50.679 Test (EURUSD,M1) Перед открытием. PositionsTotal: 0, OrdersTotal: 02021.05.0510:22:50.757 Test (EURUSD,M1) После открытия. PositionsTotal: 2, OrdersTotal: 02021.05.0510:22:50.757 Test (EURUSD,M1) Выход. PostionsTotal: 2
#include <Trade\Trade.mqh>
CTrade Trade;
//+------------------------------------------------------------------+//| Script program start function |//+------------------------------------------------------------------+voidOnStart()
{
//---int total=PositionsTotal();
int Ordertotal=OrdersTotal();
while(!IsStopped() && (total <= 1)) // Закончим, когда появится более одной позиции.if(total == 1)
Trade.PositionClose(PositionGetTicket(0)); // Если есть позиция - закрываем.elseif(!Ordertotal)
Trade.Buy(0.01); // Если нет позиции и ордера - открываем позицию.
}
//+------------------------------------------------------------------+
Sì, questo è anche il mio punto. Si scopre che lo script riesce a chiudere una delle posizioni, quando in realtà ce ne sono due, ma PositionsTotal() restituisce 1. E poi, dopo la chiusura, la condizione di fine ciclo è soddisfatta, cioè PositionsTotal() restituisce 2.
È possibile inserire delle stampe per vedere completamente cosa succede.
Le stampe possono essere inserite per vedere pienamente cosa sta succedendo.
Sì, per confermare che il ragionamento è corretto:
Risultato:
In effetti, la posizione è lasciata solo appesa.
P. S. Corretto il post, perché ho messo la cosa sbagliata nel codice a causa del copia-incolla.In effetti, la posizione è stata lasciata solo appesa.
Nel registro, è probabile che il tempo di registrazione dell'ultimo trade segua il tempo di registrazione della chiusura dello script.
È anche importante stampare OrdersTotal.Nel registro, è probabile che l'ora dell'ultimo record di scambio segua l'ora del record di chiusura dello script.
Ti riferisci a queste due voci?
Penso che qui sia tutto corretto in termini di ordine. Ci sono infatti due posizioni ma PositionsTotal() non ha ancora ricevuto un aggiornamento. Pertanto, restituisce 1 e la posizione è chiusa. E dopo l'esecuzione dell'operazione di scambio, viene aggiornato allo stato che corrisponde a quello che esisteva prima dell'esecuzione dell'operazione di scambio. Quindi, otteniamo 2.
Il problema è stato discusso per molto tempo. Quasi tutti l'hanno incontrato. È la prima volta che è stato trovato un codice stabile e riproducibile.
Una soluzione è stata trovata.
E qual è la soluzione?
Qual è stata la difficoltà nel trovare un codice di riproduzione stabile? Un'azione per aprire o chiudere, e la successiva con una decisione basata sul numero di posizioni nel mercato o nella storia.Ti riferisci a queste due voci?
No, l'ultima registrazione dell'attività di trading è nel secondo registro.
È anche importante stampare OrdersTotal.
Ho aggiunto delle stampe. Ora rimangono due posizioni, come previsto:
Risultato:
Qual è la soluzione?
numero di posizioni nel mercato o nella storia.
Non c'è stata nessuna difficoltà, l'ho scritto al volo.
Apre posizioni come questa senza fermarsi affatto
Apre posizioni come questa senza fermarsi affatto
Beh, chi aggiornerà il totale? ))