皆さん、ミーでございます。
自作サインツールの作り方をサンプルプログラムを含めて配信しておりますが、今回は、CCIを使用したサインツールを皆様と一緒に作成してみようと思います。
サインツールの作成が初めてという方は、以下の記事を読んでから見ていただけると更に分かり易いです。
目次
CCIとは
まず、CCIとは何かについて説明します。(ご存じの方が多いと思いますが)
CCIとは、テクニカルチャートのひとつである、「Commodity Channel Index」の頭文字をとったものです。RSIのように上限、下限がないのが特徴だと思います。その特長からも、相場の過熱感(買われ過ぎ/売られ過ぎ)から逆張りに用いるというよりは、相場の方向性を判断してトレンドフォローに使うのもありです。
CCIは値動きに対して反応が早いのも特徴ですが、その分、ダマシも多いです。なのが、あまり過剰にCCIの値だけで、逆張りや順張りを行う手法にはオススメできません。
サインツールに導入する観点としては、上限、下限の幅がないため、RSIよりも更に細かな設定幅を指定できますので、サインツールには非常に組み込みやすいです。
CCIをサインツールに組み込む方法
CCIをサインツールに組み込む方法ですが、【iCCI】という関数を使用します。
【iCCI】の関数をMQLのソースプログラムから呼び出すことで、CCIの値を取得することができます。
iCCIの使い方
// iCCIの関数定義 double iCCI( string symbol, // 通貨ペア int timeframe, // 時間軸 int period, // 平均期間 int applied_price, // 適用価格 int shift // シフト );
使い方は、以下のような感じです。
double iResultCCI = iCCI(NULL,0,14,PRICE_CLOSE,0);
iResultCCI には、通貨ペア、時間軸は現在表示されているものを対象に、平均期間は一般的な14、適用価格は「PRICE_CLOSE」の設定で、最新のローソク足の情報が設定されます。
iCCIのパラメーターである「period」は、赤枠の期間を指定。「applied_price」は赤枠の適用価格の種類を指定するものです。
CCIを使用したサインツール
早速、CCIを使用したサインツール(サンプル)のご紹介をします。
今回作成するのは、
1.単純なCCIの上限/下限でサイン表示するもの
2.最新+1つ前のローソク足でサイン表示するもの
の2つになります。
単純なCCIの上限/下限でサイン表示するもの
まずは、実際に動作するサンプルコードを記載しますので、XXX.mq4(XXXの名前は何でも良い)を作成し、コンパイルの実行をお願いします。
手順が分からない方は、
https://rpa-affiliate.com/bo/self-made-signtool-base/
の記事を参照してください。
#property indicator_chart_window
#property indicator_buffers 2
extern int CCI_Period= 14;
extern double CCI_High = 100.0;
extern double CCI_Low = -100.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;
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);
if(iResultCCI >= CCI_High){
DrawReverseLowBuffer[i]=High[i];
}
else if(iResultCCI <= CCI_Low){
Alert("i --> ",i);
DrawReverseHighBuffer[i]=Low[i];
}
}
return(0);
}
実行結果のイメージ
比較的サイン数は多いですが、騙しも多いことが分かりますよね!
サンプルコードの解説
それでは、サンプルコードで重要な部分の解説をしていきますね。
#property indicator_chart_window #property indicator_buffers 2 extern int CCI_Period= 14; extern double CCI_High = 100.0; extern double CCI_Low = -100.0;
#property indicator_chart_window は、チャートウィンドウにサインを出すことを明示します。
#property indicator_buffers 2 は、使用するインジケーターの数で、HighのサインとLowのサインの2つであることを意味します。
”CCI_Period”は期間、CCI_HighはHighエントリーの値(100を超えたら)、CCI_LowはLowエントリーの値(-100を下回ったら)を定義しています。
このCCI_High、CCI_Lowの値を変更することにより、サイン数やサインの勝率が変わります。
また、先頭に”extern”が記載されておりますが、これを付けると、以下の画像のように、ユーザーがMT4から値を変えられるようになります。ユーザーの利便性が向上しますので、適切に使い分けを行いたいですよね。逆に、ユーザーに変更して欲しくない値には、”extern”は使用しません。
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);
}
上記は、MT4起動時や呼ばれる特殊な関数(init)です。その関数の中に、サイン表示に必要なサインの太さ、アイコンの種類、そして、表示するサインの配列を設定します。これは、こういうものだと覚えておく程度で構いません。
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);
if(iResultCCI >= CCI_High){
DrawReverseLowBuffer[i]=High[i];
}
else if(iResultCCI <= CCI_Low){
DrawReverseHighBuffer[i]=Low[i];
}
}
for文の中がロジックの処理となります。
ループ変数(i)の値が、limit-1から、0の間ループすることになり、初回は全てのローソク足、2回目以降は最新のローソク足が再計算されます。
次に、サイン表示配列に”EMPTY_VALUE”(空の値)を設定していますが、最新のローソク足はCCIの値が変動する可能性がありますので、一旦サイン表示なしに設定しています。
その後、CCIの値が100以上(CCI_Highで指定した値)、-100以下(CCI_Lowで指定した値)になった場合に、HighまたはLowのサインを表示する処理となります。
最新+1つ前のローソク足でサイン表示するもの
次に、”最新+1つ前のローソク足でサイン表示するもの”について、サンプルコードを記載します。
なぜ、1つ前のローソク足を見るサインツールのサンプルをご紹介するか?ですが、より勝率が高いサインを出すためです。条件を複数指定することで、より勝率が期待できるエントリーポイントでサインを出すことが出来ます。
きっと、この記事を見られている皆様は、勝率が高いところでサインを出したい!って思われてますよね(笑)
#property indicator_chart_window
#property indicator_buffers 2
extern int CCI_Period = 9;
extern double CCI_High = 180.0;
extern double CCI_High_prev= 0.0;
extern double CCI_Low = -180.0;
extern double CCI_Low_prev= 0.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;
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);
if(iResultCCI_prev < CCI_High_prev && iResultCCI >= CCI_High){
DrawReverseLowBuffer[i]=High[i];
}
else if(iResultCCI_prev > CCI_Low_prev && iResultCCI <= CCI_Low){
DrawReverseHighBuffer[i]=Low[i];
}
}
return(0);
}
実行結果のイメージ
条件が増えましたので、サイン数は減りましたが、勝率は高くなってますよね。こうして、サインツールと呼ばれるものは、条件を組み合わせることで、サインを出しています。言い換えれば、この条件が【企業秘密】ってことですよね。
サンプルコードの解説
それでは、サンプルコードで重要な部分の解説をしていきますね。
”単純なCCIの上限/下限でサイン表示するもの”のサインツールと重複する部分が多々ありますので、異なる部分のみ解説します。
extern double CCI_High = 180.0; extern double CCI_High_prev= 0.0; extern double CCI_Low = -180.0; extern double CCI_Low_prev= 0.0;
条件の変数が2つ増えています。これは判断する条件として1つ前のローソク足のCCIが加わったためです。
iResultCCI = iCCI(NULL,0,CCI_Period,PRICE_CLOSE,i);
iResultCCI_prev = iCCI(NULL,0,CCI_Period,PRICE_CLOSE,i+1);
if(iResultCCI_prev < CCI_High_prev && iResultCCI >= CCI_High){
DrawReverseLowBuffer[i]=High[i];
}
else if(iResultCCI_prev > CCI_Low_prev && iResultCCI <= CCI_Low){
DrawReverseHighBuffer[i]=Low[i];
}
そして、判定ロジックの部分が変わっております。
一つ前のローソク足のCCIが、CCI_High_prevの値より小さいことに加え、最新のローソク足のCCIが、CCI_Highの値より大きい場合に、Lowエントリーのサイン。
一つ前のローソク足のCCIが、CCI_Low_prevの値より大きいことに加え、最新のローソク足のCCIが、CCI_Lowの値より小さい場合に、Highエントリーのサイン。
を出すサインツールとなります。










コメントを残す