Domande dai principianti MQL5 MT5 MetaTrader 5 - pagina 441

 

Potete dirmi per favore cosa sto sbagliando?

Ho bisogno di calcolare quante barre sono passate da quando il prezzo ha attraversato l'ultima MA - escludendo la barra zero.

   if(Bars>1400)
     {
      int Stop;
      double MATcycle;
      for(int i=0;i!=1000 || Stop!=1; i++)
        {
         MATcycle=iMA(Symbol(),TFT,pMAT,shiftMAT,typeMAT,priceMAT,i+1);
         if(MATcycle<High[i+1] && MATcycle>Low[i+1])
           {
            Stop=1;
            Print("MATcycle=",MATcycle," i=",i);
           }
         else return (0);
        }

 
-Aleks-:

Potete dirmi per favore cosa sto sbagliando?

Dovete contare quante barre sono passate dall'ultimo attraversamento della MA da parte del prezzo, esclusa la barra zero.

   if(Bars>1400)
     {
      int Stop;
      double MATcycle;
      for(int i=0;i<1000 || Stop==1; i++)
        {
         MATcycle=iMA(Symbol(),TFT,pMAT,shiftMAT,typeMAT,priceMAT,i+1);
         if(MATcycle<High[i+1] && MATcycle>Low[i+1])
           {
            Stop=1;
            Print("MATcycle=",MATcycle," i=",i);
           }
         else return (0);
        }

Per quanto ho capito, una volta identificato l'incrocio e impostato stop=1, c'è un'uscita immediata dal ciclo. Ok, allora devi andare oltre e ricordare il numero della candela in cui è avvenuto l'incrocio. Cioè

È più facile scriverlo da soli:

for( int i = 1; i < 1000; i++ )
{
 iMaValue = ...;   // Значение МА на i свече
 if( iMaValue < High[ i ] && iMaValue > low[ i ] )
 {
  num = i;   // Запоминаем номер свечи, на котором произошло пересечение
  break;     // Выходим из цикла
 }
}

Questo è che avete identificato il numero della candela. Se il numero = 2 e non prendere in considerazione quello attuale, allora dal momento dell'incrocio si è formata una candela (o interpretarla come si vuole).

 
Tapochun:

Per quanto ho capito, una volta identificato il crossover e impostato stop=1, c'è un'uscita immediata dal ciclo. Ok, allora devi andare oltre e ricordare il numero della candela in cui è avvenuto il crossover. Cioè

È più facile scriverlo da soli:

Questo è che avete identificato il numero della candela. Se il numero = 2 e ignora quello attuale, allora si è formata una candela dall'incrocio (bene, o interpretalo come vuoi).

Grazie, è così che ha funzionato per me


int Stop=0;
   if(Bars>1400)
     {
     
      double MATcycle;
      for(int i=1;(i!=1000 || Stop==0); i++)
        {
         MATcycle=iMA(Symbol(),TFT,pMAT,shiftMAT,typeMAT,priceMAT,i);
         if(MATcycle<=High[i] && MATcycle>=Low[i])
           {
            Print("MATcycle=",MATcycle," i=",i);
            Stop=i;
            break;
           }
        }
     }

 
alph:
Potete dirmi se si tratta di una figura realistica di tester? Ed è un risultato buono o cattivo per un anno con una deposizione di 3.000 dollari?
La risposta è semplice: la performance del tester NON è REALE se stai testando un EA. Strategy Tester è usato dai trader per controllare le prestazioni dell'ATC, o per testare le strategie manuali online.
 
-Aleks-:

Grazie, è così che ha funzionato per me


int Stop=0;
   if(Bars>1400)
     {
     
      double MATcycle;
      for(int i=1;(i!=1000 || Stop==0); i++)
        {
         MATcycle=iMA(Symbol(),TFT,pMAT,shiftMAT,typeMAT,priceMAT,i);
         if(MATcycle<=High[i] && MATcycle>=Low[i])
           {
            Print("MATcycle=",MATcycle," i=",i);
            Stop=i;
            break;
           }
        }
     }

Non dovresti scriverlo in questo modo, perché se non c'è stato alcun crossover durante le ultime 1000 barre, in primo luogo, il ciclo continuerà, e in secondo luogo, potrebbe andare in loop/errore, perché se la storia finisce e non c'è alcun crossover, non ci sarà alcuna uscita dal ciclo, perché Stop = 0. È meglio scriverlo come ho detto sopra.

 
Tapochun:

Non dovresti scriverlo in questo modo, perché se non c'è stato alcun crossover durante le ultime 1000 barre, in primo luogo, il ciclo continuerà, e in secondo luogo, potrebbe andare in loop/errore, perché se la storia finisce e non si verifica alcun crossover, non ci sarà alcuna uscita dal ciclo, perché Stop = 0. È meglio scriverlo come ho detto sopra.

Il segno "o" non funziona - secondo l'espressione, il ciclo o sarà superato di 1000 battute o terminerà non appena il risultato richiesto è stato trovato. O sarà finita prima di 1000 barre se il risultato richiesto, cioè l'attraversamento della MA, sarà raggiunto?
 
-Aleks-:
Il segno "o" non funziona - la condizione dice che o raggiunge 1000 barre o finisce non appena si trova il risultato desiderato. O sarà finita prima di 1000 barre, se il risultato desiderato, cioè l'attraversamento della MA?
|| significa che se almeno una delle condizioni tra le parentesi è vera, il ciclo si ripeterà. Quindi, anche quando i >= 1000, ma stop = 0, il ciclo continuerà e i continuerà ad aumentare, il che causerà valori MA errati (nel caso in cui vada fuori dalla storia). E l'operatore break è responsabile della terminazione del ciclo quando si trova il risultato desiderato;
 
Tapochun:
|| significa che se almeno una delle condizioni tra parentesi è vera, il ciclo sarà ripetuto, quindi, anche quando i >= 1000, ma stop = 0, il ciclo continuerà, i continuerà ad aumentare, il che causerà un valore MA sbagliato (nel caso ci sia un outlier nella storia). E l'operatore break è responsabile della terminazione del ciclo dopo aver trovato il risultato desiderato;
Capito, grazie per il chiarimento! Pensavo che una delle condizioni fosse sbagliata e che il ciclo si sarebbe fermato...
 

Ciao 2015.09.19_02:13AM MSC. Nella funzione ArrayResize() il compilatore scrive comunque

di fronte alla dimensione dell'array -- virgola prevista, che si scriva int o no. Se non si scrive int, dice: "-.

L'ho cambiata senza tipo. E ho rimosso il riferimento & e le parentesi quadre - ha funzionato!
Avvertenze: quando è stato scritto normalmente, -- il compilatore ha scritto: nasconde l'identificatore

dichiarazione di livello globale. Ma quando ho rimosso la dichiarazione degli identificatori a livello globale, - ha scritto

scrive: "Errore, identificatore non dichiarato. E ho cambiato gli array High[] e Low[] in HighP[] e LowP[]. Non

aiutato. Il compilatore scrive la stessa cosa. 02:27 MSC. Allego un file di screenshot.

 
Николай Никитюк:

Ciao 2015.09.19_02:13AM MSC. Nella funzione ArrayResize() il compilatore scrive comunque

di fronte alla dimensione dell'array -- virgola prevista, che si scriva int o no. Se non si scrive int, dice: "-.

"senza tipo. E ho rimosso il riferimento & e le parentesi quadre - mi ha aiutato!
Avvertenze: quando è stato scritto normalmente, -- il compilatore ha scritto: nasconde l'identificatore

dichiarazione di livello globale. E quando ho rimosso la dichiarazione degli identificatori a livello globale, - ha scritto

scrive: "Errore, identificatore non dichiarato. E ho cambiato gli array High[] e Low[] in HighP[] e LowP[]. Non

aiutato. Il compilatore scrive la stessa cosa. 02:27 MSC. Sto allegando il file dello screenshot.

  1. Le immagini devono essere inserite così:Forum: come inserire un'immagine
  2. Non leggi per niente quello che ti viene consigliato?

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

    Domande dai principianti

    Karputov Vladimir, 2015.09.17 18:46

    1. Scrittura errata di ArrayResize. Dovrebbe essere così:
      //--- устанавливаю размеры массивов с запасом (reserve)
      ArrayResize(mrate,16,9);
      ArrayResize(maVal,16,9);
      ArrayResize(fVal,3,2);
      ArrayResize(zVal,3);
    2. E l'impostazione del flag della serie temporale per l'array sarà così:
      //--- массив максимальных цен баров
      ArraySetAsSeries(High,true);
      //---  
      ArraySetAsSeries(Low,true);