MT4インディケータの基本プログラムを紹介します。
喜平が自作で使用しているMT4インディケータのベースとなる基本プログラムです。実際にはもう少し複雑な条件を設定したものを使用しています。
広告の下にある「Kihei_Basic_Indicator.mq4」のソースコードを、メタエディター標準に入っているインディケーターのソースコードに上書き(コピーペースト)して、「Kihei_Basic_Indicator.mq4」のファイル名で保存してください。
ファイル名を変更する前にコンパイルすると元のインディケータソースが消えますのでご注意ください。
心配だったら、新規作成ボタンからカスタムインディケータを選んでファイルを作ってもよいです。保存完了後にコンパイルして、チャートに適用してみてください。
移動平均線25MAが75MAとクロスした時にアラートが出るプログラムとなっています。
アラート発生=即エントリーとなるサインではありませんが、25MAと75MAのクロスは短期のトレンド転換となっている可能性がありますので、他の条件と組み合わせることでることでサインと考えることはできると思います。
例えば、こんな感じ
MT4サインツールのプログラミングに興味のある方は、このコードの骨組みを維持したまま、「ココを変える」の部分でそれぞれ条件を設定するとオリジナルサインツールが作れます。
アラート矢印の変更はMT4サインツール(インディケータ)の矢印設定を参考にしてみてください。
ただ、勝ちやすい条件を探し出すのは至難の技なので、どういったものか理解できたら、市販のサインツールを使用してみるのもよいと思います。
ほとんどの環境で動作すると思いますが、環境により動かない可能性もあります。
サンプルコードを利用した結果によって生じるいかなる損害、損失について当サイトは一切の責任を負いません。利用は自己責任でお願いいたします。
下の方にZIPファイルとしてダウンロードできるリンクもありますよ。
//Kihei_Basic_Indicator.mq4
//サブウインドウに矢印表示してアラーム鳴らす基本インジケーター
//移動平均線25MAが75MAとクロスした時にアラートが出ます
//参考コードですのでサイン通りに売買して勝てる保証はありません
#property indicator_separate_window
#property indicator_buffers 2
#property indicator_minimum 0 //サブウィンドウMIN目盛
#property indicator_maximum 40 //サブウィンドウMAX目盛
#property indicator_color1 Gold //上向き矢印の色
#property indicator_color2 Aqua //下向き矢印の色
#property indicator_width1 2 //矢印のサイズ 1~3
#property indicator_width2 2
//テクニカル指標クラスの定義
#include <Indicators\Indicators.mqh>
//テクニカル指標の設定(必要なオブジェクトを設定)
CiMA MA25, MA75; //移動平均のオブジェクト「ココを変える」
input int MA25_Period = 25; //移動平均の期間 25本足
input int MA75_Period = 75; //移動平均の期間 75本足
//アラートのオンオフ設定
extern string timeFrame = "Current time frame";
extern bool alertsOn = true;
extern bool alertsMessage = true;
extern bool alertsSound = true;
//サイン表示用buffersの確保
double ExtMapBuffer1[]; //条件 買いサイン用
double ExtMapBuffer2[]; //条件 売りサイン用
int TimeFrame;
int NowBar;
datetime TimeArray[];
//表示用初期設定
//init()は、インジケーター開始時、時間足変更時、
//プロパティ変更時、MT4再起動時のタイミングで
//動作させる関数
int init()
{
SetIndexStyle(0,DRAW_ARROW);
SetIndexArrow(0,228); //上向き矢印種類設定
SetIndexBuffer(0,ExtMapBuffer1);
SetIndexEmptyValue(0,0.0);
SetIndexStyle(1,DRAW_ARROW);
SetIndexArrow(1,230); //下向き矢印種類設定
SetIndexBuffer(1,ExtMapBuffer2);
SetIndexEmptyValue(1,0.0);
IndicatorShortName(StringConcatenate(Symbol(),
" Special Sign"));
SetIndexLabel(0,NULL);
SetIndexLabel(1,NULL);
TimeFrame = stringToTimeFrame(timeFrame);
return(0);
}
//終了時設定(このインジケーターでは詳細設定しません)
//deinit()は、インジケーター削除時、時間足変更直前、
//プロパティ変更直前、MT4再起動直前のタイミングで
//動作させる関数
int deinit()
{
return(0);
}
//メイン設定
//start()は、適用したチャート通貨ペアの価格取得の
//タイミングで動作させる関数
int start()
{
//テクニカル指標の初期化 「ココを変える」
if(MA25.MaPeriod() < 0)
MA25.Create(_Symbol, 0, MA25_Period, 0,
MODE_SMA, PRICE_CLOSE);
if(MA75.MaPeriod() < 0)
MA75.Create(_Symbol, 0, MA75_Period, 0,
MODE_SMA, PRICE_CLOSE);
//テクニカル指標の更新 「ココを変える」
MA25.Refresh();
MA75.Refresh();
int counted_bars = IndicatorCounted();
int limit = Bars-counted_bars-1;
for(int i=0; i < limit; i++)
{
//サイン条件 移動平均線25MAが75MAを上抜けたら買い、
// 下抜けたら売りサイン 「ココを変える」
if(MA25.Main(i) - MA75.Main(i) > 0
&& MA75.Main(i+1) - MA25.Main(i+1) >= 0)
{
ExtMapBuffer1[i+1] = 25;//買いサイン矢印座標
ExtMapBuffer2[i+1] = 0;
}
else if(MA25.Main(i) - MA75.Main(i) < 0
&& MA75.Main(i+1) - MA25.Main(i+1) <= 0)
{
ExtMapBuffer1[i+1] = 0;
ExtMapBuffer2[i+1] = 15;//売りサイン矢印座標
}
else //条件がそろわなければサイン無し
{
ExtMapBuffer1[i+1] = 0;
ExtMapBuffer2[i+1] = 0;
}
}
//参考指標をメインウィンドウに表示
Comment("", "\n",
"\n", "Kihei_Basic_Indicator", "\n",
" 移動平均 25本足 = ", MA25.Main(0), "\n",
" 移動平均 75本足 = ", MA75.Main(0));
if (alertsOn)
{
//買いアラート表示設定 (doAlertの" "内を変更する)
if (ExtMapBuffer1[1] > 0)
doAlert(" Kihei Basic BUY ");
//売りアラート表示設定 (doAlertの" "内を変更する)
if (ExtMapBuffer2[1] > 0)
doAlert(" Kihei Basic SELL ");
}
return(0);
}
//この行以下はサイン条件によって変更しなくても問題ありません
//アラート発生時処理
void doAlert(string doWhat)
{
static string previousAlert = "nothing";
string message;
if (NowBar != Bars)
{
previousAlert = doWhat;
NowBar = Bars;
message = StringConcatenate(Symbol(), " ",
TimeFrameToString(TimeFrame),
" Alert",doWhat);
if (alertsMessage) Alert(message);
if (alertsSound) PlaySound("News.wav");
}
}
//アラート表示用タイムフレーム設定
int stringToTimeFrame(string tfs)
{
int tf=0;
tfs = StringUpperCase(tfs);
if (tfs=="M1" || tfs=="1") tf=PERIOD_M1;
if (tfs=="M5" || tfs=="5") tf=PERIOD_M5;
if (tfs=="M15"|| tfs=="15") tf=PERIOD_M15;
if (tfs=="M30"|| tfs=="30") tf=PERIOD_M30;
if (tfs=="H1" || tfs=="60") tf=PERIOD_H1;
if (tfs=="H4" || tfs=="240") tf=PERIOD_H4;
if (tfs=="D1" || tfs=="1440") tf=PERIOD_D1;
if (tfs=="W1" || tfs=="10080") tf=PERIOD_W1;
if (tfs=="MN" || tfs=="43200") tf=PERIOD_MN1;
if (tf < Period()) tf=Period();
return(tf);
}
string TimeFrameToString(int tf)
{
string tfs="Current time frame";
switch(tf) {
case PERIOD_M1: tfs="M1" ; break;
case PERIOD_M5: tfs="M5" ; break;
case PERIOD_M15: tfs="M15" ; break;
case PERIOD_M30: tfs="M30" ; break;
case PERIOD_H1: tfs="H1" ; break;
case PERIOD_H4: tfs="H4" ; break;
case PERIOD_D1: tfs="D1" ; break;
case PERIOD_W1: tfs="W1" ; break;
case PERIOD_MN1: tfs="MN1";
}
return(tfs);
}
string StringUpperCase(string str) { string s = str; int lenght = StringLen(str) - 1; int char1; while(lenght >= 0) { char1 = StringGetChar(s, lenght); if((char1 > 96 && char1 < 123) || (char1 > 223 && char1 < 256)) s = StringSetChar(s, lenght, char1 - 32); else if(char1 > -33 && char1 < 0) s = StringSetChar(s, lenght, char1 + 224); lenght--; } return(s); } //----------END---------- ここまでがプログラム
こちらからmq4ファイルとex4ファイルをセットしたZIPファイルをダウンロードすることもできます。(直リンクはお控えください。)
Kihei_Basic_Indicator.zip矢印サインをサブウィンドウではなくメインウィンドウに表示させる場合はこちら、
Kihei_Basic2_Indicator.zip上記基本プログラムを少しだけアレンジしたサンプルはこちら
サインは出さないけど環境認識ツールはこちらも参考にしてください。
投資本専門店 トレーダーズショップ
– オーディオブックも充実しています
– 送料無料 !