} //+------------------------------------------------------------------+ //| Expert tick function | //+------------------------------------------------------------------+ voidOnTick() { if(nb_1.new_bar("EURUSD",PERIOD_M5))Alert("Новый бар на EURUSD M5"); if(nb_2.new_bar("GBPUSD",PERIOD_M15))Alert("Новый бар на GBPUSD M15"); if(nb_3.new_bar("USDJPY",PERIOD_M30))Alert("Новый бар на USDJPY M30"); if(nb_4.new_bar("AUDCAD",PERIOD_H1))Alert("Новый бар на AUDCAD H1");
2016.12.2720:00:02.827 test03 EURUSD,M1: Alert: Новый бар на USDJPY M30 2016.12.2720:00:01.663 test03 EURUSD,M1: Alert: Новый бар на AUDCAD H1 2016.12.2720:00:01.663 test03 EURUSD,M1: Alert: Новый бар на GBPUSD M15 2016.12.2720:00:01.663 test03 EURUSD,M1: Alert: Новый бар на EURUSD M5 2016.12.2719:55:01.999 test03 EURUSD,M1: Alert: Новый бар на EURUSD M5
CNevBar *nb[]; int SymbolTotal=0; //+------------------------------------------------------------------+ //| Expert initialization function | //+------------------------------------------------------------------+ intOnInit() { //--- SymbolTotal=SymbolsTotal(false); ArrayResize(nb,SymbolTotal);
for(int i=0;i<SymbolTotal;i++) { nb[i]=new CNevBar(); //Print("Экземпляр класса = ",nb[i]); } //--- return(INIT_SUCCEEDED); } //+------------------------------------------------------------------+ //| Expert deinitialization function | //+------------------------------------------------------------------+ voidOnDeinit(constint reason) { for(int i=0;i<SymbolTotal;i++)delete(nb[i]); } //+------------------------------------------------------------------+ //| Expert tick function | //+------------------------------------------------------------------+ voidOnTick() { ulong Start=0; Start=GetMicrosecondCount(); for(int i=0;i<SymbolTotal;i++) { string symbol=SymbolName(i,false); if(nb[i].new_bar(symbol,PERIOD_M1))Print("Новый бар на ",symbol," M1"); } Print("На обработку всех символов в терминале ушло: ",GetMicrosecondCount()-Start," миллисекунд"); } //+------------------------------------------------------------------+
結果
2016.12.2722:24:01.182 Expert test03 EURUSD,M1: loaded successfully 2016.12.2722:24:05.046 test03 EURUSD,M1: initialized 2016.12.2722:24:39.497 test03 EURUSD,M1: На обработку 49 символов в терминале ушло: 66522 миллисекунд 2016.12.2722:24:42.819 test03 EURUSD,M1: На обработку 49 символов в терминале ушло: 181 миллисекунд 2016.12.2722:24:47.743 test03 EURUSD,M1: На обработку 49 символов в терминале ушло: 181 миллисекунд 2016.12.2722:24:48.658 test03 EURUSD,M1: На обработку 49 символов в терминале ушло: 172 миллисекунд 2016.12.2722:25:03.367 test03 EURUSD,M1: На обработку 49 символов в терминале ушло: 173 миллисекунд 2016.12.2722:25:10.051 test03 EURUSD,M1: Новый бар на EURUSD M1 2016.12.2722:25:10.051 test03 EURUSD,M1: На обработку 49 символов в терминале ушло: 183 миллисекунд 2016.12.2722:25:17.232 test03 EURUSD,M1: Новый бар на USDJPY M1 2016.12.2722:25:17.232 test03 EURUSD,M1: На обработку 49 символов в терминале ушло: 191 миллисекунд 2016.12.2722:25:19.668 test03 EURUSD,M1: На обработку 49 символов в терминале ушло: 162 миллисекунд 2016.12.2722:25:19.788 test03 EURUSD,M1: На обработку 49 символов в терминале ушло: 130 миллисекунд 2016.12.2722:25:23.064 test03 EURUSD,M1: На обработку 49 символов в терминале ушло: 160 миллисекунд 2016.12.2722:25:25.579 test03 EURUSD,M1: На обработку 49 символов в терминале ушло: 132 миллисекунд 2016.12.2722:25:57.800 test03 EURUSD,M1: Новый бар на GBPUSD M1 2016.12.2722:25:57.800 test03 EURUSD,M1: Новый бар на USDCHF M1 2016.12.2722:25:57.800 test03 EURUSD,M1: На обработку 49 символов в терминале ушло: 154 миллисекунд 2016.12.2722:25:58.510 test03 EURUSD,M1: На обработку 49 символов в терминале ушло: 129 миллисекунд 2016.12.2722:25:58.610 test03 EURUSD,M1: На обработку 49 символов в терминале ушло: 176 миллисекунд 2016.12.2722:25:58.850 test03 EURUSD,M1: На обработку 49 символов в терминале ушло: 173 миллисекунд 2016.12.2722:25:58.892 test03 EURUSD,M1: На обработку 49 символов в терминале ушло: 136 миллисекунд 2016.12.2722:25:59.043 test03 EURUSD,M1: На обработку 49 символов в терминале ушло: 138 миллисекунд 2016.12.2722:26:00.252 test03 EURUSD,M1: На обработку 49 символов в терминале ушло: 147 миллисекунд 2016.12.2722:26:19.801 test03 EURUSD,M1: Новый бар на EURUSD M1 2016.12.2722:26:19.801 test03 EURUSD,M1: На обработку 49 символов в терминале ушло: 156 миллисекунд 2016.12.2722:26:26.219 test03 EURUSD,M1: Новый бар на GBPUSD M1 2016.12.2722:26:26.219 test03 EURUSD,M1: Новый бар на USDCHF M1 2016.12.2722:26:26.219 test03 EURUSD,M1: На обработку 49 символов в терминале ушло: 170 миллисекунд 2016.12.2722:26:35.065 test03 EURUSD,M1: Новый бар на USDJPY M1 2016.12.2722:26:35.065 test03 EURUSD,M1: На обработку 49 символов в терминале ушло: 204 миллисекунд 2016.12.2722:26:41.118 test03 EURUSD,M1: На обработку 49 символов в терминале ушло: 135 миллисекунд 2016.12.2722:26:49.655 test03 EURUSD,M1: На обработку 49 символов в терминале ушло: 239 миллисекунд 2016.12.2722:26:49.745 test03 EURUSD,M1: На обработку 49 символов в терминале ушло: 129 миллисекунд 2016.12.2722:26:56.357 test03 EURUSD,M1: На обработку 49 символов в терминале ушло: 133 миллисекунд 2016.12.2722:26:56.467 test03 EURUSD,M1: На обработку 49 символов в терминале ушло: 132 миллисекунд 2016.12.2722:27:01.395 test03 EURUSD,M1: Новый бар на EURUSD M1 2016.12.2722:27:01.395 test03 EURUSD,M1: Новый бар на USDCHF M1 2016.12.2722:27:01.395 test03 EURUSD,M1: На обработку 49 символов в терминале ушло: 148 миллисекунд 2016.12.2722:27:02.204 test03 EURUSD,M1: Новый бар на USDJPY M1 2016.12.2722:27:02.204 test03 EURUSD,M1: На обработку 49 символов в терминале ушло: 148 миллисекунд 2016.12.2722:27:02.304 test03 EURUSD,M1: На обработку 49 символов в терминале ушло: 129 миллисекунд 2016.12.2722:27:02.464 test03 EURUSD,M1: На обработку 49 символов в терминале ушло: 132 миллисекунд 2016.12.2722:27:03.143 test03 EURUSD,M1: На обработку 49 символов в терминале ушло: 134 миллисекунд 2016.12.2722:28:33.018 test03 EURUSD,M1: Новый бар на EURUSD M1 2016.12.2722:28:33.018 test03 EURUSD,M1: Новый бар на GBPUSD M1 2016.12.2722:28:33.018 test03 EURUSD,M1: Новый бар на USDJPY M1 2016.12.2722:28:33.018 test03 EURUSD,M1: На обработку 49 символов в терминале ушло: 174 миллисекунд 2016.12.2722:28:33.308 test03 EURUSD,M1: На обработку 49 символов в терминале ушло: 133 миллисекунд 2016.12.2722:28:33.509 test03 EURUSD,M1: Новый бар на USDCHF M1 2016.12.2722:28:33.509 test03 EURUSD,M1: На обработку 49 символов в терминале ушло: 154 миллисекунд 2016.12.2722:28:44.137 test03 EURUSD,M1: На обработку 49 символов в терминале ушло: 132 миллисекунд 2016.12.2722:28:45.088 test03 EURUSD,M1: uninit reason 1 2016.12.2722:28:45.158 Expert test03 EURUSD,M1: removed
こんなこともできるんだ...。
...
ありがとうございます、詳しくないのですが調べてみます、私のも改造してみます。
3行で収まるんだから、こんなシンプルな設計でスズほど長いコードを書く必要はないでしょう。
void OnTick()
{
if(BBars!=Bars)
{BBars=Bars;
// код....
}
}
ありがとうございます。このレコードについてはよく知らないのですが、調べてみます。
Pエントリーは非常にシンプルで、CNevBarクラスにnew_barメソッドが1つ書かれています。new_bar メソッドは、指定された文字と周期で新しいバーイベントを作成します。新しいバーイベントが発生した場合、new_bar メソッドは true を返し、そうでない場合は false を返します。
{
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);
}
次に、クラス宣言です。
次に、自分のコードでクラスのメソッドを 使用します。
以下は、このクラスを異なる記号とピリオドで使用した例です。
//| test03.mq4 |
//| Sergey Gritsay |
//| https://www.mql5.com/ru/users/sergey1294 |
//+------------------------------------------------------------------+
#property copyright "Sergey Gritsay"
#property link "https://www.mql5.com/ru/users/sergey1294"
#property version "1.00"
#property strict
//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
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 nb_1;
CNevBar nb_2;
CNevBar nb_3;
CNevBar nb_4;
//+------------------------------------------------------------------+
//| Expert initialization function |
//+------------------------------------------------------------------+
int OnInit()
{
//---
//---
return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| Expert deinitialization function |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{
}
//+------------------------------------------------------------------+
//| Expert tick function |
//+------------------------------------------------------------------+
void OnTick()
{
if(nb_1.new_bar("EURUSD",PERIOD_M5))Alert("Новый бар на EURUSD M5");
if(nb_2.new_bar("GBPUSD",PERIOD_M15))Alert("Новый бар на GBPUSD M15");
if(nb_3.new_bar("USDJPY",PERIOD_M30))Alert("Новый бар на USDJPY M30");
if(nb_4.new_bar("AUDCAD",PERIOD_H1))Alert("Новый бар на AUDCAD H1");
}
//+------------------------------------------------------------------+
このクラスの作業の結果
2016.12.27 20:00:01.663 test03 EURUSD,M1: Alert: Новый бар на AUDCAD H1
2016.12.27 20:00:01.663 test03 EURUSD,M1: Alert: Новый бар на GBPUSD M15
2016.12.27 20:00:01.663 test03 EURUSD,M1: Alert: Новый бар на EURUSD M5
2016.12.27 19:55:01.999 test03 EURUSD,M1: Alert: Новый бар на EURUSD M5
3行で収まります。 こんなシンプルな設計なのに、フットロッカーほど長いコードを書く必要はないでしょう。
void OnTick()
{
if(BBars!=Bars)
{BBars=Bars;
// код....
}
}
なぜクラスをここに引きずり込む必要があるのか、理解できません。
現在のシンボルとピリオドにのみ使用するのであれば、クラスは必要なく、ユーザー定義関数で十分です。
//| test03.mq4 |
//| Sergey Gritsay |
//| https://www.mql5.com/ru/users/sergey1294 |
//+------------------------------------------------------------------+
#property copyright "Sergey Gritsay"
#property link "https://www.mql5.com/ru/users/sergey1294"
#property version "1.00"
#property strict
datetime curbar;
datetime lastbar;
//+------------------------------------------------------------------+
//| Expert initialization function |
//+------------------------------------------------------------------+
int OnInit()
{
//---
//---
return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| Expert deinitialization function |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{
}
//+------------------------------------------------------------------+
//| Expert tick function |
//+------------------------------------------------------------------+
void OnTick()
{
if(new_bar(_Symbol,PERIOD_CURRENT))Alert("Новый бар");
}
//+------------------------------------------------------------------+
bool 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);
}
//+------------------------------------------------------------------+
クラスでプログラムする方が簡単です
こんにちは。
チャートが配置されている期間(タイムフレーム)の分の値の平方根を 計算して、後で計算に使いたい。
Period()は見つけたけど、これでどうやって数学演算をするんだ?
チップをください。
こんにちは。
チャートが配置されている期間(タイムフレーム)の分の値の平方根を計算して、後で計算に使いたい。
Period()は見つけたけど、これでどうやって数学演算をするんだ?
チップをください。
なぜここにクラスを引きずり込む必要があるのか理解できない
つまり、大雑把に言えば、OnTickは 全てのティックを チェックし、例えば以前のように60-90組のリソースを食い尽くすのでしょうか?
何がリソースだ!基本的に200ミリ秒以下で終わる私の端末で49文字を処理するための検証コードを紹介します。
//| test03.mq4 |
//| Sergey Gritsay |
//| https://www.mql5.com/ru/users/sergey1294 |
//+------------------------------------------------------------------+
#property copyright "Sergey Gritsay"
#property link "https://www.mql5.com/ru/users/sergey1294"
#property version "1.00"
#property strict
//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
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 *nb[];
int SymbolTotal=0;
//+------------------------------------------------------------------+
//| Expert initialization function |
//+------------------------------------------------------------------+
int OnInit()
{
//---
SymbolTotal=SymbolsTotal(false);
ArrayResize(nb,SymbolTotal);
for(int i=0;i<SymbolTotal;i++)
{
nb[i]=new CNevBar();
//Print("Экземпляр класса = ",nb[i]);
}
//---
return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| Expert deinitialization function |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{
for(int i=0;i<SymbolTotal;i++)delete(nb[i]);
}
//+------------------------------------------------------------------+
//| Expert tick function |
//+------------------------------------------------------------------+
void OnTick()
{
ulong Start=0;
Start=GetMicrosecondCount();
for(int i=0;i<SymbolTotal;i++)
{
string symbol=SymbolName(i,false);
if(nb[i].new_bar(symbol,PERIOD_M1))Print("Новый бар на ",symbol," M1");
}
Print("На обработку всех символов в терминале ушло: ",GetMicrosecondCount()-Start," миллисекунд");
}
//+------------------------------------------------------------------+
結果
2016.12.27 22:24:05.046 test03 EURUSD,M1: initialized
2016.12.27 22:24:39.497 test03 EURUSD,M1: На обработку 49 символов в терминале ушло: 66522 миллисекунд
2016.12.27 22:24:42.819 test03 EURUSD,M1: На обработку 49 символов в терминале ушло: 181 миллисекунд
2016.12.27 22:24:47.743 test03 EURUSD,M1: На обработку 49 символов в терминале ушло: 181 миллисекунд
2016.12.27 22:24:48.658 test03 EURUSD,M1: На обработку 49 символов в терминале ушло: 172 миллисекунд
2016.12.27 22:25:03.367 test03 EURUSD,M1: На обработку 49 символов в терминале ушло: 173 миллисекунд
2016.12.27 22:25:10.051 test03 EURUSD,M1: Новый бар на EURUSD M1
2016.12.27 22:25:10.051 test03 EURUSD,M1: На обработку 49 символов в терминале ушло: 183 миллисекунд
2016.12.27 22:25:17.232 test03 EURUSD,M1: Новый бар на USDJPY M1
2016.12.27 22:25:17.232 test03 EURUSD,M1: На обработку 49 символов в терминале ушло: 191 миллисекунд
2016.12.27 22:25:19.668 test03 EURUSD,M1: На обработку 49 символов в терминале ушло: 162 миллисекунд
2016.12.27 22:25:19.788 test03 EURUSD,M1: На обработку 49 символов в терминале ушло: 130 миллисекунд
2016.12.27 22:25:23.064 test03 EURUSD,M1: На обработку 49 символов в терминале ушло: 160 миллисекунд
2016.12.27 22:25:25.579 test03 EURUSD,M1: На обработку 49 символов в терминале ушло: 132 миллисекунд
2016.12.27 22:25:57.800 test03 EURUSD,M1: Новый бар на GBPUSD M1
2016.12.27 22:25:57.800 test03 EURUSD,M1: Новый бар на USDCHF M1
2016.12.27 22:25:57.800 test03 EURUSD,M1: На обработку 49 символов в терминале ушло: 154 миллисекунд
2016.12.27 22:25:58.510 test03 EURUSD,M1: На обработку 49 символов в терминале ушло: 129 миллисекунд
2016.12.27 22:25:58.610 test03 EURUSD,M1: На обработку 49 символов в терминале ушло: 176 миллисекунд
2016.12.27 22:25:58.850 test03 EURUSD,M1: На обработку 49 символов в терминале ушло: 173 миллисекунд
2016.12.27 22:25:58.892 test03 EURUSD,M1: На обработку 49 символов в терминале ушло: 136 миллисекунд
2016.12.27 22:25:59.043 test03 EURUSD,M1: На обработку 49 символов в терминале ушло: 138 миллисекунд
2016.12.27 22:26:00.252 test03 EURUSD,M1: На обработку 49 символов в терминале ушло: 147 миллисекунд
2016.12.27 22:26:19.801 test03 EURUSD,M1: Новый бар на EURUSD M1
2016.12.27 22:26:19.801 test03 EURUSD,M1: На обработку 49 символов в терминале ушло: 156 миллисекунд
2016.12.27 22:26:26.219 test03 EURUSD,M1: Новый бар на GBPUSD M1
2016.12.27 22:26:26.219 test03 EURUSD,M1: Новый бар на USDCHF M1
2016.12.27 22:26:26.219 test03 EURUSD,M1: На обработку 49 символов в терминале ушло: 170 миллисекунд
2016.12.27 22:26:35.065 test03 EURUSD,M1: Новый бар на USDJPY M1
2016.12.27 22:26:35.065 test03 EURUSD,M1: На обработку 49 символов в терминале ушло: 204 миллисекунд
2016.12.27 22:26:41.118 test03 EURUSD,M1: На обработку 49 символов в терминале ушло: 135 миллисекунд
2016.12.27 22:26:49.655 test03 EURUSD,M1: На обработку 49 символов в терминале ушло: 239 миллисекунд
2016.12.27 22:26:49.745 test03 EURUSD,M1: На обработку 49 символов в терминале ушло: 129 миллисекунд
2016.12.27 22:26:56.357 test03 EURUSD,M1: На обработку 49 символов в терминале ушло: 133 миллисекунд
2016.12.27 22:26:56.467 test03 EURUSD,M1: На обработку 49 символов в терминале ушло: 132 миллисекунд
2016.12.27 22:27:01.395 test03 EURUSD,M1: Новый бар на EURUSD M1
2016.12.27 22:27:01.395 test03 EURUSD,M1: Новый бар на USDCHF M1
2016.12.27 22:27:01.395 test03 EURUSD,M1: На обработку 49 символов в терминале ушло: 148 миллисекунд
2016.12.27 22:27:02.204 test03 EURUSD,M1: Новый бар на USDJPY M1
2016.12.27 22:27:02.204 test03 EURUSD,M1: На обработку 49 символов в терминале ушло: 148 миллисекунд
2016.12.27 22:27:02.304 test03 EURUSD,M1: На обработку 49 символов в терминале ушло: 129 миллисекунд
2016.12.27 22:27:02.464 test03 EURUSD,M1: На обработку 49 символов в терминале ушло: 132 миллисекунд
2016.12.27 22:27:03.143 test03 EURUSD,M1: На обработку 49 символов в терминале ушло: 134 миллисекунд
2016.12.27 22:28:33.018 test03 EURUSD,M1: Новый бар на EURUSD M1
2016.12.27 22:28:33.018 test03 EURUSD,M1: Новый бар на GBPUSD M1
2016.12.27 22:28:33.018 test03 EURUSD,M1: Новый бар на USDJPY M1
2016.12.27 22:28:33.018 test03 EURUSD,M1: На обработку 49 символов в терминале ушло: 174 миллисекунд
2016.12.27 22:28:33.308 test03 EURUSD,M1: На обработку 49 символов в терминале ушло: 133 миллисекунд
2016.12.27 22:28:33.509 test03 EURUSD,M1: Новый бар на USDCHF M1
2016.12.27 22:28:33.509 test03 EURUSD,M1: На обработку 49 символов в терминале ушло: 154 миллисекунд
2016.12.27 22:28:44.137 test03 EURUSD,M1: На обработку 49 символов в терминале ушло: 132 миллисекунд
2016.12.27 22:28:45.088 test03 EURUSD,M1: uninit reason 1
2016.12.27 22:28:45.158 Expert test03 EURUSD,M1: removed