FX自動売買システム開発

自作EAでポジションを全決済、分割決済する方法【MT4でFX自動売買】

 

✔ 本記事のテーマ

本記事では自動売買システム(EA)で全決済、分割決済を行う方法をご紹介します。

 

✔ 記事を読むメリット

MT4で保有ポジションを一括決済するには追加のプログラムが必要です。
1ボタンで決済するインジケータは公開されていますが、EAはありません。
本記事で自作EAに一括、分割で決済するロジックを実装できます。

 

✔ 以下の方におすすめ

・自動売買で保有ポジションを一括決済したい

・特定条件で一部のポジションを決済したい

・裁量で取ったポジションを自動で決済したい

 

もし上記のような悩みがあれば、本記事でばっちり解決します。

 

↓そもそも「MT4って何?」という方はこちら。
メタトレーダー(MT4)の使い方!入手方法も解説

↓サンプルEAの動かし方や評価、改編方法は以下
MT4で自作するFX自動売買システム(EA)とは?作り方を徹底解説!

 

 

1.【例題】ポジションを一括、もしくは分割で決済するには?

(引用元:yahoo知恵袋

 

質問者さんの希望を要約すると以下になります。

 

質問者さんの希望

・トータル益がプラスの際に一括決済するロジックを実装したい。

・決済とエントリー条件が重なる際にロジックが想定通りに働かない。

 

それでは実装する方法を考えていきましょう。

 

2.【解答】開発工程をいくつかのステップに分けて考える

実装したい機能を分割すると以下の3つに分けることができます。
それぞれの機能について見ていきましょう。

 

実装すべきロジック3つ

① 複数ポジションのトータル益を判断するロジック

② 全てのポジションを一括決済するロジック

③ 決済するタイミングで新しいポジションを取らないようにするロジック

 

①のトータル益はOrderProfit関数で取得が可能です。
③は決済中、または決済後に一定期間ポジションを取らないことで解決します。
時間経過を条件に組み込む方法は以下の記事で紹介しています。

 

自作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開発に限らず、物事に詰まったら外部の知識を頼るのが賢い選択です。
以下ではトレードとプログラミングに役立つ参考書籍やサービスを紹介します。

 

①書籍でトレードの勉強

基本ブログ内で完結するよう心がけていますが、以下の本があると理解が深まります。
シリーズものですがとりあえず1冊読んでみると良いかと思います。

■FXメタトレーダー入門 AMAZON 楽天

 

②無料のプログラミングスクールを活用

ソースコードの理解に苦しむようであれば初級レベルのプログラミングを学びましょう。
最初の基礎ベースを身に着けるならTechAcademyがおすすめです。
TechAcademyは1週間の無料体験があるので、それで十分学べるかと思います。

>>Techacademyの無料体験はこちら

 

【無料講座】FX自動売買ツールの作り方を解説【MT4で自作EA】

続きを見る

 

5.まとめ

本記事では保有ポジションを一括決済、分割決済する方法を紹介しました。
応用次第で取引の幅が広がるので是非挑戦してみてください。

 

その他のロジックについて知りたい方は以下の記事を参照下さい。

>>参考:『FX自動売買システム(EA)の自作に困った際のヒント集』

 

以上、参考になれば幸いです。

 

  • この記事を書いた人

HAZU

静岡の一部上場企業で働く兼業投資家、投資を初めて6年が経ちました。30代のセミリタイアを目指して20代からコツコツと資産形成中。趣味はキャンプとプログラミング。ブログでは主に【FXの始め方から自動化】までを扱っています。

-FX自動売買システム開発

© 2021 HAZUの資産形成ラボ Powered by AFFINGER5