//+------------------------------------------------------------------+
//| 取引関数 |
//+------------------------------------------------------------------+
void OnTrade()
{
//--- 今週の取引履歴から直近約定のチケットを受け取る
ulong last_deal=GetLastDealTicket();
if(HistoryDealSelect(last_deal))
{
//--- 01.01.1970から経過したミリ秒数で表された約定の実行時刻
long deal_time_msc=HistoryDealGetInteger(last_deal,DEAL_TIME_MSC);
PrintFormat("Deal #%d DEAL_TIME_MSC=%i64 => %s",
last_deal,deal_time_msc,TimeToString(deal_time_msc/1000));
}
else
PrintFormat("HistoryDealSelect() failed for #%d. Eror code=%d",
last_deal,GetLastError());
//---
}
//+------------------------------------------------------------------+
//| 履歴内の最終約定チケットまたは -1 を返す |
//+------------------------------------------------------------------+
ulong GetLastDealTicket()
{
//--- 過去7日の履歴をリクエストする
if(!GetTradeHistory(7))
{
//--- 失敗した呼び出しを通知して -1 を返す
Print(__FUNCTION__," HistorySelect() returned false");
return -1;
}
//---
ulong first_deal,last_deal,deals=HistoryDealsTotal();
//--- あれば注文を操作する
if(deals>0)
{
Print("Deals = ",deals);
first_deal=HistoryDealGetTicket(0);
PrintFormat("first_deal = %d",first_deal);
if(deals>1)
{
last_deal=HistoryDealGetTicket((int)deals-1);
PrintFormat("last_deal = %d",last_deal);
return last_deal;
}
return first_deal;
}
//--- 約定が見つからないので -1 を返す
return -1;
}
//+--------------------------------------------------------------------------+
//| 過去数日の履歴をリクエストし、障害が発生した場合にはfalseを返す |
//+--------------------------------------------------------------------------+
bool GetTradeHistory(int days)
{
//--- 取引履歴を要求する週の期間を設定する
datetime to=TimeCurrent();
datetime from=to-days*PeriodSeconds(PERIOD_D1);
ResetLastError();
//--- リクエストして結果をチェックする
if(!HistorySelect(from,to))
{
Print(__FUNCTION__," HistorySelect=false. Error code=",GetLastError());
return false;
}
//--- 履歴が正常に受信された
return true;
}
|