ブレイクイーブンとは?
今回は簡単な仕組みで、すぐにEAに導入できるブレイクイーブンストップの導入について書きたいと思います。
ブレイクイーブンストップとは、ポジションを保有し、ある程度相場が有利な方向に動いてから、ストップロス(損切価格)を引き上げる仕組みのことを言います。
同じような仕組みにトレーリングストップがありますが、トレーリングストップがその後も相場の伸長が続く場合に、それに追随するにストップロスを引き上げていくのに対して、ブレイクイーブンストップはストップロスの変更は1回だけ行います。
トレーリングストップについてはこちらの記事も参考にしていただけたら、と思います。
EAのロジックによっては、トレーリングストップの小刻みなストップロスの切り上げによって、もっと大きく利を伸ばせるような局面でもポジションがクローズしてしまう事があり、ブレイクイーブンストップのように損失は回避しつつも、相場の細かいノイズのような動きでポジションが刈られることもなく利益を伸ばせる場合もあります。
EAのロジックによって、どちらが良いかを判断するとよいでしょう。(もちろん、トレーリングストップもブレイクイーブンストップも両方採用しないという選択肢もあります)
ブレイクイーブン導入のロードマップ
以下の手順でコードを記述していきます
- 標準ライブラリのトレードファイルをインクルードし、CTradeクラスのインスタンスを宣言
- OnTick()内に、値の取得、発注命令、ブレイクイーブンストップ命令を記述
- グロバール領域にブレイクイーブンストップ用の関数を作成
標準ライブラリのトレードファイルをインクルードし、CTradeクラスのインスタンスを宣言
OnTick()内に、値の取得、発注命令、ブレイクイーブン命令を記述
今回は「ポジションを持っていなかったら、買い注文を出す」という簡単な発注回路を組み込みます。
★注意:以下のソースコードには発注回路が含まれています。
ソースコードの内容を試されるときは、必ずストラテジーテスターのバックテストモードか、
デモ口座でお試しいただくようお願いします。
void OnTick()
{
double Ask=NormalizeDouble(//正規化
SymbolInfoDouble(_Symbol,SYMBOL_ASK),//現在値の取得
_Digits);
if(PositionsTotal()==0)//ポジションがなければ
{
trade.Buy(0.01,NULL,Ask,Ask-1000*_Point,Ask+500*_Point);
//買い注文
}//if(PositionsTotal()==0)
BreakEven(Ask);
//ブレイクイーブンを発動させる
}//void OnTick()
CTradeクラスのtrade.Buyメソッドを使うことによって、MQL4の OrderSend関数と同じような見栄えで発注記述を書くことができます。
最後のBreakEven(Ask);
はこのままだと、関数がまだできていないので、コンパイルエラーになってしまいますので、BreakEven関数をこれから作っていきます。
NormalizeDouble関数については↓をご覧ください。
グロバール領域にブレイクイーブン関数を作成
ブレイクイーブンストップ用の関数の定義をしていきます。
今回は「建値から200ポイント有利な方向に動いたら、ストップロスに移動させる」
という回路を組み込みました。
//ブレイクイーブン関数の定義
void BreakEven(double price)
{
//ポジションプール内を古い方にむかってループチェック
for(int icounter=PositionsTotal()-1 ; icounter>=0 ;icounter--)
{
string positionSymbol=PositionGetSymbol(icounter);//ポジションの通貨ペアを取得
if(_Symbol==positionSymbol)//ポジションの通貨ペアが一致したら
{
ulong PosTicketNum=PositionGetInteger(POSITION_TICKET);
//ポジションのチケット番号を取得
double PosPrice=PositionGetDouble(POSITION_PRICE_OPEN);
//ポジションのオープン価格を取得
if(price>PosPrice+200*_Point)//現在値がオープン価格より一定数上がったら
{
trade.PositionModify(PosTicketNum,PosPrice,PosPrice+500*_Point);
//ストップロスを建値に引き上げる
}//if(Ask>PosPrice+200*_Point)
}//if(_Symbol==positionSymbol)
}//for(int icounter=PositionsTotal()-1 ; icounter>=0 ;i--)
}//void BreakEven(double price)
※PositionGetSymbol関数についてはコチラをご覧ください。
PositionGetInteger関数についてはコチラをご覧ください。
全体のプログラムコード
#include <Trade\Trade.mqh>
//標準ライブラリーのトレードファイルを使えるようにする
CTrade trade;
// CTradeクラスのインスタンスを宣言
void OnTick()
{
double Ask=NormalizeDouble(//正規化
SymbolInfoDouble(_Symbol,SYMBOL_ASK),//現在値の取得
_Digits);
if(PositionsTotal()==0)//ポジションがなければ
{
trade.Buy(0.01,NULL,Ask,Ask-1000*_Point,Ask+500*_Point);
//買い注文
}//if(PositionsTotal()==0)
BreakEven(Ask);
//ブレイクイーブンを発動させる
}//void OnTick()
//+------------------------------------------------------------------+
//ブレイクイーブン関数の定義
void BreakEven(double price)
{
//ポジションプール内を古い方にむかってループチェック
for(int icounter=PositionsTotal()-1 ; icounter>=0 ;icounter--)
{
string positionSymbol=PositionGetSymbol(icounter);//ポジションの通貨ペアを取得
if(_Symbol==positionSymbol)//ポジションの通貨ペアが一致したら
{
ulong PosTicketNum=PositionGetInteger(POSITION_TICKET);
//ポジションのチケット番号を取得
double PosPrice=PositionGetDouble(POSITION_PRICE_OPEN);
//ポジションのオープン価格を取得
if(price>PosPrice+200*_Point)//現在値がオープン価格より一定数上がったら
{
trade.PositionModify(PosTicketNum,PosPrice,PosPrice+500*_Point);
//ストップロスを建値に引き上げる
}//if(Ask>PosPrice+200*_Point)
}//if(_Symbol==positionSymbol)
}//for(int icounter=PositionsTotal()-1 ; icounter>=0 ;i--)
}//void BreakEven(double price)
プログラムコードの挙動
挙動は以下のようになります↓
ストップロスを移動させるのは別に建値じゃなくてもいいし、発動条件も「直近高値を超えたら」等、色々と応用を利かせると面白いですね。
最後まで読んでいただきありがとうございました。<(_ _)>
※当サイトのメインコンテンツである、<MQL5でEAを作ろう講座>では以下の記事で、ブレイクイーブンストップについて解説しておりますので、よろしければ参考にしてください。
★注意再掲:ソースコードの内容を試されるときは、必ずストラテジーテスターのバックテストモードか、
デモ口座でお試しいただくようお願いします。コード内に発注記述が入っています。
リアル口座に導入するといきなりポジションを持ってしまいます。ソースコードを利用されたことによって金銭的被害を被られたとしても当方では責任を負うことができません。
詳しくは免責事項をご確認ください。
変数については↓をご覧ください。
OnTick関数については↓をご覧ください。
PositionsTotal関数については↓をご覧ください
SymbolInfoDouble関数については↓をご覧ください
※当サイトでは、プログラミング経験ゼロの方でも、プログラミングの基礎から学べる
をメインコンテンツとして展開しています。
第0回から、順を追って勉強していけばプログラミングの経験がなくてもMQL5を使って、MT5用のEAが作れるように書いています。最初は難しいと感じるかもしれませんが、繰り返し勉強していく事で自然とスキルが身についていくはずです。興味ある方は是非ご覧ください。
コメント