MetaTrader 4のバージョンアップにより仕様が変わってきた部分がありますので、 記事を新しい仕様で書き直しております。この注意書きが書かれていないページは 旧仕様の記事になります。旧仕様の記事でも一部を除き基本的にはシステムの制作に問題はありません。
今回はMACD関数の説明をします。
サンプルプログラムはこちらです。Zip圧縮していますので解凍してご利用ください。
サンプルプログラムの使い方は、以下の記事で説明しています。
MACD関数
では、MetaEditorを起動して下さい。
NameはiMACDにして置いて下さい。
内容はほとんど前回と変わりません。
変数に入れる内容が異なるだけです。
では、まとめてコードを書きますので、同じようにコードを半角英数で書いていってください。
void OnTick()
{
//---
//変数の宣言
int cnt;
int CurrentPosition = -1;
double old_main_macd,old_signal_macd;
double now_main_macd,now_signal_macd;
int ticket;
int order_select;
bool order_close;
// オーダーチェック(ポジションなどのデータ)
for(cnt=0;cnt= now_signal_macd)
{
//買いポジションを持つ
ticket = OrderSend(Symbol(), OP_BUY, 0.1, Ask, 30, 0,0 , "Buy", 0, 0, clrBlue);
}
else //もしメインがシグナルを上から下にクロスしたら
if( old_main_macd > old_signal_macd && now_main_macd <= now_signal_macd)
{
//売りポジションを持つ
ticket = OrderSend(Symbol(), OP_SELL, 0.1, Bid, 30, 0,0 , "Sell", 0, 0, clrRed);
}
}
// ポジション有り
else
{
//ポジションの選択
order_select = OrderSelect(CurrentPosition,SELECT_BY_POS);
//ポジションの確認
if(OrderSymbol() == Symbol())
{
//もし買いポジションだったら
if(OrderType()==OP_BUY)
{
//もしメインがシグナルを上から下にクロスしたら
if( old_main_macd > old_signal_macd && now_main_macd <= now_signal_macd)
{
//手仕舞い
order_close = OrderClose(OrderTicket(),OrderLots(),Bid,30,Green);
if( order_close == true )
{
//売りポジションを持つ
ticket = OrderSend(Symbol(), OP_SELL, 0.1, Bid, 30, 0,0 , "Sell", 0, 0, clrRed);
}
}
}
else //もし売りポジションだったら
if(OrderType()==OP_SELL)
{
//もしメインがシグナルを下から上にクロスしたら
if( old_main_macd < old_signal_macd && now_main_macd >= now_signal_macd)
{
//手仕舞い
order_close = OrderClose(OrderTicket(),OrderLots(),Ask,30,Green);
if( order_close == true )
{
//買いポジションを持つ
ticket = OrderSend(Symbol(), OP_BUY, 0.1, Ask, 30, 0,0 , "Buy", 0, 0, clrBlue);
}
}
}
}
}
}
書けましたか?
前回と見比べて貰えれば分かると思いますが、変数名と下のコードが変わっただけです。
//一つ前のMACDのメイン
old_main_macd = iMACD(NULL,0,12,26,9,PRICE_CLOSE,MODE_MAIN,1);
//一つ前のMACDのシグナル
old_signal_macd = iMACD(NULL,0,12,26,9,PRICE_CLOSE,MODE_SIGNAL,1);
//現在のMACDのメイン
now_main_macd = iMACD(NULL,0,12,26,9,PRICE_CLOSE,MODE_MAIN,0);
//現在のMACDのシグナル
now_signal_macd = iMACD(NULL,0,12,26,9,PRICE_CLOSE,MODE_SIGNAL,0);
前回のプログラムは変数に入れていたのがiMA関数でした。
今回は、このiMACD関数の説明です。
まず、日本語で内容を書きますね。
iMACD関数(通貨ペア、タイムフレーム(時間足)、短期EMA、長期EMA、シグナル、値を取る時間(始値、終値など)、モード、シフト)
iMAと似ている部分がありますので、簡単に説明していきます。
通貨ペアとタイムフレームはiMAと同じです。
基本的にNULLと0と入力しておけば問題ありません。
短期EMA、長期EMA、シグナルはMACDの使い方と同じです。
値を取る時間は、今回は終値にします。
PRICE_CLOSEと入れて置いてください。
モードはMACDのメインの線かシグナルの線かを選択します。
メインならMODE_MAIN、シグナルならMODE_SIGNALと入力します。
シフトは数字を入れることによって、その数字分前の足のデータを入力出来ます。
0は現在のデータ、1なら1つ前の足のデータです。
今回も前回のiMAと同じゴールデンクロスとデッドクロスが売買条件ですので、0と1の両方を変数に入れています。
これで、今回のプログラムの説明は終了です。
今回のプログラムは、MACD(短期12,長期26,シグナル9)のメインとシグナルのゴールデンクロスとデッドクロスで仕掛けをして、手仕舞いはその逆のルール、手仕舞いと一緒にドテンするというものです。
では、コードを全て書けたらコンパイルのボタンを押してください。
エラーが出てきた場合は、半角になっているか、;を付け忘れていないか、{}を付け忘れていないか、{}の数は合っているかを確認して下さい。
どうしてもエラーが分からない場合は、サンプルプログラムを参照して下さい。
エラーが出なかったら、MetaTrader 4のバックテストでiMACDを選んで、スタートして下さい。
終わったら、結果、Graph、レポートを見てください。
今回はこれで終了です。