初心者の方からの質問 MQL5 MT5 MetaTrader 5 - ページ 517

 

MT4、コミュニティに協力してください。
1.エキスパートアドバイザーでは、M1チャートで(ティックまたは0.5秒タイマーで)作業し、H1チャートの新しいローソクの 瞬間に計算を行う必要があります。
我々は、各時間の最後のM1キャンドル(NN:00分)に続いて、M1キャンドルの開始をキャッチすることができますが、それは非常に良いものではありません...また、H1ローソク足がその瞬間に表示されないこともあります。
もしかしたら、もっとエレガントなやり方があるのでは?
2.Expert Advisor のテキストにあるインジケータコードと比較して、iCustom() を通してインジケータ値を取得するのにかかる時間はどれくらいですか?
3. Expert Advisorのテキストに表示されるインジケータのコードが、より速く計算される場合、M1チャートに付属するExpert Advisorでは、H1チャート上のインジケータの値を計算する方法は?

 
MikeZv:

MT4、コミュニティに助けを求めています。
1.エキスパートアドバイザーでは、M1チャートをティックまたは0.5秒タイマーで操作し、H1チャートに新しいローソクが 表示された瞬間に計算をする必要があります。
我々は、各時間の最後のM1キャンドル(NN:00分)に続いて、M1キャンドルの開始をキャッチすることができますが、それは非常に良いものではありません...また、H1ローソク足がその瞬間に表示されないこともあります。
もしかしたら、もっとエレガントなやり方があるのでは?
2.Expert Advisor のテキストにあるインジケータコードと比較して、iCustom() を通してインジケータ値を取得するのにかかる時間はどれくらいですか?
3. Expert Advisorのテキストに表示されるインジケータのコードが、より速く計算される場合、M1チャートに付属するExpert Advisorでは、H1チャート上のインジケータの値を計算する方法は?

最初の質問に対する答えですが、この関数は新しいバーを 定義します。

bool NevBar(int period)
  {
   static datetime StatTime;

   if(StatTime!=iTime(NULL,period,0))
     {
      StatTime=iTime(NULL,period,0);
      return(true);
     }
   return(false);
  }

使用例

int OnInit()
  {
//---
   NevBar(PERIOD_H1);
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---

  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
//---
   if(NevBar(PERIOD_H1))
     {
      производим вычисления.
     }
  }
//+------------------------------------------------------------------+

 
Sergey Gritsay:

最初の質問に対する答えですが、この関数は新しいバーを 定義します。

Sergeyさん、どうもありがとうございます。ドキュメントに目を通しましたが、どういうわけかiTime()を見逃していました.:
また、なぜOnInit()の中でNevBar()を呼び出すのでしょうか?

 
MikeZv:

最初の関数呼び出し、それ以外は即座にトリガーされます。OnInit()が呼び出されない ようにするために

bool NevBar(int period)
  {
   static datetime StatTime;
   
   if(StatTime==0)StatTime=iTime(NULL,period,0);

   if(StatTime!=iTime(NULL,period,0))
     {
      StatTime=iTime(NULL,period,0);
      return(true);
     }
   return(false);
  }
 
Sergey Gritsay:

最初の関数呼び出し、それ以外は即座にトリガーされます。OnInit()が呼び出されない ようにするために

セルゲイさん、ありがとうございました。フォーラムでは、「スタティック変数は使うな!」と強く恫喝されました。" :)
 
MikeZv:
セルゲイさん、ありがとうございました。フォーラムでは、「スタティック変数を使うな!」とビビッてました。" :)
聞いてはいけない、使わなければならないのなら、勇敢に、しかし正しく使いなさい
 
MikeZv:
セルゲイさん、ありがとうございました。フォーラムでは、「スタティック変数を使うな!」とビビッてました。" :)
初めて知りました。何がそんなに怖いんでしょうね。私も滅多に使いませんが、ある種の作業には向いていますね。
 
Sergey Gritsay:
初めて知りました、何がそんなに怖いんでしょうね、私もほとんど使いませんが、ある種の作業には向いているようです。
問題は、静的変数は、EAの全実行時間中に同じシンボルと時間枠でNevDay()が呼び出された場合にのみ使用できることです。 2つ以上のシンボルがある場合、NevDay()は不正な値を返します。My Expert Advisorは多通貨に対応するように設計されています。:(
 
MikeZv:
ポイントは、静的変数は同じシンボルと時間枠に対して NevDay()が呼び出された場合にのみ使用できることです。 2つ以上のシンボルがある場合、NevDay()は不正確な値を返します。私のExpert Advisorは多通貨対応です ...:(

多通貨モードで必要な場合は、以下の例をご覧ください。MT4とMT5で動作します。

//+------------------------------------------------------------------+
//|                                                         тест.mq4 |
//|                        Copyright 2016, MetaQuotes Software Corp. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2016, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"

//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//---
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---

  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
//---
   int SymbolTotal=SymbolsTotal(true);
   Comment("SymbolTotal = ",SymbolTotal);
   for(int i=0;i<SymbolTotal;i++)
     {
      if(NewBar(SymbolTotal,i,SymbolName(i,true),PERIOD_H1))
        {
         Alert(SymbolName(i,true)," Новый бар на Н1");
        }
     }

  }
//+------------------------------------------------------------------+
bool NewBar(int size,int i,string symbol,ENUM_TIMEFRAMES  period)
  {
   datetime curbar[];
   static datetime lastbar[];
   ArrayResize(curbar,size);
   ArrayResize(lastbar,size);

   curbar[i]=(datetime) SeriesInfoInteger(symbol,period,SERIES_LASTBAR_DATE);

   if(lastbar[i]==0)lastbar[i]=(datetime)SeriesInfoInteger(symbol,period,SERIES_LASTBAR_DATE);
   if(lastbar[i]!=curbar[i])
     {
      lastbar[i]=curbar[i];
      return(true);
     }
   return(false);
  }
//+------------------------------------------------------------------+
 
MikeZv:
ポイントは、同じシンボルと時間枠で NevDay()が呼び出された場合のみ、静的変数を使用できることです。 2つ以上のシンボルがある場合、NevDay()は不正な値を返します。私のExpert Advisorは多通貨対応です ...:(

以下は、クラスを使った別のオプションです。

//+------------------------------------------------------------------+
//|                                                         тест.mq4 |
//|                        Copyright 2016, MetaQuotes Software Corp. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2016, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
class CNevBar
  {
private:
   datetime          curbar;
   datetime          lastbar;
public:
                     CNevBar();
                    ~CNevBar();
   bool              new_bar(string symbol,ENUM_TIMEFRAMES period);
  };
//+------------------------------------------------------------------+
void CNevBar::CNevBar()
  {

  }
//+------------------------------------------------------------------+
void CNevBar::~CNevBar(void)
  {

  }
//+------------------------------------------------------------------+
bool CNevBar:: new_bar(string symbol,ENUM_TIMEFRAMES period)
  {
   curbar=(datetime) SeriesInfoInteger(symbol,period,SERIES_LASTBAR_DATE);
   if(lastbar==0)lastbar=(datetime)SeriesInfoInteger(symbol,period,SERIES_LASTBAR_DATE);
   if(lastbar!=curbar)
     {
      lastbar=curbar;
      return(true);
     }
   return(false);
  }

CNevBar *eurusd_H1; // объявим экземпляр класса для симмвола EURUSD
CNevBar *eurusd_M15; // объявим экземпляр класса для симмвола EURUSD

CNevBar *audusd_M30; // объявим экземпляр класса для симмвола AUDUSD
CNevBar *audusd_M5; // объявим экземпляр класса для симмвола AUDUSD

//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//---
   eurusd_H1=new CNevBar();// создадим экземпляр класса для симмвола EURUSD
   audusd_M30=new CNevBar();// создадим экземпляр класса для симмвола AUDUSD
   eurusd_M15=new CNevBar();// создадим экземпляр класса для симмвола EURUSD
   audusd_M5=new CNevBar();// создадим экземпляр класса для симмвола AUDUSD

//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---
   delete eurusd_H1;// удалим экземпляр класса для симмвола EURUSD
   delete audusd_M30;// удалим экземпляр класса для симмвола AUDUSD
   delete eurusd_M15;// удалим экземпляр класса для симмвола EURUSD
   delete audusd_M5;// удалим экземпляр класса для симмвола AUDUSD

  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {

   if(eurusd_H1.new_bar("EURUSD",PERIOD_H1))
     {
      Alert("EURUSD"," Новый бар на Н1");
     }

   if(eurusd_M15.new_bar("EURUSD",PERIOD_M15))
     {
      Alert("EURUSD"," Новый бар на M15");
     }

   if(audusd_M30.new_bar("AUDUSD",PERIOD_M30))
     {
      Alert("AUDUSD"," Новый бар на M30");
     }
   if(audusd_M5.new_bar("AUDUSD",PERIOD_M5))
     {
      Alert("AUDUSD"," Новый бар на M5");
     }

//---

  }
//+------------------------------------------------------------------+
//+------------------------------------------------------------------+

テスト結果

2016.02.20 21:09:43     2015.01.10 00:00  тест3 test started
2016.02.20 21:09:45     2015.01.12 00:00  тест3 EURUSD,M1: Alert: EURUSD Новый бар на M15
2016.02.20 21:09:47     2015.01.12 00:00  тест3 EURUSD,M1: Alert: AUDUSD Новый бар на M30
2016.02.20 21:09:50     2015.01.12 00:00  тест3 EURUSD,M1: Alert: AUDUSD Новый бар на M5
2016.02.20 21:09:53     2015.01.12 00:05  тест3 EURUSD,M1: Alert: AUDUSD Новый бар на M5
2016.02.20 21:09:59     2015.01.12 00:10  тест3 EURUSD,M1: Alert: AUDUSD Новый бар на M5
2016.02.20 21:10:04     2015.01.12 00:15  тест3 EURUSD,M1: Alert: EURUSD Новый бар на M15
2016.02.20 21:10:04     2015.01.12 00:15  тест3 EURUSD,M1: Alert: AUDUSD Новый бар на M5
2016.02.20 21:10:10     2015.01.12 00:20  тест3 EURUSD,M1: Alert: AUDUSD Новый бар на M5
2016.02.20 21:10:13     2015.01.12 00:25  тест3 EURUSD,M1: Alert: AUDUSD Новый бар на M5
2016.02.20 21:10:16     2015.01.12 00:30  тест3 EURUSD,M1: Alert: EURUSD Новый бар на M15
2016.02.20 21:10:16     2015.01.12 00:30  тест3 EURUSD,M1: Alert: AUDUSD Новый бар на M30
2016.02.20 21:10:16     2015.01.12 00:30  тест3 EURUSD,M1: Alert: AUDUSD Новый бар на M5
2016.02.20 21:10:23     2015.01.12 00:35  тест3 EURUSD,M1: Alert: AUDUSD Новый бар на M5
2016.02.20 21:10:26     2015.01.12 00:40  тест3 EURUSD,M1: Alert: AUDUSD Новый бар на M5
2016.02.20 21:10:29     2015.01.12 00:45  тест3 EURUSD,M1: Alert: EURUSD Новый бар на M15
2016.02.20 21:10:29     2015.01.12 00:45  тест3 EURUSD,M1: Alert: AUDUSD Новый бар на M5
2016.02.20 21:10:34     2015.01.12 00:50  тест3 EURUSD,M1: Alert: AUDUSD Новый бар на M5
2016.02.20 21:10:36     2015.01.12 00:55  тест3 EURUSD,M1: Alert: AUDUSD Новый бар на M5
2016.02.20 21:10:39     2015.01.12 01:00  тест3 EURUSD,M1: Alert: EURUSD Новый бар на Н1
2016.02.20 21:10:39     2015.01.12 01:00  тест3 EURUSD,M1: Alert: EURUSD Новый бар на M15
2016.02.20 21:10:39     2015.01.12 01:00  тест3 EURUSD,M1: Alert: AUDUSD Новый бар на M30
2016.02.20 21:10:39     2015.01.12 01:00  тест3 EURUSD,M1: Alert: AUDUSD Новый бар на M5
2016.02.20 21:10:46     2015.01.12 01:05  тест3 EURUSD,M1: Alert: AUDUSD Новый бар на M5
2016.02.20 21:10:50     2015.01.12 01:10  тест3 EURUSD,M1: Alert: AUDUSD Новый бар на M5
2016.02.20 21:10:55     2015.01.12 01:15  тест3 EURUSD,M1: Alert: EURUSD Новый бар на M15
2016.02.20 21:10:55     2015.01.12 01:15  тест3 EURUSD,M1: Alert: AUDUSD Новый бар на M5
2016.02.20 21:10:57     2015.01.12 01:17  Tester: stop button pressed
理由: