自作サインツール|陽線・陰線と大陽線・大陰線の判断方法(サンプルプログラムあり)

皆さん、みーでございます。

今回はサインツールにおいて、良く使用する「陽線・陰線」の判断方法と、実は以外に難しい「大陽線・大陰線」の判断方法について、実際に動作するMQLのサンプルプログラムを元に解説していきます。

サインツールの作成が初めてという方は、以下の記事を読んでから見ていただけると更に分かり易いです。

自作サインツールの作り方|環境準備とサンプル動作の確認を初心者にも分かり易く説明

2021年12月21日

陽線・陰線の判断方法

上記の図のように、始値より終値が高いものが「陽線」、始値より終値が低いものが「陰線」となります。高値、安値だけでは、「陽線」と「陰線」の判断はできません。「陽線」と「陰線」を判断するには、始値と終値を使用します。

つまり、プログラム的に言うと、始値<終値=陽線、始値>終値=陰線と判断できます。

陽線・陰線の判断方法

実際に動作するプログラムです。

#property indicator_chart_window
#property indicator_buffers 2

double DrawReverseLowBuffer[];
double DrawReverseHighBuffer[];

int init()  {
   SetIndexStyle(0,DRAW_ARROW,STYLE_SOLID,1,clrMagenta);
   SetIndexStyle(1,DRAW_ARROW,STYLE_SOLID,1,clrRed);
   SetIndexArrow(0,234);
   SetIndexArrow(1,233);
   SetIndexBuffer(0,DrawReverseLowBuffer);
   SetIndexBuffer(1,DrawReverseHighBuffer);
   return(INIT_SUCCEEDED);
}

int start() {
   int counted_bars=IndicatorCounted(); 
   int limit = Bars - counted_bars;
  
   for (int i=limit-1;i>=0;i--){
      if(i == 0){
         DrawReverseLowBuffer[i] = EMPTY_VALUE;
         DrawReverseHighBuffer[i] = EMPTY_VALUE;
      }
      
      if(isSunshineLine(i)){
         DrawReverseLowBuffer[i]=High[i];
      }
      else{
         DrawReverseHighBuffer[i]=Low[i];
      }
   }
   return(0);
}

bool isSunshineLine(int index){
   if(Close[index] > Open[index]){
     return(true); // 陽線
   }
   return(false);  // 陰線
}

実行すると、以下のような画面になると思います。

全てのローソク足を対象に、陽線なら↓矢印がでます。陰線なら↑矢印がでます。

陽線、陰線を判断しているプログラムについて説明しますね。

bool isSunshineLine(int index){
   if(Close[index] > Open[index]){
     return(true); // 陽線
   }
   return(false);  // 陰線
}

これだけです。isSunshineLineというローカル関数を作成し、isSunshineLine(ローソク足の番号)として呼び出すことで、陽線なら「true」、陰線なら「false」を返却します。

Closeが終値の値を保持している配列で、Openが始値の値を保持している配列となります。その配列から指定された番号(index)の終値と始値の値を比較し、終値の方が始値より大きい場合は、陽線、それ以外の場合は陰線と判断しています。

本サンプルプログラムでは、終値と始値が同じ値の場合は、陰線と判断しています。

      if(isSunshineLine(i)){
         DrawReverseLowBuffer[i]=High[i];
      }
      else{
         DrawReverseHighBuffer[i]=Low[i];
      }

isSunshineLineの呼び出しもとは上記のような感じですね。

もし、isSunshineLine(i)が「true」なら、下方向の矢印を表示。「false」なら上方向の矢印を表示となります。

 

大陽線・大陰線の判断方法

陽線、陰線の高さが大きいものを大陽線、大陰線と言いますが、どの程度の高さがあれば、大陽線、大陰線と判断するのかという明確な基準はありません。また、以外に大きさを判断することは難しいです。

難しい理由として、例えば、始値と終値の幅が0.01以上の場合と判断するとしても、16通貨の基準となる最小値が異なるため、ある通貨では大陽線と判断されたが、ある通貨では同じ高さに見えるけど判断されない・・・みたいなことが生じます。それでは、割合で出そうとした場合、何を基準に割合を出すかですが、簡単な方法として考えられるのが、前日の高値、安値を基準に何%以上なら大陽線、大陰線と判断する方法ですね。

但し、この方法は非常に危険です。理由は、前日の高値・安値は、日によって変わりますよね!なので、あまり精度も高くないですし、プログラムの作成方法次第では、サインが【リペイント】してしまう可能性があります。

なので、一番簡単で精度が高い判断方法は、ずばり、RSI/CCIの値が1つ前のローソク足の値と比べ、XXX以上の差があれば・・・と判断する方法です。

大陽線・大陰線の判断方法

実際に動作するプログラムです。

#property indicator_chart_window
#property indicator_buffers 2

extern int CCI_Period = 9;
extern int CCI_Difference = 200.0;


double DrawReverseLowBuffer[];
double DrawReverseHighBuffer[];


int init()  {
   SetIndexStyle(0,DRAW_ARROW,STYLE_SOLID,1,clrMagenta);
   SetIndexStyle(1,DRAW_ARROW,STYLE_SOLID,1,clrRed);
   SetIndexArrow(0,234);
   SetIndexArrow(1,233);
   SetIndexBuffer(0,DrawReverseLowBuffer);
   SetIndexBuffer(1,DrawReverseHighBuffer);
   return(INIT_SUCCEEDED);
}

int start() {
   int counted_bars=IndicatorCounted(); 
   int limit = Bars - counted_bars;
   double iResultCCI,iResultCCI_prev;
   double differenceCCI;
  
   for (int i=limit-1;i>=0;i--){
      if(i == 0){
         DrawReverseLowBuffer[i] = EMPTY_VALUE;
         DrawReverseHighBuffer[i] = EMPTY_VALUE;
      }
      iResultCCI      = iCCI(NULL,0,CCI_Period,PRICE_CLOSE,i);
      iResultCCI_prev = iCCI(NULL,0,CCI_Period,PRICE_CLOSE,i+1);
      
      differenceCCI = MathAbs(iResultCCI - iResultCCI_prev);      
      
      if(differenceCCI > CCI_Difference){
         if(isSunshineLine(i)){
            DrawReverseLowBuffer[i]=High[i];
         }
         else{
            DrawReverseHighBuffer[i]=Low[i];
         }
      }
   }
   return(0);
}

bool isSunshineLine(int index){
   if(Close[index] > Open[index]){
     return(true);
   }
   return(false);
}

実行すると、以下のような画面になると思います。

単純な陽線・陰線の判断に、サンプルではCCIの増加分を加味していますので、大きくCCIが増加している場合で陽線の場合は「大陽線」、陰線の場合は「大陰線」と判断することができます。

      differenceCCI = MathAbs(iResultCCI - iResultCCI_prev);      
      
      if(differenceCCI > CCI_Difference){
         if(isSunshineLine(i)){
            DrawReverseLowBuffer[i]=High[i];
         }
         else{
            DrawReverseHighBuffer[i]=Low[i];
         }
      }

MathAbsの関数は絶対値に変換してくれるものです。増加量をみたいため、CCIの差分を絶対値に判断し、CCI_Differenceで指定された値(サンプルでは200.0としています)より増加している場合に、陽線なら大陽線、陰線なら大陰線と判断します。

この大陽線、大陰線の判断を行うインジケーターって、以外にないですよね(笑)。サインツールの条件として、このような差分量を加える方法もありますので、ぜひ、参考にしていただければと思います。

サインツール作成の記事一覧はこちら

Sponsor Link








コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です