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

 
PolarSeaman:

Non ci sono arrivato da solo"Assicurati solo di aggiornare i dati in OnTimer() per far funzionare il tuo codice. "

Come devo fare?

Avete un programma offline?

 
Puoi dirmi come ottenere gli indicatori di fondo da un timeframe diverso da quello su cui il gufo è in bilico?
 
Galim_V:
Puoi dirmi come ottenere gli indicatori di fondo da un timeframe diverso da quello su cui il gufo è in bilico?

1. Perché hai appeso l'uccello? Non è un peccato?

2. Avete mai aperto la guida? Ricevere i dati dell'indicatore nell'Expert Advisor da qualsiasi timeframe non è affatto un problema perché i primi due parametri delle funzioni di ricezione dei dati dell'indicatore servono a specificare il simbolo e il periodo del grafico da cui si vogliono ricevere i valori.

Infatti, anche quando si digita il codice nell'editor, si apre la lista delle variabili formali della funzione, e un tooltip mostra il simbolo e il tempo. Strano che non ci abbia fatto caso.

 
Artyom Trishkin:

Avete un programma offline?

No.

 
PolarSeaman:

No.

Allora perché il costante aggiornamento senza necessità?

Hai bisogno di tempo? Puoi ottenere l'ora dell'ultimo tick: TimeCurrent(), o l'ultima ora locale: TimeLocal().

Se si ottiene l'ora dell'ultimo tick nel fine settimana, il timer non aiuterà - l'ora sarà l'ultimo tick del venerdì, o l'ultimo tick dell'ultimo giorno lavorativo. E TimeLocal() non vi darà l'ora del server - dovete ricalcolarla con un offset.

Tuttavia, non so esattamente cosa vuoi ottenere alla fine.

 
Artyom Trishkin:

1. Perché hai appeso l'uccello? Non è un peccato?

2. Avete mai aperto la guida? Ricevere i dati dell'indicatore nell'Expert Advisor da qualsiasi timeframe non è affatto un problema perché i primi due parametri delle funzioni di ricezione dei dati dell'indicatore servono a specificare il simbolo e il periodo del grafico da cui si vogliono ricevere i valori.

Infatti, anche quando si digita il codice nell'editor, si apre la lista delle variabili formali della funzione, e un tooltip mostra il simbolo e il tempo. Strano che non ci abbia fatto caso.

2018.07.04 22:17:38.398 2016.11.10 13:00:00 Arap01 EURUSD,H1: Arrotondamento 44.53781512605145 45.0 Questi sono dati stocastici in modalità "normale", cioè:

2=iStochastic(NULL,0,K,D,slowing,Average_method,price_field,MODE_MAIN,2);

qui chiedo M5 2=iStochastic(NULL,5,K,D,slowing,Average_method,price_field,MODE_MAIN,2);

Ottengo 2018.07.04 22:23:05.680 2016.11.10 13:00:00 Arap01 EURUSD,H1: Rounding 0.0 0.0



 
Artyom Trishkin:

Tuttavia, non so esattamente cosa vuoi ottenere.

Allarme, voglio, due secondi prima della chiusura della barra. Non lavorerò durante il fine settimana.

 
PolarSeaman:

Quindi ho bisogno di un avviso due secondi prima che la barra si chiuda senza un tick.

Non è facile da fare, è necessario eseguire un timer più accurato (almeno 500 ms) e fare precedentemente la sincronizzazione dell'ora locale e dell'ora del server.
Ve ne ho già parlato:

Al momento dell'arrivo del tick, contare la differenza TimeCurrent()-TimeLocal()
(questo viene fatto una volta per sincronizzare l'ora locale e quella del server)

- Questo è l'offset relativo al broker, se questo offset cambia in seguito, il tempo deve essere ricalcolato;
- all'inizio dell'Expert Advisor (oalla comparsa della barraD1) ricalcoliamo di nuovo tutti i tempi necessari, nell'ora locale, tenendo conto dell'offset;
- Aspettiamo quello che abbiamo "contato" nel timer, controllando la desincronizzazione, la perdita di connessione con il broker, la traduzione delle mani locali.

si può prendere +/- 1 secondo
 
Taras Slobodyanik:

Non è facile da fare, bisogna eseguire un timer più accurato (almeno 500ms) e pre-sincronizzare l'ora locale con quella del server.
Te ne ho già parlato:

Si può prendere +/- 1 secondo

Grazie. Come fare il tempo in secondi, prima che la barra M5 si chiuda. In questo momento sta visualizzando H1.

#property strict
#property indicator_chart_window
//--- input parameters
#define  MILLISEC_TIMER_INTERVAL         500 
int            timeOffset;
datetime       ServerLocalOffset;
datetime       prevTime,myTime,localtime;
bool           newBar = false;
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- indicator buffers mapping
   EventSetMillisecondTimer(MILLISEC_TIMER_INTERVAL);
   
  datetime srvtime,tmpOffset;
   RefreshRates();
   srvtime = TimeCurrent();
   // Modified
   localtime = TimeLocal()+TimeGMTOffset();
   if(TimeHour(srvtime)>TimeHour(localtime)){
      // Server Time is still ahead of us
      int newOffset = TimeHour(srvtime)-TimeHour(localtime);
      ServerLocalOffset = (newOffset*60*60);
   }else if(TimeHour(srvtime)<TimeHour(localtime)){
      // Server Time is Behind us
      int newOffset = TimeHour(localtime)-TimeHour(srvtime);
      ServerLocalOffset = (newOffset*60*60);
   }else{
      // No modification required
      ServerLocalOffset = srvtime;
   }
   localtime = TimeLocal()-ServerLocalOffset;
   
   tmpOffset = TimeSeconds(srvtime) - TimeSeconds(localtime);
   if(tmpOffset < 30 && tmpOffset >= 0){
      timeOffset = TimeSeconds(srvtime) - TimeSeconds(localtime);
   }
   return(INIT_SUCCEEDED);
  }
  
void OnDeinit(const int reason)
  {
   EventKillTimer();
  }
//+------------------------------------------------------------------+
//| 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[])
  {
//---

//--- return value of prev_calculated for next call
   return(rates_total);
  }
//+------------------------------------------------------------------+
//| Timer function                                                   |
//+------------------------------------------------------------------+
void OnTimer()
  {
//---
datetime sec;
   datetime localtime;
   localtime = TimeLocal()+(TimeGMTOffset()+(60*60));
 sec=Time[0]-localtime-timeOffset;
 if(sec<=2){Alert("время откр. бара ",Time[0]);}
      Comment(TimeToStr(sec,TIME_SECONDS ));
  }
//+------------------------------------------------------------------+
 
Non ho ancora capito come contare i secondi fino alla chiusura della barra sul periodo corrente. Aiuto.