Toute question des nouveaux arrivants sur MQL4 et MQL5, aide et discussion sur les algorithmes et les codes. - page 579

 
PolarSeaman:
Je n'ai toujours pas trouvé comment compter les secondes jusqu'à la fermeture de la barre sur la période en cours. J'ai besoin de votre aide.

Je vous ai donné la fonction.

 
Artyom Trishkin:

Je vous ai donné la fonction.

Oui, mais le code ci-dessus, dans le commentaire, effectue un décompte régulier toutes les secondes, alors que la fonction est saccadée. Sur M1, sur 60 mesures, 3 ou 4 fois il n'y a pas d'alerte.

#property strict
#define  MILLISEC_TIMER_INTERVAL         500 
//--- input parameters
input int s_clo=2;
input int Period_=13,
Shift_=0;
input     ENUM_MA_METHOD Method_MA_=MODE_SMA;
input ENUM_APPLIED_PRICE Apply_to_=PRICE_CLOSE;
double ma_fast;
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+

int OnInit()
{

   if(!EventSetMillisecondTimer(MILLISEC_TIMER_INTERVAL))
   {
      Print("Не могу запустить таймер");
      return INIT_FAILED;
   }
return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//--- destroy timer
   EventKillTimer();

  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTimer()
  {
   RefreshRates();
//---
ma_fast=0;
   if(SecondsToCandleClose(Symbol(),0)>=s_clo)return;
   
   { ma_fast=ma(Period_,Shift_,Method_MA_,Apply_to_,0); Alert("ma_fast",ma_fast,"время откр. бара ",Time[0]);}
   
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
long SecondsToCandleClose(const string symbol_name,const ENUM_TIMEFRAMES timeframe)
  {
   datetime array[];
   return(CopyTime(symbol_name,timeframe,0,1,array)==1 ? PeriodSeconds(timeframe)+array[0]-TimeCurrent() : 0);
  }

//+------------------------------------------------------------------+
double ma(int period,int ma_shift,ENUM_MA_METHOD ma_method,ENUM_APPLIED_PRICE ap_price,int shift)
  {
   return(ND(iMA(NULL,(int)0,period,ma_shift,ma_method,ap_price,shift)));
  }
  //
  double ND(double A)
  {
   return(NormalizeDouble(A,Digits));
  }
  //
 
PolarSeaman:

Oui, mais le code ci-dessus, dans le commentaire, effectue un décompte régulier toutes les secondes, alors que la fonction est saccadée. Sur M1, sur 60 mesures, 3 ou 4 fois il n'y a pas d'alerte.

C'est parce que la fonction utilise TimeCurrent() - l'heure d'arrivée de la dernière citation. Vous devez remplacer cette heure par une TimeLocal() locale avec un décalage calculé (on vous l'a déjà dit).

 
Artyom Trishkin:

Vous devez remplacer cette heure par l'heure locale TimeLocal() avec un décalage calculé (on vous l'a déjà dit).

Je ne sais pas comment le faire correctement, alors j'ai trouvé un code qui compte le temps jusqu'à la fermeture du H1 sans ticks, et j'essaie de l'utiliser, j'ai remplacéTimeCurrent() dans votre fonction, mais il ne veut pas me montrer les secondes avant la fermeture.

#property strict
#property indicator_chart_window
//--- input parameters
#define  MILLISEC_TIMER_INTERVAL         500 
int            timeOffset;
datetime       ServerLocalOffset;
datetime       prevTime,myTime,localtime;
bool           newBar = false;
datetime sec;
//+------------------------------------------------------------------+
//| 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 localtime;
   localtime = TimeLocal()+(TimeGMTOffset()+(60*60));
 sec=Time[0]+Period()*60-localtime-timeOffset;//
 
 if(SecondsToCandleClose(Symbol(),0)<=2){Alert("время откр. бара ",Time[0]);}
      Comment(" Time 1: ",TimeToStr(sec,TIME_SECONDS )," Time 2: ",TimeToStr(SecondsToCandleClose(Symbol(),0),TIME_SECONDS ));
  }
//+------------------------------------------------------------------+
//+------------------------------------------------------------------+
long SecondsToCandleClose(const string symbol_name,const ENUM_TIMEFRAMES timeframe)
  {
   datetime array[];
   return(CopyTime(symbol_name,timeframe,0,1,array)==1 ? PeriodSeconds(timeframe)+array[0]-sec : 0);
  }
////
 
Veuillez me conseiller sur la manière d'implémenter cette idée dans le code :
Si les mandats étaient ouverts et que maintenant il n'y en a plus = Alerte.

Quelque chose comme ça probablement...
double x=0 ;
Si(OrdersTotal >0) {x=1;}
If (OrdersTotal <x) {Alert ;}
x=0 ;

 
Tigerfreerun:
S'il vous plaît dites-moi comment mettre en œuvre l'idée dans le code :
Si les mandats ont été ouverts et qu'il n'y a maintenant aucun mandat = Alerte.

Quelque chose dans ce style probablement...
double x=0 ;
Si (OrdersTotal >0) {x=1;}
If (OrdersTotal <x) {Alert ;}
x=0 ;

If(OrdersTotal ==0) {Alert ;}
 
Alekseu Fedotov:
If (OrdersTotal ==0) {Alert ;}
Alors le signal est cyclique. Et même si aucune commande n'a été ouverte. L'idée est que 1) les ordres sont ouverts 2) maintenant il n'y a pas d'ordres 3)1 Alerte
 

Les gars !

Il y a beaucoup d'objets sur le graphique.

Mais quand vous y accédez.

Comment(ObjectsTotal());

Ça dit qu'il n'y en a que trois.

Pourquoi ne compte-t-il pas les flèches ?


 
Tigerfreerun:
S'il vous plaît dites-moi comment mettre en œuvre l'idée dans le code :
Si les mandats étaient ouverts et que maintenant il n'y en a plus = Alerte.

Quelque chose comme ça probablement...
double x=0 ;
Si (OrdersTotal >0) {x=1;}
If (OrdersTotal <x) {Alert ;}
x=0 ;

Faites comme ça. Le code est presque correct. Il ne manque qu'un mot ici :

static double x=0;
If (OrdersTotal >0) {x=1;} 
If (OrdersTotal <x) {Алерт ; x= 0;} 
 
Vladimir Tkach:

Les gars !

Il y a beaucoup d'objets sur le graphique.

Mais quand vous y accédez.

Ça dit qu'il n'y en a que trois.

Pourquoi ne compte-t-il pas les flèches ?


Peut-être parce que ce sont dessymboles de la police Wingdings.
Raison: