Cualquier pregunta de los recién llegados sobre MQL4 y MQL5, ayuda y discusión sobre algoritmos y códigos - página 369

 

Buenas tardes. algo ha dejado de procesar la bandera en mt4 después de un tiempo. simplemente mt empieza a ignorarla, podrían decirme por qué:

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;
      }
Archivos adjuntos:
 
itslek:

Buenas tardes. algo ha dejado de procesar la bandera en mt4 después de algún tiempo. simplemente mt empieza a ignorarla, podrían decirme por qué:


prueba con una frecuencia de temporizador de 100-200ms,
500ms es demasiado para coger 1 segundo

y la vela puede abrirse unos segundos o incluso un minuto después

 
Ivan Ivanov:

Pruébalo:

... ¿O es que realmente se necesita externamente?


Gracias. Parece que ha ayudado.

¿Cuál es la diferencia entre entrada y salida?

 
Taras Slobodyanik:

prueba con una frecuencia de temporizador de 100-200ms,
500ms es demasiado tiempo para coger 1 segundo

y la vela puede abrirse unos segundos o incluso un minuto después


así que el problema no es que no lo coja. No hay nada malo en ello.

El problema es que la bandera deja de funcionar y empieza a enviar una señal cada 500ms, ignorando las condiciones de la bandera. No entiendo qué pasa ahí...

 
RichLux:¿Cuál es la diferencia entre entrada y salida?


 

Me pueden decir cómo reiniciar el buffer cuando aparece uno nuevo, pero de manera que no se borren los datos anteriores del buffer, sino que se muestren en el gráfico. Por alguna razón no puedo poner el buffer a cero y cuando aparece una nueva barra, los nuevos datos se superponen a los antiguos datos acumulados. Lo que no he descrito correctamente en el código.

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:

así que el problema no es que no lo coja. No hay nada malo en ello.

el problema es que la bandera deja de funcionar y empieza a enviar una señal cada 500ms, ignorando las condiciones de la bandera. no entiendo que pasa ahí...


La sincronización es confusa, tanto en el local como en el servidor al mismo tiempo.
Yo cogería un segundo a grandes rasgos como este:

//+------------------------------------------------------------------+
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);
}
 

Hola, ¿Puede decirme por favor si es necesario escribir en iData para este indicador, no importa si es cualquier programa o referencia a los datos de la barra, donde se puede especificar el marco de tiempo, ¿por qué es los datos de otros marcos de tiempo no se reflejan correctamente en la actual diferente en el gráfico de tiempo, pero sólo en el gráfico del marco de tiempo especificado? Gracias.

 

Hola, quizás alguien responda y ayude, lo intentaré de nuevo. Aquí hay un post en la página 367, está todo expuesto allí.

 
Novaja:

Hola, tal vez alguien responda y ayude, lo intentaré de nuevo. Aquí hay un post, página 367,, está todo ahí.


Compruébalo.

Razón de la queja: