メカニカル・トレーディングシステム "スタニスラブの三角形"
はじめに
本稿は、将来のバーやトレンドラインの交差時の位置を計算で導きだすことを取り扱っています。トレンドライン発生規則にはTの形に近いことがあげられます。デマーク手法が最後のインターバルでTDを作成するのに関係します。
提供するアプリケーションは、本格的な自動化エキスパートアドバイザーですが、その一部をより複雑なトレーディングシステムに組み込むことができます。
交差チャネル形成の基本原則
"チャバショブの三角形"パターンの本質は、どのポイントでも2つ下部に、2つ上部に最新のフラクタルを常に確認することができるというアイディアに基づいています。トレンドラインは2つの上部フラクタルと2つの下部フラクタルから描かれます。
これら2本のラインが三角形を右に生成しようとする場合に交差します。このパターンを"チャバショブの三角形"と呼ぶのです。ラインが交差するポイントのことを頂点と呼びます。全4つのフラクタルに出現順序(左から右)順に番号を振ります。
垂線を左から2番目のフラクタルに描きます。同じように垂線を頂点にも引きます。これら2本の垂線のあいだにあるローソク足の数を、ライン上にあるローソク足も本数に含めて3で割って約分し、頂点の左にセットして3本目の垂線を引きます。
2番目のフラクタル上に引かれた垂線と中央の垂線との距離が実ブレイクスルーエリアになります。
図1. 三角形の描画
三角形の描画に移りましょう。
最新の4つのフラクタルの位置はバラバラかも知れません。三角形を描くことができないか、さもなくばラインが短すぎるか長すぎるかしてしまうのです。
図2フラクタルの不適合位置の例
したがって、三角形を描くのに十分な条件を導入する必要があります。
三角形ライン収束条件:
- 上下ラインの最初のフラクタルは20~30ピップス以上の高さが開いていないといけません(この高さの値はテストでより厳密に指定できます)。
- 上下ラインの最初のフラクタル間のサイズは、2番目のフラクタル間のサイズより小さくないといけません。
- 上部ラインの最初のフラクタルは同じラインの2番目のフラクタルより低くなければならず、下部ラインの最初のフラクタルは2番目のフラクタルより高くなければいけません。
これらの追加条件は、条件を作成するパターンのプログラムコードで使用します。
図3実ブレイクスルーエリア
簡単だとは思いますが、念のため図3を見てみましょう。2つのラインの交差が起きる地点で、バー本数をどのように特定することができるのでしょうか?
ラインのブレイクスルーの瞬間、このブレイクスルーが実際本物であるかどうかはまだ分かりません。もうマーケットにエントリーする時かもしれないのに!実ブレイクスルーエリアの計算ブロックは、時間パラメーターを使用してこの問題を解決します。つまり、タイムレンジ内でラインの交差を特定するのです。
どのバーも特定の時間が経過した後チャートに出現します。例えば、1時間足では1時間につき1本新しいバーが出現します。各2つのラインの単位時間あたりの価格変動レートが分かれば、交差時間を計算することは可能です。三角形の"底辺"から交差時までの合計時間が分かれば、交差前の(そのタイムフレームでの)バー本数を計算できます。実ブレイクスルーエリアは同じブロック内で特定されます。
エキスパートアドバイザーはブロック単位で設計されています。
もっとも頻繁に繰り返されるブロックは、プログラムの始めに置かれるものです。ポジション・オープンとクローズ、記号とラインを描く関数を置きます。メイン処理プログラムもまた独立したブロックを持っています。
- 上下フラクタルを検出するブロック
- パターン形成条件ブロック
- 実ブレイクスルーエリア計算ブロック
- ポジションオープン条件ブロック
関数ブロックの一部を以下に示します。
// --------------------------------------------------------------------+ void Op_Sell_Ch() { if(!OrderSend(Symbol(),OP_SELL,Lots,Bid,2,Ask+SL_S*Point, Bid-TP_S*Point," ",Magic,0,Red)) { Print(" 売り注文オープンエラー # ",GetLastError()); } return(0); } // --------------------------------------------------------------------+ void Op_Buy_Ch() { if(!OrderSend(Symbol(),OP_BUY,Lots,Ask,2,Bid-SL_B*Point, Ask+TP_B*Point," ",Magic,0,Blue)) { Print(" 売り注文オープンエラー # ",GetLastError()); } return(0); } //+--------------------------------------------------------------------+ void Close_S_Ch() { if(!OrderClose(OrderTicket(),OrderLots(),Ask,2,Aqua)) {Print(" Cl.ord.# ",OrderTicket()," エラー # ",GetLastError());} return(0); } //+--------------------------------------------------------------------+
三角形形成ラインに対応する上下基準点の検出は、フラクタル発生規則に基づいたバー選別ループにおいて行われます。
基準点のナンバリングは、次のことを考慮に入れておこなわれます。「時系列要素のインデックス化は逆方向から、最後から最初の方へ向かっておこなわれます。現在のバー、アレイにおけるもっとも新しいバーは0のインデックスを持ちます。」
// ====================================================================+ // (上下フラクタル検出ブロック) --------------------------------------------+ for (i=M;i<=N;i++) // 基準点(フラクタル)検出ループ {//ループ b // 上部フラクタルの検出 ------------------------------------------------------+ if(High[i]>High[i+1] && High[i]>High[i+2] && High[i]>High[i-1] && High[i]>High[i-2]) {// フラクタル_b Tfnb++; // カウンター // ---------------------------- if(Tfnb==1) { // 1番目のフラクタル:価格、インデックス、時間 TF1B=High[i]; Tf1b=i; timf1b=iTime(Symbol(),Period(),i); }//-カウンター_1 // ---------------------------- if(Tfnb==2) {//カウンター_2 // 価格、インデックス、時間 TF2B=High[i]; Tf2b=i; timf2b=iTime(Symbol(),Period(),i); break; }//-カウンター_2 // ---------------------------- }//-フラクタル_b }//-b ループ // --------------------------------------------------------------------+ for (i=M;i<=N;i++) // 基準点(フラクタル)検出ループ {//s ループ // 下部フラクタルの検出 -----------------------------------------------------+ if(Low[i]<Low[i+1] && Low[i]<Low[i+2] && Low[i]<Low[i-1] && Low[i]<Low[i-2]) {// フラクタル_s Tfns++; if(Tfns==1) {//カウンター_1 // 価格、インデックス、時間 TF1S=Low[i]; Tf1s=i; timf1s=iTime(Symbol(),Period(),i); }//-カウンター_1 if(Tfns==2) {//カウンター_2 // 価格、インデックス、時間 TF2S=Low[i]; Tf2s=i; timf2s=iTime(Symbol(),Period(),i); break; }//-カウンター_2 }//-フラクタル_s }//- ループ s // ---------------------------(上下フラクタル検出ブロック)------------------+
次の条件は三角形を形成するライン収束ブロックに含まれています。
- 最初のフラクタルは20~30ピップス以上開いていないといけません。
- ラインの最初のフラクタルはもう一方のラインの2番目のフラクタルより低くなければいけません。
- 全4つの基準点は"0"ではありません。つまりそれらは値を持っています。
- 基準点の時間パラメーターは"0"とは別のものにすべきです。
- 最初の上部基準点は2番目の上部基準点より低く、2番目の下部基準点は2番目の下部基準点より高くなります。
- 上下ラインの2番目のフラクタルの間隔は150ピップスを超えてはいけません。
// ---------------------------------------------------------------------------+
if((TF1B-TF1S)>25*Point &&
Tf1b<=Tf2s && Tf1s<=Tf2b &&
TF1B>0 && TF1S>0 && TF2B>0 && TF2S>0 &&
timf1b!=0 && timf2b!=0 && timf1s!=0 && timf2s!=0 &&
TF1B<TF2B && TF1S>TF2S &&
(TF2B-TF2S)/Point<150)
{// 三角形描画条件
//===========================================================================+
予備条件を満たした後、上下ラインの価格変動率を計算します。
// -----------------------------------------------------------------------------+ // - (ブロック価格変動率計算)(1バーにつき上下ピップス) if(TF1B!=TF2B) {RatePriceH=MathAbs((TF2B-TF1B)/(Tf2b-Tf1b));} // 上部 if(TF1S!=TF2S) {RatePriceS=MathAbs((TF1S-TF2S)/(Tf2s-Tf1s));} // 下部 // Print(" RatePriceS= ",RatePriceS); Print(" RatePriceH= ",RatePriceH); // -------------------------------------(ブロック価格変動率計算)---+
この時点では、最新4つのフラクタルは条件を形成する三角形に応じて位置しています。頂点からどれだけ離れているのか、実ブレイクスルーエリアがどこにあるのかは、まだ明らかになっていません。頂点の計算は、フラクタル生成中の最新4つのフラクタルのうち2番目のフラクタルの位置に依ります。
長いラインの開始点は、長いラインによる短いラインの2番目のフラクタル上に描かれた垂線の交差点と定義されるべきです。この観点において、次のプログラムアルゴリズムは、実ブレイクスルーエリア計算の2方向に分岐します。"長い"上部ラインと"長い"下部ラインです。
一方の方向に関する基本コードの一部を以下に示します。もう一方の方向は同じアルゴリズムを使用して計算できます。
// жжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжж 1. 上部ラインは下部ラインより長い жжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжж+ // - (ラインの交差点を検出するブロック) ----------------------------------------------------------+ // 上部ラインが下部ラインより長い場合 - 50本のバーから交差点を探します。 if(Tf2b>Tf2s && TF2B>TF1B && TF2S<TF1S) {// 上部ラインが長い // 上部ラインのバーごとの値を計算する開始価格 Starting_Price_H=TF2B-RatePriceH*(Tf2b-Tf2s); // 上部ラインのバーごとの値を計算する開始価格 Starting_Price_S=TF2S; //三角形の底辺で垂線を描く時間 time_starting=timf2s; // ------------------------------------ for(int k=1;k<=50;k++) {//50b ループ PricB[k]=Starting_Price_H-RatePriceH*k; // マイナス下降率 PricS[k]=Starting_Price_S+RatePriceS*k; //プラス上昇率 // 上下ライン先端部分の価格が同じ場合、 if(PricB[k]<=PricS[k]) // または上部価格が下部価格より小さい場合、ラインの交差が起きていると判断します。 {//交差が起きています。 P_Tria=PricB[k-1]; // ライン交差価格 (-1) - バー1本未満でなければなない。 cut_left=k; break; // 底辺から交差点までのバー数 }//-交差があります。 }//-50b ループ // -------------------------------------- (ラインの交差点を検出するブロック)----------------------------------+
ここから、実ブレイクスルーエリアの時間パラメータの計算を始めます。
// ---------------------------------------------------------------------------+ // - (実ブレイクスルーエリアのインターバル計算ブロック)-----------------------------------+ // 追加条件の紹介 // 1. 頂点は三角形の底辺からバー50本分より離れてはいけません。 // 2. 頂点は三角形の底辺にバー15本分より近くにあってはいけません。 if(cut_left<50 && cut_left>12) {//全条件を満たす三角形 time_Apex=timf2s+cut_left*T_period; // 頂点生成時間 // バー数を3で割って、3分の2をとり約分し整数にします。 // 値: MathRound(cut_left/3*2) -実ブレイクスルーエリアのバー本数 time_bar_zona=time_starting+MathRound(cut_left/3*2)*T_period; //エリア時間 // パターン生成条件を満たし、実ブレイクスルーエリアが計算されました。 PatternTch=true; // "チャバショブの三角形"パターンが形成されました。 }//-全条件を満たす三角形 // -------------------------------------(実ブレイクスルーエリアのインターバル計算ブロック)-+
パターンが形成されたので、三角形描画ブロックの処理を開始します。
// - (パターン形成後の三角形描画ブロック)--------------------------------- ---+ if(PatternTch==true) {//パターンがあります。 Del_Frb(); Del_Frs(); // 以前の上下フラクタルを削除 CreateArrow_Frb(); CreateArrow_Frs(); // 上下フラクタルを描画 Create_Tr_H(); Create_Tr_S(); // 上下トレンドラインを描画 CreateLzona(); CreateLbasis(); CreateLApex(); // 垂線を描画 CreateTriangleH(); // 下部ラインで三角形を描画 ObjectDelete("TRS"); // 下部ラインで描画した三角形を削除 // --------------------------------------(パターン形成後の三角形描画ブロック)-+
以下のスクリーンショットは"チャバショブの三角形"パターン描画ブロックの処理結果を表示しています。
ポジションオープンのためのブロックが次に続きます。
ポジションオープン条件が満たされると、行き過ぎた場合のラインのチャネル描画が計算されます。チャネルが形成されます。
ストップロスとテイクプロフィットは資金管理システムの要件を考慮して計算され、ポジションはオープンされます(このケースでは、買いです。以下のスクリーンショットを参照してください)。
しかし、ポジションは、両方向へオープンする条件がそろえば、両方向へオープンできてしまいます(スクリーンショットショット参照)。
プログラムはパターンの発生時間を記録します。
もし現在時刻が実ブレイクスルー時刻を超えると、プログラムはオープンポジション禁止を導入します。もし現在時刻が頂点時刻を超えると、プログラムは全パターンの描画を削除し、すでに不要となった記号やラインをチャートから取り除きます。
パターン発生時間のブロックコードを以下に示します。
// - (パターン発生時間を特定するブロック) -------------------------------+ // 現在時刻が実ブレイクスルーエリアの境界時刻を超えると、パターンはその効力を失います。 if((TimeCurrent()-time_bar_zona)>=T_period) { PatternTch=false; // パターンは無効です。 - オープンポジション禁止を導入 } // 現在時刻が頂点時刻を超える場合 if((TimeCurrent()-time_Apex)>=T_period) { // チャートからパターン記号とラインを削除 Del_Frs(); Del_Frb(); Del_TrLin(); // 上部ラインによるチャネルプロフィットサイズのラインを削除 ObjectDelete("Tr_B1h"); ObjectDelete("Tr_B1hh"); ObjectDelete("Tr_B1hs");ObjectDelete("Tr_B1s"); // 下部ラインによるチャネルプロフィットサイズのラインを削除 ObjectDelete("Tr_S1s"); ObjectDelete("Tr_S1sh"); ObjectDelete("Tr_S1ss");ObjectDelete("Tr_S1h"); // 実ブレイクスルーエリアの垂線を削除 ObjectDelete("L1");ObjectDelete("zona");ObjectDelete("Ap"); ObjectDelete("TRH"); ObjectDelete("TRS"); } // ---------------------------------(パターン発生時間特定ブロック)-+
このブロックの処理結果は、前チャートのスクリーンショット右側に表示されています。
ここで紹介したエキスパートアドバイザーは、自動化テスト期間中、メカニカルトレーディングとして良い結果を得ました。
- 総利益と総損失の割合 P/F = 38869/16480 = 2.36 (more than 2)。
- 取引総数 = 101 (100より少なくありません)。
- ドローダウン・パーセンテージ = 25,18% (添付ファイル参照)。
簡単に結論をまとめます。
紹介したテクニックは、トレーダーがトレーディングシステム・コンポーネントとして利用できますが、ポジションオープン・フィルターは改良の余地があります。
ここで提供したフィルターは、技術者スタニスラブ・チャバショブ氏によって推奨されているもので、改良できるものです。
添付ファイル:
- Triangle_H1_v46.mq4 – МТСを提供
- Strategy_Tester_Report_46.zip – テスト結果
- table_3.zip – 分析の質として。
MetaQuotes Ltdによってロシア語から翻訳されました。
元の記事: https://www.mql5.com/ru/articles/1364
- 無料取引アプリ
- 8千を超えるシグナルをコピー
- 金融ニュースで金融マーケットを探索