Любые вопросы новичков по MQL4 и MQL5, помощь и обсуждение по алгоритмам и кодам - страница 579

 
PolarSeaman:
Так и не сообразил, как посчитать секунды до закрытия бара на текущем периоде. Помогите.

Я вам функцию давал.

 
Artyom Trishkin:

Я вам функцию давал.

Да, но приведённый выше код, в комментарии, отсчитывает плавно каждую секунду, а функция бывает рывками. На М1, из 60 баров 3 или 4 раза нет алерта.

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

Да, но приведённый выше код, в комментарии, отсчитывает плавно каждую секунду, а функция бывает рывками. На М1, из 60 баров 3 или 4 раза нет алерта.

Потому, что в функции используется TimeCurrent() - время прихода последней котировки. Вам это время нужно заменить на локальное TimeLocal() с рассчитанным смещением (вам уже говорили про это)

 
Artyom Trishkin:

 Вам это время нужно заменить на локальное TimeLocal() с рассчитанным смещением (вам уже говорили про это)

Как правильно это сделать я не знаю, поэтому нашел код, который без тиков отсчитывает врем до закрытия Н1, и пытаюсь его использовать, заменил TimeCurrent() в вашей функции, но не хочет она мне показывать секунды до закрытия. 

#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);
  }
////
 
Подскажите пожалуйста как в коде реализовать идею:
Если были открыты ордера, а сейчас их нет = алерт. 

Что - то вот в таком стиле наверное.. 
double x=0;
If (OrdersTotal >0) {x=1;} 
If (OrdersTotal <x) {Алерт ;} 
x=0;

 
Tigerfreerun:
Подскажите пожалуйста как в коде реализовать идею:
Если открылись ордера ордера, а сейчас их нет = алерт. 

Что - то вот в таком стиле наверное.. 
double x=0;
If (OrdersTotal >0) {x=1;} 
If (OrdersTotal <x) {Алерт ;} 
x=0;

If (OrdersTotal ==0) {Алерт ;} 
 
Alekseu Fedotov:
If (OrdersTotal ==0) {Алерт ;} 
Тогда сигнал происходит циклично. И даже если не открывались ордера. Идея в том, чтобы 1) были открыты ордера 2) сейчас их не стало 3)1 Алерт 
 

Парни!

На графике куча объектов.

Но при обращении 

Comment(ObjectsTotal());

Он сообщает, что их только три.

Почему он не считает стрелки?


 
Tigerfreerun:
Подскажите пожалуйста как в коде реализовать идею:
Если были открыты ордера, а сейчас их нет = алерт. 

Что - то вот в таком стиле наверное.. 
double x=0;
If (OrdersTotal >0) {x=1;} 
If (OrdersTotal <x) {Алерт ;} 
x=0;

Так и сделайте. Код почти правильный. Там только одного слова не хватает:

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

Парни!

На графике куча объектов.

Но при обращении 

Он сообщает, что их только три.

Почему он не считает стрелки?


  Может потому, что они символы шрифта Wingdings