Qualsiasi domanda da un PROFI a un SUPER PROFI - 1. - pagina 42

 
swanhearts:

Ciao, mi è stato inviato un indicatore MA con tutti i livelli di cui ho bisogno. Il problema è che quando passo il mouse sull'indicatore (ogni MA), non mostra il periodo di quella MA. Come risolvere il problema? C'è un errore di sintassi costante quando si cambia il nomeIndicatorShortName("MASHKI =)"); Si prega di aiutare.

il nome del buffer dell'indicatore è impostato usando SetIndexLabel

 

1. Qual è il modo più economico per sapere che la chiamata alla funzione è sullo stesso tick della chiamata precedente?

bool tick_already_processed()
{
   return( ??? );
}

void some_func()
{
   if ( tick_already_processed() ) return;

   // recalculate only once on each tick
}

void OnTick()
{
   if ( A ) some_func();
   if ( B ) some_func();
   if ( C ) some_func();
}

Il tempo (TimeCurrent) può rimanere lo stesso, il tempo in ms da SymbolInfoTick, anche teoricamente.

Confrontare i tempi di bid, ask e ms è abbastanza costoso.

Non suggerisco di organizzare il controllo nell'Expert Advisor stesso, voglio ottenere una funzione universale indipendente.


La stessa domanda riguarda le operazioni commerciali. Come facciamo a sapere che qualcosa è cambiato nella lista degli ordini/posizioni (compresi i livelli aperti, SL e TP) dall'ultima esecuzione?

Dovrei mettere qualche bandiera in OnTrade (e resettarla quando ho finito), è il modo più economico.

Ma, di nuovo, vorrei una soluzione universale.


Chi ha qualche idea?

 

Andrey Khatimlianskii: 

Esempio https://www.mql5.com/ru/code/16997

Resources.mqh.

Funzione IsNewPeriod


L'idea di base è di usare una funzione con statica all'interno.

Potete memorizzarlo in ID = GetMicroSecondsCount per ricordare e controllare i tick

Per lo stesso con gli ordini - controlla la magia

Non ho controllato lo pseudo codice qui sotto :)

bool IsNewTick(ulong newId) // GetMicrosecondCount() or magic
{
  static ulong id = 0;
  
  if (id != newId) 
  {
    id = newId;
    return true;
  }
  
  return false; 
}
 
Andrey Khatimlianskii:

2. domanda simile per i commerci. Come faccio a sapere se qualcosa è cambiato nella lista degli ordini/posizioni (compresi i livelli aperti, SL e TP) dall'ultima esecuzione?

In A, dobbiamo impostare un qualche tipo di flag in OnTrade (e resettarlo dopo l'esecuzione), è il modo più economico.

Ma, di nuovo, vorrei una soluzione universale.


Chi ha qualche idea?

Aggiungete qui le vostre condizioni (SL/TP ecc.).

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

Organizzare un ciclo di overflow degli ordini

fxsaber, 2017.10.18 12:29

struct HISTORY_UNIT
{
  long Ticket;
  int Type;
  double Lots; 
    
  HISTORY_UNIT( void ) : Ticket(::OrderTicket()), Type(::OrderType()), Lots(::OrderLots())
  {
  }

  bool operator !=( const HISTORY_UNIT &Unit ) const
  {
    return((this.Ticket != Unit.Ticket) || (this.Type != Unit.Type) || (this.Lots != Unit.Lots));
  }
      
  bool IsChange( void )
  {
    const HISTORY_UNIT Tmp;
    const bool Res = (this != Tmp);
    
    if (Res)
      this = Tmp;
      
    return(Res);
  }
};

// Возвращает true только в случае, если с последнего вызова произошли торговые изменения
bool IsChange( void )
{
  static HISTORY_UNIT History[];  

  const int Total = OrdersTotal();  
  bool Res = (ArraySize(History) != Total);

  for (int i = 0, j = Res ? ArrayResize(History, 0, Total) : 0; i < Total; i++)      
    if (OrderSelect(i, SELECT_BY_POS))
    {
      if (Res || (Res = History[j].IsChange()))
        ArrayResize(History, j + 1, Total);
      
      j++;
    }
  
  return(Res);
}
 
Andrey Khatimlianskii:

1. Qual è il modo più economico per sapere che la chiamata della funzione è sullo stesso tick della chiamata precedente?

Il tempo (TimeCurrent) può rimanere lo stesso, il tempo in ms da SymbolInfoTick, anche teoricamente.

Il confronto dei tempi di bid, ask e ms è troppo costoso.

Non suggerisco di organizzare il controllo nell'EA stesso, voglio ottenere una funzione universale indipendente.

Il problema qui non è l'economicità, ma l'affidabilità della numerazione delle zecche. Nel mio EA faccio le seguenti cose.

#ifdef __MQL5__
#else // __MQL5__
  // В false-режиме если засекли изменения, то последующие вызовы не делают проверку.  
  static bool IsNotChange( const bool bInit = false )
  {
    static bool IsChange = false;
     
    if (bInit)
      IsChange = false;
      
  #ifdef  HISTORYTICKS_ISCHANGE
    if (bInit)
      HISTORYTICKS::IsChange();
    else if (!IsChange)
      IsChange = HISTORYTICKS::IsChange();
  #endif // HISTORYTICKS_ISCHANGE
    
    return(!IsChange);
  }
#endif // __MQL5__

Questa è la versione della funzione per MT4. Numerazione attraverso l'indicatore di spia.


Non fornisco la versione MT5 della stessa funzione perché le cose inutili dovrebbero essere rimosse. Ma si basa su questa funzione.

  // Свежие тики с последнего вызова
  static int GetFreshTicks( MqlTick &Ticks[], const datetime dFrom = 0 )
  {
    static long LastTime = 0;
    static int LastAmount = 0;

    if (dFrom)
    {
     ::Comment("Waiting Ticks from " + ::TimeToString(dFrom, TIME_DATE) + "...");

      LastAmount = 0;
    }
    
    ::ArrayFree(Ticks);
  
    int Size = (dFrom || LastTime) ? ::CopyTicksRange(_Symbol, Ticks, COPY_TICKS_INFO, dFrom ? (long)dFrom * 1000 : LastTime) : 0;
    
    if (Size > LastAmount)
    {
      LastTime = Ticks[Size - 1].time_msc;
      int NewLastAmount = 1;
      
      for (int i = Size - 2; (i >= LastAmount) && (Ticks[i].time_msc == LastTime); i--)
        NewLastAmount++;
        
      if (::ArrayRemove(Ticks, 0, LastAmount))
        Size -= LastAmount;
        
      LastAmount = NewLastAmount;
    }
    else
      Size = ::ArrayResize(Ticks, 0);
    
    return(Size);
  }


Se restituisce non-zero - nuovo tick.

 
...:

L'idea di base è di usare una funzione con statica all'interno.

Per ricordare e riconciliare i tic è possibile memorizzare in ID = GetMicroSecondsCount

Grazie!

Tutto il problema è solo questo ID unico (numero di tick), che non esiste.

GetMicroSecondsCount non aiuterà, perché cambierà tra le chiamate (è per questo che è stato progettato), mentre GetTickCount, teoricamente, potrebbe non cambiare su 2 tick adiacenti.

 
fxsaber:

Il problema qui non è l'economicità, ma l'affidabilità della numerazione delle zecche. In un combattimento EA faccio così.

No, sarà sicuramente più lento di un confronto bid/ask/ms.

Qual è il problema dell'affidabilità? È solo il fatto di cambiare qualcosa che conta.

 
fxsaber:

Aggiungete qui le vostre condizioni (SL/TP ecc.).

Immediatamente si è ricordato di questo codice.

Ma il punto è solo per evitare un'inutile enumerazione di tutti gli ordini.

È chiaro che possiamo fare di questo ciclo un unico ciclo per l'intero EA. Ma in questo caso dovremmo passare alla funzione un segno di cambiamento (potremmo anche non chiamarla).

 
Andrey Khatimlianskii:

No, sarà sicuramente più lento di un confronto bid/ask/ms.

Qual è il problema dell'affidabilità? L'unica cosa che conta è che qualcosa cambi.

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

Qualsiasi domanda da PROFi a SUPER PROFi - 1.

Andrey Khatimlianskii, 2020.03.05 23:46

Il tempo (TimeCurrent) può rimanere lo stesso, il tempo in ms da SymbolInfoTick, teoricamente, anche.

Confrontare bid, ask e time in msc è costoso.

Particolarmente rilevante per MT4 dove il cambio di passo time_msc è di 1000ms.

 
Andrey Khatimlianskii:

Ma l'obiettivo è proprio quello di evitare la sovrapposizione inutile di tutti gli ordini.

È chiaro che possiamo rendere questo ciclo unico per tutta l'EA. Ma allora dobbiamo passare alla funzione un segno di cambiamento (potremmo anche non chiamarla).

Non capisco. Se qualcosa è cambiato nel database, l'unico modo per scoprirlo è confrontarlo con lo stato precedente del database.

È possibile confrontare ogni elemento di database corrispondente. Oppure si può calcolare l'hash da loro e confrontare gli hash.