取引操作の種類

取引は OrderSend() 関数を使用して建玉に注文を送ったり、未決注文を配置、変更、または解除することです。各取引注文はリクエストされた操作の種類を示します。取引操作は ENUM_TRADE_REQUEST_ACTIONS 列挙で記述されます。

ENUM_TRADE_REQUEST_ACTIONS

識別子

説明

TRADE_ACTION_DEAL

指定されたパラメータ(成行注文)の即時実行のために約定注文を出します。

TRADE_ACTION_PENDING

指定された条件(未決注文)で実行するために取引注文を出します。

TRADE_ACTION_SLTP

保有中ポジションの決済逆指値及び決済指値を変更します。

TRADE_ACTION_MODIFY

以前の注文のパラメータを変更します。

TRADE_ACTION_REMOVE

以前の未決注文を削除します。

TRADE_ACTION_CLOSE_BY

反対ポジションの決済。

買いポジションを持つ 取引操作TRADE_ACTION_DEALの例:

#define EXPERT_MAGIC 123456   // エキスパートアドバイザのMagicNumber
//+------------------------------------------------------------------+
//| 買いポジションの発注                                                   |
//+------------------------------------------------------------------+
void OnStart()
 {
//--- リクエストと結果の宣言と初期化
  MqlTradeRequest request={};
  MqlTradeResult  result={};
//--- リクエストのパラメータ
  request.action   =TRADE_ACTION_DEAL;                     // 取引操作タイプ
  request.symbol   =Symbol();                             // シンボル
  request.volume   =0.1;                                   // 0.1ロットのボリューム
  request.type     =ORDER_TYPE_BUY;                       // 注文タイプ
  request.price    =SymbolInfoDouble(Symbol(),SYMBOL_ASK); // 発注価格
  request.deviation=5;                                     // 価格からの許容偏差
  request.magic    =EXPERT_MAGIC;                         // 注文のMagicNumber
//--- リクエストの送信
  if(!OrderSend(request,result))
    PrintFormat("OrderSend error %d",GetLastError());     // リクエストの送信が失敗した場合、エラーコードを出力する
//--- 操作に関する情報
  PrintFormat("retcode=%u  deal=%I64u  order=%I64u",result.retcode,result.deal,result.order);
 }
//+------------------------------------------------------------------+

 
売りポジションを持つ 取引操作TRADE_ACTION_DEALの例:

#define EXPERT_MAGIC 123456   // エキスパートアドバイザのMagicNumber
//+------------------------------------------------------------------+
//| 売りポジションを持つ                                                    |
//+------------------------------------------------------------------+
void OnStart()
 {
//--- リクエストと結果の宣言と初期化
  MqlTradeRequest request={};
  MqlTradeResult  result={};
//--- リクエストのパラメータ
  request.action   =TRADE_ACTION_DEAL;                     // 取引操作タイプ
  request.symbol   =Symbol();                             // シンボル
  request.volume   =0.2;                                   // 0.2ロットのボリューム
  request.type     =ORDER_TYPE_SELL;                       // 注文タイプ
  request.price    =SymbolInfoDouble(Symbol(),SYMBOL_BID); // 発注価格
  request.deviation=5;                                     // 価格からの許容偏差
  request.magic    =EXPERT_MAGIC;                         // 注文のMagicNumber
//--- リクエストの送信
  if(!OrderSend(request,result))
    PrintFormat("OrderSend error %d",GetLastError());     // リクエストの送信が失敗した場合、エラーコードを出力する
//--- 操作についての情報
  PrintFormat("retcode=%u  deal=%I64u  order=%I64u",result.retcode,result.deal,result.order);
 }
//+------------------------------------------------------------------+

 
ポジションを決済する 取引操作TRADE_ACTION_DEALの例:

#define EXPERT_MAGIC 123456   // エキスパートアドバイザのMagicNumber
//+------------------------------------------------------------------+
//| 全てのポジションを決済                                                  |
//+------------------------------------------------------------------+
void OnStart()
 {
//--- 結果とリクエストの宣言
  MqlTradeRequest request;
  MqlTradeResult  result;
  int total=PositionsTotal(); // 保有ポジション数  
//--- 全ての保有ポジションの取捨
  for(int i=total-1; i>=0; i--)
    {
    //--- 注文のパラメータ
    ulong  position_ticket=PositionGetTicket(i);                                     // ポジションチケット
    string position_symbol=PositionGetString(POSITION_SYMBOL);                       // シンボル
    int    digits=(int)SymbolInfoInteger(position_symbol,SYMBOL_DIGITS);             // 小数点以下の桁数
    ulong  magic=PositionGetInteger(POSITION_MAGIC);                                 // ポジションのMagicNumber
    double volume=PositionGetDouble(POSITION_VOLUME);                                 // ポジションボリューム
    ENUM_POSITION_TYPE type=(ENUM_POSITION_TYPE)PositionGetInteger(POSITION_TYPE);   // ポジションタイプ
    //--- ポジション情報の出力
    PrintFormat("#%I64u %s  %s  %.2f  %s [%I64d]",
                 position_ticket,
                 position_symbol,
                EnumToString(type),
                 volume,
                DoubleToString(PositionGetDouble(POSITION_PRICE_OPEN),digits),
                 magic);
    //--- MagicNumberが一致している場合
    if(magic==EXPERT_MAGIC)
       {
        //--- リクエストと結果の値のゼロ化
        ZeroMemory(request);
        ZeroMemory(result);
        //--- 操作パラメータの設定
        request.action   =TRADE_ACTION_DEAL;       // 取引操作タイプ
        request.position =position_ticket;         // ポジションチケット
        request.symbol   =position_symbol;         // シンボル
        request.volume   =volume;                   // ポジションボリューム
        request.deviation=5;                       // 価格からの許容偏差
        request.magic    =EXPERT_MAGIC;             // ポジションのMagicNumber
        //--- ポジションタイプによる注文タイプと価格の設定
        if(type==POSITION_TYPE_BUY)
          {
           request.price=SymbolInfoDouble(position_symbol,SYMBOL_BID);
           request.type =ORDER_TYPE_SELL;
          }
        else
          {
           request.price=SymbolInfoDouble(position_symbol,SYMBOL_ASK);
           request.type =ORDER_TYPE_BUY;
          }
        //--- 決済情報の出力
        PrintFormat("Close #%I64d %s %s",position_ticket,position_symbol,EnumToString(type));
        //--- リクエストの送信
        if(!OrderSend(request,result))
          PrintFormat("OrderSend error %d",GetLastError()); // リクエストの送信に失敗した場合、エラーコードを出力
        //--- 操作情報 
        PrintFormat("retcode=%u  deal=%I64u  order=%I64u",result.retcode,result.deal,result.order);
        //---
       }
    }
 }
//+------------------------------------------------------------------+

 
未決注文を設定する 取引操作TRADE_ACTION_PENDINGの例:

#property description "未決注文設定の例"
#property script_show_inputs
#define EXPERT_MAGIC 123456                             // エキスパートアドバイザのMagicNumber
input ENUM_ORDER_TYPE orderType=ORDER_TYPE_BUY_LIMIT;   // 注文タイプ
//+------------------------------------------------------------------+
//| 未決注文の設定                                                      |
//+------------------------------------------------------------------+
void OnStart()
 {
//--- リクエストと結果の宣言と初期化
  MqlTradeRequest request={};
  MqlTradeResult  result={};
//--- 未決注文の設定の為のパラメータ
  request.action   =TRADE_ACTION_PENDING;                             // 取引操作タイプ
  request.symbol   =Symbol();                                         // シンボル
  request.volume   =0.1;                                             // 0.1ロットのボリューム
  request.deviation=2;                                               // 価格からの許容偏差
  request.magic    =EXPERT_MAGIC;                                     // 注文のMagicNumber
  int offset = 50;                                                   // 注文設定の為の現在の価格からのオフセット(ポイント)
  double price;                                                      // 注文の発動価格
  double point=SymbolInfoDouble(_Symbol,SYMBOL_POINT);               // ポイントサイズ
  int digits=SymbolInfoInteger(_Symbol,SYMBOL_DIGITS);              // 小数点以下の桁数(精度)
  //--- 操作タイプのチェック
  if(orderType==ORDER_TYPE_BUY_LIMIT)
    {
     request.type     =ORDER_TYPE_BUY_LIMIT;                         // 注文タイプ
     price=SymbolInfoDouble(Symbol(),SYMBOL_ASK)-offset*point;       // 発注価格
     request.price    =NormalizeDouble(price,digits);                 // 正規化された発注価格
    }
  else if(orderType==ORDER_TYPE_SELL_LIMIT)
    {
     request.type     =ORDER_TYPE_SELL_LIMIT;                         // 注文タイプ
     price=SymbolInfoDouble(Symbol(),SYMBOL_ASK)+offset*point;         // 発注価格
     request.price    =NormalizeDouble(price,digits);                 // 正規化された発注価格
    }
  else if(orderType==ORDER_TYPE_BUY_STOP)
    {
     request.type =ORDER_TYPE_BUY_STOP;                               // 注文タイプ
     price        =SymbolInfoDouble(Symbol(),SYMBOL_ASK)+offset*point; // 発注価格
     request.price=NormalizeDouble(price,digits);                     // 正規化された発注価格
    }
  else if(orderType==ORDER_TYPE_SELL_STOP)
    {
     request.type     =ORDER_TYPE_SELL_STOP;                           // 注文タイプ
     price=SymbolInfoDouble(Symbol(),SYMBOL_ASK)-offset*point;         // 発注価格
     request.price    =NormalizeDouble(price,digits);                 // 正規化された発注価格
    }
  else Alert("この例は未決注文の設定のみを対象にしています");   // もし未決注文ではないものが選択されている場合
//--- リクエストの送信
  if(!OrderSend(request,result))
    PrintFormat("OrderSend error %d",GetLastError());                 // もしリクエストの送信に失敗した場合、エラーコードを出力する
//--- 操作情報
  PrintFormat("retcode=%u  deal=%I64u  order=%I64u",result.retcode,result.deal,result.order);
 }
//+------------------------------------------------------------------+

 
保有ポジションのストップロスとテイクプロフィットの値を変更する 取引操作 TRADE_ACTION_SLTPの例:

#define EXPERT_MAGIC 123456 // エキスパートアドバイザのMagicNumber
//+------------------------------------------------------------------+
//| ポジションのストップロスとテイクプロフィットを変更する                               |
//+------------------------------------------------------------------+
void OnStart()
 {
//--- リクエストと結果の宣言
  MqlTradeRequest request;
  MqlTradeResult  result;
  int total=PositionsTotal(); // 保有ポジション数  
//--- 全ての保有ポジションを取捨
  for(int i=0; i<total; i++)
    {
    //--- 注文パラメータ
    ulong  position_ticket=PositionGetTicket(i);// ポジションチケット
    string position_symbol=PositionGetString(POSITION_SYMBOL); // シンボル
    int    digits=(int)SymbolInfoInteger(position_symbol,SYMBOL_DIGITS); // 小数点以下の桁数
    ulong  magic=PositionGetInteger(POSITION_MAGIC); // ポジションのMagicNumber
    double volume=PositionGetDouble(POSITION_VOLUME);   // ポジションボリューム
    double sl=PositionGetDouble(POSITION_SL); // ポジションのStop Loss
    double tp=PositionGetDouble(POSITION_TP); // ポジションのTake Profit
    ENUM_POSITION_TYPE type=(ENUM_POSITION_TYPE)PositionGetInteger(POSITION_TYPE); // ポジションタイプ
    //--- ポジション情報の出力
    PrintFormat("#%I64u %s  %s  %.2f  %s  sl: %s  tp: %s  [%I64d]",
                 position_ticket,
                 position_symbol,
                EnumToString(type),
                 volume,
                DoubleToString(PositionGetDouble(POSITION_PRICE_OPEN),digits),
                DoubleToString(sl,digits),
                DoubleToString(tp,digits),
                 magic);
    //--- MagicNumberが一致し、ストップロスとテイクプロフィットが指定されていない場合
    if(magic==EXPERT_MAGIC && sl==0 && tp==0)
       {
        //--- 現在の価格レートの計算
        double price=PositionGetDouble(POSITION_PRICE_OPEN);
        double bid=SymbolInfoDouble(position_symbol,SYMBOL_BID);
        double ask=SymbolInfoDouble(position_symbol,SYMBOL_ASK);
        int    stop_level=(int)SymbolInfoInteger(position_symbol,SYMBOL_TRADE_STOPS_LEVEL);
        double price_level;
        //--- 現在の決済価格からの最小許容オフセットが指定されていない場合
        if(stop_level<=0)
           stop_level=150; // 現在の決済価格から150ポイントのオフセットを設定する
        else
           stop_level+=50; // 念の為オフセットレベルは(SYMBOL_TRADE_STOPS_LEVEL + 50)ポイントと同じにする
 
        //--- Stop LossとTake Profitの値の計算と四捨五入
        price_level=stop_level*SymbolInfoDouble(position_symbol,SYMBOL_POINT);
        if(type==POSITION_TYPE_BUY)
          {
           sl=NormalizeDouble(bid-price_level,digits);
           tp=NormalizeDouble(ask+price_level,digits);
          }
        else
          {
           sl=NormalizeDouble(ask+price_level,digits);
           tp=NormalizeDouble(bid-price_level,digits);
          }
        //--- リクエストと結果の値のゼロ化
        ZeroMemory(request);
        ZeroMemory(result);
        //--- 操作パラメータの設定
        request.action  =TRADE_ACTION_SLTP; // 取引操作タイプ
        request.position=position_ticket;   // ポジションシンボル
        request.symbol=position_symbol;     // シンボル
        request.sl      =sl;               // ポジションのStop Loss
        request.tp      =tp;               // ポジションのTake Profit
        request.magic=EXPERT_MAGIC;         // MagicNumber позиции
        //--- 変更情報の出力
        PrintFormat("Modify #%I64d %s %s",position_ticket,position_symbol,EnumToString(type));
        //--- リクエストの送信
        if(!OrderSend(request,result))
          PrintFormat("OrderSend error %d",GetLastError()); // リクエストの送信に失敗した場合、エラーコードを出力する
        //--- 操作情報 
        PrintFormat("retcode=%u  deal=%I64u  order=%I64u",result.retcode,result.deal,result.order);
       }
    }
 }
//+------------------------------------------------------------------+

 
未決注文の価格レベルを変更する 取引操作TRADE_ACTION_MODIFYの例:

#define EXPERT_MAGIC 123456 // エキスパートアドバイザのMagicNumber
//+------------------------------------------------------------------+
//| 未決注文の変更                                                      |
//+------------------------------------------------------------------+
void OnStart()
 {
//--- リクエストと結果の宣言と初期化
  MqlTradeRequest request={};
  MqlTradeResult  result={};
  int total=OrdersTotal(); // 保有未決注文数
//--- 全ての保有未決注文を取捨
  for(int i=0; i<total; i++)
    {
    //--- 注文パラメータ
    ulong  order_ticket=OrderGetTicket(i);                             //注文チケット
    string order_symbol=Symbol();                                     // シンボル
    int    digits=(int)SymbolInfoInteger(order_symbol,SYMBOL_DIGITS); // 小数点以下の桁数
    ulong  magic=OrderGetInteger(ORDER_MAGIC);                         // 注文のMagicNumber
    double volume=OrderGetDouble(ORDER_VOLUME_CURRENT);               // 現在の注文量
    double sl=OrderGetDouble(ORDER_SL);                               // 現在の注文のStop Loss
    double tp=OrderGetDouble(ORDER_TP);                               // 現在の注文のTake Profit
    ENUM_ORDER_TYPE type=(ENUM_ORDER_TYPE)OrderGetInteger(ORDER_TYPE); // 注文タイプ
    int offset = 50;                                                   // 発注の為の現在価格からのオフセット(ポイント)
    double price;                                                     // 注文発動価格
    double point=SymbolInfoDouble(order_symbol,SYMBOL_POINT);         // ポイントサイズ
    //--- 注文情報の出力
    PrintFormat("#%I64u %s  %s  %.2f  %s  sl: %s  tp: %s  [%I64d]",
                 order_ticket,
                 order_symbol,
                EnumToString(type),
                 volume,
                DoubleToString(PositionGetDouble(POSITION_PRICE_OPEN),digits),
                DoubleToString(sl,digits),
                DoubleToString(tp,digits),
                 magic);
    //--- MagicNumberが一致し、Stop LossとTake Profitが設定されていない場合
    if(magic==EXPERT_MAGIC && sl==0 && tp==0)
       {
        request.action=TRADE_ACTION_MODIFY;                           // 取引操作タイプ
        request.order = OrderGetTicket(i);                           // 注文チケット
        request.symbol   =Symbol();                                   // シンボル
        request.deviation=5;                                         // 価格からの許容オフセット
      //--- 価格レベルの設定、タイプに合わせた注文のTake ProfitとStop Loss
        if(type==ORDER_TYPE_BUY_LIMIT)
          {
           price = SymbolInfoDouble(Symbol(),SYMBOL_ASK)-offset*point;
           request.tp = NormalizeDouble(price+offset*point,digits);
           request.sl = NormalizeDouble(price-offset*point,digits);
           request.price    =NormalizeDouble(price,digits);               // 正規化された発注価格
          }
        else if(type==ORDER_TYPE_SELL_LIMIT)
          {
          price = SymbolInfoDouble(Symbol(),SYMBOL_BID)+offset*point;
           request.tp = NormalizeDouble(price-offset*point,digits);
           request.sl = NormalizeDouble(price+offset*point,digits);
           request.price    =NormalizeDouble(price,digits);                 // 正規化された発注価格
          }
        else if(type==ORDER_TYPE_BUY_STOP)
          {
          price = SymbolInfoDouble(Symbol(),SYMBOL_BID)+offset*point;
           request.tp = NormalizeDouble(price+offset*point,digits);
           request.sl = NormalizeDouble(price-offset*point,digits);
           request.price    =NormalizeDouble(price,digits);                 // 正規化された発注価格
          }
        else if(type==ORDER_TYPE_SELL_STOP)
          {
          price = SymbolInfoDouble(Symbol(),SYMBOL_ASK)-offset*point;
           request.tp = NormalizeDouble(price-offset*point,digits);
           request.sl = NormalizeDouble(price+offset*point,digits);
           request.price    =NormalizeDouble(price,digits);                 // 正規化された発注価格
          }
        //---リクエストの送信
        if(!OrderSend(request,result))
          PrintFormat("OrderSend error %d",GetLastError()); // リクエストの送信に失敗した場合、エラーコードを出力する
        //--- 操作情報  
        PrintFormat("retcode=%u  deal=%I64u  order=%I64u",result.retcode,result.deal,result.order);
        //--- リクエストと結果の値のゼロ化
        ZeroMemory(request);
        ZeroMemory(result);
       }
    }
 }
//+------------------------------------------------------------------+

 
未決注文の削除をする 取引操作TRADE_ACTION_REMOVEの例:

#define EXPERT_MAGIC 123456 // エキスパートアドバイザのMagicNumber
//+------------------------------------------------------------------+
//| 未決注文の削除                                                      |
//+------------------------------------------------------------------+
void OnStart()
 {
//--- リクエストと結果の宣言と初期化
  MqlTradeRequest request={};
  MqlTradeResult  result={};
  int total=OrdersTotal(); // 保有未決注文数
//--- 全ての保有未決注文を取捨
  for(int i=total-1; i>=0; i--)
    {
    ulong  order_ticket=OrderGetTicket(i);                   // 注文チケット
    ulong  magic=OrderGetInteger(ORDER_MAGIC);               // 注文のMagicNumber
    //--- MagicNumberが一致している場合
    if(magic==EXPERT_MAGIC)
       {
        //--- リクエストと結果の値のゼロ化
        ZeroMemory(request);
        ZeroMemory(result);
        //--- 操作パラメータの設定    
        request.action=TRADE_ACTION_REMOVE;                   // 取引操作タイプ
        request.order = order_ticket;                         // 注文チケット
        //--- リクエストの送信
        if(!OrderSend(request,result))
          PrintFormat("OrderSend error %d",GetLastError()); // リクエストの送信に失敗した場合、エラーコードを出力する
        //--- 操作情報  
        PrintFormat("retcode=%u  deal=%I64u  order=%I64u",result.retcode,result.deal,result.order);
       }
    }
 }
//+------------------------------------------------------------------+

 
反対ポジションを決済する 取引操作TRADE_ACTION_CLOSE_BY の例:

#define EXPERT_MAGIC 123456 // エキスパートアドバイザのMagicNumber
//+------------------------------------------------------------------+
//| 全ての反対ポジションの決済                                              |
//+------------------------------------------------------------------+
void OnStart()
 {
//--- リクエストと結果の宣言
  MqlTradeRequest request;
  MqlTradeResult  result;
  int total=PositionsTotal(); // 保有ポジション数  
//--- 全ての保有ポジションの取捨
  for(int i=total-1; i>=0; i--)
    {
    //--- 注文パラメータ
    ulong  position_ticket=PositionGetTicket(i);                                   // ポジションチケット
    string position_symbol=PositionGetString(POSITION_SYMBOL);                     // シンボル
    int    digits=(int)SymbolInfoInteger(position_symbol,SYMBOL_DIGITS);           // 小数点以下の桁数
    ulong  magic=PositionGetInteger(POSITION_MAGIC);                               // ポジションのMagicNumber
    double volume=PositionGetDouble(POSITION_VOLUME);                               // ポジションボリューム
    double sl=PositionGetDouble(POSITION_SL);                                       // ポジションのStop Loss
    double tp=PositionGetDouble(POSITION_TP);                                       // ポジションのTake Profit
    ENUM_POSITION_TYPE type=(ENUM_POSITION_TYPE)PositionGetInteger(POSITION_TYPE); // ポジションタイプ
    //--- ポジション情報の出力
    PrintFormat("#%I64u %s  %s  %.2f  %s  sl: %s  tp: %s  [%I64d]",
                 position_ticket,
                 position_symbol,
                EnumToString(type),
                 volume,
                DoubleToString(PositionGetDouble(POSITION_PRICE_OPEN),digits),
                DoubleToString(sl,digits),
                DoubleToString(tp,digits),
                 magic);
    //--- MagicNumberが一致している場合
    if(magic==EXPERT_MAGIC)
       {
        for(int j=0; j<i; j++)
          {
          string symbol=PositionGetSymbol(j); // 反対ポジションのシンボル
          //--- 反対と未知のポジションのシンボルが一致している場合
          if(symbol==position_symbol && PositionGetInteger(POSITION_MAGIC)==EXPERT_MAGIC)
             {
              //--- 反対ポジションのタイプの設定
              ENUM_POSITION_TYPE type_by=(ENUM_POSITION_TYPE)PositionGetInteger(POSITION_TYPE);
              //--- 元のポジションと反対ポジションのタイプが一致する場合終了する
              if(type==type_by)
                continue;
              //--- リクエストと結果の値のゼロ化
              ZeroMemory(request);
              ZeroMemory(result);
              //--- 操作パラメータの設定
              request.action=TRADE_ACTION_CLOSE_BY;                         //取引操作タイプ
              request.position=position_ticket;                             // ポジションチケット
              request.position_by=PositionGetInteger(POSITION_TICKET);     // 反対ポジションのチケット
              //request.symbol     =position_symbol;
              request.magic=EXPERT_MAGIC;                                   // ポジションのMagicNumber
              //--- 反対ポジションの決済情報の出力
              PrintFormat("Close #%I64d %s %s by #%I64d",position_ticket,position_symbol,EnumToString(type),request.position_by);
              //--- リクエストの送信
              if(!OrderSend(request,result))
                PrintFormat("OrderSend error %d",GetLastError()); // リクエストの送信に失敗した場合、エラーコードを出力する
 
              //--- 操作情報 
              PrintFormat("retcode=%u  deal=%I64u  order=%I64u",result.retcode,result.deal,result.order);
             }
          }
       }
    }
 }
//+------------------------------------------------------------------+