Domande dai principianti MQL5 MT5 MetaTrader 5 - pagina 530

 
-Aleks-:

Per favore, aiutatemi! (MQL4)

Ho bisogno di ottenere il tempo di apertura del giorno sul grafico M15 tenendo conto di ogni barra - per l'indicatore.

Ho deciso di calcolare in secondi, tenendo conto della barra attuale (0), ma devo essermi sbagliato.

D_Shift=(Open_time-pos*15*60-(Open_time-Open_timeTF))/1440*60;

Se per l'indicatore, allora:

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[])
  {
   int            temp_day;
   MqlDateTime    dt_struct;
   TimeToStruct(time[0],dt_struct);
   temp_day=dt_struct.day;

   for(int i=0;i<rates_total-1;i++)
     {
      TimeToStruct(time[i],dt_struct);
      if(dt_struct.day<temp_day)
        {
         Print("Start day ",time[i-1]);
         break;
        }
     }

//--- done
   return(rates_total);
  }

Ma: questo codice sarà eseguito ogni volta che OnCalculate() viene inserito - a seconda delle vostre esigenze, potete aggiungere il flag bool o mettere il codice in una funzione separata.

 
Karputov Vladimir:

Se per indicatore, allora:

Ma: questo codice sarà eseguito ogni volta che OnCalculate() - a seconda delle vostre esigenze, o aggiungete un flag bool o mettete il codice in una funzione separata.

Grazie, ma ad ogni tick fare il ricalcolo non va bene - ho bisogno di analizzare il tuo codice, tuttavia, mentre voglio capire perché il mio codice non funziona, nel log vengono restituiti strani numeri

Tempo apertoTF 1454715900
Tempo aperto 1454284800
Delta_1S 431100
Delta_M15 479

risulta che c'è una differenza di 479 barre tra la prima barra del giorno e la barra attuale - perché?

 
-Aleks-:

Grazie, ma ricalcolare su ogni tick non va bene - devo pensare al tuo codice, tuttavia, mentre voglio capire perché il mio codice non funziona, il log restituisce strani numeri

Tempo apertoTF 1454715900
Tempo aperto 1454284800
Delta_1S 431100
Delta_M15 479

risulta che c'è una differenza di 479 barre tra la prima barra del giorno e la barra attuale - perché?

Ho indicato che non sono un sensitivo e questo è il motivo:

Ma: questo codice sarà eseguito ogni volta che OnCalculate() viene inserito- qui a seconda delle vostre esigenze o aggiungete un flagboolo mettete il codice in una funzione separata.

 
Karputov Vladimir:

Ho precisato che non sono un sensitivo e questo è il motivo:

Perché l'abilità psichica è richiesta qui? Ci sono delle variabili nel codice di cui sopra, ho mostrato cosa restituiscono quelle variabili in numeri e ho chiesto perché questo è il caso e non il contrario - secondo il codice.
 
Karputov Vladimir, non capisco il tuo codice - perché sono un principiante in questo business,non ho usato la funzioneOnCalculate prima, quindi non riesco a capire che cosarates_totalè calcolato lì, e soprattutto, dove restituirlo? Nemmeno io capisco come rendere il tutto in una funzione separata... è difficile da capire senza commenti.
 
-Aleks-:
Karputov Vladimir, non capisco il tuo codice - sono un principiante in questo business enon ho maiusato la funzioneOnCalculate prima, quindi non riesco a capire cosa viene calcolato lì ilrate_total e, cosa più importante, dove dovrebbe essere riportato? Nemmeno io capisco come rendere il tutto in una funzione separata... è difficile da capire senza commenti.

Ecco il codice completo dell'indicatore MQL4:

//+------------------------------------------------------------------+
//|                                                    Start day.mq4 |
//|                        Copyright 2016, MetaQuotes Software Corp. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2016, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"
#property strict
#property indicator_chart_window
//--- input parameters
input int      timer=10; // seconds
//--- parameter
bool           IsDefineTime=true; // true -> you can define time
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- indicator buffers mapping
   EventSetTimer(timer);
//---
   IsDefineTime=true;
//---
   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[])
  {
//---
   int            temp_day;
   MqlDateTime    dt_struct;
   TimeToStruct(time[0],dt_struct);
   temp_day=dt_struct.day;

   if(IsDefineTime)
     {
      for(int i=0;i<rates_total-1;i++)
        {
         TimeToStruct(time[i],dt_struct);
         if(dt_struct.day<temp_day)
           {
            Print("Start day ",time[i-1]);
            IsDefineTime=false;
            break;
           }
        }
     }
//--- return value of prev_calculated for next call
   return(rates_total);
  }
//+------------------------------------------------------------------+
//| Timer function                                                   |
//+------------------------------------------------------------------+
void OnTimer()
  {
//---
   IsDefineTime=true; // true -> you can define time
  }
//+------------------------------------------------------------------+

Algoritmo del suo lavoro: Quando si avvia l'indicatore, si imposta l'intervallo di tempo del timer (per esempio, 10 secondi) - significa che ogni 10 secondi il timer verrà attivato:

//+------------------------------------------------------------------+
//| Timer function                                                   |
//+------------------------------------------------------------------+
void OnTimer()
  {
//---
   IsDefineTime=true; // true -> you can define time
  }

e alla variabileIsDefineTime viene assegnato il valore true. A cosa serve? Quando IsDefineTime=true possiamo, in OnCalculate(), entrare in un ciclo per determinare l'ora di inizio del giorno:

   if(IsDefineTime)
     {
      for(int i=0;i<rates_total-1;i++)
        {
         TimeToStruct(time[i],dt_struct);
         if(dt_struct.day<temp_day)
           {
            Print("Start day ",time[i-1]);
            IsDefineTime=false;
            break;
           }
        }
     }

In questo ciclo cominciamo a percorrere l'array time[] (questo array memorizza i valori del tempo di apertura) dalla barra più a destra (il suo indice è "0"). Quando si trova l'inizio del giorno, si disattiva il suo valore e si assegna alla variabileIsDefineTime il valorefalse - in questo modo ci si protegge dall'entrare ulteriormente nel ciclo di determinazione dell'ora iniziale del giorno, fino a quando il timer gira di nuovo.

File:
Start_day.mq4  3 kb
 

Karputov Vladimir , grazie per il chiarimento, tuttavia, in che modo questo risolve il problema?

Approssimativamente abbiamo bisogno di conoscere la barra del timeframe corrente che corrisponde alla barra di inizio giornata. Abbiamo bisogno di sapere su ogni barra e calcolare e disegnare l'indicatore di conseguenza.

 
-Aleks-:

Karputov Vladimir , grazie per il chiarimento, tuttavia, in che modo questo risolve il problema?

Approssimativamente abbiamo bisogno di conoscere la barra del timeframe corrente che corrisponde alla barra di inizio giornata. È necessario conoscerlo su ogni barra e calcolare e disegnare l'indicatore di conseguenza.

È così che hai chiesto ed è così che ti è stato risposto :) . E se volete non il tempo della prima barra di questo giorno, ma l'indice di questa barra - è qui, quando si stampa l'inizio del giorno:

.
.
.
Print("Start day ",time[i-1]);
.
.
.

Si usa l'indice [i-1] - questo è il numero della prima barra del giorno.

 
Karputov Vladimir:

Come hai chiesto, hai avuto la tua risposta :) . E se avete bisogno non del tempo della prima barra del giorno, ma dell'indice di questa barra, è qui, quando si stampa l'inizio del giorno:

Si usa l'indice [i-1] - questo è il numero della prima barra del giorno.

Sono d'accordo - ho chiesto in modo confuso.

C'è un indicatore nell'app che ho fatto, ma non conta correttamente. Sono terribilmente stupido e non capisco, anche dopo le vostre spiegazioni, come fargli determinare correttamente l'indice corrispondente alla prima barra all'inizio della giornata.

Mi scuso per l'insolenza, ma forse puoi mostrarmi come combinare il tuo codice con il mio?

 

-Aleks-:

Come posso fare in modo che rilevi correttamente l'indice corrispondente alla prima barra all'inizio della giornata?

È un po' un casino:

datetime Day00=86400*(TimeCurrent()/86400);//начало дня
int bar_shift=iBarShift(_Symbol,PERIOD_CURRENT,Day00);//индекс первого бара текущего дня