LoginSignup
1

取引履歴のスリッページ情報を配列に取得する関数

Last updated at Posted at 2022-10-10

 MQL5には取引履歴より、注文価格と約定価格を取得することができます。この仕様により注文価格と約定価格の差に注文の売り買いに応じて符号±をつけてスリッページを求めます。ここでは指定した期間の取引履歴からスリッページを各取引で求め、配列で返す関数を作成しました。

 スリッページはブローカーによっては結構でかいマイナス要因となるので日ごろからチェックしておきたい項目ですね。また、注文価格を取得できないブローカーもあるので(注文価格=0になる)、うまくスリッページが取得できないときは残念ながらそういうことです…

関数の説明

引数 種類 説明
1 double out スリッページが入るdouble型の配列
2 ulong in マジックナンバー( -1は全マジックナンバーを指定 )
3 ENUM_DEAL_ENTRY in DEAL_ENTRY_INまたはDEAL_ENTRY_OUT。取得したい方。
4 datetime in 取得したい期間の開始日時
5 datetime in 取得したい期間の終了日時
戻り値 説明
bool 処理が成功ならtrue

ソースコード(コピペしたい方どうぞ)

.cpp
//+------------------------------------------------------------------+
//| 取引履歴のスリッページ情報を配列に取得する
//+------------------------------------------------------------------+
bool GetHistorySlippage(double &results[], const ulong magic_number, const ENUM_DEAL_ENTRY EDE, const datetime start, const datetime end)
  {
//--- 指定期間の取引履歴をリクエストする
   if(!HistorySelect(start, end))
      return (false);

   const ulong check_ma = 18446744073709551615; // magic_numberが-1だったとき
   
   uint  total_deals = HistoryDealsTotal(); // 履歴総数
   int   counter             = 0;           // 取引回数カウンター
   ulong ticket_history_deal = 0;           // ディールチケット
   
   ENUM_DEAL_ENTRY deal_entry;
   long            deal_type;
   long            deal_order;
   double          deal_price;
   double          order_price;
   double          slippage = 0;
   ulong           deal_magic;

//--- 配列を、履歴の取引数にリサイズ
   ArrayResize(results, total_deals);

//--- 全ての取引を配列に取得
   for(uint i = 0; i < total_deals; i++)
     {
      //--- 取引を選択する
      if((ticket_history_deal = HistoryDealGetTicket(i)) > 0)
        {
         deal_entry  = (ENUM_DEAL_ENTRY)HistoryDealGetInteger(ticket_history_deal, DEAL_ENTRY);
         deal_type   = HistoryDealGetInteger(ticket_history_deal, DEAL_TYPE);
         deal_order  = HistoryDealGetInteger(ticket_history_deal, DEAL_ORDER);
         order_price = HistoryOrderGetDouble(deal_order, ORDER_PRICE_OPEN);
         deal_price  = HistoryDealGetDouble(ticket_history_deal, DEAL_PRICE);
         deal_magic  = HistoryDealGetInteger(ticket_history_deal, DEAL_MAGIC);

         //--- 取引操作以外はスルー
         if((deal_type != DEAL_TYPE_BUY) && (deal_type != DEAL_TYPE_SELL))
            continue;
         
         //--- マジックナンバーの確認
         if( (deal_magic != magic_number)&&(check_ma != magic_number) )
            continue;

         //--- ENUM_DEAL_ENTRYで指定した情報のみ
         if(deal_entry == EDE)
           {
            if(deal_type == DEAL_TYPE_BUY){
              slippage = order_price - deal_price;
            }
            else if(deal_type == DEAL_TYPE_SELL){
              slippage = -(order_price - deal_price);
            }
            
            //--- 取引結果を配列に書き込み、取引のカウントアップ
            results[counter] = slippage;
            counter++;
           }
        }
     }
//--- 配列の最終サイズを設定する
   ArrayResize(results, counter);
   return (true);
  }

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
What you can do with signing up
1