Caratteristiche del linguaggio mql5, sottigliezze e tecniche - pagina 133

 
Alexey Viktorov:
Perché?
già provato
 
Nikolai Semko:
già provato

Ma qui

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

Peculiarità di mql5, consigli e trucchi

Nikolai Semko, 2019.04.03 22:33

Sì, grazie Alexey. Avevo dimenticato questa caratteristica. L'ho visto prima, ma non l'ho mai usato.

Provato. Qualcosa sta andando storto. Si cancella poi si cancella, ma dopo averla cancellata, tutto si ferma.

Ho semplicemente aggiunto una linea di codice alla funzione DrawSetup() prima del calcolo dell'indicatore con i seguenti parametri.

IndicatorRelease(handle);
handle=iMA(_Symbol,_Period,per1,0,MaMethod,PriceBase);
for(int i=0;i<N;i++) handle=iMA(_Symbol,_Period,per2,0,MaMethod,handle);

L'indicatore semplicemente smette di funzionare e non sono ancora in grado di capirne il motivo.

Sono assolutamente d'accordo con te. È solo un giocattolo inutile.


Non è affatto così.
 
Alexey Viktorov:

Ma qui


non è affatto così.
Ho già provato, ma ho cancellato il codice da me stesso come non riuscito.
 
Potresti anche provare a rilasciare tutti i volantini in una catena, iniziando dal più profondamente sepolto.
 
Andrey Khatimlianskii:
Potete anche provare a rilasciare tutte le maniglie di una catena, cominciando da quella più profondamente sepolta.

Beh, non funziona. Oppure, se funziona, vengono applicati dei freni.

void BuildMaFromMa()
  {
   static int h[];
   for(int i=0;i<ArraySize(h);i++) IndicatorRelease(h[i]);
   handle=iMA(_Symbol,_Period,per1,0,MaMethod,PriceBase);
   ArrayResize(h,N);
   if (N>0) h[0]=handle; 
   for(int i=0;i<N;i++)
     {
      handle=iMA(_Symbol,_Period,per2,0,MaMethod,handle);
      h[i]=handle;
     }
  }

Se si documenta la linea conIndicatorRelease, allora tutto funziona bene, ma altrimenti ci sono dei freni e non capisco cosa stia succedendo.

File:
 

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

Indicatori: MaFromMa

Nikolai Semko, 2019.04.04 01:00

Volevo confrontare le prestazioni della ricorsione e dell'iterazione.

Si scopre che la ricorsione è più del doppio più veloce...

Probabilmente perché lo stack è più veloce...

È una cosa incredibile. Mi aspettavo l'effetto opposto. ))

#define  size 1000000
uint sum1=0,sum2=0;
int i;
int X[];
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void OnStart()
  {
   ArrayResize(X,size);
   for(i=0;i<size;i++) X[i]=rand();

   ulong t=GetMicrosecondCount();
   i=0;
   while(i<size) { sum1+=X[i]; i++;}
//Recursion();
   ulong t1=GetMicrosecondCount()-t;

   t=GetMicrosecondCount();
   i=0;
//while(i<size) { sum1+=X[i]; i++;}
   Recursion();
   ulong t2=GetMicrosecondCount()-t;
   Print("время выполнения цикла    = "+string(t1)+" , контрольная сумма = "+string(sum1));
   Print("время выполнения рекурсии = "+string(t2)+" , контрольная сумма = "+string(sum2));
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void Recursion()
  {
   sum2+=X[i];
   i++;
   if(i<size) Recursion();
  }
//+------------------------------------------------------------------+
2019.04.03 19:06:40.776 TestLoopVsRecursion (EURUSD,M1) время выполнения цикла    = 1667 , контрольная сумма = 3510404212
2019.04.03 19:06:40.776 TestLoopVsRecursion (EURUSD,M1) время выполнения рекурсии = 697 , контрольная сумма = 3510404212
2019.04.03 19:06:41.697 TestLoopVsRecursion (EURUSD,M1) время выполнения цикла    = 1653 , контрольная сумма = 3492310620
2019.04.03 19:06:41.697 TestLoopVsRecursion (EURUSD,M1) время выполнения рекурсии = 699 , контрольная сумма = 3492310620
2019.04.03 19:06:42.549 TestLoopVsRecursion (EURUSD,M1) время выполнения цикла    = 1529 , контрольная сумма = 3510953577
2019.04.03 19:06:42.549 TestLoopVsRecursion (EURUSD,M1) время выполнения рекурсии = 696 , контрольная сумма = 3510953577
2019.04.03 19:06:43.332 TestLoopVsRecursion (EURUSD,M1) время выполнения цикла    = 1559 , контрольная сумма = 3512212419
2019.04.03 19:06:43.332 TestLoopVsRecursion (EURUSD,M1) время выполнения рекурсии = 698 , контрольная сумма = 3512212419
2019.04.03 19:06:44.098 TestLoopVsRecursion (EURUSD,M1) время выполнения цикла    = 1707 , контрольная сумма = 3497178596
2019.04.03 19:06:44.098 TestLoopVsRecursion (EURUSD,M1) время выполнения рекурсии = 472 , контрольная сумма = 3497178596
2019.04.03 19:06:44.839 TestLoopVsRecursion (EURUSD,M1) время выполнения цикла    = 2088 , контрольная сумма = 3485051380
2019.04.03 19:06:44.839 TestLoopVsRecursion (EURUSD,M1) время выполнения рекурсии = 482 , контрольная сумма = 3485051380
2019.04.03 19:06:45.538 TestLoopVsRecursion (EURUSD,M1) время выполнения цикла    = 1612 , контрольная сумма = 3487817581
2019.04.03 19:06:45.538 TestLoopVsRecursion (EURUSD,M1) время выполнения рекурсии = 448 , контрольная сумма = 3487817581
2019.04.03 19:06:46.397 TestLoopVsRecursion (EURUSD,M1) время выполнения цикла    = 1742 , контрольная сумма = 3475121003
2019.04.03 19:06:46.397 TestLoopVsRecursion (EURUSD,M1) время выполнения рекурсии = 497 , контрольная сумма = 3475121003
2019.04.03 19:06:47.262 TestLoopVsRecursion (EURUSD,M1) время выполнения цикла    = 1701 , контрольная сумма = 3485556615
2019.04.03 19:06:47.262 TestLoopVsRecursion (EURUSD,M1) время выполнения рекурсии = 701 , контрольная сумма = 3485556615

 

Avete una funzione di calcolo dei lotti provata e affidabile per MT5, senza stop loss?

Condividi...

 
Durante l'ottimizzazione, si può incontrare il seguente messaggio nel log del Tester
Tester  OnTesterInit failed. Optimization cannot be started.


È quasi impossibile capire la causa da questo messaggio, poiché non c'è alcun riferimento al log del terminale. È qui che dovete cercare la causa.


Ecco un esempio di un tale EA

input int Range = 0; // 1..9

int Tmp = 1 / Range;

void OnTesterDeinit() {}

double OnTester()
{
  return(Tmp);
}


L'Expert Advisor ottimizza in un intervallo in cui Range non raggiunge lo zero. Ma allo stesso tempo, l'ottimizzazione fallisce.

La ragione è che la modalità Frame di Expert Advisors è sempre lanciata con i parametri di input rigidamente prescritti in EX5. In questo caso, la modalità Frame risulta in unadivisione per zero.

Se OnTesterDeinit viene rimosso dal codice sorgente, l'ottimizzazione verrà eseguita senza problemi.


Sarebbe bello se il TesterJournal in queste situazioni avesse un riferimento al TerminalJournal. Altrimenti non è sempre possibile capire (il debug non è disponibile durante Optimization), cosa sta succedendo.

 

Si può incontrare una situazione in cui gli EA non partono su un grafico.

Sulla sinistra c'è il solito cursore quando si trascina un EA su un grafico. Sulla destra c'è il nostro caso.


Non ci saranno voci nel registro. In generale, il cursore a barre è l'unico identificatore visivo di questi grafici.


Se si salva il modello tpl, questi grafici saranno distinti da una singola linea

tester=1

Questa è probabilmente l'unica opzione programmatica per identificare il tipo di grafico. È un grafico a fotogrammi.


Quindi, se vuoi proteggerti dal trading automatico, puoi lavorare solo con questi grafici.

 

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

Bug, bug, domande

Nikolai Semko:

La formula dello strumento sintetico dà errore "Unknown parsing error" se il nome del simbolo inizia con (o contiene) un punto.

Slava, 2019.04.19 06:08

Se il nome di un carattere contiene un punto, un trattino o qualcos'altro che non si capisce (che ne dite di "RTS-12.19"?), allora il nome deve essere circondato da apostrofi

Motivazione: