English Русский 中文 Español Deutsch Português
「チュヴァショーフのフォーク」という取引システム

「チュヴァショーフのフォーク」という取引システム

MetaTrader 4トレーディングシステム | 11 12月 2015, 14:42
3 522 0
Genkov
Genkov

「トレンドラインを作成するための最終値に興味を持つ」
トーマス・R・デマーク

はじめに

スタニスラブ・チュヴァショーフは、「チュヴァショーフのフォーク」という概念に基づくFX取引方法をご紹介します。「チュヴァショーフのフォーク」では、相場の状態を分析する方法がデマークのチャート分析テクニックに似ています。


1. 「チュヴァショーフのフォーク」というパターンでトレンドラインを作成する方法

チュヴァショーフのフォークを作成するために、フラクタルインジケーターが使用されます。価格チャートで隣のフラクタルの1、2を通る直線を作ってみましょう。下フラクタルを通って上昇メイントレンドラインを作るし、上フラクタルを通って過去メイントレンドラインを作ります。


図1. 「チュヴァショーフのフォーク」の作成

メイントレンドラインを割って同じようなフラクタル「3」が生成されることを待っています。フラクタル2及びフラクタル3を通る側線とメイントレンドラインを合わせて「チュヴァショーフのフォーク」というパターンを作成できます。これは、スタニスラブ・チュヴァショーフが思い出した名前です。

「チュヴァショーフのフォーク」パターンのキーアイデアは、この側線がトレンドの方向へ向かうことです。側線を抜ける場合、シグナルが発生します。 上昇トレンドをチャートで判断できれば買いシグナルで、下降トレンドなら売りシグナルがベストタイミングでわかります。特許技術の紹介動画はこちら「チュヴァショーフのフォーク」の紹介動画です。

「チュヴァショーフのフォーク」パターンの作成の順序は以下のようになります(例として4日間の1時間足を挙げます)。


図2. 「チュヴァショーフのフォーク」パターンの発生

図2では上昇トレンドで「チュヴァショーフのフォーク」パターンが発生することが見られます。取引システムは売りポジションを開きました。


図3. 新しいパターン

6バー後に(6時間後に)新しい「チュヴァショーフのフォーク」パターンが発生しました(図3)。その場合、相場が反転する、またはレンジになります。

取引システムは売りポジションを決済して、パターンの条件に合わせて新しい売りポジションをオープンします。


図4. パターンの確認

図図4からわかるように、10月11日に相場が反転するし、下降トレンドとなります。10月12日午前中に続いてる「チュヴァショーフのフォーク」のパターンは、それを確認します。

真っ昼間から価格が側線の方に向かうので、相場が反転し、上昇トレンドとなります。価格が側線を超える場合、売りポジションを決済して買いポジションを開くタイミングです。


図5. トレンド転換

図5から見られるように、10月12日午後または10月13日午前中に上昇トレンドが続きます。また、真っ昼間ぐらいに上に向かって出るフォークが発生しましました。10月13日午後中に相場が反転し、下降トレンドとなります。このシグナルが作成した後で、取引システムは買いポジションを決済し、売りポジションをオープンします。

上で述べたパターンの生成の順序がストラテジーテスターでは見られます。Vilka_Ch_Demo20.mq4という添付ファイルをバックテストしてみてください。


図6. 取引シグナル

この図は、なんか買い取引参考・売り注文参考のことを表しています。


2. 「チュヴァショーフのフォーク」として指定されるmq4コードの特徴

添付ファイルからすべてがわかるので、変数の一覧、注文のオープン・クローズをする関数、マークを付ける関数、トレンドラインを描く関数の前には説明を書きません。

注意:各ティックで0 にリセットされる変数がStart()関数に渡されます。

1つずつ順に表示される3つのフラクタルの検索から始めましょう。この場合、下に向かって出るフォークが発生します。価格が側線を超える場合、買いポジションをオープンします。

for (i=M;i<=N;i++)
    {//ループ
    if(High[i]>High[i+1] && High[i]>High[i+2] && High[i]>High[i-1] && High[i]>High[i-2])
     {//フラクタル
      VFN++;           // フラクタルの計算器
      // ------------------------------------------------------------+
      if(VFN==1)       // 1つ目のフラクタルが検出された場合、以下の値を記憶する: 最高値[i], ロウソクの番号[i], 時間[i]:
        {// f1
           Vnf1=i;        // 選択したフラクタルの最高値のバーの番号を記憶する
           VMF1=High[i];  // 選択したフラクタルの最高値を記憶する
           tim1=iTime(NULL,0,i);        // 1つ目の基準点の時間を記憶する
         }//-f1
    // --------------------------------------------------------------+
    if(VFN==2)        // 2つ目のフラクタルが検出された場合、以下の値を記憶する: 最高値[i], ロウソクの番号[i], 時間[i]
      {// f2
          VMF2=High[i];    // 選択したフラクタルの最高値を記憶する
          if(VMF2>VMF1)    // 2つ目のフラクタルの最高値が1つ目のフラクタルの最高値より大きい場合のみ
            {
              Vnf2=i;      // 選択したフラクタルの最高値のバーの番号を記憶する
              tim2=iTime(NULL,0,i);      // 2つ目の基準点を記憶する
            }
       }//-f2
    // --------------------------------------------------------------+
    if(VFN==3)       // 3つ目のフラクタルが検出された場合、以下の値を記憶する: 最高値[i], ロウソクの番号[i], 時間[i]:
     {//f3
          VMF3=High[i];    // 選択したフラクタルの最高値を記憶する
          if(VMF3>VMF2)    // 3つ目のフラクタルの最高値が2つ目のフラクタルの最高値より大きい場合のみ,
           {
             Vnf3=i;       // 選択したフラクタルの最高値のバーの番号を記憶する
             tim3=iTime(NULL,0,i);       // 3つ目の基準点の時間を記憶する
           }
     }//-f3
// ------------------------------------------------------------------+
   if(VFN==3) break; // すべてのフラクタルが検出され、ループから抜ける
// ------------------------------------------------------------------+ 
    }//-フラクタル                      
   }//-ループ 

上記のループでは、1つずつ順に表示される3つのフラクタルを決定しました。すなわち、1つ目のフラクタルは2つ目のフラクタルより低くて、2つ目のフラクタルは3つ目のフラクタルより低いです。2つ目のフラクタルと3つ目のフラクタルを通る直線を作るとメイントレンドラインとなります。これらのフラクタルは基準点を表しています。

ただし、3つ目のフラクタルの値はメイントレンドラインと1つ目のフラクタルの交差以下になる可能性があります。

図7. 基準点の配置

そのため、3つ目の基準点の配置を確認する演算子が使用されます。

// ------------------------------------------------------------------+
   if(VMF3>VMF2 && VMF2>VMF1)
    {  
    // 側線(2)がメイントレンドライン(1)を
    // 上抜けるかどうか?それを調べるためにメイントレンドライン(1)の
    // 1つ目の上フラクタルの縦線への射影を計算する:
    V_down1=((VMF3-VMF2)/(Vnf3-Vnf2));      // 各バーのメイントレンドライン値の減少速度
    PricePrL1_1f=VMF2-(Vnf2-Vnf1)*V_down1;  // メイントレンドラインの1つ目のフラクタルへの射影の値
    // この射影の値を1つ目の上フラクタルの値を比べてみよう
    // 1つ目の上フラクタルの値が射影の値より
    // 高い場合、「チュヴァショーフのフォーク」を成功できました。
    if(VMF1>PricePrL1_1f) // 買いポジションをオープンするパターンが生成された場合
     {     
     V_down2=((VMF2-VMF1)/(Vnf2-Vnf1));  // 各バーの側線値の減少速度  
     PricePrL2_1b=VMF1-Vnf1*V_down2;     // 側線(2)の1つ目のバーへの射影の値
     PricePrL1_1b=VMF2-Vnf1*V_down1;     // メイントレンドライン(1)の1つ目のバーへの射影の値
     // 買いポジションをオープンするパターンが生成されたのを記憶する
     patternBuy = true; patternSell = false;   // 買いポジションをオープンするパターンが生成された
     // 「チュヴァショーフのフォーク」のマークやトレンドラインを描画する

     DelLine(); CreateLine(); CreateArrow();   // 前のマークやトレンドラインを消して新しく描画する
     }
    }
