直近のピップのプロフィットダウンを抽出
イントロダクション
この記事では、アルゴトレードアプローチの1つを取り上げます。 これは、MetaQuotes プラットフォームに精通していない、広範な大衆を対象とします。 いずれかの用語が明確でない場合は、検索オプションを使用してください。 この記事の目的は、収益性の高いトレードシステム(またはトレードロボット)を見つけることです。
まず、どこを掘り下げましょうか
それは、各トレーダーが見つけようとしているものです。 すでに何百万回もの試みが行われています。 既存のソリューションに問題がなければ、この記事をスキップして次のソリューションに切り替えることができます。 しかし、より論理的な解決策は、群衆によって検索されていない掘り出し物を検索することです。
土壌(Soil)
トレーディングシステムの作成に関する考察のほとんどは、ヒストリーバーや適用される様々なインジケータの使用に関連します。 これは最もよくカバーされたフィールドであるため、詳細は考慮しません。 バーは人工的なエンティティを表します。したがって、プロトデータに近い何か、すなわち価格ティックで動作します。 このアプローチは、群衆に対して情報的な利点を与えるかもしれません。
シャベル(Shovel)
この利益を得るタスクは困難です。 したがって、タスクは複雑な知的方法によって解決されるべきであるという意見が存在します。 これらは、機械学習、計量数学モデルなどが含まれます。 すべてにおいて、膨大な作成とテスト期間 (計算の複雑さによる)が必要であるという大きな欠点があります。 したがって、シンプルで迅速なアイデアを含む真逆の方法を行きましょう。 したがって、特定の場所ではなく、広範な範囲で相場パターンを検索することができます。
この方法は愚かに見えるかもしれません。 しかし、周辺には多くの情報があるので、古典的なタッセルを使用して特定の場所で掘り出し物を探すのは非効率的です。 したがって、何かしらの良い研究ツールが必要です。 このツールは、何百万ものティックを使用できる必要があります。 速さに差はありません。 見つかった結果を便利に視覚化できる必要があります。 簡潔で、明確な指示がある必要があります。
古典的な発見方法
任意の数学的なパッケージを使用し、上記の要件を満たす準備ができている場合は素晴らしいです。 そうでない場合は、MetaTrader5プラットフォームのストラテジーテスターを使用し、すべての利点を使用しましょう。
このツールは、異なるブローカーからのティックの膨大な数を組み込み、さらに他のティックで動作することができます。 データベースの計算結果に格納され、さまざまなパラメータを視覚化できます。 また、すべてのバリエーションの完全なテストとユーザー基準に基づく遺伝的アルゴリズムに基づいて、独自のマルチスレッドオプティマイザがあります。
トレーディングアルゴリズム
また、トレードアルゴリズムの形でシンプルで高速なアイデアが必要です。 このアイデアは任意にすることができます。 最も重要な基準は、その速度です。 また、アルゴリズム内のループを避けることをお勧めします。 新しいティックを受け取り、高速アクションを実行し、終了します。
このようなアルゴリズムの亜種の 1 つをこの記事の基礎として使用します。 これはこの記事のコアのように見えるかもしれません。 しかし、そんなことはありません。 この記事の目的は、特定のアルゴリズムではありません。 これが、隠れている理由です。
MQL5
このトレードアルゴリズムは、MQL5言語のEAとして作成されます。 今回は、バーやインジケータを使用しないことにしました。 したがって、ティックとオーダー(オーダーのヒストリー)を使用する必要があります。 このようなこのEAは、MetaTrader4Ordersトレーディングライブラリを使用して、1行でMQL5に変換することができます。
#include <MT4Orders.mqh> // https://www.mql5.com/en/code/16006
この有用なライブラリを使用し、クロスプラットフォームコード(MetaTrader4/5で動作することができます)を作成することができます。 このトレードアルゴリズムは高速でなければならず、テスターで最低限のチェックが必要です。
ソース
調査の価格データはどこで入手しましょう? 多くのティックソースがあります。 そのうちの一つを選びましょう。
高い金の濃度を持つ岩を見つければ、金の塊を見つける可能性が高くなります。 したがって、潜在的な利益が高いティックソースを使用します。 このような比較基準を決定する方法は、フォーラムのコメントで説明されました(ロシア語です。組み込みの翻訳機を使用してください)。 このメソッドに基づいて、 ティックデータのマルチギガバイトを選択しました. 何十億ものティック
カスタムティック
ティックはcustom symbolsを使用してMetaTrader5テスターに供給することができます。 あまりにも複雑である可能性があるため、クオートの選択されたアーカイブからのデータに基づいてそのようなシンボルを作成する準備ができている ThirdPartyTicksを使用します。
燃料添加物
何十億ものティックは、合理的な時間をかけて処理する必要があります。 検索する際に、トレードアルゴリズムインプットに対して何兆ものティックを生成する必要があります。 これには膨大な時間がかかるので、加速メカニズムが必要です。
実際には、すべてのティックが必要なわけではありません。 我々はトレードアルゴリズムを知っているので、どのティックがトレードの変化につながらないかを理解する必要があります。 つまり、空のティックを識別し、ヒストリーから削除できます。 このフィルタリングは効率的です。
Total Ticks (EURAUD.rann) = 61354152 (2134296 ticks/sec.), Reserve = 80023750 Recording... After Filter (MinPips = 5) Ticks = 7820486 (12.75%)
ティックの数がほぼ桁減少したログシューズ。
MetaTrader5テスターは細心の注意を払っていますが(間違いなく有用です)、検討中の分析に不要な可能性があります(時には誤りがあります)。 操作の詳細を知っていれば回避できますが、現時点では考慮しません。 このトピックに関するフォーラムディスカッションがあります(ロシア語)。
MQL5のトレードアルゴリズムに必要なものは次のとおりです。
- ポジションのオープン/決済は、リミットオーダーのみを使用します。
- ネッティングロジック。 また、MetaTrader5でネットアカウントを開設する必要があります。
- トレーディング 1 ロット — ピップ単位での利益。
- テスターにカスタムシンボルの手数料がないサーバー上で起動します。
- カスタムシンボルは"exchange"を設定する必要があります。
単一の起動結果は次のようになります。
強調表示された列は、ポジションの取消がリミットオーダーを使用して実行されていることを示します。 すべて、リクエストされた価格で正確に実行されます。 リクエストされた価格で正確に実行することは重要です。
トリック
相場の挙動は、一日の時間帯に依存します。 したがって、BestIntervalライブラリを使用してみましょう。たった2行です:
#define BESTINTERVAL_ONTESTER // Optimization criterion - profit of the best interval. #include <fxsaber\BestInterval\BestInterval.mqh> // Calculating the best trading interval
これより、EAに追加のインプットパラメータが提供されます。
その日の特定の時間にのみトレードする際にEAが示す最高利益に等しいBestInterval基準によって最適化します。
ショベル(Excavator)
トレードアルゴリズムを用意しました。 フィルタリングされたカスタムティックも用意されています。 これを何とかしてMetaTrader5テスターを介してを組み合わせる必要があります。 これは、MultiTesterソリューションを通じて解決することができます。自動的にすべてのカスタムシンボルを使用し、このシンボルを使用してEA最適化を実行します。
最適化インターバル
ヒストリー全体にわたってEAを最適化する意味はありません - ルール性または過剰適合であるかどうかを理解することは困難です。 "数値スレッシャー"計算によって導かれるので、多数のトレードを数えてみましょう。
トレード数が多ければ多いほど、統計結果はよくなります。 トレード期間が小さいほど、リスクは低くなります。 一般的に、トレード数は多い方が良いです。 ここではそれについては細かく説明しません。
また、トレードの頻度が必要なので、小さな間隔を選択することができます。 まだ良いトレード数が含まれている可能性があります。
これは、過去4ヶ月よりも少しばかり少ないです。
さて、始めてみましょう。
成果
81シンボル(アーカイブソースのすべてのデータ)に関するすべての計算は10時間かかり、その一部は著者の睡眠中に行われました。 そのため、夜間にテストを実行すると便利です。 MetaTrader5テスターはマルチコアであるため、10時間でも可能です。
MetaTrader5 テスター データベースで最適化キャッシュを確認します。
データベースからレコードを開き、選択したシンボルに対応する最適化結果を表示します。
すべてのバリアント (81) は手動でチェックされました。 このプロセスは自動化できますが、まだ実装されていないため、小一時間費やす必要がありました。 シンボルの 1 つを例として分析してみましょう。 シンボルごとに同じことが行われました。
ここでは、1つのシンボルの最適化結果がBestInterval基準でソートされた場合。 カスタムシンボルの利点は、負のバランスに制限がないことです。 残高サイズがトレードに影響を与えないので、注意を払う必要はありません。
多くのトレード数を必要としています。 したがって、赤い列のレコードの 1 つを選択し、1 つのテストを実行します。 そのトレードチャートは以下の通りです:
これは、ラウンドクロックのトレードです。 単一のテストの最後に、次のレコードが得られます。
BestInterval Action(true - single pass & MT4-style & Virtual is required) = false Profit = -2392.00 = -2392.00 + 0.00 (0.00%) - Amount of Delete Intervals = 0 (2019.04.01 - 2019.07.20) 00:00:00 - 23:59:59 : Profit = -2392.00 (100.00%), Total = 2612 (70.64%), PF = 0.94, Mean = -0.92, DD = 3840.00, RF = -0.62 SUMMARY: 00:00:00 - 23:59:59 : Profit = -2392.00 (100.00%), Total = 2612 (70.64%), PF = 0.94, Mean = -0.92, DD = 3840.00, RF = -0.62 Profit = 4035.00 = -2392.00 + 6427.00 (-268.69%) - Amount of Delete Intervals = 1 (2019.04.01 - 2019.07.20), 20:00 - 08:00, CountHours = 11 00:00:00 - 07:58:54 : Profit = 1074.00 (26.62%), Total = 349 (76.22%), PF = 1.21, Mean = 3.08, DD = 709.00, RF = 1.51 19:41:38 - 23:59:59 : Profit = 2961.00 (73.38%), Total = 348 (76.44%), PF = 1.94, Mean = 8.51, DD = 358.00, RF = 8.27 SUMMARY: 00:00:00 - 23:59:59 : Profit = 4035.00 (100.00%), Total = 697 (76.33%), PF = 1.49, Mean = 5.79, DD = 484.00, RF = 8.34 BestInterval is saved in "TesterEA"-file in common(MT5)/base(MT4) folder. final balance - InitBalance (10000.00) + Profit (-2392.00) without BestInterval. OnTester - Profit (4035.00) with BestInterval. final balance 7608.00 USD OnTester result 4035
4035ピップの利益を達成するために、午後8時から午前8時までトレードする必要があるという結果になりました。 トレードがどのように見えるかを確認するには、インプットパラメータに移動し、BestIntervalを有効にする必要があります。
MetaTrader5で最適化モードを無効にしてください。 無効にする方法は次のとおりです。
ベストインターバルの使用結果を開始して確認します。
単一テスト ログをチェックして、パフォーマンスが適切に行われたことを確認します。
BestInterval Action(true - single pass & MT4-style & Virtual is required) = true Calculation time activated intervals is 2019.07.23 16:27:25 - TesterEA (common folder) 00:13:14 ago. Amount of Delete Intervals = 1 (2019.04.01 - 2019.07.20), 20:00 - 08:00, CountHours = 11 00:00:00 - 07:58:54 : Profit = 1074.00 (26.62%), Total = 349 (76.22%), PF = 1.21, Mean = 3.08, DD = 709.00, RF = 1.51 19:41:38 - 23:59:59 : Profit = 2961.00 (73.38%), Total = 348 (76.44%), PF = 1.94, Mean = 8.51, DD = 358.00, RF = 8.27 SUMMARY: 00:00:00 - 23:59:59 : Profit = 4035.00 (100.00%), Total = 697 (76.33%), PF = 1.49, Mean = 5.79 final balance - InitBalance (10000.00) + Profit (4035.00) with BestInterval. OnTester - Virtual InitBalance (10000.00) + Profit (-2403.00) without BestInterval. Profit is calculated with TickValue=1 and w/o Commission+Swap. final balance 14035.00 USD OnTester result 7597
この結果は良いように見えます。 トレードが多く、バランスチャートはスムーズです。 しかし、ヒストリー全体でこのEAを再確認する必要があります。
最適化間隔で結果の数学的なオーバーフィットがあることを示すひどいチャートが表示されました。 しかし、この結果は他の期間では機能しません。 したがって、実際のトレードでこの戦略を起動した場合、 資産を失うことになります。
フォワードテスト
MetaTrader5テスターは、フォワードテストモードをサポートします。 私の個人的な意見では、このようなテストは自己欺瞞です。 したがって、より良い解決策は、ヒストリー全体で2〜3つの良好な結果をチェックすることです。 ヒストリー全体で結果がうまくいかない場合は、この戦略を使用しないでください。 フォワードテストは、より多くの結果を実行します。
ゴールド
チャートは常にそんなに悪いのだろうか? 今回のケースではそうです - 最適化された値は、利用可能なヒストリー全体でテストされたときに悪い結果を示します。
最適化された間隔は赤で表示されます。 ご覧の通り、テスト期間が最適化された間隔よりもはるかに長い場合は、良好な安定性が観察されます。
ジュエリーエッチング
すべてのテストの後、さらなるタスクに選択するシンボルが明確になりました: EURCHF. 上記のテストのレポート:
ピップ単位の数学的期待値は赤で強調表示されます。 これは、重要なパラメータです! EURCHFの手数料は約4.40ピップです。 これは、利益の3分の2がブローカーによって取られることを意味します。 あまりにも多すぎます。
BestIntervalを削除し、トレード時間を調整するためのインプットを追加します。 チャート上に緑色でマークされている最大のドローダウン時間の終わりから最適化を開始してみましょう。 パラメータが多い場合は、遺伝的最適化を数回実行します。
最適化中に正規性を検索する際に強い歪みを避けるため、システム以外のデータを削除します。
ここに、ソース コードに次の書き込みを記述します。
const bool TradeTime = (TimeCurrent() < D'2018.02.10') || (TimeCurrent() >= D'2018.02.12');
その結果、フィルタリングされていないシンボルで数学的期待されるペイオフを2回増やすことに成功しました。
マーチンゲール/グリッド
もちろん、オーダーグリッドなどの追加のメソッドを適用しようとしました。 まず、数字上の成長を見てうれしかったです。 しかし、なぜこうなったか理由を説明できませんでした。 MetaTrader5テスターがネッティングアカウントで別の計算を使用していることを発見しました。 したがって、計算された値は、期待される値を示しません。 適切な計算を記述しました:
ヘッジアカウントの予想ペイオフの計算は、従来の計算に対応しています。 double OnTester() { double Res = 0; if (HistorySelect(0, INT_MAX)) for (int i = HistoryDealsTotal() - 1; i >= 0; i--) Res += HistoryDealGetDouble(HistoryDealGetTicket(i), DEAL_VOLUME); Res /= 2; if (Res) Res = TesterStatistics(STAT_PROFIT) / Res; return(Res); }
この結果は、グリッドが十分に最適化されたトレード戦略を改善できないという理論を完全に確認しました。 これは、正確だが簡潔な結論です。
マネタイゼーション
アイデアを交換する方法を決定する必要があります。 異なるブローカー(価格ヒストリーを含む)のトレード条件を確認し、特にリミットオーダーの実装を確認します。 ブローカーの中には、負のスリッページが可能な条件で、成行注文を通じてリミットオーダーを実行することができます。 一部のオーダーでは、リミットオーダーの部分的なインプットが禁止されています。 すべてのピップは重要であるため、このようなブローカーを避けてください(記事のタイトルを参照してください)。 したがって、トレード条件を選択する際には、注意する必要があります。
トレード戦略自体は、多くのトレードを意味します。
トレードに適した場所を見つけることができました。 ここでの最初のリミットオーダーはすぐにリクイディティプロバイダに到達し、したがって、オーダーフィリングの可能性が増加します。 ここでもう一つの可能なボーナスは、ありうるスリッページです。 数学的期待値の各ピップは重要です。 これより、手数料の少なくとも一部をカバーすることができます。
ライブトレード
ライブトレードはMetaTrader4プラットフォームで行われました。 したがって、クロスプラットフォーム関数を使用しました。
実際の結果とテスト結果の最大の対応を達成するために、次の運用スキームを実装する必要がありました。
- EAの起動時に、現在の状態までのティックヒストリーにHistoryTicksライブラリを使用してアクセスされます。
- このEAは、仮想ライブラリを使用して仮想環境のこのティックヒストリーに自動的に調整されます。
- 指定されたEA設定を持つトレードヒストリー全体が、現在までのブラウザに表示されます。 これより、インプット値のエラーの確率を最小限に抑えることができます。 損失がある場合は、エラーが発生している必要があります。
- このEAは、各ティックで仮想環境でトレードを続けます。 EAがオフの場合、再開後はストップがなかったかのようにトレードを続行します。
- 理想的でない実際の環境は、常に仮想環境と同期され、実行が完璧な状態です。
ステップはすべて数学のペイオフを増やすために必要でしたが、ほぼすべてのトレードシステムにステップを適用します。 もちろん、気にしたくない場合は、この部分を省略できます。 しかし, ステップが実際のトレードで本当に役立つ方法を参照してください。. このステップは、このトレード戦略に特に重要です。
多様化
インプット値のセットを 1 つだけ選択するだけでは不十分です。 どの最適化亜種が将来良好なパフォーマンスを示すかは、事前に知ることはできません。
したがって、すぐに8つのバリアントを選択し、均等に分かれるようにします。 すべてを同時に立ち上げました(1つのEAが個々のMagicNumberを実行している8つのチャート)。 これは、グリッドのように見えるかもしれません。 しかし、グリッドトレードシステムとは何の関係もありません. 8つの独立したトレードシステムです。
パイケーキ
仮にトレーディングシステムを立ち上げたとします。 次に何ができるでしょうか。 いくつかの方法があります。 信頼管理と PAMM、Signals コピー サービスまであります。
ピップ単位によって利益をつかむことについて話しているので、戦略はPR目的にのみシグナルとして提供することができます。 購読者は、トレードをコピーするときに負のスリッページを持つため、利益を得ることができなくなります。 したがって、期待される数学のペイオフは、負になります。 これはほとんどの加入者が資金を失うことを意味します。
トレード方法が公表されると、システム全体またはその基本原則のリバースエンジニアリングが発生する可能性があります。 これは、公的に利用可能なシステムの恩恵を受けるもう一つの可能性です。
また、一見良いシステムでも負ける可能性があります。 これは避けられません。
メモアール
特定のトピックに関連する研究中に、さまざまな状況に遭遇します。 また、あるケースを記憶しています。 EURDKK は、このスレッドで言及されました(ロシア語)。
この図は、赤いインターバルで最適化されたトレードシステムのパフォーマンスを示します。 今は再現できません。 しかし、最適化間隔の左側の画像が良く、直線として表されたことを覚えています。 実際のアカウントで実行され、テスターと同様のパフォーマンスを示したほぼ聖杯でした。 年明け後、一貫して負け始めました。 これはトレードを止めるのに十分でした。 以前に稼いだ資金の約10%を失いました。 まだなぜこれが起ったのか分かりません。
ここで最も重要な結論は、ほとんど聖杯と思えるようなものでさえ損失を引き起こすということです。 でもまた他の理由でこの事件を思い出しました
NOKSEK シンボルです。 このシンボルに注意を払ったことがありますか。 なぜ?
結論
この記事には、古典的な知的アプローチに対する"数値のスレッシャー"という特定の哲学的闘争があります。 自分に合ったソリューションを選択できます。
いくつかのトリックやアイデアが役に立つかもしれません。
この記事内のすべての考慮事項の背後にある興味深い声明があります。つまり、手中に収益性の高いトレードシステムがある場合でも、それについてよく知らない可能性が高いです。 これにより、多くの良いシステムが捨てられたと思います。 この記事では、トレーディングシステムをテストすることは、1~2シンボルで起動しているだけではないことを示しています。
1日の異なる時間をテストする必要があります。 モンテカルロ法は望ましくありません。 このシステムの収益性に関する結論を台無しにするかもしれません。
ユニバーサルシステムは利益を引き出す可能性は低い。 毎ピップに苦労するかもしれません。
MetaTrader5テスターに関しては、素晴らしいと言えます! 残念ですが、テスターなしではこのような研究を行うことは不可能でしょう。 開発者のおかげです! 改良されたバージョンが将来リリースされることを願っています。
他の考慮すべき項目は?
この記事には次の内容を内包することができませんでした。
- その他のシンボル。
- MetaTrader5のスリッページの計算。
- 手数料がリミットオーダーの正のスリッページによってカバーされる方法のデモンストレーション。
- 現在利用可能なMetaTrader5のテイクプロフィットが使用に適していないことを実証。
- この結果に対するスワップの影響。
- EURCHFシステムは、2つの5月(2018年と2019年)で類似した敗北結果を示しています。
- オートオプティマイザを通じてトレードシステムの有効性を評価するための基準の作成。
- 混合シンボルの作成。
- 遺伝的最適化の前に完全なパラメータテストの重要性。
- シンボルの復帰は、見つかったルール性とトレードシステムのパフォーマンスに影響を与えるべきではありません。
- テスターの結果の解釈は重要です。
- スプレッドまたはローカルエクストリームス。
MetaQuotes Ltdによってロシア語から翻訳されました。
元の記事: https://www.mql5.com/ru/articles/7113
- 無料取引アプリ
- 8千を超えるシグナルをコピー
- 金融ニュースで金融マーケットを探索
取引、自動取引システム、取引戦略のテストに関するフォーラム
記事「最後のピップへのスクラッチ利益」の議論
fxsaber 、2019 /08 /24 23:38
記事が公開されてからちょうど1か月が経過しました。中間結果。
取引、自動取引システム、取引戦略のテストに関するフォーラム
記事「最後のピップへのスクラッチ利益」の議論
fxsaber 、2019.08.08.27 00:26
ブログはオンライン取引分析オプションの例を引用しました。Forum on trading, automated trading systems and testing trading strategies
Discussion of article "Extract profit down to the last pip"
fxsaber, 2019.10.01 10:34
September 2019: +51%.
Forum on trading, automated trading systems and testing trading strategies
Discussion of article "Extract profit down to the last pip"
fxsaber, 2020.03.21 14:25
Meanwhile, the long-running account monitored for the article made its way to Top10 on some monitoring services. We do not raise the risk, we stumble, we learn.