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

 
PolarSeaman:
Non ho ancora capito come contare i secondi fino alla chiusura della barra sul periodo corrente. Ho bisogno del vostro aiuto.

Vi ho dato la funzione.

 
Artyom Trishkin:

Vi ho dato la funzione.

Sì, ma il codice sopra, nel commento, fa un conto alla rovescia regolare ogni secondo, mentre la funzione è a scatti. Su M1, su 60 barre, 3 o 4 volte non c'è nessun allarme.

#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:

Sì, ma il codice di cui sopra, nel commento, fa un conto alla rovescia regolare ogni secondo, mentre la funzione è a scatti. Su M1, su 60 barre 3 o 4 volte non c'è nessun allarme.

Questo perché la funzione usa TimeCurrent() - tempo di arrivo dell'ultima citazione. Dovete sostituire questo tempo con un TimeLocal() locale con un offset calcolato (vi è già stato detto).

 
Artyom Trishkin:

Dovete sostituire questo tempo con TimeLocal() locale con l'offset calcolato (ve l'hanno già detto)

Non so come farlo bene, così ho trovato un codice che conta alla rovescia il tempo per chiudere H1 senza tick, e cercando di usarlo, ho sostituitoTimeCurrent() nella tua funzione, ma non vuole mostrarmi i secondi alla chiusura.

#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);
  }
////
 
Si prega di consigliare come implementare l'idea nel codice:
Se i mandati erano aperti e ora non ce ne sono = Allarme.

Qualcosa come questo probabilmente...
doppio x=0;
Se(OrdiniTotali >0) {x=1;}
Se (OrdiniTotali <x) {Avviso ;}
x=0;

 
Tigerfreerun:
Per favore, ditemi come implementare l'idea nel codice:
Se i mandati si sono aperti e ora non ci sono mandati = Allarme.

Qualcosa in questo stile probabilmente...
doppio x=0;
Se (OrdiniTotali >0) {x=1;}
Se (OrdiniTotali <x) {Avviso ;}
x=0;

If(OrdersTotal ==0) {Alert ;}
 
Alekseu Fedotov:
If (OrdersTotal ==0) {Alert ;}
Allora il segnale è ciclico. E anche se nessun ordine è stato aperto. L'idea è che 1) gli ordini sono aperti 2) ora non ci sono ordini 3)1 Alert
 

Ragazzi!

Ci sono molti oggetti sul grafico.

Ma quando vi si accede.

Comment(ObjectsTotal());

Dice che ce ne sono solo tre.

Perché non conta le frecce?


 
Tigerfreerun:
Per favore, ditemi come implementare l'idea nel codice:
Se i mandati erano aperti e ora non ce ne sono = Allarme.

Qualcosa come questo probabilmente...
doppio x=0;
Se (OrdiniTotali >0) {x=1;}
Se (OrdiniTotali <x) {Avviso ;}
x=0;

Fate così. Il codice è quasi corretto. Manca solo una parola:

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

Ragazzi!

Ci sono molti oggetti sul grafico.

Ma quando vi si accede.

Dice che ce ne sono solo tre.

Perché non conta le frecce?


Forse perché sonosimboli del carattere Wingdings