Caratteristiche del linguaggio mql5, sottigliezze e tecniche - pagina 185

 
C'è un altro bug in gioco. Impostiamo un ordine Limit al prezzo corrente e guardiamo il suo graduale riempimento. Controlliamo il lotto totale di tutte le posizioni e gli ordini ad ogni passo. Non deve cambiare e deve essere uguale a quello che è stato inviato a OrderSend.
// Демонстрация потери данных во время торговли.

template <typename T>
T MyPrint( const T Value, const string Str )
{
  Print(Str + " = " + (string)Value);

  return(Value);
}

#define _P(A) MyPrint(A, ": " + #A)

sinput double inLots = 100;

int OnInit()
{
  MqlTradeResult Result = {0};
  MqlTradeRequest Request = {0};
  
  Request.action = TRADE_ACTION_PENDING;
  Request.symbol = _Symbol;
  Request.volume = inLots;
  Request.price = SymbolInfoDouble(_Symbol, SYMBOL_ASK);
  Request.type = ORDER_TYPE_BUY_LIMIT;
  
  return(OrdersTotal() || PositionsTotal() || !OrderSend(Request, Result)); // Работаем, когда ничего не открыто.
}

// Возвращает сумму лотов всех позиций и ордеров.
double GetSumLots()
{
  double Lots = 0;
  
  for (int i = _P(OrdersTotal()) - 1; i >= 0; i--)
    if (_P(OrderGetTicket(_P(i))))
      Lots += _P(OrderGetDouble(ORDER_VOLUME_CURRENT));
    
  for (int i = _P(PositionsTotal()) - 1; i >= 0; i--)
    if (_P(PositionGetTicket(_P(i))))
      Lots += _P(PositionGetDouble(POSITION_VOLUME));

  return(Lots);
}

void OnTradeTransaction(const MqlTradeTransaction& trans,
                        const MqlTradeRequest& request,
                        const MqlTradeResult& result)
{
  Print("---------");
    
  // Проверяем, что сумма лотов всех позиций и ордеров совпадает с заданной.
  if (NormalizeDouble(_P(GetSumLots()) - inLots, _Digits))
    Alert("BUG!");
}


Risultato.

2020.08.21 01:18:13.375 : OrdersTotal() = 1
2020.08.21 01:18:13.375 : i = 0
2020.08.21 01:18:13.375 : OrderGetTicket(MyPrint(i,: +i)) = 1197440
2020.08.21 01:18:13.375 : OrderGetDouble(ORDER_VOLUME_CURRENT) = 68.59999999999999
2020.08.21 01:18:13.375 : PositionsTotal() = 1
2020.08.21 01:18:13.375 : i = 0
2020.08.21 01:18:13.375 : PositionGetTicket(MyPrint(i,: +i)) = 1197440
2020.08.21 01:18:13.375 : PositionGetDouble(POSITION_VOLUME) = 31.4
2020.08.21 01:18:13.375 : GetSumLots() = 100.0
2020.08.21 01:18:13.377 ---------
2020.08.21 01:18:13.377 : OrdersTotal() = 1
2020.08.21 01:18:13.377 : i = 0
2020.08.21 01:18:13.377 : OrderGetTicket(MyPrint(i,: +i)) = 1197440
2020.08.21 01:18:13.377 : OrderGetDouble(ORDER_VOLUME_CURRENT) = 68.59999999999999
2020.08.21 01:18:13.377 : PositionsTotal() = 1
2020.08.21 01:18:13.377 : i = 0
2020.08.21 01:18:13.377 : PositionGetTicket(MyPrint(i,: +i)) = 1197440
2020.08.21 01:18:13.377 : PositionGetDouble(POSITION_VOLUME) = 31.4
2020.08.21 01:18:13.377 : GetSumLots() = 100.0
2020.08.21 01:18:13.389 ---------
2020.08.21 01:18:13.389 : OrdersTotal() = 1
2020.08.21 01:18:13.389 : i = 0
2020.08.21 01:18:13.389 : OrderGetTicket(MyPrint(i,: +i)) = 1197440
2020.08.21 01:18:13.389 : OrderGetDouble(ORDER_VOLUME_CURRENT) = 41.4
2020.08.21 01:18:13.389 : PositionsTotal() = 1
2020.08.21 01:18:13.389 : i = 0
2020.08.21 01:18:13.389 : PositionGetTicket(MyPrint(i,: +i)) = 1197440
2020.08.21 01:18:13.389 : PositionGetDouble(POSITION_VOLUME) = 31.4
2020.08.21 01:18:13.389 : GetSumLots() = 72.8
2020.08.21 01:18:13.389 Alert: BUG!
2020.08.21 01:18:13.389 ---------
2020.08.21 01:18:13.389 : OrdersTotal() = 1
2020.08.21 01:18:13.389 : i = 0
2020.08.21 01:18:13.389 : OrderGetTicket(MyPrint(i,: +i)) = 1197440
2020.08.21 01:18:13.389 : OrderGetDouble(ORDER_VOLUME_CURRENT) = 41.4
2020.08.21 01:18:13.389 : PositionsTotal() = 1
2020.08.21 01:18:13.389 : i = 0
2020.08.21 01:18:13.389 : PositionGetTicket(MyPrint(i,: +i)) = 1197440
2020.08.21 01:18:13.389 : PositionGetDouble(POSITION_VOLUME) = 31.4
2020.08.21 01:18:13.389 : GetSumLots() = 72.8
2020.08.21 01:18:13.389 Alert: BUG!
2020.08.21 01:18:13.389 ---------
2020.08.21 01:18:13.389 : OrdersTotal() = 1
2020.08.21 01:18:13.389 : i = 0
2020.08.21 01:18:13.389 : OrderGetTicket(MyPrint(i,: +i)) = 1197440
2020.08.21 01:18:13.389 : OrderGetDouble(ORDER_VOLUME_CURRENT) = 41.4
2020.08.21 01:18:13.389 : PositionsTotal() = 1
2020.08.21 01:18:13.389 : i = 0
2020.08.21 01:18:13.389 : PositionGetTicket(MyPrint(i,: +i)) = 1197440
2020.08.21 01:18:13.389 : PositionGetDouble(POSITION_VOLUME) = 31.4
2020.08.21 01:18:13.389 : GetSumLots() = 72.8
2020.08.21 01:18:13.389 Alert: BUG!
2020.08.21 01:18:13.389 ---------
2020.08.21 01:18:13.389 : OrdersTotal() = 1
2020.08.21 01:18:13.389 : i = 0
2020.08.21 01:18:13.389 : OrderGetTicket(MyPrint(i,: +i)) = 1197440
2020.08.21 01:18:13.389 : OrderGetDouble(ORDER_VOLUME_CURRENT) = 41.4
2020.08.21 01:18:13.389 : PositionsTotal() = 1
2020.08.21 01:18:13.389 : i = 0
2020.08.21 01:18:13.389 : PositionGetTicket(MyPrint(i,: +i)) = 1197440
2020.08.21 01:18:13.390 : PositionGetDouble(POSITION_VOLUME) = 58.6
2020.08.21 01:18:13.390 : GetSumLots() = 100.0

