MT5 e la velocità in azione - pagina 18

 
Renat Fatkhullin:

Avete solo due stati 5000 e unlim?

Tu sei la mente della tua felicità.

Sì, avete bisogno di un controllo completo o di un controllo superficiale. Non vedo l'utilità dell'intermezzo.
 
Renat Fatkhullin:

In teoria, sì.

Non dimenticare i processi di sincronizzazione. Un gran numero di processi nella piattaforma sono asincroni.

Per esempio, l'integrazione di un gateway con uno scambio o un fornitore di liquidità può inviare rapporti sulle transazioni con ritardi di secondi o addirittura minuti. Spesso l'api non fornisce affatto l'accesso alla storia per la riconciliazione, ma fornisce generatori di rapporti lenti e non ritmici.

All'apertura del mercato, o a causa di una riconnessione imprevista del gateway, i rapporti possono essere ritardati. Sono replicati nella cronologia sul server e immediatamente inviati in modo asincrono ai terminali. Grazie all'ordinamento per data, vengono inseriti nei posti giusti, e nel frattempo si possono aprire nuovi trade.

La maggior parte delle API di integrazione sono così analfabete e disfunzionali che rendono quasi impossibile fare dei gateway garantiti. Anche se c'è un'opinione che questo sia il prodotto di un sabotaggio deliberato da parte dei loro sviluppatori.

Dobbiamo dare il diritto di scelta? Chi ha bisogno di scatti fisici e chi ne ha abbastanza per lavorare con indici con rischi adeguati.

 
I commenti non relativi a questo argomento sono stati spostati in "Domande dai principianti di MQL5 MT5 MetaTrader 5".
 
fxsaber:

Dobbiamo dare il diritto di scegliere? Chi ha bisogno di scatti fisici e chi ha bisogno di abbastanza per lavorare con gli indici con i rischi appropriati.

Qual è il problema nel mantenere una cache locale sull'EA e campionare rispetto all'ultimo tempo di aggiornamento? Io ce l'ho e non ho mai avuto alcun lag con esso. Le mie funzioni di rete rallentano l'intera interfaccia a causa della sua implementazione sincrona, sarebbe bello avere WebRequestAsync fuori dalla scatola, anche se sto già cercando DLL o anche wrapper vincolanti in python e C++, dato che c'è una API di trading in python :)

Ma lavorare con grandi quantità di dati senza cache locale è molto strano.

PS. In generale le maschere di hash e il caching sono molto richiesti in multicurrency ed è per questo che ho chiesto sopra in questo thread per maschere di hash normali (leggi veloci) fuori dalla scatola.
Документация по MQL5: Сетевые функции / WebRequest
Документация по MQL5: Сетевые функции / WebRequest
  • www.mql5.com
Для использования функции WebRequest() следует добавить адреса серверов в список разрешенных URL во вкладке "Советники" окна "Настройки". Порт сервера выбирается автоматически на основе указанного протокола - 80 для "http://" и 443 для "https://". Функция WebRequest() является синхронной, это означает, что она приостанавливает выполнение...
 
Andrey Pogoreltsev:

Qual è il problema nel mantenere una cache locale sull'EA e campionare rispetto all'ultimo tempo di aggiornamento?

Loscript fa proprio questo.

Per quanto riguarda la cache locale, questo è il modo in cui la storia è implementata in MT4Orders.

 
fxsaber:

Per quanto riguarda la cache locale, è così che MT4Orders ha implementato la storia.

Non mi aspettavo che la sceneggiatura, che ha due anni, potesse

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

Consulente esperto OrderCloseTime MQL5

fxsaber, 2018.07.06 00:49

#include <MT4Orders.mqh> // https://www.mql5.com/en/code/16006

void LastTimeMQL4( datetime &OpenTime, datetime &CloseTime )
{
  for (int i = OrdersHistoryTotal() - 1; i >= 0; i--)
    if (OrderSelect(i, SELECT_BY_POS, MODE_HISTORY) && (OrderType() <= OP_SELL))
    {
      OpenTime = OrderOpenTime();
      CloseTime = OrderCloseTime();
      
      break;
    }
}

void LastTimeMQL5( datetime &OpenTime, datetime &CloseTime )
{
  if (HistorySelect(0, INT_MAX))
  {
    for (int i = HistoryDealsTotal() - 1; i >= 0; i--)
    {
      const ulong Ticket = HistoryDealGetTicket(i);
  
      if (HistoryDealGetInteger(Ticket, DEAL_ENTRY) == DEAL_ENTRY_OUT)
      {
        CloseTime = (datetime)HistoryDealGetInteger(Ticket, DEAL_TIME);

        if (HistorySelectByPosition(HistoryDealGetInteger(Ticket, DEAL_POSITION_ID)))
          OpenTime = (datetime)HistoryDealGetInteger(HistoryDealGetTicket(0), DEAL_TIME);
          
        break;
      }
    }
  }
}

typedef void (*GetLastTime)( datetime&, datetime& );

void Bench( GetLastTime LastTime, const int Amount = 10000 )
{
  datetime OpenTime, CloseTime;
  datetime Tmp = 0;

  for (int i = 0; i < Amount; i++)
  {
    LastTime(OpenTime, CloseTime);
    
    Tmp += CloseTime - OpenTime;        
  }
  
  Print(Tmp);
}

#define  BENCH(A)                                                              \
{                                                                             \
  const ulong StartTime = GetMicrosecondCount();                              \
  A;                                                                          \
  Print("Time[" + #A + "] = " + (string)(GetMicrosecondCount() - StartTime)); \
}

#define  PRINT(A) Print(#A + " = " + (string)(A))

void OnStart()
{  
  if (HistorySelect(0, INT_MAX))
    PRINT(HistoryDealsTotal());

  BENCH(Bench(LastTimeMQL4))
  BENCH(Bench(LastTimeMQL5))  
}


mostrerà tali freni!

// Первый запуск
2020.08.28 22:01:12.941 HistoryDealsTotal() = 9435
2020.08.28 22:01:13.198 2046.04.30 00:13:20
2020.08.28 22:01:13.198 Time[Bench(LastTimeMQL4)] = 257277
2020.08.28 22:01:43.982 2046.04.30 00:13:20
2020.08.28 22:01:43.982 Time[Bench(LastTimeMQL5)] = 30783493

// Второй запуск
2020.08.28 22:03:31.474 HistoryDealsTotal() = 9435
2020.08.28 22:03:31.724 2046.04.30 00:13:20
2020.08.28 22:03:31.724 Time[Bench(LastTimeMQL4)] = 250491
2020.08.28 22:04:02.011 2046.04.30 00:13:20
2020.08.28 22:04:02.011 Time[Bench(LastTimeMQL5)] = 30286258

Il puro MQL5 è 100 volte più lento del caching parziale (solo HistorySelectByPosition).

 
Il test è del tutto inaccettabile.

Per MQL5-style, avete specificamente testato 10 000 campioni di HistorySelect su tutta la profondità. E hai anche aggiunto dei cicli extra.

Senza una chiara dichiarazione iniziale delle condizioni, spiegando la loro evidente parzialità e dando numeri scioccanti - questo è il più puro imbroglio e manipolazione.

Per un gioco così sporco con un biglietto per l'aconito.
 
Renat Fatkhullin:
Il test è del tutto inaccettabile.

Per MQL5-style, avete specificamente testato 10 000 campioni di HistorySelect su tutta la profondità. E hai anche aggiunto dei cicli extra.

Senza una chiara dichiarazione iniziale delle condizioni, spiegando la loro evidente parzialità e dando numeri scioccanti - questo è il più puro imbroglio e manipolazione.

Per un gioco così sporco con un biglietto per l'aconito.

Allora la tua percezione è sbagliata. Si dimostra che è corretto cacciare se stessi in modo che non ci sia una spina nel fianco.

Se ho capito bene, dopo questa implementazione.

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

MT5 e la velocità in azione

Renat Fatkhullin, 2020.08.27 22:58

Abbiamo già ottimizzato un sacco di operazioni di campionamento e ora stiamo pensando all'aggiornamento ottimale della cache, quando in realtà il 99% dei campioni sarà completamente inutile e verrà perso sul fatto.

Cioè, a meno che non randomizziate specificamente i limiti di campionamento, la cache mostrerà hit vicini al 100%.

Molto probabilmente la prossima settimana ci sarà già una soluzione efficace.


questo esempio verrà eseguito molto più velocemente.


HH Lo script calcola il tempo di apertura/chiusura dell'ultima posizione nella storia del trading.

 
fxsaber:

Mostra come cacciare correttamente se stessi, in modo da non essere buttati fuori.

Se "cache" in questo modo, sarà super-veloce.

void LastTimeMQL5( datetime &OpenTime, datetime &CloseTime )
{
  static ulong PrevTicketIn = 0;  // Хранит тикет входа позиции с последнего вызова.
  static ulong PrevTicketOut = 0; // Хранит тикет выхода позиции с последнего вызова.
  
  if (HistorySelect(0, INT_MAX))
  {
    for (int i = HistoryDealsTotal() - 1; i >= 0; i--)
    {
      const ulong Ticket = HistoryDealGetTicket(i);
      
      if (Ticket == PrevTicketOut)            
      {
        OpenTime = (datetime)HistoryDealGetInteger(PrevTicketIn, DEAL_TIME);
        CloseTime = (datetime)HistoryDealGetInteger(PrevTicketOut, DEAL_TIME);        
        
        break;
      }
      else if (HistoryDealGetInteger(Ticket, DEAL_ENTRY) == DEAL_ENTRY_OUT)
      {
        PrevTicketOut = Ticket;
        
        CloseTime = (datetime)HistoryDealGetInteger(Ticket, DEAL_TIME);

        if (HistorySelectByPosition(HistoryDealGetInteger(Ticket, DEAL_POSITION_ID)))
        {
          PrevTicketIn = HistoryDealGetTicket(0);
          OpenTime = (datetime)HistoryDealGetInteger(PrevTicketIn, DEAL_TIME);
        }
          
        break;
      }
    }
  }
}

Chi scrive così?

 
fxsaber:

Se si "cacheggia" in questo modo, è super-veloce.

Chi scrive così?

Programmatori C.