Quando ha senso mantenere parte del codice del robot in un indicatore? - pagina 33

 

Un discorso zelo utile...

E conoscendo la risorsa e il potenziale dei partecipanti, propongo provocatoriamente di misurare la velocità e la 'non glottabilità' dei tic in:

1) Sovnig

2) script ciclico in esecuzione ad una frequenza di 1 millisecondo

3) indotto

4) un ricevitore DDE di terzi.

Per gli adepti neofiti, come me, sarà anche utile.

;)

 

Alla fine della serata:

File:
experts.zip  1 kb
 

Vorrei aggiungere i miei due centesimi:

La performance degli Expert Advisors con il codice dell'indicatore interamente inserito nell'EA è spesso circa tre volte più veloce di quella delle loro controparti che chiamano indicatori personalizzati. Questo è vero per le varianti con calcoli di indicatori molto pesanti. Se questi calcoli sono molto leggeri, non ci sarà alcuna differenza. L'indicatore EMA ha un calcolo troppo primitivo per usarlo per tali misure. In alcuni dei miei recenti articoli su questo sito ho anche presentato una variante dell'Expert Advisor con un indicatore di calcolo molto pesante della JMA. La versione con il codice senza chiamate di indicatori è tre volte più veloce.

Personalmente non ho alcun desiderio di dimostrare nulla a nessuno; traggo solo le mie conclusioni, che ho visto con i miei occhi e non una volta; anche se, naturalmente, non faccio questo tipo di cose per sempre, e può essere che le ultime build di MT4 abbiano fatto apparire questo quadro in qualche modo diverso. E anche in MT5 all'inizio era assolutamente lo stesso. Ma non tengo traccia di questi dettagli e quindi non posso affermare che sia lo stesso ora.

 

GODZILLA:

In alcuni dei miei recenti articoli su questo sito ho anche postato una variante dell'Expert Advisor con un indicatore di calcolo molto pesante di JMA. La variante con codice senza chiamate di indicatori funziona tre volte più velocemente.

Qui? La conclusione è semplice, ci sono 3 possibilità:

1. il codice senza chiamate di indicatori è scritto male, il che è improbabile.

2. l'indicatore è scritto in modo inefficace.

3. Le cifre indicate non riflettono la realtà.

 
GODZILLA:

Vorrei aggiungere i miei due centesimi:

La performance degli Expert Advisors con il codice dell'indicatore interamente inserito nell'EA è spesso circa tre volte più veloce di quella delle loro controparti che chiamano indicatori personalizzati. Questo è vero per le varianti con calcoli di indicatori molto pesanti. Se questi calcoli sono molto leggeri, non ci sarà alcuna differenza. L'indicatore EMA ha un calcolo troppo primitivo per usarlo per tali misure. In alcuni dei miei recenti articoli su questo sito ho anche presentato una variante dell'Expert Advisor con un indicatore di calcolo molto pesante della JMA. La variante senza chiamate di indicatori è tre volte più veloce.

Personalmente non ho alcun desiderio di dimostrare nulla a nessuno; traggo solo le mie conclusioni, che ho visto con i miei occhi e non una volta; anche se, naturalmente, non faccio questo tipo di cose per sempre, e può essere che le ultime build di MT4 abbiano fatto apparire questo quadro in qualche modo diverso. E anche in MT5 all'inizio era assolutamente lo stesso. Ma non tengo traccia di questi dettagli e quindi non posso affermare che sia lo stesso ora.


Non essere ridicolo. Semplicemente non hai ancora imparato a scrivere indicatori.

Dopo tale eresia:

//---- ЭМУЛЯЦИЯ ИНДИКАТОРНЫХ БУФЕРОВ
  int NewSize = iBars(symbol, timeframe);
  //----  Проверка на смену нулевого бара
  if(ArraySize(Ind_Buffer0) < NewSize)
    {
      //---- Установить прямое направление индексирования в массиве 
      ArraySetAsSeries(Ind_Buffer0, false);
      ArraySetAsSeries(Ind_Buffer1, false);
      ArraySetAsSeries(Ind_Buffer2, false);
      //---- Изменить размер эмулируемых индикаторных буферов 
      ArrayResize(Ind_Buffer0, NewSize); 
      ArrayResize(Ind_Buffer1, NewSize); 
      ArrayResize(Ind_Buffer2, NewSize); 
      //---- Установить обратное направление индексирования в массиве 
      ArraySetAsSeries(Ind_Buffer0, true);
      ArraySetAsSeries(Ind_Buffer1, true);
      ArraySetAsSeries(Ind_Buffer2, true); 
    } 
//----

avresti potuto astenerti del tutto dalla tua opinione in questo thread.

 

Idea sbagliata #1: si può fare a meno di IndicatorCounted()

Un indicatore con esso:

#property indicator_chart_window
#property indicator_buffers 1
#property indicator_color1 Red

extern double Alpha = 0.9;

double EMA[];

int init()
{
   SetIndexBuffer(0, EMA);
   return(0);
}

int start()
{
   int toCount = MathMin(Bars - 1, Bars - IndicatorCounted());
   if (toCount == Bars - 1) EMA[Bars - 1] = Open[Bars - 1];
   for(int i = toCount - 1; i >= 0; i--)
   {
      EMA[i] = (1 - Alpha)*Open[i] + Alpha*EMA[i + 1];
   }
   return(0);
}

Senza di esso, secondo il principio di hrenfx

#property indicator_chart_window
#property indicator_buffers 1
#property indicator_color1 Yellow

extern double Alpha = 0.9;

double EMABuffer[];

double GetPrice( int Shift )
{
  return(Open[Shift]);
}

double EMA;

int init()
{
   EMA = GetPrice(Bars - 1);

   SetIndexBuffer(0, EMABuffer);
   return(0);
}

double GetEMA()
{
   static int PrevTime = 0;

   if (PrevTime == Time[0])
      return(EMA);

   int i = iBarShift(Symbol(), Period(), PrevTime) - 1;

   PrevTime = Time[0];
   while (i >= 0)
   {
      EMA = EMA * Alpha + (1 - Alpha) * GetPrice(i);
      EMABuffer[i] = EMA;
      i--;
   }
   return(EMA);
}

void start()
{
  GetEMA();
}

Poi applichiamo gli indici al grafico ed emuliamo la perdita di connessione mentre l'automa è in funzione. Risultato:


 

Sì, anche io ho fatto qualche ricerca sull'argomento. Certo, è davvero una stronzata fare casino con le stronzate degli sviluppatori della piattaforma, ma non importa.

Hai trasformato il mio EA in un indicatore. Come te, ero sicuro 24 ore fa che l'indicatore di Expert Advisor e l'indicatore di EA semplice devono mostrare gli stessi risultati, perché entrambi sono attivati su tick. Ma si innescano in modo diverso. Il primo tick dopo l'apparizione del collegamento non è lo stesso per l'EA e per l'indicatore tratto dall'EA. Potete controllare voi stessi.

Lo screenshot qui sopra mostra che l'EA (non l'indicatore dell'EA) viene confrontato con iCustom dopo la rottura della connessione. L'interruzione della comunicazione avviene senza problemi.

 

Presumo che al primo tick dopo un'interruzione della connessione, l'indicatore non si attivi immediatamente. Per essere più precisi, l'indicatore attende che la funzione IndicatorCounted() venga eseguita. Ma questa funzione può essere eseguita (a seconda della connessione) fino a diversi secondi. Cioè, ecco lo schema:

  1. Prima spunta dopo un errore di connessione.
  2. L'indicatore è partito.
  3. IndicatorCounted() viene eseguito (sembra che subito dopo l'avvio dell'indicatore, anche se IndicatorCounted() non è presente nel corpo dell'indicatore) per qualche tempo.
  4. Dopo aver ricevuto il risultato, l'ambiente di trading viene aggiornato.
  5. E l'indicatore inizia ad eseguire il suo codice come se fosse iniziato non al primo tick, ma all'ultimo tick prima del risultato di IndicatorCounted().

P.S. Test sulla build 226.

 
Si scopre che per l'assoluta affidabilità degli EA "all in one" dovremmo fare una chiamata iniziale dell'indicatore Empty e RefreshRates() proprio all'inizio della funzione. Questo garantirà il caricamento della storia (dopo la pausa) e l'esecuzione dell'EA sul primo tick, corrispondente alla storia già caricata.
 
hrenfx:
Si scopre che per l'assoluta affidabilità degli EA "all in one" dovremmo fare una chiamata iniziale dell'indicatore Empty e RefreshRates() proprio all'inizio della funzione. Questo garantirà il caricamento della storia (dopo la pausa) e l'esecuzione dell'EA sul primo tick, corrispondente alla storia già caricata.


E puoi postare le ricerche e i controlli su questa ipotesi?

hmmm... Se è così, e dà una garanzia di carico, allora è un'ottima opzione.

Ho visto un thread di ForexTools in cui non c'era soluzione al problema di scambiare la cronologia al momento di avviare il terminale e l'Expert Advisor.


Motivazione: