Domande dai principianti MQL5 MT5 MetaTrader 5 - pagina 602

 
Karputov Vladimir:
In un indicatore o in un EA/script?
In un indicatore.
 

Yuri Evseenkov:

fromme2you:

Un'altra domanda: come stressare lo sviluppatore di MT4 e l'ambiente di esecuzione del codice MQL, in modo che metta mente e mano nello sviluppo di un linguaggio per gestire le eccezioni, come nel mio esempio o simile nel significato?


Contatta il servesdesk, crea un thread/sondaggio sul forum.

Non è passato molto tempo da quando MT4 è stato sepolto. Non hanno una visione chiara del mercato, hanno una visione chiara della regolamentazione del mercato.

Vedi il post di Renat di oggi:

Renat Fatkhullin:

...

Losviluppo di MT4 è fermo e ci saranno solo correzioni e cosmetici.

 
Alex:

Salve. Potete per favore consigliarmi come risolvere questo problema. Ho bisogno di trovare i prezzi aperti delle barre ad una certa ora, per esempio alle 01:00, analizzando per esempio le ultime 50 barre. Non sono sicuro di come affrontare questo compito in mql5.


Sia calcolando la data attuale + aggiungendovi il tempo richiesto e poi aggiungendo ventiquattro ore, questo metodo ha funzionato su mql4.

Per quanto ho capito, mql5 ha strutture speciali con output temporale, ma per qualche motivo non posso usarle.

Grazie in anticipo per la risposta.

Sarei molto grato se qualcuno potesse lanciarmi un po' di codice per capire il processo di pensiero.
Alex:
Nell'indicatore.

Qui, per una migliore comprensione, consiglio di guardare prima la numerazione delle barre. Per prima cosa dobbiamo capire esattamente come viene numerata la barra più a destra nell'indicatore MQL5.

Per farlo, mettete il seguente commento nell'indicatore in OnCalculate:

//+------------------------------------------------------------------+
//|                                                         test.mq5 |
//|                              Copyright © 2016, Vladimir Karputov |
//|                                           http://wmua.ru/slesar/ |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2016, Vladimir Karputov"
#property link      "http://wmua.ru/slesar/"
#property version   "1.00"
#property indicator_chart_window
#property indicator_buffers 1
#property indicator_plots   1
#property  indicator_type1   DRAW_LINE
#property  indicator_color1  Blue
//--- indicator buffers
double Buffer[];
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- indicator buffers mapping
   SetIndexBuffer(0,Buffer,INDICATOR_DATA);
//---
   ArrayInitialize(Buffer,1);
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int OnCalculate(const int rates_total,
                const int prev_calculated,
                const datetime &time[],
                const double &open[],
                const double &high[],
                const double &low[],
                const double &close[],
                const long &tick_volume[],
                const long &volume[],
                const int &spread[])
  {
//---
   Comment("rates_total=",IntegerToString(rates_total),
           ", time[rates_total-1]=",TimeToString(time[rates_total-1],TIME_DATE|TIME_MINUTES|TIME_SECONDS));

//--- return value of prev_calculated for next call
   return(rates_total);
  }
//+------------------------------------------------------------------+

Questo codice produrrà questo risultato:

Numerazione negli array di indicatori MQL5, per impostazione predefinita

Cioè, di default la barra più a destra negli array di indicatori MQL5 ha un indice uguale a "rates_total-1".

Tornando alla tua domanda - devi prendere le ultime 50 barre e passarci attraverso. E analizza il tempo aperto della barra (l'array time[]), se il tempo della barra è uguale a quello specificato, ricorda l'indice della barra. Quindi ottenere il prezzo aperto dall'array open[] utilizzando questo indice.

Sembra simile a questo:

//+------------------------------------------------------------------+
//|                                                         test.mq5 |
//|                              Copyright © 2016, Vladimir Karputov |
//|                                           http://wmua.ru/slesar/ |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2016, Vladimir Karputov"
#property link      "http://wmua.ru/slesar/"
#property version   "1.00"
#property indicator_chart_window
#property indicator_plots   0
//--- input parameters
input datetime time_open=D'01:00';     // время искомого бара
//--- parameters
int open_hour;                         // время искомого бара (часы)
int open_min;                          // время искомого бара (минуты)
bool first_start=false;                // false - значит бары ещё не искались
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
//---
   MqlDateTime str1;
   TimeToStruct(time_open,str1);
   open_hour=str1.hour;
   open_min=str1.min;
//---
   first_start=false;
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int OnCalculate(const int rates_total,
                const int prev_calculated,
                const datetime &time[],
                const double &open[],
                const double &high[],
                const double &low[],
                const double &close[],
                const long &tick_volume[],
                const long &volume[],
                const int &spread[])
  {
//---
//Comment("rates_total=",IntegerToString(rates_total),
//        ", time[rates_total-1]=",TimeToString(time[rates_total-1],TIME_DATE|TIME_MINUTES|TIME_SECONDS));
   if(!first_start)
     {
      int index=-1;
      for(int i=rates_total-1;i>rates_total-1-50;i--)
        {
         MqlDateTime str2;
         TimeToStruct(time[i],str2);
         if(str2.hour==open_hour && str2.min==open_min)
           {
            index=i;
            first_start=true;
            Print("Бар ",IntegerToString(i)," имеет время открытия ",TimeToString(time[i],TIME_DATE|TIME_MINUTES|TIME_SECONDS),
                  " и цену открытия ",DoubleToString(open[i],Digits()));
           }
        }
     }
//--- return value of prev_calculated for next call
   return(rates_total);
  }
//+------------------------------------------------------------------+
 
Karputov Vladimir:

Qui, per capire meglio in seguito, vi consiglio di cominciare a guardare la numerazione delle barre. Cioè, si dovrebbe prima capire esattamente come viene numerata la barra più a destra nell'indicatore MQL5.

Per farlo, mettete il seguente commento nell'indicatore in OnCalculate:

Questo codice produrrà questo risultato:


Cioè, di default la barra più a destra negli array di indicatori MQL5 ha un indice uguale a "rates_total-1".

Tornando alla tua domanda - devi prendere le ultime 50 barre e passarci attraverso. E analizza il tempo aperto della barra (l'array time[]), se il tempo della barra è uguale a quello specificato, ricorda l'indice della barra. Quindi ottenere il prezzo aperto dall'array open[] utilizzando questo indice.

Assomiglia approssimativamente a questo

Karputov Vladimir, grazie mille. Me ne occuperò io. Penso che mql5 abbia un accesso più flessibile alle serie temporali, ma è un po' complicato per i programmatori "principianti". :))
 
Alex:
Karputov Vladimir, grazie mille. Lo apprezzo molto. Penso che mql5 abbia un accesso più flessibile alle serie temporali, ma è un po' complicato per i programmatori "principianti". :))
Si tratta di abituarsi. Allora capirete che tutto è strutturato, facile e corretto.
 
Karputov Vladimir:
È una questione di abitudine. Allora scoprirete che tutto è strutturato, facile e corretto.

Un'altra domanda. I parametri

const double &open[],
                const double &high[],
                const double &low[],
                const double &close[],
                const long &tick_volume[],
                const long &volume[],
                const int &spread[])


Penso che siano responsabili della coppia a cui è applicato l'indicatore. Quindi, è impossibile ottenere le stesse informazioni su altre coppie di valute? In altre parole, la soluzione più universale è quella di creare gli stessi array di OCHL, solo attraverso la funzione Copy...?
 
Alex:

Un'altra domanda. Parametri

Capisco che sono responsabili della coppia a cui viene applicato l'indicatore. E tirare fuori con il loro aiuto le stesse informazioni su un'altra coppia di valute è impossibile? Quindi, la soluzione più universale è quella di creare gli stessi array OCHL solo attraverso la funzione Copy...?
Quando si accede ai simboli di altre persone, ci sono delle sfumature che bisogna capire ed essere consapevoli:organizzazione dell'accesso ai dati. In altre parole, se richiedete i dati delle serie temporali del simbolo di qualcun altro - dovete prima assicurarvi che questi dati siano preparati ed esistenti. Questo è l'unico modo per essere sicuri che i dati richiesti dal simbolo di qualcun altro siano corretti.
 
Karputov Vladimir:
Quando si accede ai personaggi di altre persone, ci sono delle sfumature che bisogna capire e di cui bisogna essere consapevoli:organizzare l'accesso ai dati. In altre parole, se richiedete i dati delle serie temporali dei simboli di qualcun altro, dovete prima assicurarvi che questi dati siano stati preparati ed esistano. Solo in questo modo puoi essere sicuro che i dati che richiedi al personaggio alieno siano corretti.

Capito. Grazie.

Un'altra domanda: si convertono sempre i valori nel tipo stringa nella funzione Print(). Qual è lo scopo di fare questo? Senza traduzione, i tipi int, double, ecc. sono visualizzati nella funzione Print() esattamente allo stesso modo.

 
Alex:

Capito. Grazie.

Un'altra domanda: si convertono sempre i valori al tipo di stringa nella funzione Print(). Qual è lo scopo di fare questo? Senza traduzione, i tipi int, double, ecc. sono visualizzati in Print() esattamente allo stesso modo.

Il modo in cui un numero viene memorizzato nella memoria del computer e il modo in cui viene emesso sono due grandi differenze. Specialmente con i numeri in virgola mobile, è sempre meglio limitare il numero di cifre decimali.

Ecco perché cerco sempre di formattare correttamente l'output - usoIntegerToString eDoubleToString.

 
Karputov Vladimir:

Il modo in cui un numero viene memorizzato nella memoria del computer e il modo in cui viene emesso sono due grandi differenze. Specialmente con i numeri in virgola mobile, è sempre meglio limitare il numero di cifre decimali.

Ecco perché cerco sempre di formattare correttamente l'output dei numeri usandoIntegerToString eDoubleToString.

Grazie per le vostre risposte e la vostra pazienza.


Vladimir, probabilmente sono stanco di te :) Ma i progressi nelle basi sono molto lenti. Ho provato a fare un compito di prova con la funzione Copy... L'indicatore non è disegnato, anche se ci sono numeri in Printe... Non capisco niente.


//+------------------------------------------------------------------+
//|                                                        Bars.mq5 |
//|                                                                  |
//|                                                                  |
//+------------------------------------------------------------------+
#property copyright ""
#property link      ""
#property version   "1.00"
#property indicator_separate_window
#property indicator_buffers 2
#property indicator_plots   2
//--- plot UpBar
#property  indicator_label1  "UpBar"
#property  indicator_type1   DRAW_HISTOGRAM
#property  indicator_color1  clrGreen
#property  indicator_style1  STYLE_SOLID
#property  indicator_width1  6
//--- plot DnBar
#property  indicator_label2  "DnBar"
#property  indicator_type2   DRAW_HISTOGRAM
#property  indicator_color2  clrRed
#property  indicator_style2  STYLE_SOLID
#property  indicator_width2  6
//--- input parameters
input int   Histori=30;
input ENUM_TIMEFRAMES TimeFrame=0; 
input string  Simvol="EURUSD";
//--- indicator buffers
double         UpBar[];
double         DnBar[];
double         O_Price[];
double         C_Price[];



  
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- indicator buffers mapping
   SetIndexBuffer(0,UpBar,INDICATOR_DATA);
   SetIndexBuffer(1,UpBar,INDICATOR_DATA);
   SetIndexBuffer(2,O_Price,INDICATOR_CALCULATIONS);
   SetIndexBuffer(3,C_Price,INDICATOR_CALCULATIONS);



   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int OnCalculate(const int rates_total,
                const int prev_calculated,           
                const datetime &time[],
                const double &open[],
                const double &high[],
                const double &low[],
                const double &close[],
                const long &tick_volume[],
                const long &volume[],
                const int &spread[])
 {
ArraySetAsSeries(O_Price,true);
ArraySetAsSeries(C_Price,true);
CopyOpen(Simvol,TimeFrame,0,Histori,O_Price);
CopyClose(Simvol,TimeFrame,0,Histori,C_Price);

     for (int t=3; t<Histori; t++) 
       {
          UpBar[t]=MathAbs(NormalizeDouble((O_Price[t]-C_Price[t]),Digits()));   
          Print(DoubleToString(UpBar[t],Digits()));
       }

   return(rates_total);
  }
Motivazione: