バーとボリュームは新しいバーを検出 するのに信頼性がありません。
コンピュータはナノ秒単位で動いているので、うまくコード化されたEAは20ミリ秒で多くのことを行うことができます。
- 2010.10.11
- Konstantin Gruzdev
- www.mql5.com
- www.mql5.com
アランさん、ありがとうございます。
非常に興味深いです......まさに私が推測していることです......。10倍速い......うーん。
意味する。TimeCurrent()は、高速で、バーの境界線に同期している?
なぜ......うーん......。
私はそれについて考えるためにしばらく時間が必要です。
ウィルバー
OK - こういうのが好きな人へ:この問題についての私の研究。
私は、OnTickイベントごとに、ある文章をファイルに書きました。
TimeLocal (PC CLock), TimeCurrent(), SymbolInfoTick() を使って、最後に来たティックに関するいくつかの情報と、- CopyRates() を使って、現在のBarに関するいくつかの情報を得ることができます。
USD/JPY "の例 - 期間は "M1 "です。
PC-Clockで19:43:01に43分足の最初のティックが入り、同時に新しいバーが発生しました。
ティックボリュームが1でないのはご愛嬌として、これが通常の流れです。
時にはそれはそう簡単ではありません - この場合のように。
PCは、41分のバーの3つのティックが来たとき、すでに19:42:00を示しています。それらはまだ19:41:59のタイムスタンプを持っています。
今、世界は深呼吸をしています - 8.150ミリ秒の完全な静止状態。
そして、PCはすでに19:42:09を表示しており、新しいバーの最初のティック(42分バー)が入ってきました。
ティックは19:42:07と表示され、19:42のバーであるため、バーのタイムスタンプは19:42:00となります。
さて......うーん............。
1.TimeCurrent() は常にティックのタイムスタンプと等しいのでしょうか?
4万件のレコードをチェックしたところ、TimeCurrentがすでに切り替わっていて、最後のティックのタイムスタンプが切り替わっていないケースは5件だけでした。
2.2. last_tickは常に新しいバーの開始より前にあるのでしょうか?
(続き)
TimeCurrent()はサーバーからの最後のティックの時間であり、チャートシンボルからかどうかはあなたのコードによります。
私はあなたの「最後のティック」の問題を理解していません、あなたはこの出力を生成するコードを表示する必要があります。
こんにちは、アラン
私はOnTick()でTimeCurrent()をチェックし、それが私が扱うシンボルに属していることを確認する必要があります。
これは私の "新しいバー識別子 "になるはずです。
//--- New Bar
bool NewBar = false;
long currPeriodSeconds;
double currPeriodProgress = 0;
int OnInit(void) //-----------------------------------------------
{
currPeriodSeconds = PeriodSeconds();
return(INIT_SUCCEEDED);
}
void OnTick() //--------------------------------------------------
{
if(MathMod(TimeCurrent(),currPeriodSeconds) < currPeriodProgress)
NewBar = true;
else NewBar = false;
currPeriodProgress = MathMod(TimeCurrent(),currPeriodSeconds);
私はこのsequenzでそれを確認するつもりです。
//--- Just for testing
int ExtHdlFile1=0;
MqlRates rates[1];
//--- New Bar
bool NewBar = false;
long currPeriodSeconds;
double currPeriodProgress = 0;
int OnInit(void) // -------------------------------------------------------
{
currPeriodSeconds = PeriodSeconds();
ExtHdlFile1=FileOpen("NewBarTest.csv",FILE_READ|FILE_WRITE|FILE_CSV);
FileSeek (ExtHdlFile1,0,SEEK_END);
FileWrite(ExtHdlFile1, "TimeLocal",
"TimeCurrent",
"rates[0].time",
"rates[0].tick");
return(INIT_SUCCEEDED);
}
void OnTick() // -----------------------------------------------------------
{
if(MathMod(TimeCurrent(),currPeriodSeconds) < currPeriodProgress)
NewBar = true;
else NewBar = false;
currPeriodProgress = MathMod(TimeCurrent(),currPeriodSeconds);
//--- lets check this
if(NewBar)
{
// last Time Stamp of old Bar
FileWrite(ExtHdlFile1, " ",
" ",
TimeToString(rates[0].time, TIME_MINUTES|TIME_SECONDS),
IntegerToString(rates[0].tick_volume));
// get the new bar
if(CopyRates(Symbol(),Period(),0,1,rates)!= 1) return;
// first Time Stamp of new Bar
FileWrite(ExtHdlFile1,TimeToString(TimeLocal(),TIME_MINUTES|TIME_SECONDS),
TimeToString(TimeCurrent(), TIME_MINUTES|TIME_SECONDS),
TimeToString(rates[0].time, TIME_MINUTES|TIME_SECONDS),
IntegerToString(rates[0].tick_volume));
}
if(CopyRates(Symbol(),Period(),0,1,rates)!= 1) return; // != clean code - just a test
}
void OnDeinit(const int reason)
{
FileClose(ExtHdlFile1);
return;
}
これが私の最終バージョン です。
あまりに簡単なので、ちょっと心配になりました。
アラン祝福の言葉をかけていただけるとうれしいです。
// -----------------------------------------------------------------------
bool NewBar(void)
{
bool iNewBar = false;
static double currPeriodProgress = 0;
currPeriodProgress = MathMod(TimeCurrent(),PeriodSeconds());
return(iNewBar);
}
// ------------------------------------------------------------------------
void OnTick()
{
if(NewBar()) PlaySound("tick.wav");
ケルンからご挨拶
ウィルバー
一番簡単な方法です。
static datetime tlastbar=0;
datetime tnewbar=iTime(NULL,PERIOD_CURRENT,0);
bool isnewbar=tnewbar!=tlastbar;
tlastbar=tnewbar;
- 無料取引アプリ
- 8千を超えるシグナルをコピー
- 金融ニュースで金融マーケットを探索
新しいバーが日の目を見たとき、どのように表示するのか不思議です。
主に、私はパフォーマンスを心配しています。いくつかのシンボルでは、20ミリ秒ごとにティックが表示されました。反応する時間はそれほど多くはありません。
一つのアイデアは、rates.tick_volumeです。
Mqlrates rates[1];
OnInit()
{
if(CopyRates(_Symbol,_Period,0,1,rates) < 1)
if(rates[0].tick_volume == 1)
{
... deal with new bar ...
}
もう一つのアイデアは、バーの数が 増加しているかどうかをチェックすることです。
OnInit()
{
if(BarsOld < Bars(_Symbol,_Period))
{
BarsOld = Bars(_Symbol,_Period);
... deal with new bar ...
}
OnChartEventもチェックしましたが、新しいバーを他のものと区別する方法は見つかりませんでした。
評価ありがとうございました。
WIllbur