🤖
MQL5でポジションクローズ(ポジション決済)する方法 OrderSend()の説明
決済は決済するポジションチケットを指定して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