見出し画像

MQL4/MT4インジケーター ドンチャン+移動平均線大循環分析のサイン表示 ソースコード無料公開

今日は、タートルズが基本のエントリールールとして活用したドンチャンチャネルと、移動平均を組み合わせたサインインジケーターを公開します。

これは小次郎講師が紹介している「移動平均線大循環分析」の手法でもあります。

■Donchian02インジケーター

▶動作サンプル画像

▶エントリーポイント

実験期間中に1億5千ドルを稼ぎ出したというタートルズのエントリールールの一部であるエントリールール1がこちらです。

【エントリールール1】
■20本ハイを上に抜けたたら買いエントリー
■20本ローを下に抜けたら売りエントリー

以下は、移動平均線の「短期」「中期」「長期」の状態を組み合わせた場合に、どのような状態を示すトレンド状態なのかをまとめました。

【移動平均線大循環分析】
■中期線<短期線<長期線: お試し買いエントリー
■中期線<長期線<短期線: 早仕掛け買いエントリー
■長期線<中期線<短期線: 本仕掛け買いエントリー

■長期線<短期線<中期線: お試し売りエントリー
■中期線<長期線<短期線: 早仕掛け売りエントリー
■長期線<中期線<短期線: 本仕掛け売りエントリー

「お試し」は確度が低いが、そこでエントリーして期待どおりの方向に伸びれば利が大きくなります。
「本仕掛け」はトレンドがかなり見えて確度が高いですが、リスクを低減する代わりに利益が少なくなる傾向にあります。

サインであるひし形「◆」は、本仕掛けになるにつれ、色を濃く表示するようにしているので、それで見分けて頂いたらと思います。

▶設定内容

基本は20本ハイ・20本ローのラインを表示し、そこを抜けると「◆」のサインを出します。
その際に、移動平均線の状態を見て、確度が低いものは色が薄く、確度が高いものは色を濃くしています。

移動平均メソッドの種類や、また期間の足の数についても修正できるため、たとえばもっと長期スパンにして、よりリスクを低減させて、エントリー回数は下がるけれどもより確実なポイントを取るといった戦略も可能です。

▶ダウンロード

以下から、実行ファイル(ex4)とソースコード(mq4)をダウンロード頂けます。

▶ソースコード

ソースコードの中身はこちらです。

#property copyright   "2024-2025, Hiromax."
#property link        "https://note.com/hiro_max"
#property description "Hiromx Indicator Donchian 02"
#property strict

#property indicator_chart_window
#property indicator_buffers 13

input string main_setting = "";                        //■メインライン
input int bar_count_main = 20;                     // └メインライン:計測する足の数
input string sub_setting = "";                        //■サブライン
input bool sub_line = false;                        // ├サブライン有効化
input int bar_count_sub = 10;                      // └サブライン:計測する足の数
input string ima_setting = "";                        //■移動平均
input bool ima_line = true;                        // ├移動平均有効化
input ENUM_MA_METHOD ima_method = MODE_SMMA;       // ├移動平均 メソッド
input ENUM_APPLIED_PRICE ima_price = PRICE_CLOSE;  // ├移動平均 価格定数
input int ima_period_short  = 5;                   // ├移動平均 短期足期間 足の数
input int ima_period_middle = 20;                  // ├移動平均 中期足期間 足の数
input int ima_period_long   = 40;                  // └移動平均 長期足期間 足の数

double     Buf1[];
double     Buf2[];
double     Buf3[];
double     Buf4[];
double     Buf5[];
double     Buf6[];
double     Buf7[];
double     DrawDot1[];
double     DrawDot2[];
double     DrawDot3[];
double     DrawDot4[];
double     DrawDot5[];
double     DrawDot6[];

int windex;

int OnInit(void)
  {
   SetIndexBuffer(0, Buf1);
   SetIndexStyle(0,DRAW_LINE,STYLE_SOLID,2,Lime);
   SetIndexBuffer(1, Buf2);
   SetIndexStyle(1,DRAW_LINE,STYLE_SOLID,2,Red);

   SetIndexBuffer(2,DrawDot1);  
   SetIndexArrow(2,117);
   SetIndexStyle(2,DRAW_ARROW,STYLE_SOLID,1,Cyan);
   SetIndexBuffer(3,DrawDot2);  
   SetIndexArrow(3,117);
   SetIndexStyle(3,DRAW_ARROW,STYLE_SOLID,1,White);

   SetIndexBuffer(4, Buf3);
   SetIndexStyle(4,DRAW_LINE,STYLE_DASHDOT,1,Lime);
   SetIndexBuffer(5, Buf4);
   SetIndexStyle(5,DRAW_LINE,STYLE_DASHDOT,1,Red);

   SetIndexBuffer(6, Buf5);
   SetIndexStyle(6,DRAW_LINE,STYLE_SOLID,1,Yellow);
   SetIndexBuffer(7, Buf6);
   SetIndexStyle(7,DRAW_LINE,STYLE_SOLID,1,Yellow);
   SetIndexBuffer(8, Buf7);
   SetIndexStyle(8,DRAW_LINE,STYLE_SOLID,1,Yellow);

   SetIndexBuffer(9,DrawDot3);  
   SetIndexArrow(9,117);
   SetIndexStyle(9,DRAW_ARROW,STYLE_SOLID,1,clrDeepSkyBlue
);
   SetIndexBuffer(10,DrawDot4);  
   SetIndexArrow(10,117);
   SetIndexStyle(10,DRAW_ARROW,STYLE_SOLID,1,clrHotPink);
   SetIndexBuffer(11,DrawDot5);  
   SetIndexArrow(11,117);
   SetIndexStyle(11,DRAW_ARROW,STYLE_SOLID,1,clrRoyalBlue);
   SetIndexBuffer(12,DrawDot6);  
   SetIndexArrow(12,117);
   SetIndexStyle(12,DRAW_ARROW,STYLE_SOLID,1,clrDeepPink);

   return(INIT_SUCCEEDED);
  }

void OnDeinit(const int reason)
{
  ObjectsDeleteAll();
}

int OnCalculate(const int rates_total,
                const int prev_calculated,
                const datetime &time[],
                const double &open[],
                const double &high[],
                const double &low[],
                const double &close[],
                const long &tick_volume[],
                const long &volume[],
                const int &spread[])
  {
   int counted_bars=IndicatorCounted();
   int limit = Bars - counted_bars - 1;

   for(int i=0; i<limit; i++)
   {
      int stage = 1;
      double buf5i = iMA(Symbol(), Period(), ima_period_short, 0, ima_method, ima_price, i);
      double buf6i = iMA(Symbol(), Period(), ima_period_middle, 0, ima_method, ima_price, i);
      double buf7i = iMA(Symbol(), Period(), ima_period_long, 0, ima_method, ima_price, i);
      if(ima_line){
        Buf5[i] = buf5i;
        Buf6[i] = buf6i;
        Buf7[i] = buf7i;
      }
      if((buf5i <= buf6i) && (buf5i >= buf7i) && (buf6i >= buf7i)) stage = 2;
      if((buf5i <= buf6i) && (buf5i <= buf7i) && (buf6i >= buf7i)) stage = 3;
      if((buf5i <= buf6i) && (buf5i <= buf7i) && (buf6i <= buf7i)) stage = 4;
      if((buf5i >= buf6i) && (buf5i <= buf7i) && (buf6i <= buf7i)) stage = 5;
      if((buf5i >= buf6i) && (buf5i >= buf7i) && (buf6i <= buf7i)) stage = 6;

      if(High[i] > High[iHighest(Symbol(), Period(), MODE_HIGH, bar_count_main-1, i+1)]){
        Buf1[i] = High[iHighest(Symbol(), Period(), MODE_HIGH, bar_count_main-1, i+1)];

        if(stage == 5){
          DrawDot1[i] = High[i];
        }else if(stage == 6){
          DrawDot3[i] = High[i];      
        }else if(stage == 1){
          DrawDot5[i] = High[i];      
        }

      }else{
        Buf1[i] = High[iHighest(Symbol(), Period(), MODE_HIGH, bar_count_main, i)];
      }

      if(Low[i] < Low[iLowest(Symbol(), Period(), MODE_LOW, bar_count_main-1, i+1)]){
        Buf2[i] = Low[iLowest(Symbol(), Period(), MODE_LOW, bar_count_main-1, i+1)];

        if(stage == 2){
          DrawDot2[i] = Low[i];
        }else if(stage == 3){
          DrawDot4[i] = Low[i];      
        }else if(stage == 4){
          DrawDot6[i] = Low[i];      
        }

      }else{
        Buf2[i] = Low[iLowest(Symbol(), Period(), MODE_LOW, bar_count_main, i)];
      }

      if(sub_line){
        Buf3[i] = High[iHighest(Symbol(), Period(), MODE_HIGH, bar_count_sub, i)];
        Buf4[i] = Low[iLowest(Symbol(), Period(), MODE_LOW, bar_count_sub, i)];
      }

   }

   return(rates_total);
  }

今回は、20本ハイ/ローを抜けたサインと、移動平均線3本のトレンド状態との組み合わせのインジケーター・サインツールを作ってみました。

これをEA化して、実際にバックテストして成績を見てみると、実践に使えるものなのかがすぐ分かるので、より面白くなってきますね。さらに時間足やペア通貨を変更して、より勝てる条件を見極めるみたいなこともやりやすくなります。

■編集後記

ちなみに、なぜこういう発信をしているかというと、単純に日本人個人投資家全員がFXでちゃんと勝てるようになって、外貨獲得していって外国人投資家を出し抜いていこうぜというのが目的です。僕は有益なツールを日本人のみにしか提供しません。そして、日本のGDPガンガン上げて、日本円の価値も上げていくことに貢献します。それでその結果日本人全員が幸せになれれば最高じゃないですか。

そういった形で、今後も様々なツールを作って公開していくので、フォローしてお待ち頂ければと思います。

あと、サインツールに組み込むと便利な「チャート画像付き通知ツール」についてはプラットフォームごとに5種類販売していて、お得なまとめパックも作りました。サインが出た時に、LINE・メールなどに画像付きで柔軟に送信したい、という方はチェックしてみてください。

発信はじめて間もないですが、すでにご購入頂いた方もいて、発信の励みになっています。本当にありがとうございます!

ということで、最後までお読み頂いてありがとうございました。
それではまた!

いいなと思ったら応援しよう!