ライブラリ: Symbol - ページ 2

 
Stanislav Korotky:

というようなことを加えるべきだ:

そうしないと、プロパティだけが必要で、バーが必要でないことがある。

クラスのメソッドは すべてパブリックです。ですから、プロパティだけをクローンするにはCloneProperties()を呼び出します。

 

ライブラリーと使用例が更新されました。

Пример

クロスのバックテストを実行する際、テスターはメインシンボルだけでなく、メインシンボルの利益通貨を口座通貨に変換するための補助シンボルも引き出します。補助シンボルを引き出し、そのティックを生成し、メイン・シンボルと同期させることは、シングル・ランや特に最適化モードでは貴重な計算リソース(と時間)を消費します。


しかし、このような精度はほとんどの場合不要です。従って、私はMetaTrader 5テスターのこのこだわり/不完全さを回避したい。MetaTrader 4では、テスター内で口座通貨を変更することができます。MetaTrader 5にはそのようなオプションはありません。

デモスクリプトは、テスターのこの制限を回避する方法を示しています。これを行うには、バックテスト用のシンボルのコピーが作成されますが、利益/マージンの通貨は口座通貨に等しく設定されます。つまり、取引結果を再変換する必要はありません。また、利益は実際にpipsで計算されるため、状況によっては非常に明確になります。

// テスターを高速化するために、シンボルのコピーを作成する。
#property script_show_inputs

#include <Symbol.mqh>

void OnStart()
{
  const SYMBOL Symb("TESTER_" + _Symbol); // シンボルの作成

  if (Symb.IsExist()) // シンボルが作成された場合
  {
    Symb = _Symbol; // メインシンボルからすべてのプロパティとバー履歴(カスタムの場合はティック履歴も)をコピー - clone

    // シンボルの通貨を口座の通貨にする
    Symb.SetProperty(SYMBOL_CURRENCY_PROFIT, AccountInfoString(ACCOUNT_CURRENCY));
    Symb.SetProperty(SYMBOL_CURRENCY_MARGIN, AccountInfoString(ACCOUNT_CURRENCY));

    if (Symb.On()) // マーケット・ウォッチに含まれるもの
      ChartOpen(Symb.Name, PERIOD_CURRENT); // 新しいシンボル・チャートを開く
  }
}


結果


このようにして、テスター/オプティマイザーの自由な加速が達成されます。


EURGBPで 徹底的に測定してみました。タイムゲインは~2倍です。取引は完全に一致しています。確かに無料です!

 

以下の注意はライブラリに関するものだけではありません。


カスタムシンボルのプロパティを変更する必要がある場合、場合によっては引用符をインポートする前に行う必要があります。

したがって、結果の信頼性のために、シンボルのすべてのプロパティを最初に設定し、その後でインポートすることを強くお勧めします。

例えば、SYMBOL_TRADE_TICK_VALUE と SYMBOL_TRADE_TICK_SIZE を設定する場合は、ティック/バーをインポートする前に行う必要があります。

 

MT5-testerでは、原則として(例えばFX)、指値注文には正のスリッページがあり、これは自己欺瞞に つながります(時には実際のティックに テスターのグレイルという形でさえ)。



しかし、テスターのこの機能を回避する方法があります。以下にその方法を詳しく説明します。


1.元のシンボル(オープンチャート)がカスタムでない場合、または口座がヘッジされている場合、シンボルチャート上でこのスクリプトを実行します。

#include <Symbol.mqh>

void OnStart()
{
  const SYMBOL Symb(_Symbol + "_Custom"); // シンボルの作成

  if (Symb.IsExist()) // シンボルが作成された場合
  {
    Symb = _Symbol;   // メインシンボルからすべてのプロパティとバー履歴(カスタムの場合はティック履歴も)をコピー - clone

    if (Symb.On())    // マーケット・ウォッチに含まれるもの
      ChartOpen(Symb.Name, PERIOD_CURRENT); // 新しいシンボル・チャートを開く
  }
}


この画像が表示されます。



