Domande dai principianti MQL5 MT5 MetaTrader 5 - pagina 589

 
admoon:



Controllando l'indicatore passo dopo passo, ho trovato un rimbalzo nella subroutine dietro il if {} e in cui non c'è W. Ecco un codice semplificato per chiarire il punto:

//--- parametri di ingresso

input int w=10;

//---

{

int i;

//---

int co=0;

for(i=0;i<=w;i++)if(w==10){co++; Alert(co);}

//--- restituire il valore di prev_calculato per la prossima chiamata

return(rates_total);

}

Risultato (arlet):

2016.05.30 00:45:14.064 1 (EURUSD,H1) 11

2016.05.30 01:10:35.972 1 (EURUSD,H1) 10

........... ecc. a 1.

2016.05.30 00:45:14.064 1 (EURUSD,H1) 1

Regola: se l'espressione tra parentesi è vera, allora l'operatore1 viene eseguito.

Nel codice: l'operatore1 viene eseguito SEMPRE.

Penso che if() dovrebbe funzionare solo una volta quando la condizione tra parentesi è vera. Ma in realtà avviene ad ogni controllo, quindi tutte le espressioni in {} vengono eseguite ad ogni passo e masticano il tempo della macchina.

Domande: PERCHE' la variabile CO è cresciuta da 0 a 11 durante il ciclo? Perché Alert si attiva ad ogni passo?

Quante volte ve lo devo dire?

Guarda: hai w uguale a 10,
Tu controlli w per 10: "if(w==10){co++; Alert(co);}" Pensi che questa espressione sia vera?
Allora perché hai questa domanda?

 
admoon:



Controllando l'indicatore passo dopo passo, ho rilevato un rimbalzo nella subroutine dietro il if {} e in cui non c'è W. Ecco un codice semplificato per chiarire la questione:

//--- parametri di ingresso

input int w=10;

//---

{

int i;

//---

int co=0;

for(i=0;i<=w;i++)if(w==10){co++; Alert(co);}

//--- restituire il valore di prev_calculato per la prossima chiamata

return(rates_total);

}

Risultato (arlet):

2016.05.30 00:45:14.064 1 (EURUSD,H1) 11

2016.05.30 01:10:35.972 1 (EURUSD,H1) 10

........... ecc. a 1.

2016.05.30 00:45:14.064 1 (EURUSD,H1) 1

Regola: se l'espressione tra parentesi è vera, allora l'operatore1 viene eseguito.

Nel codice: l'operatore1 viene eseguito SEMPRE.

Penso che if() dovrebbe funzionare solo una volta quando la condizione tra parentesi è vera. Ma in realtà avviene ad ogni controllo, quindi tutte le espressioni in {} sono eseguite ad ogni passo e masticano il tempo della macchina.

Domande: PERCHE' la variabile CO è cresciuta da 0 a 11 durante il ciclo? Perché l'allarme viene attivato ad ogni passo?

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

Bug, bug, domande

Andrey Barinov, 2016.05.30 10:38

A quanto pare hai un errore di battitura nel codice, e volevi scrivere così:

int i;
//---
   int co=0;
   for(i=0;i<=w;i++)
     {
      if(i==10)
        {
         co++; 
         Alert(co);
        }
     }
//--- return value of prev_calculated for next call
   return(rates_total);

 
