マルチカレンシーEAのバックテスト - ページ 3

 

その時、これを掲載したかったのですが、トップページに恐ろしく映ってしまいました。

ポートフォリオEAのロジック

 

こんにちは、皆さん。

私も少し前にこの問題に遭遇し、ここで議論しました: https://www.mql5.com/en/forum/1642

私のEAは建値のみの戦略で、バックテストの時間を節約するためにそれにこだわりたかったのです(当然ですが)。

私が考案した解決策は、以下の通りです。

  1. EAのメイン取引期間中に最もアクティブなペアを「ドライバー」(ティックを生成するチャート)として使用します。
  2. 各 onTick() で、ドライバーが新しいバーに入ったかどうかをチェックします。
    1. 新しいバーがなければ、もう少し待ちます。
    2. 新しいバーがあれば、OnTick() メッセージを各トレーダー (各トレーダーは一つの通貨ペアに責任を持ちます) に配信します。
  3. トレーダーは、そのトレーダーの通貨ペアの最後の時刻が、ドライバからの「新しいバー の時刻」と等しいかどうかをチェックします。
    1. 等しい場合は、通常通り取引可能
    2. そうでない場合は、現在のバーの終値を開始価格として扱い、以前のバーの情報を探す場合は、この「1つ違い」の状況を考慮する必要があります。

以下、私のEAからコードの重要な部分をカット&ペーストします。これがあなたのお役に立てれば幸いです。

乾杯


// this is from the Trader base class

    // manage a new tick and predetermines whether a new bar hast started
    virtual void 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 performed
    void 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 orders
        double v0 = inSameBar ? sBuf[0] : sBuf[1];  // determine the actual 'previous' bar
        double v1 = inSameBar ? sBuf[1] : sBuf[2];  // determine the actual 'current' bar
        
        if (_volume > 0) {
            if (crossesZeroDownwards(v0, v1)) {  // cross down?
                setReqVolume(0);  // close this order
                tradeCloses = true;
            }    
        } else if (_volume < 0) {
            if (crossesZeroUpwards(v0, v1)) {  // cross up?
                setReqVolume(0);  // close this order
                tradeCloses = true;
            }    
        }

        ...
Tick generation - Open bar only
  • www.mql5.com
The whole list printed shows also many discrepancies in times.
 

ちょうど私もこの問題に出くわしたところです。JForexからMQL5へ移植しようとしているのです。期限を延長してくれたのは助かりましたが、悩む必要はなかったと思い始めています :)

MetaQuotesはまだ直ってないみたいですね。

MT5 forexはDOMをサポートしていないようです。

isNewBarではどうにもならない。

とんでもない状態のようです。

この問題に関して、MT5内部で何かが変わったかどうか、誰か知っていますか?

ティックの供給を期待する多通貨のストラテジーに有効な解決策をご存知の方はいらっしゃいますか?

あなたのフラストレーションが原因です。

ジム

 
TradingGurus:

ちょうど私もこの問題に出くわしたところです。JForexからMQL5へ移植しようとしているのです。期限を延長してくれたのは助かりましたが、悩む必要はなかったと思い始めています :)

MetaQuotesはまだ直ってないみたいですね。

MT5 forexはDOMをサポートしていないようです。

isNewBarではどうにもならない。

とんでもない状態のようです。

この問題に関して、MT5内部で何かが変わったかどうか、誰か知っていますか?

ティックの供給を期待する多通貨のストラテジーに有効な解決策をご存知の方はいらっしゃいますか?

あなたのフラストレーションが原因です。

ジム


OnTick()の代わりに、1秒タイマーでOnTimer()を使ってみてください。
 

enividさん、こんにちは。

enivid:
OnTick()の代わりに、1秒タイマーでOnTimer()を使ってみてください。

ご提案ありがとうございます。あなたのソリューションは、私が試した他のどのソリューションよりも、確かに私たちの要件に対してはるかによく機能します。

しかし、異なるペアに対して多通貨のバックテストを 実行すると、まだわずかに異なる結果が出ます。

これは大きな自信につながりません。

これからもっと真夜中の油を燃やしてきます!

乾杯。

ジム

 
enivid:
OnTick()の代わりに、1秒タイマーでOnTimer()を使ってみてください。

TradingGurus

しかし、異なるペアに対して多通貨のバックテストを実行すると、やはりわずかに異なる結果が出ます。

ジム、私はコンテストポートフォリオEAで1秒のOnTimerソリューションを使っています。もし、あなたの戦略がすべてのティックに依存しているのであれば、1秒間に1つ以上のティックが可能なため、単一通貨で OnTimerとOnTickを使用すると、異なる結果が得られるでしょう。私は、通常、「欠落した」ティックが新しいバーの高値または安値を作成した場合に、最も大きな違いが生じることを発見しました。前のバーの高値/安値と現在のバーの高値/安値に変更がないか確認し、変更があった場合は「ミッシングティック」として挿入することができます(もちろん、現在のティックが新しいバーの高値/安値を作成した場合は除きます)。

また、MetaTrader Strategy Testerはティックデータのみをシミュレートしていることに留意してください。ティックの動きにどれだけ敏感かにもよりますが、このシミュレーションはバックテストとフォワードテストに大きな影響を与える可能性があります。

- パトリック

 
こんにちは、パトリック。
Pix:

もし、あなたのストラテジーが全てのティックに依存しているのであれば、1秒間に複数のティックが可能であるため、OnTimerとOnTickを単一通貨で使用した場合、異なる結果を得ることができます。

- パトリック


そういうことではありません。私たちのコンテストEA(まだ可能性があるだけです!)は、12ペアすべてを取引します。OnTimer()だけを使用すると、例えばストラテジーテスターで EUR/USDではなくGBP/USDを選択した場合、異なるバックテスト結果が得られます。

シミュレートされたティックを使用したバックテストでは、MT4の限界は十分承知しています。残念ながら、MT5もそれほど良くはないようです。

ジム

 

私たちは歴史的な理由から、このすべてをティックで実現することを強く希望していましたが、断念しました。ただ、一貫性を持たせることができないのです。

そこで、OnTimer()とisNewBar()を使って、1分足のバーを使っています。

そしてさらに、チャンピオンシップの締め切りまでまだ4時間あるんだ :)

Jim
 

締め切りまであと5分というところでようやくEAを提出。

バックテストは 1回、最適化はしていません。

このようなことは初めてですが、承認される可能性があるのかどうか、どなたか教えてください。

その場合、来週以降に入力設定をいじることは許されるのでしょうか、それとも許されないのでしょうか?

ジム

 
TradingGurus:

締め切りまであと5分というところでようやくEAを提出。

バックテストは1回、最適化はしていません。

このようなことは初めてですが、承認される可能性があるのかどうか、どなたか教えてください。

その場合、来週以降に入力設定をいじることは許されるのでしょうか、それとも許されないのでしょうか?

ジム

グッドラックJim!

もしあなたのEAが2010.01.01から2010.08.01の間にエラー(取引エラーなど)なく正しくバックテストされ、利益を上げていれば、あなたの個人情報が正しい限り、承認される可能性が高いでしょう。ただし、この時点から設定(入力パラメータ)を含め、何も変更できなくなります。

あなたのボットが動作するのを楽しみにしています

- パトリック