皆さん、みーでございます。
今回はサインツールにおいて、良く使用する「陽線・陰線」の判断方法と、実は以外に難しい「大陽線・大陰線」の判断方法について、実際に動作するMQLのサンプルプログラムを元に解説していきます。
サインツールの作成が初めてという方は、以下の記事を読んでから見ていただけると更に分かり易いです。
陽線・陰線の判断方法
上記の図のように、始値より終値が高いものが「陽線」、始値より終値が低いものが「陰線」となります。高値、安値だけでは、「陽線」と「陰線」の判断はできません。「陽線」と「陰線」を判断するには、始値と終値を使用します。
つまり、プログラム的に言うと、始値<終値=陽線、始値>終値=陰線と判断できます。
陽線・陰線の判断方法
実際に動作するプログラムです。
#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としています)より増加している場合に、陽線なら大陽線、陰線なら大陰線と判断します。
この大陽線、大陰線の判断を行うインジケーターって、以外にないですよね(笑)。サインツールの条件として、このような差分量を加える方法もありますので、ぜひ、参考にしていただければと思います。
コメントを残す