Caratteristiche del linguaggio mql5, sottigliezze e tecniche - pagina 173

 
fxsaber:

Aggiornato sopra.

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

Peculiarità di mql5, consigli e trucchi

fxsaber, 2020.04.09 13:13

Sembra che non l'abbiate incontrato affatto. Date un'occhiata alla documentazione. Ci sono due volumi per ordine.

Questi sono limitatori dal vivo. Il primo numero è il volume originale, il secondo è il volume versato. Non appena diventano uguali o vengono cancellati, vanno nella storia.


Non è un ordine eseguito in due parti? Sembra strano che i volumi non eseguiti siano gli stessi.

 
Alexey Viktorov:

Non è un ordine eseguito in due parti? Sembra strano che i volumi non eseguiti siano gli stessi.

Coincidenza. Hanno anche caricatori diversi.

 
fxsaber:

Non ci può essere ordine nel modo d'ordine quando è vivo. Da morto - ci sarà un tempo di prima esecuzione, come detto in origine.


Trovato nella storia.

 
fxsaber:

Quando si collassa tramite CloseBy, sembra che perda le maiuscole. Bisogna controllare.

Questo sembra essere il motivo per cui il primo codice qui sotto non funziona.

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

Storia del profitto in MQL5?

fxsaber, 2017.08.26 19:16

  1. MQL5
    double Profit( void )
    {
     double Res = 0;
    
     if (HistorySelect(0, INT_MAX))
       for (int i = HistoryDealsTotal() - 1; i >= 0; i--)
       {
         const ulong Ticket = HistoryDealGetTicket(i);
         
         if((HistoryDealGetInteger(Ticket, DEAL_MAGIC) == MagicNumber) && (HistoryDealGetString(Ticket, DEAL_SYMBOL) == Symbol()))
           Res += HistoryDealGetDouble(Ticket, DEAL_PROFIT);
       }
         
      return(Res);
    }


  2. MQL5 + MQL4
    #include <MT4Orders.mqh> // https://www.mql5.com/ru/code/16006
    
    double Profit( void )
    {
     double Res = 0;
    
     for (int i = OrdersHistoryTotal() - 1; i >= 0; i--)
       if(OrderSelect(i, SELECT_BY_POS, MODE_HISTORY) && (OrderMagicNumber() == MagicNumber) && (OrderSymbol() == Symbol()))
         Res += OrderProfit();
         
      return(Res);
    }

Contare il profitto nella magia sembra essere un problema.

 
I prezzi degli ordini sono normalizzati, gli scambi no. Lo script trova tali scambi.
void OnStart()
{
  if (HistorySelect(0, INT_MAX))
    for (int i = HistoryDealsTotal() - 1; i >= 0; i--) // Перебираем все сделки
    {
      const ulong Ticket = HistoryDealGetTicket(i); // Тикет сделки
      const double Price = HistoryDealGetDouble(Ticket, DEAL_PRICE); // Цена сделки
      
      if (NormalizeDouble(Price, 5) != Price) // Если цена сделки не нормализована,      
        Print(Ticket);                        // печатаем тикет сделки.
    }
}
 

Le frecce per aprire/chiudere le posizioni, che MT5 piazza automaticamente in tempo reale, sono basate su eventi TradeTransaction.


Proprio ora ho visto che questi eventi (apertura e chiusura di una dozzina di posizioni) non hanno raggiunto il terminale a causa di una momentanea mancanza di connessione - è stato così casuale, ero seduto al mio PC e li ho guardati a occhio. Di conseguenza non ci sono frecce corrispondenti.


E, come è stato detto a volte qui, non si può fare affidamento su OnTradeTransaction negli EA da combattimento. Peccato che non ci sia un meccanismo pubblico affidabile per gestire OrderSendAsync.

 
fxsaber:

Peccato che non ci sia un meccanismo pubblico affidabile per gestire OrderSendAsync.

i servizi possono accedere ai mestieri? - se è così, allora è possibile monitorare ogni 10 ms e inviare l'evento al grafico

Ho guardato l'aiuto, ho pensato che forse mi hanno aggiunto i servizi, ma credo che fosse così l'anno scorso:

-È un programma che, a differenza degli indicatori, degli Expert Advisors e degli script, non richiede il collegamento a un grafico. Simile agli script, i servizi non gestiscono alcun evento tranne l'evento di lancio. Per avviare un servizio, il suo codice deve contenere la funzione gestore OnStart. I servizi non accettano altri eventi tranne Start, ma possono inviare eventi personalizzati ai grafici stessi usando EventChartCustom

UPD: Ho scritto uno script di servizio.

struct SOrderInfo
{
   int positionstotal;
   int orderstotal;
   int historyorderstotal;
   bool operator==(const SOrderInfo &v){return(positionstotal==v.positionstotal && orderstotal==v.orderstotal && historyorderstotal==v.historyorderstotal);}
};
//+------------------------------------------------------------------+
int OnStart()
{
   SOrderInfo CurrState = UpdateOrdersInfo();
   SOrderInfo LastState = CurrState;
   while(!IsStopped())
   {
      Sleep(10);
      CurrState = UpdateOrdersInfo();
      if(CurrState == LastState) continue;
      LastState = CurrState;
      Print("Orders changed!");
   }
   return(0);
}
//+------------------------------------------------------------------+
SOrderInfo UpdateOrdersInfo()
{
   SOrderInfo result;
   result.positionstotal     = PositionsTotal();
   result.orderstotal        = OrdersTotal();
   result.historyorderstotal = HistoryOrdersTotal();
   return(result);
}
//+------------------------------------------------------------------+

Ho aperto diversi ordini e li ho chiusi manualmente.

 
Igor Makanu:

i servizi possono accedere ai mestieri? - se è così, è possibile monitorare ogni 10ms e inviare un evento al grafico

Questo non è diverso dallo stesso sconfinamento a Sovtenik. Solo che non basta confrontare i conteggi, gli interni possono cambiare.

 
Andrey Khatimlianskii:

Non è diverso dalla stessa tracotanza di Owletnik. Solo che non basta confrontare la quantità, gli interni possono cambiare.

Servizi come Alerters sono molto buoni. Non avete bisogno di grafici, vengono avviati automaticamente con Terminal. Devi solo risolvere le situazioni di passaggio da un conto all'altro.

Il servizio può anche essere un consigliere di combattimento. Senza l'interfaccia grafica, non è molto conveniente.
 
Andrey Khatimlianskii:

Non è diverso dalla stessa tracotanza di Owletnik. Solo che non basta confrontare la quantità, gli interni possono cambiare.

è diverso.

ci sono i cosiddetti compiti di controllo e gestione

EA - gestione, servizio - controllo

il controllo non deve essere superfluo - prenderete tutte le risorse del sistema e otterrete un sistema instabile invece del controllo

bisogna definire la criticità degli eventi, imho, chiusura e apertura degli ordini - questi sono eventi critici che hanno bisogno di controllo, mentre cambiare TP e SL potrebbe essere fatto come prima (qualche tentativo fallito - lasciate perdere, al prossimo tick ci riproveremo)

e il modo in cui suggerisci - controllare tutto è possibile - si può ripetere lo stato degli ordini in SQLite, poi ci sarà un problema di sincronizzazione del database con il servizio e EA.... tutto questo non è necessario


Penso che lo schema dovrebbe essere più semplice - dovrebbe essere così: ottenere l'eventoOnTradeTransaction dal terminale in EA e generare l'evento OnChartEvent dal servizio per un controllo aggiuntivo in EA