Tutte le domande dei nuovi arrivati su MQL4 e MQL5, aiuto e discussione su algoritmi e codici - pagina 242

 
Youri Lazurenko:

Non riesco a risolvere un problema apparentemente semplice. Da qualche parte sul grafico c'era un incrocio di MA. Troviamo un bar dopo la traversata. Come faccio a calcolare il numero di barre da quella barra alla barra attuale?

Il numero di quella particolare barra. No?
 
Youri Lazurenko:

Non riesco a risolvere un problema apparentemente semplice. Da qualche parte sul grafico c'era un incrocio di MA. Troviamo un bar dopo la traversata. Come faccio a calcolare il numero di barre da questa barra a quella attuale?


Sembra fatto (almeno il commento sullo schermo è corretto). Grazie al"numero di barre" penso di aver trovato la soluzione. Uso la funzione iTime per determinare il datetime della barra necessaria. Lo schizzo si presenta così:

void OnTick()

{

int nBarsUp, nBarsDn;

datetime date_dn = iTime(NULL, 0, IntersectionDN());

datetime date_up = iTime(NULL, 0, IntersectionUp());

datetime date_1 = iTime(NULL, 0, 1);

nBarsUp = Bars(Symbol(), 0, date_up, date_1);

nBarsDn = Bars(Symbol(), 0, date_dn, date_1);

Commento("Numero di barre lunghe: " + nBarsUp + "\n "+ "Numero di barre corte: " + nBarsUp + "\n")

"Numero di barre corte:" + nBarsDn);

}

//+------------------------------------------------------------------+

int IntersezioneDN()

{

for(int i = 0; i < 36; i++)

{

se(iMA(Symbol(), 0, 5, 0, MODE_EMA, PRICE_CLOSE, i) > iMA(Symbol(), 0, 21, 0, MODE_EMA, PRICE_CLOSE, i)

&& iMA(Symbol(), 0, 5, 0, MODE_EMA, PRICE_CLOSE, i-1) < iMA(Symbol(), 0, 21, 0, MODE_EMA, PRICE_CLOSE, i-1))

ritorno(i-1);

}

ritorno(-1);

}

int IntersezioneSu()

{

for(int i = 0; i < 36; i++)

{

if(iMA(Symbol(), 0, 5, 0, MODE_EMA, PRICE_CLOSE, i) < iMA(Symbol(), 0, 21, 0, MODE_EMA, PRICE_CLOSE, i)

&& iMA(Symbol(), 0, 5, 0, MODE_EMA, PRICE_CLOSE, i-1) > iMA(Symbol(), 0, 21, 0, MODE_EMA, PRICE_CLOSE, i-1))

ritorno(i-1);

}

ritorno(-1);

}

 
Youri Lazurenko:

Sembra aver funzionato (almeno il commento sullo schermo è corretto). Grazie al"numero di barre", penso di aver trovato una soluzione. Ho usato la funzione iTime per determinare il datetime della barra desiderata. Lo schema si presenta così:

void OnTick()

{
   int nBarsUp, nBarsDn;
   datetime date_dn = iTime(NULL, 0, IntersectionDN());
   datetime date_up = iTime(NULL, 0, IntersectionUp());
   datetime date_1  = iTime(NULL, 0, 1);
  
   nBarsUp = Bars(Symbol(), 0, date_up, date_1);
   nBarsDn = Bars(Symbol(), 0, date_dn, date_1); 
   
   Comment("Количество длинных баров: " + nBarsUp + "\n"+
           "Количество коротких баров: " + nBarsDn);     
}

//+------------------------------------------------------------------+

int IntersectionDN()

{
   for(int i = 0; i < 36; i++)
   {
      if(iMA(Symbol(), 0, 5, 0, MODE_EMA, PRICE_CLOSE, i) > iMA(Symbol(), 0, 21, 0, MODE_EMA, PRICE_CLOSE, i)
         && iMA(Symbol(), 0, 5, 0, MODE_EMA, PRICE_CLOSE, i-1) < iMA(Symbol(), 0, 21, 0, MODE_EMA, PRICE_CLOSE, i-1))
         return(i-1);
   }  
   return(-1);
}

int IntersectionUp()
{
   for(int i = 0; i < 36; i++)
   {
      if(iMA(Symbol(), 0, 5, 0, MODE_EMA, PRICE_CLOSE, i) < iMA(Symbol(), 0, 21, 0, MODE_EMA, PRICE_CLOSE, i)
         && iMA(Symbol(), 0, 5, 0, MODE_EMA, PRICE_CLOSE, i-1) > iMA(Symbol(), 0, 21, 0, MODE_EMA, PRICE_CLOSE, i-1))
         return(i-1);
   } 
   return(-1);  

}

State cercando un crossover nel loop. E da zero bar in profondità nella storia. Quindi la vostra funzione IntersezioneXX() restituisce il numero della barra.

A cosa serve tutto questo?

int nBarsUp, nBarsDn;
   datetime date_dn = iTime(NULL, 0, IntersectionDN());
   datetime date_up = iTime(NULL, 0, IntersectionUp());
   datetime date_1  = iTime(NULL, 0, 1);
  
   nBarsUp = Bars(Symbol(), 0, date_up, date_1);
   nBarsDn = Bars(Symbol(), 0, date_dn, date_1); 
 
Artyom Trishkin:

State cercando un crossover nel loop. E dal bar zero al fondo della storia. Quindi IntersezioneXX() restituisce il numero della barra.

A cosa serve tutto questo?


Il numero del bar, sì. Ma ho bisogno di sapere il numero di barre - da questa barra in profondità nella storia fino alla barra zero. In breve, ho bisogno dell'angolo di inclinazione della barra dal MA. Ma poiché non può essere calcolato come mi sembra (prezzo sulla linea verticale e barre sulla linea orizzontale poste a una certa distanza l'una dall'altra - sono valori incompatibili). C'era una volta un suggerimento sul forum di introdurre un coefficiente - la differenza di prezzo divisa per il numero di barre. L'idea mi sembra ragionevole. Voglio metterlo in pratica, ma siccome io stesso sono un tonto, cerco di trovare qualcosa e di provarlo da solo per tentativi ed errori.

P.S. Come inserire il codice in MQL4 (come il tuo, non come il mio)?
 

Qualcuno sa come affrontare questo problema?


Dopo aver cambiato il TF, il pannello è deformato

 
Youri Lazurenko:

Il numero di barre, sì. Ma ho bisogno di sapere il numero di barre - da questa qualche barra in fondo alla storia fino alla 0a barra. In breve, ho bisogno dell'angolo della barra dal MA. Ma poiché non può essere calcolato, mi sembra (prezzo sulla linea verticale e barre sulla linea orizzontale poste a una certa distanza l'una dall'altra - sono valori incompatibili). C'era una volta un suggerimento sul forum di introdurre un coefficiente - la differenza di prezzo divisa per il numero di barre. L'idea mi sembra ragionevole. Voglio metterlo in pratica, ma essendo io stesso un dummies, cerco di trovare qualcosa e provare da solo per tentativi ed errori.

P.S. Come inserire il codice in MQL4 (come lo avete voi, non come lo ho io)?
Se questa è la decima barra, come faccio a sapere la differenza tra la decima e la zero barra? 10-0=10
E a cosa serve la sottrazione?

 

Ciao, i duenumerimenoq e wsono confrontati in modo errato, quando sono uguali, l'operatore if pensa che uno sia maggiore dell'altro. Quando q = -0,0002 e w è anche -0,0002, res12=falso, perché?

 

Ciao, i duenumerimenoq e wsono confrontati in modo errato, quando sono uguali, l'operatore if pensa che uno sia maggiore dell'altro, qual è l'errore? Quando q = -0,0002 e w è anche -0,0002, res12=falso, perché?

static bool res12=true;

start()
{   

double SPREAD=MarketInfo(Symb,MODE_SPREAD);// Спред

   double q=High[0]-3.0*Point-High[1];
   double w=-SPREAD*Point;
      
   if (New_Bar==true&&ticket1<=0)
     {
      if(q>w)
       {
        res12=false; 
        Alert("res12=false");
        Alert (q);
        Alert (w);
       }
     }
      if (New_Bar==true&&ticket1<=0)
     {
        if(q<=w)
        {
         res12=true;
         Alert("res12=true");
         Alert (q);
         Alert (w);
        }
      }





}
 
Jenya77769:

Ciao, i duenumerimenoq e wsono confrontati in modo errato, quando sono uguali, l'operatore if pensa che uno sia maggiore dell'altro. Quando q = -0,0002 e w è anche -0,0002, res12=falso, perché?


Penso che abbiamo bisogno di normalizzare e questo è tutto, non si possono confrontare i doppi tra loro senza normalizzazione.

se NormalizeDouble (q<=w)
 
Vyacheslav Kornev:

Penso che ho bisogno di normalizzare e questo è tutto, poiché non è possibile confrontare il doppio tra loro senza la normalizzazione.


Grazie, ha funzionato, solo che ho normalizzato q e w separatamente!

if(NormalizeDouble(q,4)> NormalizeDouble(q,4))
Motivazione: