ライブラリ: Symbol

 

Symbol:

標準銘柄やカスタム銘柄を扱うためのライブラリ

作者: fxsaber

 

Пример

クロスでバックテストを実行する場合、テスターはメインシンボルだけでなく、メインシンボルの利益通貨を口座通貨に変換できる補助シンボルも引き出します。補助シンボルを引き出し、そのティックを生成し、メイン・シンボルと同期させることは、シングル・ランや特に最適化モードでは貴重な計算リソース(と時間)を消費します。しかし、このような精度はほとんどの場合不要です。従って、私はMetaTrader 5テスターのこのこだわり/不完全さを回避したい。MetaTrader 4では、テスター内で口座通貨を変更することができます。MetaTrader 5にはそのようなオプションはありません。

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

これは機能します!


これはテスターをより速く論理的に動作させる最も簡単な方法です。


ZЫ 急ぎました。新しいクロスは正しくカウントされます - それは利益を変換しません。しかし、何らかの理由で、それが他のどこにも使用されていないとき、それはそれでメジャーをドラッグします。

2017.09.04 14:46:43.062 Core 1  EURCHF_custom: generate 975389 ticks in 0:00:00.063, passed to tester 3210 ticks
2017.09.04 14:46:43.062 Core 1  EURUSD: generate 979976 ticks in 0:00:00.062, passed to tester 8696 ticks
 

スクリプトのコードを少し編集した。 行の中に:


const SYMBOL Symb(_Symbol + PostFix); // シンボルを作成。

Symb = _Symbol; // メイン・シンボルからすべてのプロパティとバー履歴をコピー - 複製。


Symbolを "SBER "に置き換えた。


VDSB株のチャートでスクリプトを実行した。

スクリプト実行後、SBER_customチャートが開き、SBERバーの代わりにVDSBシェアのバーが表示された。これは論理的ではありません。チャート上にSBER......バーが表示されると思っていたのに。

Symb = "SBER "という行の実行中に、何らかの理由でName="VDSB "という値のオブジェクト、つまりスクリプトが実行されたシンボルの名前のオブジェクトが作成されました。


残念ながら、このエラーを修正することはできません。コードを修正していただけないでしょうか。

 
pivomoe:

残念ながら、このエラーを修正することができません。コードを修正していただけますか?

SBER "Metaquotes-Demoで変更なしでスクリプトを実行するだけでも、結果が期待通りでないことがわかります。

CustomRatesReplaceが 一部の文字(Forex以外のすべての文字)に対して正しく機能しないことがわかったので、開発者はバグを修正する必要がある。

 
fxsaber:

SBER "Metaquotes-Demoで変更なしでスクリプトを実行するだけでも、結果が期待したものでないことがわかります。

CustomRatesReplaceがいくつかのシンボル(FX以外のすべてのシンボルのようです)で正しく動作しないことがわかったので、開発者はバグを修正する必要があります。


実際の BCS口座で動かして みた。SBERチャート上のオリジナルスクリプトは動作します。SBER_customチャートにSBERの気配値が表示されています。CustomRatesReplace関数が正しく動作しないとはどういうことですか?必要であれば、残高ゼロでBCSに実際の口座を作成する方法を説明できます。

 
pivomoe:

実際の BCS口座で動かして みた。オリジナルのスクリプトはSBERチャート上で動作する。SBER_customチャートにSBERの気配値が表示されます。CustomRatesReplace関数が正しく動作していないとはどういうことでしょうか?必要であれば、残高ゼロでBCSに実際の口座を作る方法を説明します。

ありがとうございます!Symbol.mqhの126行目

// return(this.CloneProperties() && (this.CloneHistory() != -1)); // Was
return(this.CloneProperties(Symb) && (this.CloneHistory(Symb) != -1)); // シュタール
 
迅速な対応に感謝する。すべて順調です。
 

カスタムシンボルを使用する別のシナリオ(必ずしもこのライブラリの助けを借りる必要はありません)。


新しいヒストリカルデータで Expert Advisorの定期的なバックテストを完全に自動化し、テスト結果を戦闘Expert Advisorに転送して、実際の画像をテスターと同期させることが可能です。これにより、独自のテスターを作成することなく、このような取引ロジックを実現することができます。

ストラテジーテスター(MT4)での ティックでの テストから実際の口座での動作まで、Expert Advisorの 取引 ロジックを最大限に正確に変換するタスクに直面しました。

理由はこうだ:

テスターでは、Expert Advisorは理想的な取引条件下で動作するだけ なく、実際には、別のモード、つまりリアルタイムモードで動作します。リアルタイムとそうで ない 2つの異なるロボットがあることが わかった 。実際の 口座に 注文 (1つでも!)を送信/変更する = ping + 約定時間など。= 同時にティックが来て、それをカウントする必要がある。そして、ランダムにストリームに入る(この間、ティック・アベレージに対して価格がどこに行ったかは わからない 。+ この間、私たちのティック平均と比較して価格がどのように推移したかは わからないが 、私たちは最も速く、原則として最も重要なティックのいくつかを見逃したに違いない)。 結局 、テスターでロールアウトした戦略は何も残らなかったかもしれない。

というわけで、考えた結果、次のようになった:

  1. 戦闘 モードでは 、Expert Advisorの取引ロジックはオフになり、実際にはコピーツールとして機能する。
  2. 取引システムはインジケーターに転送され、インジケーターは始値と終値のコマンドを生成し、Expert Advisorがこれらのコマンドを実行するのを待つことなく、テスターのように理想的な 条件で インジケーターに組み込まれた TSを実行します。私の知る限り、このインジケーターはティックを見逃すことはないはずですが、技術的に可能かどうかは疑問ですが、少なくとも、最初からこの機能があり、ドキュメントにも記載されているExpert Advisorよりは見逃すことは少ないはずです。+ また、TC計算の誤差を分離することによっても、TCロジックの二次的な操作による中断がないため、誤差は少なくなるはずです。

この方式を使用するもう一つの可能性:

マーケットからExpert Advisorの無料デモ版を入手し、新鮮な相場でテスターで追跡し、コピー機はテスターの結果からデータを取得します。従って、有料版は必要ない。


おそらく、カスタムシンボルでのMarket Expert Advisorのバックテストを禁止する必要があるのだろう。

 

コードの中に次のような行がある。

const int Size = ::CopyRates(Symb, PERIOD_M1, 0, ::Bars(Symb, PERIOD_M1), Rates);

あなたのスクリプトをチェックしたわけではありませんが、私は文字を大量にコピーするスクリプトを書いています。CopyRates関数と Bars関数は、"Settings->Graphics->Max. bars in window "で指定された以上の値を返すことができないので、ほとんどの履歴はコピーされません。

このコロンの意味は何ですか?

 
pivomoe:

あなたのスクリプトは確認していませんが、私は文字の大量コピーのスクリプトを書いています。CopyRates関数と Bars関数は、「設定->チャート->ウィンドウ内の最大バー数」で指定された以上の値を返すことができないので、履歴のほとんどはコピーされません。

チャート上にすでにあるものを正確にコピーする。そうしないと、ページングに時間がかかる。

あなたのコードにあるこれらのコロンにはどのような意味があるのですか?

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

MQL5 取引がストップロスで決済されたかどうかを知るには?

fxsaber, 2017.02.14 20:00

大雑把に言うと、コロンの前に対応するメソッドが呼び出されるクラス名を指定します。

コロンの前に何もなければ、そのクラスはグローバルです。

この場合、コロンはすべて消すことができる。また、異なるクラスが同じメソッド(仮想メソッドも含む)を持つ可能性があるため、コロンを使うと便利です。また、間違いを防ぐために、コロンでどのメソッドが呼び出されるべきかを明確に示すことができる。

 

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

  bool Template(const string Symb = NULL) const
  {
    return(this.CloneProperties(Symb));
  }

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