Caratteristiche del linguaggio mql5, sottigliezze e tecniche - pagina 97

 
Artyom Trishkin:

Quindi c'era già una sorta di soluzione nella KB:

Ma non per la sceneggiatura. Ed è abbastanza difficile per EA, perché suggerisce di uscire da OnTick in caso di situazione indefinita. E questa situazione potrebbe accadere da qualche parte nel profondo dell'Expert Advisor. E non solo dovremo uscire da lì, per uscire da OnTick, ma potrebbe essere necessario aprire, per esempio, due posizioni contemporaneamente (a la cart). Ma il secondo dovrebbe essere aperto solo se il primo è stato aperto con successo. In questo caso, essere sbattuti fuori da OnTick dopo il primo OrderSend, per dirla tutta, non va bene.

 
fxsaber:

Ma non per la sceneggiatura. Ed è abbastanza difficile per l'EA, perché viene suggerito di uscire da OnTick in una situazione non definita. E questa situazione potrebbe accadere da qualche parte nelle viscere di Expert Advisor. E non solo dovremo uscire da lì, per uscire da OnTick, ma potrebbe essere necessario aprire, per esempio, due posizioni contemporaneamente (a la cart). Ma il secondo dovrebbe essere aperto solo se il primo è stato completato con successo. In questo caso, essere sbattuti fuori da OnTick dopo il primo OrderSend, per dirla tutta, non va bene.

Lo script può rallentare fino al numero esplicito di posizioni.

Consulente esperto... In un EA, dobbiamo considerare questo nella logica delle funzioni di apertura delle posizioni - sono chiamate dall'EA con la restituzione del risultato del loro lavoro. Il risultato dell'ordine di mercato viene restituito a false. E poi l'EA lavorerà secondo la sua logica. Sì, sono d'accordo che è più difficile da implementare in alcuni EA già pronti che considerare immediatamente tali probabilità. Ma questo è il motivo per cui il ramo è qui - per far sapere agli altri e usare la conoscenza.

 
Artyom Trishkin:

Lo script può essere rallentato fino alla ricezione di un numero esplicito di posizioni.

Potete anche rallentare l'Expert Advisor.

Il consulente esperto... Nell'Expert Advisor, dovremo considerare questo nella logica della funzione di apertura delle posizioni - sono chiamate dall'EA con la restituzione del risultato del loro lavoro. Il risultato viene restituito falso se c'è un ordine a mercato. E poi l'EA lavorerà con la logica insita in esso. Sì, sono d'accordo che è più difficile da implementare in alcuni EA già pronti che considerare immediatamente tali probabilità. Ma è a questo che serve il ramo: far sapere agli altri e usare la conoscenza.

Devi solo aspettare un po' di tempo fino a quando il commercio passa. Uscire dal TS fino al prossimo tick è una decisione terribile.

 
fxsaber:

Puoi anche rallentare il consulente.

Devi solo aspettare un po' che il commercio sia passato. Uscire dal TS fino al prossimo tick è una decisione raccapricciante.

Bene, in quel codice, l'attesa del tempo stabilito è appena fatta. Ma non si può aspettare per ore - aspetta per un certo tempo un dato numero di tentativi per ottenere un ambiente valido, poi esce con il risultato. Altrimenti, se si aspetta molto tempo, l'ambiente di trading può cambiare molto, ed è troppo tardi per bere il borjomi :)

//+------------------------------------------------------------------+
//| Заполняет массивы тикетов позиций                                |
//+------------------------------------------------------------------+
bool FillingListTickets(const uint number_of_attempts)
  {
//--- Проверка состояния окружения
   int n=0,attempts=int(number_of_attempts<1 ? 1 : number_of_attempts);
   while(IsUncertainStateEnv(symb,InpMagic) && n<attempts && !IsStopped())
     {
      n++;
      Sleep(sleep);
     }
   if(n>=attempts && IsUncertainStateEnv(symb,InpMagic))
     {
      Print(__FUNCTION__,": Uncertain state of the environment. Please try again.");
      return false;
     }
//---
 
Artyom Trishkin:

Beh, quel codice aspetta una quantità di tempo stabilita, ma non si può aspettare per ore - aspetta un numero stabilito di tentativi per ottenere un ambiente valido. Ma non si può aspettare per ore - aspetta un po' di tempo per il numero specificato di tentativi per ottenere un ambiente valido, poi esce con il risultato. Altrimenti, se si aspetta molto tempo, l'ambiente di trading può cambiare molto, ed è troppo tardi per bere il borjomi :)

Sì, non ho notato l'attesa. Questo andrà bene. Allora ero molto più attento.

 

Imho, concentrarsi suPositionsTotal() è una decisione sbagliata in ogni caso. Durante l'elaborazione della tua richiesta, un'altra posizione potrebbe aprirsi/chiudersi sul conto, per esempio, se diversi EA stanno lavorando. Cosa ti impedisce di controllare la risposta del server, come è stato progettato dagli sviluppatori?

In effetti, non vedo molto senso in PositionsTotal, se non per il controllo generale. Un EA dovrebbe chiaramente controllare i tick delle sue posizioni e lavorare solo su di essi.

 

Dopo aver utilizzato ChartIndicatorGet() la funzione IndicatorRelease(handle) deve necessariamente essere chiamata. È scritto nell'esempio della funzione ChartIndicatorGet(), ma non nella nota della funzione! Gli sviluppatori volevano correggere la documentazione, ma non l'hanno fatto. A causa della chiusura della SD, questo probabilmente non sarà mai fatto.

Personalmente ho incontrato il problema di un indicatore "appeso". Dal parlare con la SD:

Ah, cioè, quando avvio l'indicatore X sul grafico, ha cercato tra tutti gli indicatori e ne hatrovato una copia usando lafunzioneChartIndicatorGet()- ha incrementato il contatore. Ho cancellato il primo indicatore X - contatore decrementato, ma ho dimenticato il secondo - ha l'indicatore "appeso", perché il suo manico non è stato pulito?

Sì, è esattamente così che funziona. Pertanto OnDeinit non funziona.

 

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

Come importare i dati storici in csv al simbolo personalizzato usando CustomRatesUpdate?

fxsaber, 2018.08.19 12:01

// Sets the maximum size of an array.
template <typename T>
int ArrayResize( T &Array[] )
{
  int MinSize = ArraySize(Array);
  int MaxSize = INT_MAX;
  int AvgSize;
  
  while ((MinSize < MaxSize - 1) && !IsStopped())
  {
    AvgSize = (int)((MinSize + (long)MaxSize) >> 1);        
    
//    ArrayFree(Array);
    
    if (ArrayResize(Array, (int)AvgSize) == AvgSize)
      MinSize = AvgSize;
    else
      MaxSize = AvgSize;
  }
  
  return(ArrayResize(Array, MinSize));
}
 
La parte inglese del forum ha mostrato
// Обмен значениями между двумя числовыми переменными
#define  SWAP(A, B) { A += B; B = A - B; A -= B; }
 
fxsaber:
La parte inglese del forum ha mostrato

Per risparmiare qualche byte di memoria? Inoltre, con il doppio si ottengono numeri diversi (== sarà falso) e gli interi possono traboccare.

Motivazione: