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

 

Buon pomeriggio. qualcosa ha smesso di elaborare la bandiera in mt4 dopo un po'. mt inizia ad ignorarla, potresti dirmi perché:

void OnTimer()
  {
//---
   //-----------------
   int tmeLeftC = PeriodSeconds() - (TimeCurrent()-Time[0]);
   int tmeLeftL = PeriodSeconds() - (TimeLocal()-Time[0]);
   
   
//флаг на вкл отправки   
   if ((sendflag==0) && (tmeLeftC >= 10)) 
      {
         sendflag=1;
      }
      

//Условия на отправку 
///------BAY 
   if ((sendflag==1) && (fNewBar()) && (TimeHour(Time[0]) >= StartH) && (TimeHour(Time[0]) <= EndH) && ((tmeLeftC <= SecondsPrevToServer) || (tmeLeftL <= SecondsPrevToServer)))
      {
         Print("Predict data");
         sendSig();
         Print("Send data");
         sendflag=0;
      }
 
itslek:

Buon pomeriggio. qualcosa ha smesso di elaborare la bandiera in mt4 dopo un po' di tempo. mt inizia ad ignorarla, potresti dirmi perché:


provare una frequenza del timer di 100-200ms,
500ms è troppo per prendere 1 secondo

e la candela può aprirsi qualche secondo o anche un minuto dopo

 
Ivan Ivanov:

Provate:

... O hai davvero bisogno di extern?


Grazie. Sembra che abbia aiutato.

Qual è la differenza tra input ed extern?

 
Taras Slobodyanik:

provare una frequenza del timer di 100-200ms,
500ms è troppo lungo per prendere 1 secondo

e la candela può aprirsi qualche secondo o anche un minuto dopo


quindi il problema non è che non lo prende. Non c'è niente di male in questo.

Il problema è che il flag smette di funzionare e comincia a inviare un segnale ogni 500ms, ignorando le condizioni del flag. Non capisco cosa sta succedendo lì...

 
RichLux: Qual è la differenza tra input ed extern?


 

Potete per favore dirmi come resettare il buffer quando appare una nuova barra, ma in modo che i dati precedenti nel buffer non vengano cancellati, ma visualizzati sul grafico. Per qualche motivo non riesco ad azzerare il buffer e quando appare una nuova barra, i nuovi dati si sovrappongono ai vecchi dati accumulati. Ciò che non ho descritto correttamente nel codice.

void OnInit()
{
   IndicatorDigits(0);
   SetIndexBuffer(0,Buf_1);
   SetIndexBuffer(1,Buf_2);
   Bid1=Bid;
  
   
}
 
 
//+------------------------------------------------------------------+
//| 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[])
{
   datetime Вр=Time[0];   // Время текущего бара
   if(Вр>Время)           // Если новый бар
   {
      Время=Вр;           // Запомнить
      Buf_1[0]=0;         // и обнулить последний элемент буфера
      Buf_2[0]=0;
   }
   
      
   if(Bid > Bid1) 
   {
   V1 = iVolume(NULL, 0, 0);
   V2 = V1 + V2;
   Buf_1[0]= V2;
   }                             
   else 
   {
   V3 = iVolume(NULL, 0, 0);
   V4 = V3 + V4;
   Buf_2[0]= (V4*-1);
   }
   Bid1=Bid;
   
   
  return(rates_total);
}
 
itslek:

quindi il problema non è che non lo prende. Non c'è niente di male in questo.

Il problema è che la bandiera smette di funzionare e comincia a inviare un segnale ogni 500ms, ignorando le condizioni della bandiera. non capisco cosa sta succedendo lì...


La tua tempistica è confusa, sia locale che server allo stesso tempo.
Io prenderei una seconda volta all'incirca così:

//+------------------------------------------------------------------+
bool NewBar()
{
static bool flag=false;
static int bar=Bars;
static datetime lasttime=0;

if (!flag && Bars!=bar)
   {
   bar=Bars;
   lasttime=TimeLocal();
   flag=true;
   }
if (flag && TimeLocal()-lasttime>=pause) //pause - пауза после начала бара, например 59 сек
   {
   flag=false;
   return(true);
   }
return(false);
}
 

Ciao, puoi dirmi per favore se hai bisogno di digitare in iData per questo indicatore, non importa se è qualsiasi programma o riferimento ai dati della barra, dove è possibile specificare il timeframe, perché i dati da altri timeframe non si riflettono correttamente nel grafico corrente diverso su timeframe, ma solo nel grafico del timeframe specificato? Grazie.

 

Ciao, forse qualcuno risponderà e aiuterà, proverò di nuovo. Qui c'è un post a pagina 367, è tutto scritto lì.

 
Novaja:

Ciao, forse qualcuno risponderà e aiuterà, proverò di nuovo. Ecco un post, pagina 367,, è tutto lì.


Guarda qui.

Motivazione: