先ほど書いたように、今回も、「
CROSS MA」を使って紹介していきます。
参考インジゲーター:
CROSS MA01
このインジゲーターは何度か紹介していますが、2本の移動平均線がゴールデンクロスしたときとデッドクロスしたときに矢印サインを表示するというシンプルなインジゲーターです。
ということで、最初に、2本の移動平均線の値を取得して比較していかなければならないので、
移動平均線の値を代入しておくたまの変数を用意します。
と、その前に、
移動平均線の期間もパラメーターで変更できたほうが便利なので、
まず、外部変数のF_MA_Period(短期移動平均線の期間)とS_MA_Period(長期移動平均線の期間)を宣言しておきます。
extern int F_MA_Period = 5;
extern int S_MA_Period = 10;
あと、この処理も不要かもしれませんが、書いておきます。
インジゲーターを起動したときに表示されているオブジェクトをすべて削除します。
他のインジゲーターと併用して使いたい場合は、削除してしまうので、ないほうがいいです。
int init()
{
ObjectsDeleteAll();
return(0);
}
さて、ここから主となる、start()の中の処理を書いていきます。
今回は、現在の足から100本分、遡って矢印を表示するという簡易的なインジゲーターを作ります。
全部の足をチェックして矢印を表示することもできますが、そのあたりの処理は元になってる「
CROSS MA」や別のインジゲーターを参考にしてみてください。
それでは、以下よりコードを書いていきます。
int start()
{
①for (int i=0; i<100; i++)
{
②double F_MA01 = iMA(NULL,0,F_MA_Period,0,MODE_EMA,PRICE_CLOSE,i);
③double S_MA01 = iMA(NULL,0,S_MA_Period,0,MODE_EMA,PRICE_CLOSE,i);
④double F_MA02 = iMA(NULL,0,F_MA_Period,0,MODE_EMA,PRICE_CLOSE,i+1);
⑤double S_MA02 = iMA(NULL,0,S_MA_Period,0,MODE_EMA,PRICE_CLOSE,i+1);
⑥string obj_name = "obj"+i;
⑦if(F_MA02 < S_MA02 && F_MA01 > S_MA01)
{
⑧ObjectCreate(obj_name,OBJ_ARROW,0,0,0);
⑨ObjectMove(obj_name,0,Time[i],Low[i]-10*Point);
⑩ObjectSet(obj_name, OBJPROP_ARROWCODE, 233);
⑪ObjectSet(obj_name, OBJPROP_WIDTH,5);
⑫ObjectSet(obj_name, OBJPROP_COLOR, Red);
}
⑬if(F_MA02 > S_MA02 && F_MA01 < S_MA01)
{
⑭ObjectCreate(obj_name,OBJ_ARROW,0,0,0);
⑮ObjectMove(obj_name,0,Time[i],High[i]+20*Point);
⑯ObjectSet(obj_name, OBJPROP_ARROWCODE, 234);
⑰ObjectSet(obj_name, OBJPROP_WIDTH,5);
⑱ObjectSet(obj_name, OBJPROP_COLOR, Blue);
}
}
return(0);
}
今回は、オブジェクトで矢印サインを作って表示するということで、
どうやってやろうかなと思ったんですが、
ObjectCreateのOBJ_ARROWを使って、「Wingdings Font」でコードを指定して矢印を作ってみました。
⑧~⑫と⑭~⑱の処理で矢印を作って指定した位置に表示しています。
順番にコードを説明していきます。
①for (int i=0; i<100; i++)
for文で現在の足から100本分の足をチェックしていきます。
②double F_MA01 = iMA(NULL,0,F_MA_Period,0,MODE_EMA,PRICE_CLOSE,i);
double型の変数F_MA01にiMAでi本前の(短期)移動平均線の値を取得して代入します。
③double S_MA01 = iMA(NULL,0,S_MA_Period,0,MODE_EMA,PRICE_CLOSE,i);
double型の変数S_MA01にiMAでi本前の(長期)移動平均線の値を取得して代入します。
④double F_MA02 = iMA(NULL,0,F_MA_Period,0,MODE_EMA,PRICE_CLOSE,i+1);
double型の変数F_MA02にiMAでi+1本前の(短期)移動平均線の値を取得して代入します。
⑤double S_MA02 = iMA(NULL,0,S_MA_Period,0,MODE_EMA,PRICE_CLOSE,i+1);
double型の変数S_MA02にiMAでi+1本前の(長期)移動平均線の値を取得して代入します。
⑥string obj_name = "obj"+i;
string型の変数obj_nameに文字列「obj」とiの値を合体させて代入する。
⑦if(F_MA02 < S_MA02 && F_MA01 > S_MA01)
i+1本前の短期移動平均線が長期移動平均線より小さい、かつ、i本前の短期移動平均線が長期移動平均線より大きい、という条件文。
⑧ObjectCreate(obj_name,OBJ_ARROW,0,0,0);
オブジェクト名「obj_name」、オブジェクトの種類「OBJ_ARROW」、オブジェクトの位置「0、0、0」と指定。
⑨ObjectMove(obj_name,0,Time[i],Low[i]-10*Point);
オブジェクトの位置をTime[i]、Low[i]-10*Pointへ移動します。
⑩ObjectSet(obj_name, OBJPROP_ARROWCODE, 233);
オブジェクトのコードを233(上矢印)に指定します。
⑪ObjectSet(obj_name, OBJPROP_WIDTH,5);
オブジェクトの太さ(大きさ)を5に指定します。
⑫ObjectSet(obj_name, OBJPROP_COLOR, Red);
オブジェクトの色をRed(赤)に指定します。
⑬if(F_MA02 > S_MA02 && F_MA01 < S_MA01)
i+1本前の短期移動平均線が長期移動平均線より大きい、かつ、i本前の短期移動平均線が長期移動平均線より小さい、という条件文。
⑭ObjectCreate(obj_name,OBJ_ARROW,0,0,0);
オブジェクト名「obj_name」、オブジェクトの種類「OBJ_ARROW」、オブジェクトの位置「0、0、0」と指定。
⑮ObjectMove(obj_name,0,Time[i],High[i]+20*Point);
オブジェクトの位置をTime[i]、High[i]+20*Pointへ移動します。
⑯ObjectSet(obj_name, OBJPROP_ARROWCODE, 234);
オブジェクトのコードを234(下矢印)に指定します。
⑰ObjectSet(obj_name, OBJPROP_WIDTH,5);
オブジェクトの太さ(大きさ)を5に指定します。
⑱ObjectSet(obj_name, OBJPROP_COLOR, Blue);
オブジェクトの色をBlue(青)に指定します。
ここまで作るのに少し時間がかかりましたが、完成してみると、
意外と思ったより短いコードで書くことができました。
たぶん、もっと効率よく書くこともできると思います。
とりあえず、ここまでをコンパイルして実行してみます。
参考MQL:
iMA
参考MQL:
ObjectCreate
参考MQL:
ObjectMove
参考MQL:
ObjectSet