MT5 e la velocità in azione - pagina 80

 
fxsaber:

ZS Sarebbe bene sbarazzarsi dei blocchi che vanno avanti da mesi. Esegui questo script su una macchina con RAM infinita. Per esempio, non posso caricare le zecche dal 1° giugno solo un carattere alla volta. Appende semplicemente CopyTicks con zero consumo di risorse.

b2699 - risolto, grazie.

 
Al salvadanaio di codici che mostrano i freni. Questa volta Tester.
 

Forum sul trading, sistemi di trading automatico e test di strategie di trading

Accettazione di ordini SL/TP

fxsaber, 2020.12.11 09:17

// Измеряет размер лага между приходом тика на MT5-сервер и MT5-Терминал.
// Запускать на той же машине, на которой установлен MT5-сервер.

Sono state elaborate 100 zecche. Il ritardo di arrivo tra il server e il terminale varia da uno a otto millisecondi. La media è di poco più di quattro millisecondi. Questo è uguale al ritardo di attivazione dell'ordine TP, che è dove questo ramo è iniziato.


Il ritardo stesso è all'interno del server MT5. Il canale Server->Terminal non ha niente a che vedere con questo.


Grande richiesta agli sviluppatori di eliminare questo ritardo. Ora con zero ping abbiamo un ritardo costante di tick in entrata non solo al terminale, ma anche al server. In particolare, l'accettazione degli ordini.

 
Per ridurre i ritardi nel trading, consiglio di trasferire il terminale di battaglia su un disco RAM.
 

Inaspettatamente mi sono imbattuto in un tick mancante nella storia, anche se è venuto in Market Watch: SymbolInfoTick.



La stampa dello stesso tick attraverso MQL mostra una bandiera interessante.

                         [time]     [bid]     [ask] [last] [volume]    [time_msc] [flags] [volume_real]
        [0] 2021.01.04 20:52:55 103.16300 103.16500 0.0000        0 1609793575267       4       0.00000
        [1] 2021.01.04 20:52:55 103.16300 103.16400 0.0000        0 1609793575788       4       0.00000
        [2] 2021.01.04 20:52:59 103.16400 103.16400 0.0000        0 1609793579367     130       0.00000
        [3] 2021.01.04 20:53:01 103.16400 103.16400 0.0000        0 1609793581817       2       0.00000
        [4] 2021.01.04 20:53:01 103.16300 103.16400 0.0000        0 1609793581969       2       0.00000

Questa bandiera si è formata sul tick della storia appena prima del tick mancante di Market Watch. Forse questo ci dirà dov'è il problema.


ZS Purtroppo, questo accade sistematicamente. La cronologia delle zecche non contiene tutte le zecche che arrivano al terminale.

 
fxsaber:

Inaspettatamente mi sono imbattuto in un tick mancante nella storia, anche se è venuto in Market Watch: SymbolInfoTick.



La stampa dello stesso tick attraverso MQL mostra una bandiera interessante.

Questa bandiera si è formata sul tick della storia appena prima del tick mancante di Market Watch. Forse questo ci dirà dov'è il problema.


ZS Purtroppo, questo accade sistematicamente. La cronologia delle zecche non contiene tutte le zecche che arrivano al terminale.

Diciamo che l'EA scambia un giorno intero su un conto reale e realizza un profitto.

il giorno dopo eseguo il tester sul giorno precedente e ottengo una perdita.

Non capisco la ragione, o il broker dà i tick sbagliati o qualcos'altro...

Документация по MQL5: Константы, перечисления и структуры / Состояние окружения / Информация о счете
Документация по MQL5: Константы, перечисления и структуры / Состояние окружения / Информация о счете
  • www.mql5.com
Информация о счете - Состояние окружения - Константы, перечисления и структуры - Справочник MQL5 - Справочник по языку алгоритмического/автоматического трейдинга для MetaTrader 5
 

Forum sul trading, sistemi di trading automatico e test di strategie di trading

MT5 e la velocità in azione

fxsaber, 2021.01.04 20:51

Inaspettatamente mi sono imbattuto in una mancanza di tick nella storia, nonostante il fatto che stava arrivando al Market Watch: SymbolInfoTick.


Ho avviato un terminale parallelo, dove il tkc non è stato generato dal terminale, ma caricato dal server.

Nello screenshot questo terminale a sinistra - il segno di spunta è presente. Ma sull'altro Terminale (a destra) - non lo è!


Si scopre che il terminale stesso non mette tutti i tick in arrivo nella cronologia dei tick. Se volete avere la storia senza omissioni, dovete aggiungere il file tkc e tirarlo dal server.

Insetto sgradevole.

 
// Попытка поймать тик, который не попал в историю тиков.

// Сравнение двух тиков.
bool IsEqual( const MqlTick &Tick1, const MqlTick &Tick2 )
{
  return((Tick1.time_msc == Tick2.time_msc) &&
         !NormalizeDouble(Tick1.bid - Tick2.bid, _Digits) &&
         !NormalizeDouble(Tick1.ask - Tick2.ask, _Digits));
}

// Проверяет наличие тика в истории.
bool IsHistory( const MqlTick &Tick )
{
  bool Res = false;
  
  MqlTick Ticks[];
  
  const int Size = CopyTicksRange(_Symbol, Ticks, COPY_TICKS_ALL, Tick.time_msc, Tick.time_msc + 1);
  
  for (int i = 0; !Res && (i < Size); i++)
    Res = IsEqual(Tick, Ticks[i]);
    
  return(Res);
}

void OnTick()
{
  static MqlTick Ticks[];
  MqlTick Tick;
  
  if (SymbolInfoTick(_Symbol, Tick)) // Взяли текущий тик.
  {
    const int Size = ArrayResize(Ticks, ArraySize(Ticks) + 1);
    
    Ticks[Size - 1] = Tick; // Дописали его в массив
    
    MqlTick HistoryTick[1];
    
    if (CopyTicks(_Symbol, HistoryTick, COPY_TICKS_ALL, 0, 1) > 0) // Взяли последний исторический тик
    {
      int i = 0;
      
      while ((i < Size) && (Ticks[i].time_msc < HistoryTick[0].time_msc)) // Если исторический тик пришел позже проверяемого
      {
        if (!IsHistory(Ticks[i]))                                    // Если в истории тиков нет проверяемого тика,
        {
          Alert("!IsHistory(Ticks[i]) == true");
          ArrayPrint(Ticks, _Digits, NULL, i, 1, ARRAYPRINT_HEADER); // выводим его.
        }
          
        i++;
      }
      
      ArrayRemove(Ticks, 0, i); // Удалили тики, что проверили.
    }
  }  
}

Un tale EA non potrebbe catturare i tick mancanti nella storia. Quello di combattimento sì. Apparentemente, questi tick non avviano l'OnTick.

Gli stessi tic mancati possono essere effettivi per decine di millisecondi.

 
fxsaber:
C'era un post sopra con il codice sorgente. Ora è vuoto. Il motivo?
Il post deve essere stato quando il sito è stato aggiornato (ci sono due post del genere nella parte inglese).
 
fxsaber:

Ho eseguito un terminale parallelo in cui il tkc non è stato generato dal terminale, ma caricato dal server.

Nello screenshot di questo terminale a sinistra - il segno di spunta è presente. Ma sull'altro terminale (a destra) non lo è!

Ho eseguito questo script su entrambi i terminali.

// Сохранение тиковой истории в текстовый файл.

string GetTickFlag( uint tickflag )
{
  string flag = " " + (string)tickflag;

#define  TICKFLAG_MACRO(A) flag += ((bool)(tickflag & TICK_FLAG_##A)) ? " TICK_FLAG_" + #A : ""; \
                        tickflag -= tickflag & TICK_FLAG_##A;
 TICKFLAG_MACRO(BID)
TICKFLAG_MACRO(ASK)
TICKFLAG_MACRO(LAST)
TICKFLAG_MACRO(VOLUME)
TICKFLAG_MACRO(BUY)
TICKFLAG_MACRO(SELL)
#undef  TICKFLAG_MACRO

  if (tickflag)
    flag += " FLAG_UNKNOWN (" + (string)tickflag + ")";

  return(flag);
}

#define  TOSTRING(A) " " + #A + " = " + (string)Tick.A
string TickToString( const MqlTick &Tick, const int FilterFlags = 0xFF )
{
  return(TOSTRING(time) + "." + ::IntegerToString(Tick.time_msc % 1000, 3, '0') +
         TOSTRING(bid) + TOSTRING(ask) + TOSTRING(last)+ TOSTRING(volume) + GetTickFlag(Tick.flags & FilterFlags));
}
#undef  TOSTRING


void OnStart()
{  
  MqlTick Ticks[];
  const int Size = CopyTicksRange(_Symbol, Ticks, COPY_TICKS_ALL, D'2021.01.05 01:00' * 1000, D'2021.01.05 10:50' * 1000);
  
  string From = (string)Ticks[0].time;
  string To = (string)Ticks[Size - 1].time;
  
  StringReplace(From, ":", ".");
  StringReplace(To, ":", ".");
  
  const int handle = FileOpen(_Symbol + "_" + From + "-" + To + ".txt", FILE_WRITE | FILE_ANSI | FILE_TXT);

  if (handle != INVALID_HANDLE)
  {        
    for (int i = 0; i < Size; i++)
      FileWrite(handle, TickToString(Ticks[i], 0x7F)); // Фильтр флагов, иначе очень много различий.

    FileClose(handle);
  }
  
  Alert("Done.");
}


A seconda dell'intervallo richiesto, il tkc può cambiare (sincronizzazione con il server). Così alcune zecche che mancavano prima della richiesta possono cominciare ad essere presenti.

Nonostante questo, è stato ancora possibile rilevarne alcuni su diversi personaggi. Ho dovuto applicare un filtro di bandiere, perché sono molto diverse per le zecche su diversi terminali.

Ecco come appaiono le differenze.


EURJPY.


USDCHF .


In generale, quando si fa trading in tempo reale, alcuni tick possono non essere presenti nella cronologia dei tick, in quanto sono nel terminale e possono essere sul server.

Questo bug deve essere risolto.