Il grande e terribile MT4 per sempre (o come strategizzare una transizione) - pagina 14

 
Ihor Herasko:

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.

 
fxsaber:

Le stampe possono essere inserite per vedere pienamente cosa sta succedendo.

Sì, per confermare che il ragionamento è corretto:

#include <Trade\Trade.mqh>

void OnStart()
{
  CTrade Trade;
  
  while (!IsStopped() && (PositionsTotal() <= 1)) // Закончим, когда появится более одной позиции.
    if (PositionsTotal() == 1)
    {
      Trade.PositionClose(PositionGetTicket(0)); // Если есть позиция - закрываем.
      Print("Закрытие, т. к. PositionsTotal() равно 1");
    }
    else if (!OrdersTotal())
    {
      Trade.Buy(0.01); // Если нет позиции и ордера - открываем позицию.
      
Print("Открытие. PositionsTotal: ", PositionsTotal()); 
    }
    
  Print("Выход. PostionsTotal: ", PositionsTotal());
}

Risultato:

2021.05.05 10:11:43.393 Test (EURUSD,M1)        Открытие. PositionsTotal: 0
2021.05.05 10:11:43.488 Test (EURUSD,M1)        Закрытие, т. к. PositionsTotal() равно 1
2021.05.05 10:11:43.535 Test (EURUSD,M1)        CTrade::OrderSend: market sell 0.01 position #2249868517  EURUSD [position closed]
2021.05.05 10:11:43.535 Test (EURUSD,M1)        Закрытие, т. к. PositionsTotal() равно 1
2021.05.05 10:11:43.615 Test (EURUSD,M1)        Открытие. PositionsTotal: 0
2021.05.05 10:11:43.697 Test (EURUSD,M1)        Закрытие, т. к. PositionsTotal() равно 1
2021.05.05 10:11:43.777 Test (EURUSD,M1)        Открытие. PositionsTotal: 0
2021.05.05 10:11:43.859 Test (EURUSD,M1)        Закрытие, т. к. PositionsTotal() равно 1
2021.05.05 10:11:43.941 Test (EURUSD,M1)        Открытие. PositionsTotal: 0
2021.05.05 10:11:44.023 Test (EURUSD,M1)        Открытие. PositionsTotal: 1
2021.05.05 10:11:44.101 Test (EURUSD,M1)        Закрытие, т. к. PositionsTotal() равно 1
2021.05.05 10: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.
 
Ihor Herasko:

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.
 
fxsaber:

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.05 10:11:44.101 Test (EURUSD,M1)        Закрытие, т. к. PositionsTotal() равно 1
2021.05.05 10: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.

 
fxsaber:

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.
 
Ihor Herasko:

Ti riferisci a queste due voci?

No, l'ultima registrazione dell'attività di trading è nel secondo registro.

 
fxsaber:

È anche importante stampare OrdersTotal.

Ho aggiunto delle stampe. Ora rimangono due posizioni, come previsto:

#include <Trade\Trade.mqh>

void OnStart()
{
  CTrade Trade;
  
  while (!IsStopped() && (PositionsTotal() <= 1)) // Закончим, когда появится более одной позиции.
    if (PositionsTotal() == 1)
    {
      Trade.PositionClose(PositionGetTicket(0)); // Если есть позиция - закрываем.
      Print("Закрытие, т. к. PositionsTotal() равно 1");
    }
    else if (!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.05 10:22:50.583 Test (EURUSD,M1)        Перед открытием. PositionsTotal: 0, OrdersTotal: 0
2021.05.05 10:22:50.663 Test (EURUSD,M1)        После открытия. PositionsTotal: 0, OrdersTotal: 1
2021.05.05 10:22:50.679 Test (EURUSD,M1)        Перед открытием. PositionsTotal: 0, OrdersTotal: 0
2021.05.05 10:22:50.757 Test (EURUSD,M1)        После открытия. PositionsTotal: 2, OrdersTotal: 0
2021.05.05 10:22:50.757 Test (EURUSD,M1)        Выход. PostionsTotal: 2
 
Dmitry Fedoseev:

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

#include <Trade\Trade.mqh>
CTrade Trade;
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
  {
//---
   int total=PositionsTotal();
   int Ordertotal=OrdersTotal();
   while(!IsStopped() && (total <= 1))  // Закончим, когда появится более одной позиции.
      if(total == 1)
         Trade.PositionClose(PositionGetTicket(0)); // Если есть позиция - закрываем.
      else
         if(!Ordertotal)
            Trade.Buy(0.01); // Если нет позиции и ордера - открываем позицию.
  }
//+------------------------------------------------------------------+

Foto di

 
SanAlex:

Apre posizioni come questa senza fermarsi affatto

Beh, chi aggiornerà il totale? ))

Motivazione: