Domande dai principianti MQL5 MT5 MetaTrader 5 - pagina 1220

 
HistorySelect(xxx,TimeCurrent()+1)

Un secondo è spesso la perdita dell'ultimo scambio/ordine sul reale. Per esempio, su molte violazioni un ordine va in esecuzione per il tempo TTL, che può essere di cinque secondi. Se non viene eseguito in cinque secondi, l'ordine è un reindirizzamento. Oppure viene eseguito, ma in tre secondi.

Nel caso, se non ci sono stati tick dall'accettazione all'esecuzione, tale chiamata HistorySelect non riceverà informazioni su di essa.


Forse, il TimeCurrent dovrebbe essere uguale a MathMax(LastOrder_time, MarketWatch_Time). Allora la HistorySelect sarà corretta. Ma TimeCurrent potrebbe essere troppo costoso.


A proposito, un tale schema di lavoro di HistorySelect salterà una parte della storia delle compravendite.

void OnStart()
{
  static MqlTick PrevTick = {0};
  
  MqlTick Tick;
  
  if (SymbolInfoTick(_Symbol, Tick))
  {
    if (HistorySelect(PrevTick.time, INT_MAX))
      // Учитываем новые ордера/сделки в Истории торгов

    PrevTick = Tick;  
  }
}

Anche se, a prima vista, tutto è chiaro.


Scrivere una DealsTotal() economica non è facile in MT5. Non è elementare (e gratuito) OrdersHistoryTotal() in MT4.

 

pensieri ad alta voce, nessuna pretesa di rilevanza o competenza:


fxsaber:

Se non ci sono stati ticchettii dall'accettazione all'esecuzione, tale chiamata a HistorySelect non otterrà informazioni al riguardo.

Non risolverete questo problema, il modello di interazione server - terminale - MQL è stato originariamente progettato

Non ho raggiunto il punto di controllare in MT5, ma in MT4 so per certo che ci sono situazioni, quando nella finestra di osservazione del mercato ci sono variazioni di prezzo sul nostro simbolo, ma non ci possono essere tick o meno di quelli che ci sono in ЕА


ok, non importa, quindi funziona, basta scegliere nella decisione TS, cosa succede all'ordine in assenza di informazioni dal server dal momento in cui si invia l'ordine - cioè, l'ordine sarà impostato o respinto a priori, e ha ricevuto la risposta per confermare questa decisione preliminare o annullare - cioè, lavorare con informazioni non confermate o ancora aspettare la risposta dal server - questa offerta MQ e probabilmente non si adatta


fxsaber:

Non è facile usare DealsTotal() a buon mercato in MT5. Non è l'elementare (e gratuito) OrdersHistoryTotal() in MT4.

non scrivere ;)

o meglio, molto probabilmente lo farai, e spenderai risorse EA per mantenere l'algoritmo, penso che tu abbia bisogno di scoprire come funziona SQLite, i test di performance MQ hanno dichiarato, il lavoro con grandi tabelle e campioni è esattamente lo scopo del database - il codice EA sarà minimalista, tutto il lavoro che il database farà, tutto il lavoro si riduce a riempire i dati quando si inserisce un ordine e l'aggiornamento quando il server risponde (sincronizzazione, naturalmente, quando si esegue EA, il database in memoria)

 
Igor Makanu:

ma non lo farai ;)

o meglio, molto probabilmente si scriverà e spenderà risorse EA per mantenere l'algoritmo, penso che avete bisogno di capire come funziona SQLite, test di prestazioni MQ dichiarato, lavorare con grandi tabelle e campioni è esattamente lo scopo del database - codice EA sarà minimalista, tutto il lavoro il database vi farà, tutto il lavoro sarà ridotto a riempire i dati quando si effettua un ordine e aggiornare quando risponde dal server (sincronizzazione, naturalmente all'avvio EA, il database in memoria)

È stato originariamente scritto e pubblicato. È improbabile che diventi più veloce.

 
fxsaber:

È stato originariamente scritto e pubblicato. È improbabile che diventi più veloce.

Devo aver visto male il compito.