Sono stati piazzati 100 lotti, ma ad un certo punto i lotti sono diventati 72,8. Ovviamente, l'algoritmo di trading può essere disorientato in una tale situazione.

Stringa di ricerca: Oshibka 011.
 

fxsaber:
Он должен быть неизменным - равным тому, что был отправлен в OrderSend.

In realtà, no, c'è la possibilità di un malfunzionamento della tempistica, che è quello che succede, ma non c'è una soluzione facile a tutti

 
Andrei Trukhanovich:

In realtà no, c'è la possibilità di ottenere una mancata corrispondenza temporale, che è quello che succede, non c'è una soluzione facile a tutti

Non ho nemmeno una soluzione semplice. Come assicurarsi che ci sia un desync in qualche script in esecuzione non è affatto chiaro.

 
fxsaber:

Non ho nemmeno una soluzione complicata. Come assicurarsi in qualsiasi script in esecuzione che ci sia un'asincronia non è affatto chiaro.

Se il lotto totale è cambiato, continua a contare fino a quando i lotti per gli ordini e le posizioni sono gli stessi due volte.

La possibilità di essere fuori sincrono è minima o addirittura di pochi punti percentuali, quindi non influenzerà affatto le prestazioni.

__________

Ho guardato le tue stampe, forse è un bug, se è un caso di async, l'importo sbagliato non dovrebbe essere ripetuto allo stesso modo in diversi calcoli

 
Andrei Trukhanovich:

Se il lotto totale è cambiato, continua a contare fino a quando i lotti per gli ordini e le posizioni sono gli stessi due volte.

C'è una frazione o qualche percento di probabilità di desincronizzazione, per cui la performance è quasi ininfluente.

Nel registro qui sopra, tre calcoli consecutivi mostrano il risultato sbagliato. Abbiamo bisogno di Sonno, ma questo può portare a ritardi, quando non avremo il tempo di reagire all'ordine commerciale che viene emesso.

Questa non è una situazione piacevole.

 
fxsaber:

Nel registro qui sopra, tre calcoli consecutivi mostrano il risultato sbagliato.

Sì, l'ho visto, l'ho aggiunto in cima

 
I commenti non relativi a questo argomento sono stati spostati in "Tutte le domande dei neofiti su MQL4 e MQL5, aiuto e discussione su algoritmi e codici".
 
Alexey Viktorov:

Non dovresti offenderti. La probabilità più alta è un errore nel codice. Al secondo posto c'è lo spread esorbitante. Ma chi se non voi può scartare la prima opzione e cominciare a considerare la seconda senza vedere il codice. Spero che i moderatori spostino l'argomento in quello sbagliato.

Grazie per la risposta adeguata. Non sono offeso, sono sconvolto)). Ho scritto per cercare di trovare una soluzione rapida, che può essere qualcuno che ha già incontrato. Il codice è assolutamente standard, un ciclo totalprofit che somma e confronta con un dato valore, inoltre il codice ha funzionato per un paio di mesi su due conti diversi senza fallire. Buona giornata.

 
Evgeny Vlasov:

Grazie per la risposta adeguata. Non sono offeso, sono rattristato)). Ho scritto per cercare di trovare una soluzione rapida, che forse qualcuno che l'ha già incontrata ha. Il codice è assolutamente standard, un ciclo totalprofit che somma e confronta con un dato valore, inoltre il codice ha funzionato per un paio di mesi su due conti diversi senza fallire. Buona giornata.

Non si tratta di caratteristiche.
 
Artyom Trishkin:
Non si tratta di caratteristiche.

Sono d'accordo.