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

 
Igor Zakharov:

Solo non quelli del calendario. Barre di 30 giorni all'indietro (domenica, sabato)

A giudicare dalla funzione senza il parametro shift che stai facendo in 5 e hai fatto la domanda in 4 :)

Sì, 30 barre sono 21 giorni lavorativi se si conta da ieri. (24.02.2019 - 25.01.2019)

Ho avuto

Per il mese dimensione media delle candele: 598

Per una settimana dimensione media delle candele: 519

E iATR() fornisce numeri a dieci cifre...

Quindi non ho ancora capito come usarlo.

 
Alexander Layzerevich:

E iATR() produce numeri a dieci cifre...

Di solito, frazioni decimali (cioè come il prezzo. Per convertire in punti è necessario dividere per _Point).

Vedi illustrazione: euro/dollaro a partire da oggi - 560 pips su base giornaliera per il mese.


 
Igor Zakharov:

Di solito, frazioni decimali (cioè come il prezzo. Per convertire in punti, dividere per _Point).

Vedi l'illustrazione: euro/dollaro a partire da oggi - 560 pips su base giornaliera per un mese.


Ho controllato in MQL4:

iATR

 
Igor Zakharov:

Di solito, frazioni decimali (cioè come il prezzo. Per convertire in punti, dividere per _Point).

Vedi illustrazione: euro/dollaro a partire da oggi - 560 pips su base giornaliera per un mese.


Ho controllato in MQL5. Ho scritto il seguente codice per controllarlo:

//************************************************************************************************/
double iPointOrderStep()
{
   int Awerage30 = (iATR (Symbol(),PERIOD_D1, 21));
   Print ("Awerage30 = ", Awerage30);
   int Awerage7 = (iATR (Symbol(),PERIOD_D1, 5));
   Print ("Awerage7 = ", Awerage7);
   
   double iPointOrderStep = NormalizeDouble(((Awerage30+Awerage7)/2),0);
   Print ("iPointOrderStep = ", iPointOrderStep);
   return (iPointOrderStep);
}   
//************************************************************************************************/

Questo è ciò che mostra:

iATR

Cioè, mostra un valore, ma ne visualizza un altro...

 
Alexander Layzerevich:

Controllato in MQL5. Ho scritto questo codice per controllarlo:

Questo è ciò che produce:

Cioè mostra un valore, ma ne mostra un altro...

In MQL5 una tale costruzione di lavoro con l'indicatore non è adatta

   int Awerage30 = (iATR (Symbol(),PERIOD_D1, 21));
   Print ("Awerage30 = ", Awerage30);

Prima dovete creare un handle, e l'avete fatto, e solo dopo potete ottenere valori dalCopyBuffer

// этот код в Init()
      int handleATR=iATR(Symbol(),PERIOD_D1,21);
      if(handleATR==INVALID_HANDLE) return;

// это уже в сам советник/индикатор: OnTick()
      double hATR[];
      CopyBuffer(handleATR,0,0,1,hATR);
// double ATR = hATR[0]; // здесь значение ATR
 
Vitaly Muzichenko:

In MQL5 tale costruzione di lavoro con l'indicatore non è adatta

Prima dovete creare un handle, ed è quello che avete fatto ora, e dopo potete ottenere valori dalCopyBuffer

Grazie, ne terrò conto e riscriverò il codice.

Lo sto solo scrivendo in MT4 e usando #include <MT4Orders.mqh> per testarlo in MT5.

Forse la libreria non supporta gli indicatori.

 
Alexander Layzerevich:

Grazie, ne terrò conto e riscriverò il codice.

Lo scrivo solo in MT4 e uso #include <MT4Orders.mqh> per testarlo in MT5.

Forse la libreria non supporta gli indicatori.

Sì, solo funzioni commerciali.

 
Alexander Layzerevich:

Grazie, ne terrò conto e riscriverò il codice.

Lo scrivo solo in MT4 e uso #include <MT4Orders.mqh> per testarlo in MT5.

Forse la libreria non supporta gli indicatori.

È un modo molto veloce per combinare due piattaforme, funziona, ma è meglio non farlo in mql5

double ATR(string symb,ENUM_TIMEFRAMES tf,int period,int index) {
 #ifdef __MQL4__
  return(iATR(symb,tf,period,index));
 #else
  double buf[1];
  int handle=iATR(symb,tf,period);
   if(handle<0) {
    PrintFormat("Failed to create handle ATR %s/%s, Error: %d",symb,sTF(tf),GetLastError());
    return(WRONG_VALUE);
   } else {
    if(CopyBuffer(handle,0,index,1,buf)<0) {
     PrintFormat("Failed to copy data from the indicator ATR %s/%s, Error: %d",symb,sTF(tf),GetLastError());
     return(WRONG_VALUE);
    }
   }
   return(buf[0]);
 #endif
 }

E applicare l'indicatore nello stesso modo come in mql4

double atr=ATR(Symbol(),PERIOD_D1, 30);
 
Vitaly Muzichenko:

Questa è un'opzione molto veloce per combinare le due piattaforme, funziona, ma è meglio non farlo in mql5

E applicare l'indicatore nello stesso modo come in mql4

Grazie mille per il codice.

Ha funzionato:

//************************************************************************************************/
double iPointOrderStep()
{
   double Awerage30 = (int)((ATR(Symbol(),PERIOD_D1,21,1))/Point());
//   Print ("Awerage30 = ", Awerage30);
   double Awerage7 = (int)((ATR(Symbol(),PERIOD_D1,5,1))/Point());
//   Print ("Awerage7 = ", Awerage7);
   
   double iPointOrderStep = NormalizeDouble(((Awerage30+Awerage7)/2/6),0);
//   Print ("iPointOrderStep = ", iPointOrderStep);
   return (iPointOrderStep);
}   
//************************************************************************************************/
double ATR(string symb,ENUM_TIMEFRAMES tf,int period,int index) {
 #ifdef __MQL4__
  return(iATR(symb,tf,period,index));
 #else
  double buf[1];
  int handle=iATR(symb,tf,period);
   if(handle<0) {
    PrintFormat("Failed to create handle ATR %s/%s, Error: %d",symb,sTF(tf),GetLastError());
    return(WRONG_VALUE);
   } else {
    if(CopyBuffer(handle,0,index,1,buf)<0) {
     PrintFormat("Failed to copy data from the indicator ATR %s/%s, Error: %d",symb,sTF(tf),GetLastError());
     return(WRONG_VALUE);
    }
   }
   return(buf[0]);
 #endif
 }
//************************************************************************************************/

Ora ho i dati mediati all'inizio dell'avvio dell'EA. E questi dati vengono ricalcolati ogni volta che accedo alla funzione.

Da quanto ho capito, per limitare la chiamata, devo fare un record di buffer con i dati calcolati.

Quindi, dobbiamo impostare la condizione per il ricalcolo. Il "lunedì" e se non c'è niente nel buffer.

Cioè dichiarare la variabile buferStep = -1; e inOnTick() se buferStep <0 o "Monday" allora ricalcolare.

Anche qui sono bloccato, come può il robot dichiarare che oggi è "lunedì"?

 
Alexander Layzerevich:

Grazie mille per il codice.

Ha funzionato così:

Ora ho i dati mediati all'inizio dell'EA. E questi dati vengono ricalcolati ogni volta che la funzione viene chiamata.

Da quanto ho capito, per limitare la chiamata, devo fare un record di buffer con i dati calcolati.

Quindi, dobbiamo impostare la condizione per il ricalcolo. Il "lunedì" e se non c'è niente nel buffer.

Cioè dichiarare la variabile buferStep = -1; e inOnTick() se buferStep <0 o "Monday" allora ricalcolare.

Anche qui ho un problema, come può Robot dichiarare che oggi è "lunedì"?

Non voglio usare lunedì, voglio solo il numero di giorni fa. E lo otterrei su ogni nuova barra per non caricare l'Expert Advisor di calcoli su ogni tick.

Motivazione: