MetaTrader 4のバージョンアップにより仕様が変わってきた部分がありますので、 記事を新しい仕様で書き直しております。この注意書きが書かれていないページは 旧仕様の記事になります。旧仕様の記事でも一部を除き基本的にはシステムの制作に問題はありません。
今回は「SL、TPの設定」について説明します。
SLはストップロス(損切り)、TPはリミット(利食い)のことです。
サンプルプログラムはこちらです。Zip圧縮していますので解凍してご利用ください。
サンプルプログラムの使い方は、以下の記事で説明しています。
TPSLを設定する上での注意
MetaTrader4では、ポジションを取得すると同時にTPとSLを設定していると、エラーが発生し、注文がキャンセルされる仕様となっています。
ポジションを取得する時には、TPとSLを設定をせずに、ポジションを取得した後で設定する必要があります。
今回はMA(移動平均線)のゴールデンクロスで買い、デッドクロスで売るシステムのTPとSLをポジションを取得した後からつけるプログラムを紹介します。
決済はSLとTPのみで行い、ドテンは行いません。
ポジションを取るプログラムの説明
では、MetaEditorを起動して下さい。
NameはTPSLなどにして下さい。
では、まとめてコードを書きますので、同じようにコードを半角英数で書いていってください。
void OnTick()
{
//---
//変数の宣言
int cnt;
int CurrentPosition = -1;
double old_fast_ma,old_slow_ma;
double now_fast_ma,now_slow_ma;
int ticket;
int order_select;
int order_modify;
double sl_rate;
double tp_rate;
// オーダーチェック(ポジションなどのデータ)
for(cnt=0;cnt= now_slow_ma)
{
//買いポジションを持つ
ticket = OrderSend(Symbol(), OP_BUY, 0.1, Ask, 30, 0,0 , "Buy", 0, 0, clrBlue);
}
else
//もし21日線が90日線を上から下にクロスしたら
if( old_fast_ma > old_slow_ma && now_fast_ma <= now_slow_ma)
{
//買いポジションを持つ
ticket = OrderSend(Symbol(), OP_SELL, 0.1, Bid, 30, 0,0 , "Sell", 0, 0, clrRed);
}
}
}
書けましたか?
今回は前回の自動売買システムの作り方 前編と 自動売買システムの作り方 後編 で説明したiMA関数を使い、MAのゴールデンクロスとデッドクロスでポジションをエントリーし、その後にSLとTPを設定するプログラムになっています。
先ず先に後半のポジションを取るプログラムの説明です。
//一つ前の21日線
old_fast_ma = iMA(NULL,0,21,0,MODE_SMA,PRICE_CLOSE,1);
//一つ前の90日線
old_slow_ma = iMA(NULL,0,90,0,MODE_SMA,PRICE_CLOSE,1);
//現在の21日線
now_fast_ma = iMA(NULL,0,21,0,MODE_SMA,PRICE_CLOSE,0);
//現在の90日線
now_slow_ma = iMA(NULL,0,90,0,MODE_SMA,PRICE_CLOSE,0);
// ポジションチェック ポジション無し
if(CurrentPosition == -1)
{
//もし21日線が90日線を下から上にクロスしたら
if( old_fast_ma < old_slow_ma && now_fast_ma >= now_slow_ma)
{
//買いポジションを持つ
ticket = OrderSend(Symbol(), OP_BUY, 0.1, Ask, 30, 0,0 , "Buy", 0, 0, clrBlue);
}
else
//もし21日線が90日線を上から下にクロスしたら
if( old_fast_ma > old_slow_ma && now_fast_ma <= now_slow_ma)
{
//買いポジションを持つ
ticket = OrderSend(Symbol(), OP_SELL, 0.1, Bid, 30, 0,0 , "Sell", 0, 0, clrRed);
}
}
ここでは、ポジションを持っていない時にMAがゴールデンクロス、またはデッドクロスと判定された時にポジションを取るようになっています。
詳しくは前回の 自動売買システムの作り方 前編と 自動売買システムの作り方 後編 をご覧下さい。
前回と違う部分はデッドクロスで売りポジションを取得するようになっていります。
売りの場合はOrderSend関数の中身のOP_BUYの部分をOP_SELLに、Askの部分をBidにしてください。
矢印の色を変える場合はclrBlueをclrRedに変えてください。
TPSLの設定
次に、前半のポジションを持っている場合にTPかSLが設定されていない場合に新たに設定する為のプログラムです。
//変数の宣言
int cnt;
int CurrentPosition = -1;
double old_fast_ma,old_slow_ma;
double now_fast_ma,now_slow_ma;
int ticket;
int order_select;
int order_modify;
double sl_rate;
double tp_rate;
// オーダーチェック(ポジションなどのデータ)
for(cnt=0;cnt
今回初めて登場するのはOrderModify関数、 OrderOpenPrice関数、OrderStopLoss関数、 OrderTakeProfit関数、OrderTicket関数 、NormalizeDouble関数です。
プログラムの内容は、取得中のポジションにSLかTPの設定がない場合、エントリーレートから20.0Pipsの地点にTPとSLを設定するというものです。
OrderOpenPrice関数は、ポジションのオープンレートを調べる関数です。
OrderStopLoss関数は、ポジションのストップロス値を調べる関数です。
OrderTakeProfit関数は、ポジションのリミット値を調べる関数です。
OrderTicket関数は、ポジションのチケットナンバーを調べる関数です。
NormalizeDouble関数は、数値を指定する小数点桁数で丸める関数です。指定の小数点未満の数値がある時に不都合がある場合に使います。
//SL、TPの設定
order_modify = OrderModify(OrderTicket(), OrderOpenPrice(),sl_rate,tp_rate, 0, MediumSeaGreen);
上記がOrderModify関数です。
注文の内容を変更するのに使われる関数となっています。
OrderModify関数(チケット番号, 指値, ストップロス値,リミット値, 有効期限, 表示される色)
個別に説明していきます。
チケット番号は変更する注文のチケット番号を選択します。
指値は指値を変更するときなどに使います。今回はオープンレートが入っています
ストップロス値はここに入力された数値をストップロスにします。
リミット値はここに入力された数値をリミットにします。
有効期限は指値などの未約定の注文の有効期限を指定します。
表示される色は色の設定です。
今回はSLとTPを変更しています。
買いの場合、
sl_rate = OrderOpenPrice()-(200*Point);
tp_rate = OrderOpenPrice()+(200*Point);
変数sl_rate にエントリーレートから下に20.0Pipsのレートを、
変数tp_rate にエントリーレートから上に20.0Pipsのレートをいれています。
OrderOpenPrice()がオーダーセレクトで指定したポジションのエントリーレートを取得する関数。
Pointは現在のチャートの通貨ペアのレート最小単位の値を取得します。
例えばドル円が100.000の場合はPointは0.001、ユーロドルの場合1.11111の場合はPointは0.00001になります。
基本的に1 Pointは0.1Pipsになります。
200*Pointの場合は20.0 Pipsになります。
(もうほとんどありませんがドル円が少数点二桁の証券会社の場合は100.00となりPointは0.01、ユーロドルの場合1.1111の場合はPointは0.0001になります。この場合は1 Pointは1 Pipsになります。)
sl_rate = NormalizeDouble(sl_rate,Digits);
tp_rate = NormalizeDouble(tp_rate,Digits);
NormalizeDouble関数はNormalizeDouble(数値,少数点の桁数)と設定し、戻り値で数値を小数点の桁数で丸めたものを返します。
例えば、NormalizeDouble(1.123,1)の場合、戻り値は1.1になります。
今回の場合あまり意味のない処理に見えますが、この処理をしないでOrderModify関数を使用した場合エラー1が出ます。
少数点未満の数値が入っている場合不具合になるようなケースでは特に変数に入れる数値に使用する少数点未満の数値が入っていない場合でも念の為NormalizeDoubleによって指定小数点の桁数で数値を丸めておくほうがいいです。
if( OrderStopLoss() != sl_rate || OrderTakeProfit() != tp_rate )
このif分はもし今から設定するSLとすでに設定されているSLが同じレートでなければ、というものになります。
同じレートを何度も設定し直さないための処理になります。
この関数の中で、
//SL、TPの設定
order_modify = OrderModify(OrderTicket(), OrderOpenPrice(),sl_rate,tp_rate, 0, MediumSeaGreen);
OrderModifyによりSLをsl_rateに、TPをtp_rate に設定しています。
order_modify = は戻り値を変数に入れない場合警告が出るのでその対策で入れています。
他にもこの戻り値が1の場合はOrderModifyによる変更が成功、0の場合は変更が失敗と分かりますので、その対策をする場合などは使用します。
今回はこれで終了です。OrderModify関数は出来ることがたくさんありますので、是非マスターしてください。