🤖

MQL5でポジションクローズ(ポジション決済)する方法 OrderSend()の説明

2023/10/07に公開

決済は決済するポジションチケットを指定してOrderSend()します。

request.position = Ticket;

MQL5 成行エントリー注文の関数のおさらい

entry.mq5
int MagicNumber = 123;       // マジックナンバー
double ilots = 0.01;         // ロットサイズ
int slippage = 10;          // スリッページ

void position_entry(ENUM_ORDER_TYPE order_type) {
   MqlTradeRequest req = {};
   MqlTradeResult res = {};

   req.action = TRADE_ACTION_DEAL;  // 成行注文
   req.symbol = Symbol();
   req.volume = ilots;               // 注文数量
   req.type = order_type;           // 売買方向 ORDER_TYPE_BUY or ORDER_TYPE_SELL
   req.deviation = slippage;        // スリップページ
   req.magic = MagicNumber;         // マジックナンバー
   req.comment = "";                // コメント

   bool order_result = OrderSend(req, res);

   if (order_result == false) {
       Print(res.retcode);
   }
}

MQL5 ポジション成行クローズ関数 ポジションを成行決済する

position_close(ORDER_TYPE_BUY,position_ticke);//BUY決済
position_close(ORDER_TYPE_SELL,position_ticke);//SELL決済

close.mq5
void position_close(ENUM_ORDER_TYPE order_type,ulong position_ticket)
  {
   MqlTradeRequest req = {};
   MqlTradeResult res = {};

   order_type = order_type==ORDER_TYPE_BUY?ORDER_TYPE_SELL:ORDER_TYPE_BUY;

   req.action = TRADE_ACTION_DEAL;  // 成行注文
   req.symbol = Symbol();
   req.volume = lots;               // 注文数量
   req.type = order_type;           // 売買方向 ORDER_TYPE_BUY or ORDER_TYPE_SELL
   req.deviation = slippage;        // スリップページ
   req.magic = MagicNumber;         // マジックナンバー
   req.comment = "";                // コメント
   req.position = position_ticket;  //決済するポジションを指定する

   bool order_result = OrderSend(req, res);

   if(order_result == false)
     {
      Print(res.retcode);
     }
  }

標準クラスを使ったポジション決済

標準クラスを使った場合はorder_typeの指定は不要です。

#include <Trade\Trade.mqh>
CTrade trade;

void position_close(ulong position_ticket) {
    if(trade.PositionClose(position_ticket) == false) {
        Print("ポジションクローズのエラー: ", GetLastError());
    }
}

全決済する場合

ポジションカウントの関数を変更して全決済する関数をつくる
position_all_close(ORDER_TYPE_BUY);//BUY全決済
position_all_close(ORDER_TYPE_SELL);//SELL全決済

void position_all_close(ENUM_ORDER_TYPE side)
  {
   for(int i=PositionsTotal()-1; i>=0; i--)
     {
      if("" != PositionGetSymbol(i))
        {
         if(PositionGetInteger(POSITION_TYPE)==side)
           {
            if(Symbol()==PositionGetString(POSITION_SYMBOL))
              {
               if(PositionGetInteger(POSITION_MAGIC)==MagicNumber)
                 {
                  position_close(side,PositionGetInteger(POSITION_TICKET));
                 }
              }
           }
        }
     }
  }

使い方

ポジションの0番を決済する

void OnTick()
  {
bool A = PositionsTotal() == 0;//ポジション数が0
bool B = OrdersTotal() == 0;//オーダー数が0

if(A && B){
position_entry(0);
}

bool C = PositionsTotal() > 0;//ポジション保有状態
ulong position_ticket = PositionGetTicket(0);//ポジションリストの0番のチケットを取得する

if(C){
position_close(1,position_ticket);//ポジションの指定して、反対方向のSell注文決済する
}
   
  }

テクニカル指標のRSIを使った成行注文、成行決済EA

RSI30を下回ったらロング、70を超えたら決済

