MQL4、MQL5に関する初心者からの質問、アルゴリズムやコードに関するヘルプ、ディスカッションなど。 - ページ 579

 
PolarSeaman:
現在の期間のバーが閉じるまでの秒数をカウントする方法がまだわかっていません。あなたの力が必要です。

機能をあげてみました。

 
Artyom Trishkin:

機能をあげてみました。

そうなんですが、上のコメントのコードでは1秒ごとにスムーズにカウントダウンしているのに、この関数ではぎくしゃくしています。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:

はい、しかし、上記のコード、コメントでは、1秒ごとにスムーズにカウントダウンしていますが、関数ではぎくしゃくしています。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;
If(OrdersTotal>0) {x=1;}.
If (OrdersTotal <x) {Alert ;}.
x=0;

 
Tigerfreerun:
そのアイデアをコードで実装する方法を教えてください。
ワラントが開いていて、今はワラントがない場合=Alert。

このようなスタイルのものは、おそらく......。
double x=0;
If (OrdersTotal >0) {x=1;}.
If (OrdersTotal <x) {Alert ;}.
x=0;

If(OrdersTotal==0) {Alert ;}.
 
Alekseu Fedotov:
If (OrdersTotal ==0) {Alert ;}.
そうすると、信号が周期的になります。また、仮に注文が開かれていなかったとしても考え方としては、1)注文が開いている 2)今は注文がない 3)1アラート
 

みんな!

グラフにはたくさんのオブジェクトが描かれています。

でも、アクセスすると

Comment(ObjectsTotal());

3つしかないって書いてあるじゃん。

なぜ、矢印がカウントされないのですか?


 
Tigerfreerun:
そのアイデアをコードで実装する方法を教えてください。
ワラントが開いていて、今はない場合=アラート。

こんな感じかな、たぶん...。
double x=0;
If (OrdersTotal >0) {x=1;}.
If (OrdersTotal <x) {Alert ;}.
x=0;

こんな感じでやってください。コードはほぼ正しいです。そこには、たった1つの言葉が欠けている。

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

みんな!

グラフにはたくさんのオブジェクトが描かれています。

でも、アクセスすると

3つしかないって書いてあるじゃん。

なぜ、矢印がカウントされないのですか?


Wingdingsフォントの 記号だからでしょうか。