// this is from the Trader base class// manage a new tick and predetermines whether a new bar hast startedvirtualvoid onTick() {
MqlRates rates[1];
// check the rates of the tick stream we're attached to (_Symbol!!!)if (CopyRates(_Symbol, _period, 0, 1, rates) != 1) {
Print("CopyRates of ", _Symbol, " failed");
return;
}
if (_newBar = (rates[0].time != _currBarTime)) {
_prevBarTime = _currBarTime; // remember the previous bar time
_currBarTime = rates[0].time; // remember the current bar time
}
}
// this is the actual trader for a specific currency pair// checks whether a new trade (closing or opening) is to be performedvoid checkForTrade(void) {
MqlRates rates[3];
if (CopyRates(_symbol, _period, 0, 3, rates) != 3) {
Print("CopyRates of ", _symbol, " failed");
return;
}
bool inSameBar = (rates[2].time == _currBarTime); // _currBarTime determined in OnTick()!double sBuf[3]; // signal buffer! 2: current bar, 1: previous bar, 0: current - 2 if (CopyBuffer(_ind, SIGNAL3, 0, 3, sBuf) != 3) {
Print("copy signal from indicator failed, no data");
return;
}
// first close exiting ordersdouble v0 = inSameBar ? sBuf[0] : sBuf[1]; // determine the actual 'previous' bardouble v1 = inSameBar ? sBuf[1] : sBuf[2]; // determine the actual 'current' barif (_volume > 0) {
if (crossesZeroDownwards(v0, v1)) { // cross down?
setReqVolume(0); // close this order
tradeCloses = true;
}
} elseif (_volume < 0) {
if (crossesZeroUpwards(v0, v1)) { // cross up?
setReqVolume(0); // close this order
tradeCloses = true;
}
}
...
その時、これを掲載したかったのですが、トップページに恐ろしく映ってしまいました。
こんにちは、皆さん。
私も少し前にこの問題に遭遇し、ここで議論しました: https://www.mql5.com/en/forum/1642
私のEAは建値のみの戦略で、バックテストの時間を節約するためにそれにこだわりたかったのです(当然ですが)。
私が考案した解決策は、以下の通りです。
以下、私のEAからコードの重要な部分をカット&ペーストします。これがあなたのお役に立てれば幸いです。
乾杯
ちょうど私もこの問題に出くわしたところです。JForexからMQL5へ移植しようとしているのです。期限を延長してくれたのは助かりましたが、悩む必要はなかったと思い始めています :)
MetaQuotesはまだ直ってないみたいですね。
MT5 forexはDOMをサポートしていないようです。
isNewBarではどうにもならない。
とんでもない状態のようです。
この問題に関して、MT5内部で何かが変わったかどうか、誰か知っていますか?
ティックの供給を期待する多通貨のストラテジーに有効な解決策をご存知の方はいらっしゃいますか?
あなたのフラストレーションが原因です。
ジム
ちょうど私もこの問題に出くわしたところです。JForexからMQL5へ移植しようとしているのです。期限を延長してくれたのは助かりましたが、悩む必要はなかったと思い始めています :)
MetaQuotesはまだ直ってないみたいですね。
MT5 forexはDOMをサポートしていないようです。
isNewBarではどうにもならない。
とんでもない状態のようです。
この問題に関して、MT5内部で何かが変わったかどうか、誰か知っていますか?
ティックの供給を期待する多通貨のストラテジーに有効な解決策をご存知の方はいらっしゃいますか?
あなたのフラストレーションが原因です。
ジム
enividさん、こんにちは。
OnTick()の代わりに、1秒タイマーでOnTimer()を使ってみてください。
ご提案ありがとうございます。あなたのソリューションは、私が試した他のどのソリューションよりも、確かに私たちの要件に対してはるかによく機能します。
しかし、異なるペアに対して多通貨のバックテストを 実行すると、まだわずかに異なる結果が出ます。
これは大きな自信につながりません。
これからもっと真夜中の油を燃やしてきます!
乾杯。
ジム
OnTick()の代わりに、1秒タイマーでOnTimer()を使ってみてください。
TradingGurus
しかし、異なるペアに対して多通貨のバックテストを実行すると、やはりわずかに異なる結果が出ます。
ジム、私はコンテストポートフォリオEAで1秒のOnTimerソリューションを使っています。もし、あなたの戦略がすべてのティックに依存しているのであれば、1秒間に1つ以上のティックが可能なため、単一通貨で OnTimerとOnTickを使用すると、異なる結果が得られるでしょう。私は、通常、「欠落した」ティックが新しいバーの高値または安値を作成した場合に、最も大きな違いが生じることを発見しました。前のバーの高値/安値と現在のバーの高値/安値に変更がないか確認し、変更があった場合は「ミッシングティック」として挿入することができます(もちろん、現在のティックが新しいバーの高値/安値を作成した場合は除きます)。
また、MetaTrader Strategy Testerはティックデータのみをシミュレートしていることに留意してください。ティックの動きにどれだけ敏感かにもよりますが、このシミュレーションはバックテストとフォワードテストに大きな影響を与える可能性があります。
- パトリック
もし、あなたのストラテジーが全てのティックに依存しているのであれば、1秒間に複数のティックが可能であるため、OnTimerとOnTickを単一通貨で使用した場合、異なる結果を得ることができます。
- パトリック
そういうことではありません。私たちのコンテストEA(まだ可能性があるだけです!)は、12ペアすべてを取引します。OnTimer()だけを使用すると、例えばストラテジーテスターで EUR/USDではなくGBP/USDを選択した場合、異なるバックテスト結果が得られます。
シミュレートされたティックを使用したバックテストでは、MT4の限界は十分承知しています。残念ながら、MT5もそれほど良くはないようです。
ジム
私たちは歴史的な理由から、このすべてをティックで実現することを強く希望していましたが、断念しました。ただ、一貫性を持たせることができないのです。
そこで、OnTimer()とisNewBar()を使って、1分足のバーを使っています。
そしてさらに、チャンピオンシップの締め切りまでまだ4時間あるんだ :)
Jim締め切りまであと5分というところでようやくEAを提出。
バックテストは 1回、最適化はしていません。
このようなことは初めてですが、承認される可能性があるのかどうか、どなたか教えてください。
その場合、来週以降に入力設定をいじることは許されるのでしょうか、それとも許されないのでしょうか?
ジム
締め切りまであと5分というところでようやくEAを提出。
バックテストは1回、最適化はしていません。
このようなことは初めてですが、承認される可能性があるのかどうか、どなたか教えてください。
その場合、来週以降に入力設定をいじることは許されるのでしょうか、それとも許されないのでしょうか?
ジム
グッドラックJim!
もしあなたのEAが2010.01.01から2010.08.01の間にエラー(取引エラーなど)なく正しくバックテストされ、利益を上げていれば、あなたの個人情報が正しい限り、承認される可能性が高いでしょう。ただし、この時点から設定(入力パラメータ)を含め、何も変更できなくなります。
あなたのボットが動作するのを楽しみにしています
- パトリック