//+------------------------------------------------------------------+
//|                                                      ProjectName |
//|                                      Copyright 2020, CompanyName |
//|                                       http://www.companyname.net |
//+------------------------------------------------------------------+

//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void OnTick()
  {

   bool P0 = position_count(ORDER_TYPE_BUY) ==0;

//RSI30で逆張りロング
   bool A = getRSIValue(1) < 30;
   if(A && P0)
     {
      position_entry_with_sltp(0);//BUY
     }

   bool B = getRSIValue(1) > 70;
   bool P1 = position_count(ORDER_TYPE_BUY) ==1;

   if(B && P1)
     {
      position_all_close(ORDER_TYPE_BUY);
     }
  }

//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
double getRSIValue(int shift)
  {
   static int handle = -1;

// RSI指標のハンドルを取得
   if(handle == -1)
     {
      handle = iRSI(_Symbol,PERIOD_CURRENT, 21, PRICE_CLOSE);
     }

   double rsiValue[];

// バッファをコピーしてRSIの値を取得
   CopyBuffer(handle, 0, shift, 1, rsiValue);

   return rsiValue[0];
  }

int MagicNumber = 123;       // マジックナンバー
double lots = 0.01;         // ロットサイズ
int slippage = 10;          // スリッページ

//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void position_entry(ENUM_ORDER_TYPE order_type)
  {
   MqlTradeRequest req = {};
   MqlTradeResult res = {};


   req.action = TRADE_ACTION_DEAL;  // 成行注文
   req.symbol = Symbol();
   req.volume = lots;               // 注文数量
   req.type = order_type;           // 売買方向 ORDER_TYPE_BUY or ORDER_TYPE_SELL
   req.deviation = slippage;        // スリップページ
   req.magic = MagicNumber;         // マジックナンバー
   req.comment = "";                // コメント

   bool order_result = OrderSend(req, res);

   if(order_result == false)
     {
      Print(res.retcode);
     }
  }

//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int position_count(ENUM_ORDER_TYPE side)
  {
   int count =0;
   for(int i=PositionsTotal()-1; i>=0; i--)
     {
      if("" != PositionGetSymbol(i))
        {
         if(PositionGetInteger(POSITION_TYPE)==side)
           {
            if(Symbol()==PositionGetString(POSITION_SYMBOL))
              {
               if(PositionGetInteger(POSITION_MAGIC)==MagicNumber)
                 {
                  count++;
                 }
              }
           }
        }
     }
   return count ;
  }


//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void position_all_close(ENUM_ORDER_TYPE side)
  {
   for(int i=PositionsTotal()-1; i>=0; i--)
     {
      if("" != PositionGetSymbol(i))
        {
         if(PositionGetInteger(POSITION_TYPE)==side)
           {
            if(Symbol()==PositionGetString(POSITION_SYMBOL))
              {
               if(PositionGetInteger(POSITION_MAGIC)==MagicNumber)
                 {
                  position_close(side,PositionGetInteger(POSITION_TICKET));
                 }
              }
           }
        }
     }
  }


//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void position_close(ENUM_ORDER_TYPE order_type,ulong position_ticket)
  {
   MqlTradeRequest req = {};
   MqlTradeResult res = {};

   order_type = order_type==ORDER_TYPE_BUY?ORDER_TYPE_SELL:ORDER_TYPE_BUY;

   req.action = TRADE_ACTION_DEAL;  // 成行注文
   req.symbol = Symbol();
   req.volume = lots;               // 注文数量
   req.type = order_type;           // 売買方向 ORDER_TYPE_BUY or ORDER_TYPE_SELL
   req.deviation = slippage;        // スリップページ
   req.magic = MagicNumber;         // マジックナンバー
   req.comment = "";                // コメント
   req.position = position_ticket;  //決済するポジションを指定する

   bool order_result = OrderSend(req, res);

   if(order_result == false)
     {
      Print(res.retcode);
     }
  }

Discussion