新人对MQL4和MQL5的任何问题,对算法和代码的帮助和讨论 - 页 579

 
PolarSeaman:
仍然没有弄清楚如何计算当前周期的条形图关闭前的秒数。我需要你的帮助。

我给你的功能。

 
Artyom Trishkin:

我给你的功能。

是的,但上面的代码,在评论中,每秒钟平稳地倒数,功能是生硬的。在M1,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:

是的,但是上面的代码,在评论中,每秒钟平稳地倒数,而函数是生硬的。在M1中,60个小节中有3、4次没有警报。

这是因为该函数使用了TimeCurrent()--最后一次报价的到达时间。你需要用本地的TimeLocal()替换这个时间,并计算出偏移量(已经告诉过你了)。

 
Artyom Trishkin:

你需要用本地的TimeLocal()替换这个时间,并计算出偏移量(你已经被告知过这个问题)。

我不知道怎么做才对,所以我找到了一个代码,可以倒计时关闭H1的时间,没有刻度,并试图使用它,在你的函数中 替换了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。
如果(OrdersTotal>0) {x=1;}
如果(OrdersTotal <x) {警报;}
x=0;

 
Tigerfreerun:
请告诉我如何在代码中实现这个想法。
如果认股证已经打开,现在没有认股证=警报。

这种风格的东西可能...
double x=0。
如果(OrdersTotal >0) {x=1;}
如果(OrdersTotal <x) {警报;}
x=0;

If(OrdersTotal==0) {Alert ;}
 
Alekseu Fedotov:
If (OrdersTotal ==0) {Alert ;}
那么这个信号就是循环的。而且,即使没有开出订单。这个想法是:1)订单是开放的 2)现在没有订单 3)1个警报
 

伙计们!

图上有很多物体。

但当你访问它时。

Comment(ObjectsTotal());

它说只有三个。

为什么它不计算箭头?


 
Tigerfreerun:
请告诉我如何在代码中实现这个想法。
如果认股权证是开放的,而现在没有=警报。

像这样的事情可能...
double x=0。
如果(OrdersTotal >0) {x=1;}
如果(OrdersTotal <x) {警报;}
x=0;

像这样做。该代码几乎是正确的。那里只缺一个字。

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

伙计们!

图上有很多物体。

但当你访问它时。

它说只有三个。

为什么它不计算箭头?


也许是因为它们是 Wingdings字体符号