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