Ho pensato che avevo bisogno di aggiornare la lista degli ordini da due puntiOnTradeTransaction() e OnTick() , ecco perché ho suggerito di farlo nel database

 
void OnTradeTransaction(const MqlTradeTransaction &trans, const MqlTradeRequest &request, const MqlTradeResult &result)
  {
   if(trans.type==TRADE_TRANSACTION_DEAL_ADD)
     {
      if(!HistoryDealSelect(trans.deal))
         return;
      bool time_to_sum_up=false;
      if(HistoryDealGetInteger(trans.deal,DEAL_ENTRY)==DEAL_ENTRY_OUT)
        {
         time_to_sum_up=true;
        }
      if(!time_to_sum_up)
         return;
      HistorySelect(0,TimeCurrent());
      int deals=HistoryDealsTotal();
      for(int i=deals-1; i>=0; i--)
        {
         if(HistoryDealGetTicket(i)==trans.deal)
           {
            Print("Found!");
            return;
           }
        }
      Print("Not Found!");
     }
   return;
  
Questo codice è un frammento semplificato del mio EA.
Supponiamo che, in alcuni casi, il risultato dell'esecuzione di questo codice sia di restituire "Not Found".
Non capisco bene perché.
Perché non riesce a trovare se stesso negli eventi che scatena?
L'evento di transazione inviato dal server al terminale è arrivato, ma il server non può sincronizzare contemporaneamente l'ora corretta al terminale?
La mia comprensione è che un secondo di aumento del valore di TimeCurrent() è più che sufficiente.
Devo essermi perso qualcosa diimportante, giusto?
Vi sarei molto grato se poteste indicare eventuali errori nella mia comprensione.
Объем импорта г/г - экономический индекс Японии
Объем импорта г/г - экономический индекс Японии
  • www.mql5.com
Объем импорта г/г (Imports y/y) отражает изменение объема импорта товаров и услуг в отчетном месяце по сравнению с тем же месяцем прошлого года. Показатели импорта используются для оценки внешней торговой активности Японии и спроса на импортируемые товары внутри страны. Из-за последствий "финансового кризиса" США Япония также столкнулась с...
 
Puoi creare un metodo per aprire Market Deep di qualche simbolo in mql5 per favore? questo è importante quando si lavora con più simboli.
 
Dmitri Custurov:

Ecco il mio codice. Nell'inizializzazione crea un record nella tabella. Nel corpo di OnTick dovrebbe restituire immediatamente un errore, perché cerco di aggiungere un record con la stessa PRIMARY KEY, e dopo questo la base si chiude immediatamente. Ma allo stesso tempo dovrei vedere almeno il primo record quando lo apro, ma quando lo eseguo nel tester non c'è. E anche la tabella non viene creata. Se lo apro solo nel terminale, tutto è normale. Il primo disco è lì.

Con la posizione del database non si incasina sperando?

 
Aleksey Mavrin:

Non sei confuso sulla posizione della base, vero?

No, certo che no. Tutto è in File. Penso che in modalità tester, il database viene creato in memoria e distrutto dopo il test.

 
Igor Makanu:

pensieri ad alta voce, nessuna pretesa di rilevanza o competenza:

...

o meglio, molto probabilmente si scriverà e spenderà risorse EA per mantenere l'algoritmo, penso che avete bisogno di scoprire come funziona SQLite, test di prestazioni MQ dichiarato, il lavoro con grandi tabelle e campioni è proprio lo scopo del database - codice EA sarà minimalista, tutto il lavoro il database vi farà, tutto il lavoro è ridotto a riempire i dati quando si effettua un ordine e aggiornare quando risponde dal server (sincronizzazione, naturalmente, quando si esegue EA, il database in memoria)

E quale database farà tutto il vostro lavoro? Puoi dirmelo?

 

Su un terminale, solo l'immissione di ordini, sull'altro (con lo stesso broker e conto) il controllo dell'esecuzione. comunicazione attraverso il database o attraverso PUB/SUB ZMQ. Naturalmente il database non è SQLite. Il più adatto a questi scopi è Redis, ovviamente la mia opinione personale.

Buona fortuna