2.口座がヘッジされている場合(ターミナルウィンドウのタイトルバーにヘッジの文字がある)、任意のネット口座(例えば、MetaQuotes-Demo)に移動し、ターミナルをリロードします。

3. このスクリプトを現在のチャートで実行します。

// 指値注文のスリッページを無効にすることができる。
#property script_show_inputs

#include <Symbol.mqh>

input bool OrderLimitSlippage = false;

void OnStart()
{
  const SYMBOL Symb("TESTER_" + _Symbol); // シンボルの作成

  if (Symb.IsExist()) // シンボルが作成された場合
  {
    //https://www.mql5.com/ru/forum/212096/page2#comment_7017794
// Symb = _Symbol; // メイン・シンボルからすべてのプロパティとバー履歴(カスタムの場合はティック履歴)をコピー - clone

    Symb.CloneProperties(); // メイン・シンボルからすべてのプロパティをコピーする

    // シンボルの通貨を口座の通貨にする
    Symb.SetProperty(SYMBOL_CURRENCY_PROFIT, AccountInfoString(ACCOUNT_CURRENCY));
    Symb.SetProperty(SYMBOL_CURRENCY_MARGIN, AccountInfoString(ACCOUNT_CURRENCY));
    Symb.SetProperty(SYMBOL_CURRENCY_BASE, AccountInfoString(ACCOUNT_CURRENCY));
    
    int Answer = IDNO;
    
    // 指値注文のスリッページを取り除く
    //https://www.mql5.com/ru/forum/212096/page2#comment_7018318
    if (!OrderLimitSlippage &&
        (((ENUM_ACCOUNT_MARGIN_MODE)AccountInfoInteger(ACCOUNT_MARGIN_MODE) != ACCOUNT_MARGIN_MODE_RETAIL_HEDGING) ||
        ((Answer = MessageBox("You will need to change the account type to netting.\nDo you agree to disable limit order slips?", __FILE__, MB_YESNOCANCEL | MB_ICONQUESTION)) == IDYES)))
    {
      Symb.SetProperty(SYMBOL_TRADE_EXEMODE, SYMBOL_TRADE_EXECUTION_EXCHANGE);
      Symb.SetProperty(SYMBOL_TRADE_CALC_MODE, SYMBOL_CALC_MODE_EXCH_FUTURES);
      
      // 利益の計算
      Symb.SetProperty(SYMBOL_TRADE_TICK_VALUE, 1);
      Symb.SetProperty(SYMBOL_TRADE_TICK_SIZE, Symb.GetProperty(SYMBOL_POINT));
    }
    
    if ((Answer != IDCANCEL) && (Symb.CloneHistory() > 0) && Symb.On()) // メイン・シンボルからバー履歴(カスタムならティック履歴も)をコピー
      ChartOpen(Symb.Name, PERIOD_CURRENT); // 新しいシンボル・チャートを開く 
  }
}



3.テスターで受信したカスタムシンボルを選択します。


これで指値注文はスライドしなくなります!

 

取引、自動取引システム、取引戦略のテストに関するフォーラム

エラー、バグ、質問

fxsaber, 2018.02.14 14:41 pm.

ターミナルではなく、プラットフォームMT5の醜いバグ
#include <MT4Orders.mqh> //https://www.mql5.com/ja/code/16006

#define Bid SymbolInfoDouble(_Symbol, SYMBOL_BID)
#define Ask SymbolInfoDouble(_Symbol, SYMBOL_ASK)

void OnStart()
{
  OrderSend(_Symbol, OP_BUY, 1, Ask, 100, 0, Bid);
  
// OrderSend(_Symbol, OP_BUYLIMIT, 1, Ask, 100, 0, 0);
}

MQ-Demoでいくつかの動きの遅いシンボルで動作しています。例えば、EURHUF。

スクリプトはTP = Bidで買いポジションをオープンします。つまり、ポジションはすぐに決済されるはずです。しかし、TPは次のティックでのみ受入条件に適合しているかチェックされる!

次のティックまで、ポジションの即時決済は行われない。さらに、次のティックがBid < TPの場合、TPは受諾されずに残ります。


指値注文も同様です(コメント行)。Tester でも状況は同様です。

ハイライトされた部分については、前の投稿でこのように書かれているので、言っておく必要がある。

取引、自動取引システム、取引戦略のテストに関するフォーラム。

ライブラリ:シンボル

fxsaber, 2018.04.06 09:21.

2.口座がヘッジされている(ターミナルウィンドウのタイトルバーにヘッジの文字がある)場合は、任意のネッティング口座(例:MetaQuotes-Demo)に移動し、ターミナルを再読み込みします。

そして、ネッティング口座の 取引所シンボルの現在価格での指値注文が、次のティックを待たずに即座に執行される(そしてテスターに表示される)ことに、誰もが気づくでしょう。


重要なのは株式シンボルだけでなく、ネッティング口座も重要であることに注意してください。例えば、Hedge-MQ-DemoでMOEXシンボルを取っても、同じNetting-MQ-Demoと同じように(そしてTesterで)実行されるわけではありません。

これが、全く同じMOEXシンボルでのバックテストが、口座タイプによって異なる理由の一つです。


ZЫ 独り言です...。

 
fxsaber:

ZY 独り言です...。

いや、何も付け加えることはない。

正常なオーダー発動を実現するためには、タンバリンで踊る必要があるのが残念だ。

 
Andrey Khatimlianskii:

タンバリンを使って踊らなければならないのは残念だ。

私は指示を変更し、ダンスをかなり単純化した。例えば、ネットではスクリプトの起動というワンクリックですべてが完了する。

 

実際のティックに簡単なフィルターを適用したところ、最も軽いケースでは情報の90%以上が捨てられた。フィルターが強ければ強いほど、バックテストの結果は粗くなる。

しかし、最も弱いフィルターが結果とスピードにどのように影響するかは興味深かった。



だった。

final balance 10007242.00 EUR
TESTER_Censored,M1: 6589567 ticks, 60353 bars generated. Environment synchronized in 0:00:00.031. Test passed in 0:00:05.101 (including ticks preprocessing 0:00:00.874).
TESTER_Censored,M1: total time from login to stop testing 0:00:05.132 (including 0:00:00.031 for history data synchronization)
476 Mb memory used including 27 Mb of history data, 192 Mb of tick data


なった

final balance 10007246.00 EUR
FILTER_Censored,M1: 402622 ticks, 50887 bars generated. Environment synchronized in 0:00:00.030. Test passed in 0:00:00.516 (including ticks preprocessing 0:00:00.078).
FILTER_Censored,M1: total time from login to stop testing 0:00:00.546 (including 0:00:00.030 for history data synchronization)
314 Mb memory used including 27 Mb of history data, 64 Mb of tick data


スピード

だった

OnTesterInit
i = 0 Pass = 0 OnTester = 3.881 s.: Count = 6589567, 1697904.4 unit/sec, Agent = C:\Program Files\Alpari Limited MT5\Tester\Agent-127.0.0.1-3000 build = 1795
i = 1 Pass = 1 OnTester = 3.893 s.: Count = 6589567, 1692670.7 unit/sec, Agent = C:\Program Files\Alpari Limited MT5\Tester\Agent-127.0.0.1-3000 build = 1795
i = 2 Pass = 2 OnTester = 3.898 s.: Count = 6589567, 1690499.5 unit/sec, Agent = C:\Program Files\Alpari Limited MT5\Tester\Agent-127.0.0.1-3000 build = 1795
i = 3 Pass = 3 OnTester = 3.842 s.: Count = 6589567, 1715139.8 unit/sec, Agent = C:\Program Files\Alpari Limited MT5\Tester\Agent-127.0.0.1-3000 build = 1795
i = 4 Pass = 4 OnTester = 3.912 s.: Count = 6589567, 1684449.6 unit/sec, Agent = C:\Program Files\Alpari Limited MT5\Tester\Agent-127.0.0.1-3000 build = 1795
iMin = 3 Results[iMin] = 3.842 s.
iMax = 4 Results[iMax] = 3.912 s.
Amount = 5 Mean = 3.885 s. - 84.80%
OnTesterDeinit


だった

OnTesterInit
i = 0 Pass = 0 OnTester = 0.264 s.: Count = 402622, 1525083.3 unit/sec, Agent = C:\Program Files\Alpari Limited MT5\Tester\Agent-127.0.0.1-3000 build = 1795
i = 1 Pass = 1 OnTester = 0.264 s.: Count = 402622, 1525083.3 unit/sec, Agent = C:\Program Files\Alpari Limited MT5\Tester\Agent-127.0.0.1-3000 build = 1795
i = 2 Pass = 2 OnTester = 0.264 s.: Count = 402622, 1525083.3 unit/sec, Agent = C:\Program Files\Alpari Limited MT5\Tester\Agent-127.0.0.1-3000 build = 1795
i = 3 Pass = 3 OnTester = 0.266 s.: Count = 402622, 1513616.5 unit/sec, Agent = C:\Program Files\Alpari Limited MT5\Tester\Agent-127.0.0.1-3000 build = 1795
i = 4 Pass = 4 OnTester = 0.306 s.: Count = 402622, 1315758.2 unit/sec, Agent = C:\Program Files\Alpari Limited MT5\Tester\Agent-127.0.0.1-3000 build = 1795
iMin = 0 Results[iMin] = 0.264 s.
iMax = 4 Results[iMax] = 0.306 s.
Amount = 5 Mean = 0.273 s. - 29.28%
OnTesterDeinit


結果

実際のティックによると、ティック数は16倍減少し(最も軽いフィルター)、Optimisationのスピードは14倍増加し、品質はまったく低下しなかった(ここでは含まれていない分析)。もちろん、これはTSを特定の方法で記述した場合にのみ可能である。特に、バー分析がない場合だ。

以前の無料のユニバーサル・アクセラレーションでは、2倍しか伸びなかった。現在のものも無料(品質は落ちない)だが、普遍性は低い。しかし、見返りは1桁以上ある。今はこの方法でしかTCを最適化していない。間違いはない。


SZY

同時に、この実装(バーのスプレッドだけ計算が異なる)を簡単にチェックする。

取引、自動取引システム、取引戦略のテストに関するフォーラム。

スクリプト: ThirdPartyTicks

自動売買、2018.03.16 09:35。

Баровая история создается с учетом минимальных потерь качества при переходе от режима тестирования "Каждый тик на основе реальных тиков" к "Только цены открытия" - ТС на лимитных ордерах;

すべてのティック」と「OHLC M1」の2つのモードを比較。


すべてのティック

final balance 10006150.00 EUR
TESTER4_Censored,M1: 6576734 ticks, 60353 bars generated. Test passed in 0:00:04.587 (including ticks preprocessing 0:00:00.343).
394 Mb memory used including 27 Mb of history data, 128 Mb of tick data


OHLC M1

final balance 10006119.00 EUR
TESTER_Censored,M1: 240366 ticks, 60353 bars generated. Test passed in 0:00:00.359 (including ticks preprocessing 0:00:00.031).
306 Mb memory used including 27 Mb of history data, 64 Mb of tick data


バックテストの質は同じで、1回の実行における2番目のバリエーションのパフォーマンスは12倍優れています。

 

ノンプログラマーにとって、これらのスクリプトはExpert Advisorプログラムに書き込む必要があるのでしょうか?

最適化を 12倍高速化 するのは非常に魅力的です。

オープンポイントで最適化した場合、そのような加速はあるのでしょうか?

 
Aleksey Panfilov:

ノンプログラマーにとって、これらのスクリプトはEAプログラムに書き込む必要があるのでしょうか?

最適化を 12倍高速化 するのは非常に魅力的です。

オープンポイントで最適化した場合、そのような加速があるのでしょうか?

残念ながら、このプロセスのすべての側面を説明するのは非常に難しい。おそらく記事を書く必要があるだろう。したがって、明確かつ簡潔に説明することはできないだろう。