Salve signori! Ho un piccolo problema con la scrittura di un EA(( l'EA apre ordini pendenti per lo più ok, ma a volte ho bisogno di aprire ordini molto vicini al prezzo corrente, quindi come prescrivere che aprirebbe ordini pendenti il più vicino possibile?
 
barudkinarseniy:
Salve signori! Ho un piccolo problema quando scrivo un EA(( L'EA apre gli ordini pendenti per lo più bene, ma a volte ho bisogno di aprire ordini molto vicini al prezzo corrente, quindi come prescrivere che aprirebbe gli ordini pendenti il più vicino possibile?
Se qualcuno è interessato, ecco come funziona
 double ilow = iLow(Symbol(),TimeFrames_3,1);
 double ihigh = iHigh(Symbol(),TimeFrames_3,1);
 
 double OpenPriceBuy = NormalizeDouble(MathMax(ihigh,Ask + Point*SymbolInfoInteger(Symbol(),SYMBOL_TRADE_STOPS_LEVEL)),Digits);
 double OpenPriceSell = NormalizeDouble(MathMin(ilow,Bid - Point*SymbolInfoInteger(Symbol(),SYMBOL_TRADE_STOPS_LEVEL)),Digits);
 
 int StepST = (int)MathMax(OpenPriceBuy - OpenPriceSell,SymbolInfoInteger(Symbol(),SYMBOL_TRADE_STOPS_LEVEL));
 double lots = LotsByRisk(StepST);
 
Artyom Trishkin:

Quante volte ve lo devo dire?

Guardate: avete w uguale a 10,
Controllate w per uguale a 10: "if(w==10){co++; Alert(co);}" Pensate che questa espressione sia vera?
Allora perché hai questa domanda?

Le mie scuse per la domanda stupida e grazie per la vostra pazienza e comprensione. Sono stato deluso dallo spostamento meccanico della sonda if(w==10){ Alert(I,"/",F); attraverso il programma alla ricerca di un errore nei passi. Succede a volte quando ci si scontra con un muro della propria ignoranza della ragione, ma una volta che ci si allontana dal problema per un po', la questione si risolve da sola. Quello che voi percepite come "stridente" si rivela in realtà una richiesta non giustificata di un'altra parte del programma. Grazie, Vladimir.

 

Ciao, puoi aiutarmi con la matematica per favore?

Come sapere quale sarà il lotto della quinta posizione, se si conosce il lotto della prima e che il lotto di ogni nuova posizione aumenta in progressione aritmetica.

La seconda opzione è che il lotto aumenta con la progressione geometrica.

 
mila.com:

Ciao, puoi aiutarmi con la matematica per favore?

Come sapere quale sarà il lotto della quinta posizione, se si conosce il lotto della prima e che il lotto di ogni nuova posizione aumenta in progressione aritmetica.

La seconda opzione è che il lotto aumenta con la progressione geometrica.

Sei stato bandito da Google? Scusa, perché sei così crudele? ))

La progressione aritmetica è definita da una formula.

laprogressione geometrica è data dalla formula

 

Non capisco, in teoria per la prima variante basta moltiplicare il primo lotto per 5, se aumenta del lotto di partenza

Per la seconda opzione: moltiplicatore del lotto* della prima posizione*5 ...ma

 
mila.com:

Non capisco, in teoria per la prima opzione basta moltiplicare il primo lotto per 5

Per la seconda opzione, il lotto della prima posizione * coefficiente * 5 ...ma

Va bene, anch'io ho dimenticato la matematica dai tempi della scuola )) Ho tirato fuori un libro di matematica, ho riscritto la definizione di progressione aritmetica.

-------------

Una sequenza di numeri, ognuno dei quali, a partire dal secondo, si ottiene dal precedente aggiungendo un numero costante d, chiamato differenza di una progressione aritmetica.

Se il primo termine è a1, allora il progresso aritmetico di lunghezza n ha la forma:

a1, a1+d, a1+2*d, ...., a1 + n*d

Il codice in MQL è così, ho creato un semplice esempio

#define  LEN 5 // задали длину последовательности

int start()
{
    int d = 4;    // это разность, любое значение
    int a[LEN];   // тут храним ариф. посл.
    a[0] = 3;     // любое стартовое значение, задаете сами
    Print(0, "  ", a[0]);

    for (int n = 1; n < 4; n++)
    {
       a[n] = a[0] + (n*d);
       Print(n, "  ", a[n]);
    }
}

2016.05.31 23:08:52.433 ChangeTimeFrame EURUSD.e,M1: 3  15
2016.05.31 23:08:52.433 ChangeTimeFrame EURUSD.e,M1: 2  11
2016.05.31 23:08:52.433 ChangeTimeFrame EURUSD.e,M1: 1  7
2016.05.31 23:08:52.433 ChangeTimeFrame EURUSD.e,M1: 0  3
 
Alexey Volchanskiy:

Va tutto bene, anch'io ho dimenticato la matematica dai tempi della scuola ))

Vado a fare una passeggiata, poi scriverò il codice per il programma di geometria.