本ブログではMT4を使用した自動売買システム(EA)の開発を扱っています。
本記事ではポジションの全決済、分割決済を自動化する方法をご紹介。
✔ 本記事のテーマ
MT4には保有ポジションを一括決済する機能は実装されていません。
ネット上でもあまり有効な方法は提示されていないようです。
ならば自分で作ってしまえ、と考えたのが開発のきっかけです。
本記事の方法で自作EAに一括決済/分割決済ロジックを実装できます。
ソースコードも付けているので参考にして下さい。
✔ こんな悩みを解決
・自動売買で保有ポジションを一括決済したい
・特定条件で一部のポジションを決済したい
・裁量で取ったポジションを自動で決済したい
もし上記のような悩みがあれば、本記事でばっちり解決します。
1.特定条件下でポジションを清算したい
以下の質問を例題にロジックを組んでいきます。
(引用元:yahoo知恵袋)
質問者さんの希望を要約すると以下になります。
質問者さんの希望
・トータル益がプラスの際に一括決済するロジックを実装したい
・決済とエントリー条件が重なる際にロジックが想定通りに働かない
それでは実装する方法を考えていきましょう。
2.実装したい機能を整理する
実装したい機能を分割すると以下の3つに分けることができます。
それぞれの機能について見ていきましょう。
実装が必要なロジック
① 複数ポジションのトータル益を判断するロジック
② 全てのポジションを一括決済するロジック
③ 決済するタイミングで新しいポジションを取らないようにするロジック
①のトータル益は OrderProfit() 関数で取得が可能です。
③は決済中、または決済後に一定期間ポジションを取らないことで解決します。 続きを見る
以下の記事で紹介している方法で時間経過を取得すればOKです。
自作EAで日付や時間、曜日を取得する方法【MT4でFX自動売買】
未決済の原因は売り注文、買い注文の同時発注による不具合と推察します。
証券会社は連続発注されたオーダーを弾くことがあります。
間隔を3秒程度あけると良いでしょう。
よって、今回実装すべきは②の「全ポジションを一括決済するロジック」です。
3.サンプルソースコード公開
今回は以下2つのロジックを公開します。
サブ関数化しているため、コピペしてご自身のEAに組み込んでも使えます。
今回公開するロジック
・保有ポジションを一括決済
呼び出されるとすべてのポジションをクローズします。
条件として追加すれば決済ポジションを限定することも可能です。
拡張ソースコード
ソースコードの末尾に以下を追加してください。
あとは決済条件を設定してallclose関数を呼び出します。
command
//------------------------------------------------------------------------------------
// 6. allclose : ポジション一括決済
//------------------------------------------------------------------------------------
void allclose(){
int res,res2,magic;
double BID,ASK,endlots;
int torder = OrdersTotal();
string rrcur;
for(int i = torder-1; i >= 0; i--){
res = OrderSelect(i,SELECT_BY_POS,MODE_TRADES);
rrcur = OrderSymbol();
BID = MarketInfo(rrcur,MODE_BID);
ASK = MarketInfo(rrcur,MODE_ASK);
endlots = OrderLots();
magic = OrderMagicNumber();
if(OrderType() == OP_SELL)
res2 = OrderClose(OrderTicket(),endlots,ASK,50,Blue);
if(OrderType() == OP_BUY)
res2 = OrderClose(OrderTicket(),endlots,BID,50,Blue);
Sleep(3000); //連続で決済命令を送ると証券会社側で弾かれるため
}
}
・保有ポジションを分割決済
基本は一括決済のロジックと同じです。
提示しているコードは保有ポジションの中から古い順で半分をクローズします。
通貨ペア毎、買い、売りポジション毎にカウントすればより目的のロジックに近づきます。
拡張ソースコード
ソースコードの末尾に以下を追加してください。
あとは決済条件を設定してallclose関数を呼び出します。
command
//------------------------------------------------------------------------------------
// 6. splitclose : ポジション分割決済
//------------------------------------------------------------------------------------
void allclose(){
int res,res2,magic;
double BID,ASK,endlots;
int torder = OrdersTotal();
string rrcur;
int closelimit = OrdersTotal()/2; //総ポジションの半分
for(int i = torder-1; i >= 0; i--){
res = OrderSelect(i,SELECT_BY_POS,MODE_TRADES);
rrcur = OrderSymbol();
BID = MarketInfo(rrcur,MODE_BID);
ASK = MarketInfo(rrcur,MODE_ASK);
endlots = OrderLots();
magic = OrderMagicNumber();
if(OrderType() == OP_SELL && closecount<=closelimit)
res2 = OrderClose(OrderTicket(),endlots,ASK,50,Blue);
if(OrderType() == OP_BUY && closecount<=closelimit)
res2 = OrderClose(OrderTicket(),endlots,BID,50,Blue);
Sleep(3000); //連続で決済命令を送ると証券会社側で弾かれるため
if(res2=1)
closecount = closecount +1;
}
closecount = 0;
}
4.開発に詰まったらインプットを
EA開発に必要なのはトレードスキルとプログラミングスキルです。
どちらが欠けていても良いEAは作れません。
以下に知識やスキル不足を補うツールを紹介します。
コスパが良いおすすめサービス
FX投資マスターガイド【無料】
FX手法解説本、基本戦略はこれ読めばOK
FXメタトレーダー入門【約2千円】
EA開発者のバイブル、初心者から上級者まで
EAつくーる【約3万円】
プログラミング無しでEA開発、お試し版あり
EAプログラミングセミナー【約4万円】
講師からの指導を受けつつEA開発の基礎を学べます
・FX投資マスターガイド【無料】
FXの基本戦略はこれ読めばOKです。
特に図解が分かり易いのでロジックを考える上で参考になります。
メールアドレス登録だけなので忘れず貰いましょう。
・FXメタトレーダー入門【約2千円】
EA開発者を目指すなら以下のシリーズは押さえておきたいです。
筆者は書籍版を持っていますが、電子版が半額で売られています。
これから購入される方は電子版をお勧めします。
✔ FXメタトレーダー入門【初心者向け】
MT4の使い方を1から紹介してくれます。
これからEAを自作しようという方にはちょっと物足りないかも。
とは言え持っておいて損はない1冊です。
✔ FXメタトレーダー実践プログラミング【中~上級者向け】
MT4の使い方はOK!と言う方はこちらからで大丈夫。
辞書的な使い方もできるのでお金に余裕があれば紙媒体もおすすめです。
・EAつくーる【約3万円】
自作が難しいと感じたらEAつくーるを使うのも選択肢です。
1度購入すればノーコード(プログラミング無し)でEAが作れます。
2ステップで作るオリジナルEA
②つくーるの機能で実装できない自作ロジックを追記
今ならお試し用の1ヶ月版が2980円で使えます。
割高なので”使える”と思ったら買い切り版に切り替えましょう。
・EAプログラミングセミナー【約4万円】
がっつり取り組みたいのであればEAプログラミングセミナーもおすすめです。
難易度別に3つの講座が提供されているので、レベルに合わせて選択しましょう。
5.まとめ
本記事では保有ポジションを一括決済、分割決済する方法を紹介しました。
応用次第で取引の幅が広がるので是非挑戦してみてください。
その他のロジックについて知りたい方は以下の記事を参照下さい。
>>参考:『FX自動売買システム(EA)の自作に困った際のヒント集』
以上、参考になれば幸いです。