// ==================================================================+    

1つ目の上フラクタルの値がメイントレンドラインの1つ目のフラクタルへの射影の値より高い場合、「チュヴァショーフのフォーク」の要求に応じます。

このように、「チュヴァショーフのフォーク」 のパターンが指定されました。

これから、買いポジションの条件を決める必要があります。

// ==================================================================+    
//                    買いポジションをオープンする                       +
// ==================================================================+
   if(OrdersTotal()<1) // 1つ(2,3...)の新規注文を開始する  
    {  // ポジションをオープンする
// ------------------------------------------------------------------+
   if(patternBuy==true)
    { //patternBuy

もし最後の25バーで価格帯が50ポイントなら良いでしょう。

追加条件を指定しましょう。例えば、日足の150日移動平均線が下に向かってこの指標に比べて89ポイント以下です。

 // 追加条件の1つは、最後の25バーで価格帯が50ポイント以上
if((High[iHighest(Symbol(),Period(),MODE_HIGH,25,0)]-Low[iLowest(Symbol(),Period(),MODE_LOW,25,0)])>=50*Point)
  {// 価格帯
   // 次の追加条件は価格がMA144より89ポイント以下となる等
  if(Bid<Ma144_1-89*Point &&       // 価格はFibo89s以下   
     (Ma144_1-Ma144_48)<0)         // MA144は否定的方向
   {//次の追加条件

ポジションオープンの主な条件として、価格が側線を交差する必要があります。

例えば以下のようになります。

if((High[1]>PricePrL2_1b ||                     // ロウソクの最高値が側線の1つ目のバーへの射影の値より高い
    Close[1]>PricePrL2_1b ||                    // ロウソクが側線の1つ目のバーへの射影を超えて閉じる
    (Open[1]<Close[1] && Close[1]>PricePrL2_1b) ||   // 白いロウソクが1つ目のバーへの射影を超える
    Bid>PricePrL2_1b) && Bid<PricePrL2_1b+3*Point)   // ビッドと側線の1つ目のバーへの射影の値の差は3ポイントを超えない必要がある
   {

次に、決済逆指値と決済指値を指定しましょう。決済逆指値を最小値で指定し、ゼロバーから2つ目のフラクタルのバーまでの最小値です。価格帯を0,6超えて決済指値を設定します。

こちらのトレンド戦略では上昇トレンドの下フラクタルのチェックが実行されるので、100~200ポイントなど価格帯を2 倍超える決済指値を指定してみましょう。

  {// 買いポジションをオープンする
   // 決済逆指値としてゼロバーから2つ目のフラクタルのバーまでの最小値を指定する
  SL_B=(Bid-Low[iLowest(Symbol(),Period(),MODE_LOW,Vnf2,0)])/Point;
  if(SL_B<StopLevel) SL_B=Bid-(StopLevel+2)*Point; // StopLevelがSL_B以上である場合 
  TP_B=120;
  Print("  OP_BUY チュヴァショーフのフォーク","  VMF1 = ",VMF1," < ",PricePrH1_1f);
  Op_Buy_Ch();
  return;
  }//- 買いポジションをオープンする

最後の1つずつ順に表示される3つのフラクタルを上昇トレンドの下フラクタルにより決定し、上に向かうパターンを作成します。

//+=======================================================================+
//                   ポジションオープンの確認                                +
//+=======================================================================+
for (i=OrdersTotal()-1; i>=0; i--)        // 買い注文を選択するループ 
   {//ポジションを選択するループBuy
  if(!OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
    {Print("注文の選択のエラー = ", GetLastError()); }
   if(OrderType()==OP_BUY )                // 買い注文を出した場合
    { //2-タイプ_Buy

買いポジションがオープンされ、上に向かうパターンが生成された場合、相場が反転し、下降トレンドとなります。買いポジションを決済したほうがいいです。

//+=======================================================================+
//|  買いポジションを決済するための条件                                        +
//+=======================================================================+
   if(patternSell==true)         //  売り注文参考
    { 
    Print(" 売り注文参考なので、買いポジションを決済する必要がある");
    Close_B_Ch();         // 売りポジションを決済する
    return; 
    }
//+=======================================================================+

未決済の買いポジションの修正へ行きましょう。

修正は3段階で処理します。1つ目の段階では、決済逆指値をゼロロスの値に近くします。2つ目の段階では、決済逆指値以上である利益が出る場合、決済逆指をポジションを開始するレベルにします。

// ---- 1つ目の段階 ------------------------------------------ 1つ目の段階 ---+
    // 1つ目の段階では、
    // 決済逆指値決済逆指値以上である利益が出る場合、SL_Bを決済逆指値の1/2の値に動かす
    // つまり、ポジションを開始するレベルに近くする(+StopLevel)
   if((Bid-OrderOpenPrice())>SL_B*Point        // 価格とポジションをオープンする値の差がSL_Bを超える場合
       && OrderStopLoss()<OrderOpenPrice())    // または決済逆指値がポジションをオープンする値より低い場合
    {// 修正1
     OrderModify(OrderTicket(),                // 注文の#
     OrderOpenPrice(),                         // オープン価格
     OrderStopLoss()+(SL_B/2)*Point,           // 新しい決済逆指値
     OrderTakeProfit()+1*Point,                // 新しい決済指値
     0,                                        // 据え置き注文の終了時間
     Red);                                     // 修正のマークの色
     return;
    }//-修正1
// --- end 1つ目の段階 -----------------------------------------------------+
// ---- 2つ目の段階 ------------------------------------------ 2つ目の段階 ---+
    // 2つ目の段階では、 
    // 再び決済逆指値以上である利益が出る場合、 SL_Bを決済逆指値のゼロロスの値に動かす
    // つまり、ポジションを開始するレベルに合わせる
   if((Bid-OrderOpenPrice())>SL_B*Point        // 価格とポジションをオープンする値の差がSL_Bを超える場合
       && OrderStopLoss()<OrderOpenPrice())    // または決済逆指値がポジションをオープンする値より低い場合
    {// 修正1
     OrderModify(OrderTicket(),                // 注文の#
     OrderOpenPrice(),                         // オープン価格
     OrderStopLoss()+(SL_B+StopLevel)*Point,   // 新しい決済逆指値
     OrderTakeProfit()+1*Point,                // 新しい決済指値
     0,                                        // 据え置き注文の終了時間
     Magenta);                                 // 修正のマークの色
     return;
    }//-修正1
// --- end 2つ目の段階 -----------------------------------------------------+

利益が決済逆指値の1.5倍以上大きい場合、SL_Bを一番近い下フラクタルに引いてみましょう。

// ---- 3つ目の段階 --------------------------------------- 3つ目の段階 ------+
   //  利益が決済逆指値の1.5倍以上大きい場合
   //  SL_Bを一番近い下フラクタルに引いてみよう
   if((Bid-OrderOpenPrice())>=(SL_B+SL_B/2)*Point  // 価格とポジションをオープンする値の差がSL_B+SL_B/2を超える場合
       && OrderStopLoss()>=OrderOpenPrice())       // または決済逆指値がゼロロスのレベルにある場合
    {// 修正2
     // SL_Bを一番近い下フラクタルに引いてみよう
     // そのため、一番近い下フラクタルを検索する
    for (k=3;k<=24;k++)
     {//ループ-M
     if(Low[k]<Low[k+1] && Low[k]<Low[k+2] && Low[k]<Low[k-1] && Low[k]<Low[k-2])
      { // Lowフラクタル
      VlFl_L=Low[k];             // 一番近い下フラクタルの値
     if(VlFl_L>OrderStopLoss())  // 前の決済逆指値を超えなければならないフラクタル
      {// フラクタルはSL_B以上である
      tim1_L=iTime(NULL,0,k);    // フラクタルの時間
         ///  string Time1_L=TimeToStr(tim1_L,TIME_DATE|TIME_MINUTES); 
         ///  Print("  修正2 ====== ","  フラクタル = ","Frak"+k,VlFl_L,"  時間 = ",Time1_L);           
      // 決済逆指値を下フラクタルの値のレベルに引いてみよう 
      OrderModify(OrderTicket(),            // 注文の# 
      OrderOpenPrice(),                     // オープン価格 
      VlFl_L+2*Point,                       // 新しい決済逆指値// ゼロロス
      OrderTakeProfit()+1*Point,            // 新しい決済指値
      0,                                    // 据え置き注文の終了時間
      Aqua);                                // 修正のマークの色
      if(VlFl_L!=0)  break;                 // フラクタルが見つけた場合、ループから抜ける
      return;
// --- end 3つ目の段階 ------------------------------------------------------+


まとめ

結論は以下の通りです。すべてのブローカーは、この記事で説明している取引システムの結果が大体同じで、良い結果です。

この記事で説明している方法やコードは取引システムの部分を表しています。ただし、ポジションをオープンするフィルタのコードを書き直したほうがいいでしょう。ここでご紹介されたフィルタはスタニスラブ・チュヴァショーフから提供されました。

特許技術の紹介動画はこちら、「チュヴァショーフのフォーク」の17の紹介動画

添付ファイルの説明:

  • Vilka_Ch_Demo20.mq4 – デモバージョン
  • Vilka_Ch_ExpertH1_v1.mq4 – 「チュヴァショーフのフォーク」という取引システム
  • Vilka_Ch_MTC_v1.mq4 – コメントが入ってない「チュヴァショーフのフォーク」取引システム

MetaQuotes Ltdによってロシア語から翻訳されました。
元の記事: https://www.mql5.com/ru/articles/1352

添付されたファイル |
エキスパートアドバイザーの注文と希望の結果の取得方法 エキスパートアドバイザーの注文と希望の結果の取得方法
どのように正しく必要条件の明記を記載するのでしょうか?エキスパートアドバイザーやインジケーターを注文する際にプログラマーに期待すべき点と、期待すべきではない点は何でしょうか?やりとりを記録するにはどうすべきで、何に対して特に注意すべきでしょうか?この記事は、これらの質問や、その他多くの人にとって明白ではない様々な質問に対する答えを提供します。
行列代数ライブラリ『LibMatrix』(第一部) 行列代数ライブラリ『LibMatrix』(第一部)
著者は読者に簡単な行列代数ライブラリを紹介します。主要な機能とその特徴を見ていきます。
ZigZag インディケータ:新鮮なアプローチと新しいソリューション ZigZag インディケータ:新鮮なアプローチと新しいソリューション
本稿は高度なZigZag インディケータ作成の可能性を検証します。ノードを特定する考え方はエンベロープインディケータの使用に基づいています。連続したエンベロープに対する入力パラメータの特定の組合せを見つけることができ、そこでは ZigZag ノードはすべてエンベロープバンドの範囲 内にあると考えられます。結果的に新規ノードの座標を予測しようとすることができるのです。
外部指標のためのアラートとコメント:外部スキャンに基づく多通貨分析 外部指標のためのアラートとコメント:外部スキャンに基づく多通貨分析
多通貨の分析と複数時間軸での分析のためのアラートこの記事では、チャートにドラッグ&ドロップしなくて、外部指標にある状態を分析する方法について説明しています。いわゆる「外部スキャニング」です。