皆さん、ミーでございます。
今回はサインツールにおいて、良く使用する「陽線・陰線」の判断方法と、実は以外に難しい「大陽線・大陰線」の判断方法について、実際に動作する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としています)より増加している場合に、陽線なら大陽線、陰線なら大陰線と判断します。
この大陽線、大陰線の判断を行うインジケーターって、以外にないですよね(笑)。サインツールの条件として、このような差分量を加える方法もありますので、ぜひ、参考にしていただければと思います。










コメントを残す