見出し画像

MT4/MQLソース公開:損失ありポジション全決済

処理内容

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


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

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

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

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

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


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

使い方

ALLlossClose();
と書くだけ

■引数
なし

■戻り値
なし

無料ソースコード

■グローバル部分のコード
グローバル変数の定義と外部関数読み込みです。(stdlib.mqhは多分無しでも動くけど念のため)
ソースのどこのイベント内でも無い一番上に記述してください

#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);
}

//+------------------------------------------------------------------+
//| 損失有ポジションの全クローズ    ALLlossClose
//| (スプレッド開いててもクローズ優先)
//|  code by KOUSHIROU
//|  https://note.com/mt4_coder
//+------------------------------------------------------------------+
void ALLlossClose() 
{
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文とかで特定時間になったらとか)内に記述するのが一般的でしょう。

ALLlossClose();

以上でございます。
間違い・アドバイスなどあればご連絡くださいませ。
なお、取引会社や環境などで正常に稼働しない可能性があります。
本コードについて正常な動作や利益を保証するものではありません。
十分な検証のもとご自身の判断でご使用をお願いいたします。

この記事が気に入ったらサポートをしてみませんか?