1
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

【mt4/mql4】利益ありポジション全決済処理

Posted at

はじめに

システムトレードプログラマのmt4/mql4のメモノートです。
初心者向けの簡単なトピックから公開していきます。
.noteでEAそのものも公開していますので良ければそちらも見てください。

目次

  1. 処理内容
  2. mql4ソースコード

処理内容

自身のポジションのうち、利益の出ているポジションだけ決裁オーダーを出す関数です。
損失のあるポジションはそのままです。
スプレッド開いていてもポジション決裁を優先したいので、直前ask bidの差をスリッページに設定します。

使いどころとしては
・定期的にポジションの利確を行いたいとか

・ポジション確保したまま週末を跨ぎたくない。ので、ポジション数を減らすとか

・FOMCが迫っているのでリスク回避のためにポジション数を減らすとか

・証拠金率が下がってきたので、リスク低減のために利益のあるポジションを決裁するとか

・とある条件に合致したら、とにかく残高を増やしたいとか

ですかね。
なので基本的には使いたい条件式とセットで使う関数となります。
また、取引会社の状況によりますが、連続して決裁オーダーを出すので約定しきらない可能性があります。
なので念のためsleepを入れたあとに再度本関数を使うのも手だと思います。
なお、急な値変動やスプレッドの変化の際には、わずかな時差で必ずしも利益確定とならないポジション解消もあり得ます。

mql4ソースコード

こちらが関数側のソースです。呼び出し側の前に記述されている必要があります。
基本的には使いたい条件式とセットで使う関数となります。
なお、オーダーキャンセルも取引会社(FX会社側)での受理が必要ですので他の注文と合わせて使う際にはsleepなどで少しだけでも合間時間を確保しておくと、リクエスト拒否されにくいです。

test.mq4
//+------------------------------------------------------------------+
#include <stdlib.mqh>
double Priceaskbid[2];
int    Slippage;

//+------------------------------------------------------------------+
//| スリッページにスプレッドを格納して差があるか判定
//|  code by KOUSHIROU
//|  https://note.com/mt4_coder
//+------------------------------------------------------------------+
bool GetMarketInfo() 
{
 RefreshRates();
 Priceaskbid[0]=MarketInfo(OrderSymbol(),MODE_ASK);
 Priceaskbid[1]=MarketInfo(OrderSymbol(),MODE_BID);
 double dPoint=MarketInfo(OrderSymbol(),MODE_POINT);
 if(dPoint==0) return(false);
 Slippage=(Priceaskbid[0]-Priceaskbid[1])/dPoint;
 return(Priceaskbid[0]>0.0 && Priceaskbid[1]>0.0);
}
//+------------------------------------------------------------------+

//+------------------------------------------------------------------+
//| 利益有ポジションの全クローズ    ALLprofitClose
//| (スプレッド開いててもクローズ優先)
//|  code by KOUSHIROU
//|  https://note.com/mt4_coder
//+------------------------------------------------------------------+

void ALLprofitClose() 
{
 int iOrders=OrdersTotal()-1;
 int i;
   for(i=iOrders; i>=0; i--) 
   {
     if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES) && (OrderProfit() >= 0))
      {
       if((OrderType()<=OP_SELL) && GetMarketInfo()) 
       {
         if(!OrderClose(OrderTicket(),OrderLots(),Priceaskbid[1-OrderType()],Slippage))
         {
         Print("Close order Error");
         }
       }
     }
   }
}
//+------------------------------------------------------------------+

こちらは呼び出し側の例
呼び出したいタイミングに合わせてOnTick()、OnInit()とかOnTimer()の中で記述してみてください。何らかの条件(if文とかで特定時間になったらとか)内に記述するのが一般的でしょう。

test.mq4
ALLprofitClose();

皆様の手助けになりますように。
間違いなどあればご指摘いただけると助かります。
以上です

1
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?