OrderSendAsync

OrderSendAsync() 関数は、取引サーバの返答を待たずに非同期的な 取引操作を行うための リクエストの送信に使用されます。この関数は、サーバからの応答を待つ時間の無駄を容認出来ない取引アルゴリズムの条件下での高頻度取引のために設計されています。

bool  OrderSendAsync(
  MqlTradeRequest&  request,      // リクエスト構造体
  MqlTradeResult&   result       // 返答構造体
  );

パラメータ

request

[in]  クライエントの取引アクションを記述する MqlTradeRequest 型の構造体へのポインタ

result

[in,out]  成功した場合(true が返される場合)取引操作の結果を表す MqlTradeResult 型の構造体へのポインタ

戻り値

リクエストが取引サーバに送信された場合は true、それ以外の場合は false。リクエストが送信された場合 result 変数内で、レスポンスコードが TRADE_RETCODE_PLACED 値(コード 10008– order placed(注文が出された))を含みます。正常な実行は送信の事実のみを意味し、リクエストが取引サーバに到達し処理のために受け入れられている保証を与えるものではありません。受信したリクエストを処理する際、取引サーバは、ポジション、注文や約定の状態の変化を通知する応答をクライアント端末に送信し、これが Trade イベント生成につながります。

OrderSend() 関数で送られたリクエストをサーバ上で 実行した結果は OnTradeTransaction ハンドラで追跡出来ます。1 つの取引リクエストを実行する際に OnTradeTransaction ハンドラは複数回呼ばれることには留意されるべきです。

例えば、市場の買い注文を送信する際に、注文が処理され、買い注文が口座に記録されます。その後注文が実行されオープン注文の表から削除されて注文履歴に追加されます。約定履歴に追加され新しいポジションが作成されます。OnTradeTransaction 関数はこれらのイベント全部に呼び出されます。この様なデータの取得には、関数パラメータが分析されるべきです。

  • trans - このパラメータは取引口座に適用される取引トランザクションを記述する MqlTradeTransaction 構造体を取得します。
  • request - このパラメータは取引トランザクションにつながった取引リクエストを記述する MqlTradeRequest 構造体を取得します。
  • result - このパラメータは取引リクエスト実行の結果を記述する MqlTradeResult 構造体を取得します。

注意事項

パラメータの用途の点では、この関数は OrderSend() に似ていますが、それとは異なって非同期的です。つまり、関数の実行結果を待っている間にプログラム動作は止められません。サンプルのエキスパートアドバイザーを使用して、これら 2 つの関数の取引操作の速度を比較することが出来ます。

例:

#property description "Expert Advisor for sending trade requests "
                    " using OrderSendAsync() function.\r\n"
#property description "Handling trading events using"
                    " OnTrade() and OnTradeTransaction() handler functions is displayed\r\n"
#property description "Expert Advisor parameters allow setting Magic Number"
                    " (unique ID) "
#property description "and the mode of displaying messages in Experts log. All details are displayed by default.\r\n"
//--- 入力パラメータ
input int MagicNumber=1234567;     // エキスパートアドバイザー ID
input bool DescriptionModeFull=true; // 詳細出力モード
//--- HistorySelect() 呼び出しに使用される変数
datetime history_start;
//+------------------------------------------------------------------+
//| エキスパート初期化に使用される関数                                        |
//+------------------------------------------------------------------+
int OnInit()
 {
//--- 自動売買が許可されているかどうかをチェックする
  if(!TerminalInfoInteger(TERMINAL_TRADE_ALLOWED))
    {
    Alert("Autotrading in the terminal is disabled, Expert Advisor will be removed.");
    ExpertRemove();
    return(-1);
    }
//--- 実際の口座での取引が不可能
  if(AccountInfoInteger(ACCOUNT_TRADE_MODE)==ACCOUNT_TRADE_MODE_REAL)
    {
    Alert("Expert Advisor cannot trade on a real account!");
    ExpertRemove();
    return(-2);
    }
//--- この口座で取引が可能かどうかをみる(例えば、投資家のパスワードを使用しての取引は不可能)
  if(!AccountInfoInteger(ACCOUNT_TRADE_ALLOWED))
    {
    Alert("Trading on this account is disabled");
    ExpertRemove();
    return(-3);
    }
//--- 取引履歴を受信するためにエキスパートアドバイザーを起動する時間を節約する
  history_start=TimeCurrent();
//---
  CreateBuySellButtons();
  return(INIT_SUCCEEDED);
 }
//+------------------------------------------------------------------+
//| エキスパート初期化解除に使用される関数                                    |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
 {
//--- 全てのグラフィックオブジェクトを削除する
  ObjectDelete(0,"Buy");
  ObjectDelete(0,"Sell");
//---
 }
//+------------------------------------------------------------------+
//| TradeTransaction 関数                                             |
//+------------------------------------------------------------------+
void OnTradeTransaction(const MqlTradeTransaction &trans,
                      const MqlTradeRequest &request,
                      const MqlTradeResult &result)
 {
//--- 取引イベントのハンドラ関数名にちなんだ名付け見出し
  Print("=> ",__FUNCTION__," at ",TimeToString(TimeCurrent(),TIME_SECONDS));
//--- トランザクションタイプを列挙値として取得する
  ENUM_TRADE_TRANSACTION_TYPE type=trans.type;
//--- トランザクションがリクエスト処理の結果の場合
  if(type==TRADE_TRANSACTION_REQUEST)
    {
    //--- トランザクション名を表示する
    Print(EnumToString(type));
    //--- 処理されたリクエストを記述する文字列を表示する
    Print("------------RequestDescription\r\n",
           RequestDescription(request,DescriptionModeFull));
    //--- そしてリクエスト結果の記述を表示する
    Print("------------ ResultDescription\r\n",
           TradeResultDescription(result,DescriptionModeFull));
    }
  else // トランザクションの他のトランザクションのための完全な記述を表示する
    {
    Print("------------ TransactionDescription\r\n",
           TransactionDescription(trans,DescriptionModeFull));
    }
//---    
 }
//+------------------------------------------------------------------+
//| 取引関数                                                          |
//+------------------------------------------------------------------+
void OnTrade()
 {
//--- 取引口座の状態を格納する静的メンバ
  static int prev_positions=0,prev_orders=0,prev_deals=0,prev_history_orders=0;
//--- 取引履歴をリクエストする
  bool update=HistorySelect(history_start,TimeCurrent());
  PrintFormat("HistorySelect(%s , %s) = %s",
              TimeToString(history_start),TimeToString(TimeCurrent()),(string)update);
//--- 取引イベントのハンドラ関数名にちなんだ名付け見出し
  Print("=> ",__FUNCTION__," at ",TimeToString(TimeCurrent(),TIME_SECONDS));
//--- ハンドラの名称と処理の瞬間の注文数を表示する
  int curr_positions=PositionsTotal();
  int curr_orders=OrdersTotal();
  int curr_deals=HistoryOrdersTotal();
  int curr_history_orders=HistoryDealsTotal();
//--- 注文、ポジション、及び約定の数、またカッコ内に変更を表示
  PrintFormat("PositionsTotal() = %d (%+d)",
              curr_positions,(curr_positions-prev_positions));
  PrintFormat("OrdersTotal() = %d (%+d)",
              curr_orders,curr_orders-prev_orders);
  PrintFormat("HistoryOrdersTotal() = %d (%+d)",
              curr_deals,curr_deals-prev_deals);
  PrintFormat("HistoryDealsTotal() = %d (%+d)",
              curr_history_orders,curr_history_orders-prev_history_orders);
//--- ログをより便利に表示する文字列の区切りを挿入する
  Print("");
//--- 口座の状態を保存する
  prev_positions=curr_positions;
  prev_orders=curr_orders;
  prev_deals=curr_deals;
  prev_history_orders=curr_history_orders;
//---
 }
//+------------------------------------------------------------------+
//| ChartEvent 関数                                                   |
//+------------------------------------------------------------------+
void OnChartEvent(const int id,
                const long &lparam,
                const double &dparam,
                const string &sparam)
 {
//--- CHARTEVENT_CLICK イベント(「チャートクリック」)の処理
  if(id==CHARTEVENT_OBJECT_CLICK)
    {
    Print("=> ",__FUNCTION__,": sparam = ",sparam);
    //---約定の最小ボリューム
    double volume_min=SymbolInfoDouble(_Symbol,SYMBOL_VOLUME_MIN);
    //--- 「Buy」 ボタンが押されたら、買う
    if(sparam=="Buy")
       {
        PrintFormat("Buy %s %G lot",_Symbol,volume_min);
        BuyAsync(volume_min);
        //--- ボタンを放す
        ObjectSetInteger(0,"Buy",OBJPROP_STATE,false);
       }
    //--- 「Sell」ボタンが押されたら、売る
    if(sparam=="Sell")
       {
        PrintFormat("Sell %s %G lot",_Symbol,volume_min);
        SellAsync(volume_min);
        //--- ボタンを放す
        ObjectSetInteger(0,"Sell",OBJPROP_STATE,false);
       }
    ChartRedraw();
    }
//---        
 }
//+------------------------------------------------------------------+
//| トランザクションの記述を文字列として返す                                     |
//+------------------------------------------------------------------+
string TransactionDescription(const MqlTradeTransaction &trans,
                            const bool detailed=true)
 {
//--- 関数が返す文字列を準備する
  string desc=EnumToString(trans.type)+"\r\n";
//--- detailed(繊細)モードでは繊細が全て追加される
  if(detailed)
    {
     desc+="Symbol: "+trans.symbol+"\r\n";
     desc+="Deal ticket: "+(string)trans.deal+"\r\n";
     desc+="Deal type: "+EnumToString(trans.deal_type)+"\r\n";
     desc+="Order ticket: "+(string)trans.order+"\r\n";
     desc+="Order type: "+EnumToString(trans.order_type)+"\r\n";
     desc+="Order state: "+EnumToString(trans.order_state)+"\r\n";
     desc+="Order time type: "+EnumToString(trans.time_type)+"\r\n";
     desc+="Order expiration: "+TimeToString(trans.time_expiration)+"\r\n";
     desc+="Price: "+StringFormat("%G",trans.price)+"\r\n";
     desc+="Price trigger: "+StringFormat("%G",trans.price_trigger)+"\r\n";
     desc+="Stop Loss: "+StringFormat("%G",trans.price_sl)+"\r\n";
     desc+="Take Profit: "+StringFormat("%G",trans.price_tp)+"\r\n";
     desc+="Volume: "+StringFormat("%G",trans.volume)+"\r\n";
    }
//--- 受信された文字列を返す
  return desc;
 }
//+------------------------------------------------------------------+
//| 取引リクエストのテキスト記述を返す                                         |
//+------------------------------------------------------------------+
string RequestDescription(const MqlTradeRequest &request,
                        const bool detailed=true)
 {
//--- 関数が返す文字列を準備する
  string desc=EnumToString(request.action)+"\r\n";
//--- detailed(繊細)モードでは、使用可能のデータを全て追加する
  if(detailed)
    {
     desc+="Symbol: "+request.symbol+"\r\n";
     desc+="Magic Number: "+StringFormat("%d",request.magic)+"\r\n";
     desc+="Order ticket: "+(string)request.order+"\r\n";
     desc+="Order type: "+EnumToString(request.type)+"\r\n";
     desc+="Order filling: "+EnumToString(request.type_filling)+"\r\n";
     desc+="Order time type: "+EnumToString(request.type_time)+"\r\n";
     desc+="Order expiration: "+TimeToString(request.expiration)+"\r\n";
     desc+="Price: "+StringFormat("%G",request.price)+"\r\n";
     desc+="Deviation points: "+StringFormat("%G",request.deviation)+"\r\n";
     desc+="Stop Loss: "+StringFormat("%G",request.sl)+"\r\n";
     desc+="Take Profit: "+StringFormat("%G",request.tp)+"\r\n";
     desc+="Stop Limit: "+StringFormat("%G",request.stoplimit)+"\r\n";
     desc+="Volume: "+StringFormat("%G",request.volume)+"\r\n";
     desc+="Comment: "+request.comment+"\r\n";
    }
//--- 受信された文字列を返す
  return desc;
 }
//+------------------------------------------------------------------+
//| リクエスト処理結果の記述ををテキスト形式で返す                                |
//+------------------------------------------------------------------+
string TradeResultDescription(const MqlTradeResult &result,
                            const bool detailed=true)
 {
//--- 関数が返す文字列を準備する
  string desc="Retcode "+(string)result.retcode+"\r\n";
//--- detailed(繊細)モードでは、使用可能のデータを全て追加する
  if(detailed)
    {
     desc+="Request ID: "+StringFormat("%d",result.request_id)+"\r\n";
     desc+="Order ticket: "+(string)result.order+"\r\n";
     desc+="Deal ticket: "+(string)result.deal+"\r\n";
     desc+="Volume: "+StringFormat("%G",result.volume)+"\r\n";
     desc+="Price: "+StringFormat("%G",result.price)+"\r\n";
     desc+="Ask: "+StringFormat("%G",result.ask)+"\r\n";
     desc+="Bid: "+StringFormat("%G",result.bid)+"\r\n";
     desc+="Comment: "+result.comment+"\r\n";
    }
//--- 受信された文字列を返す
  return desc;
 }
//+------------------------------------------------------------------+
//| 売買に必要な 2 つのボタンを作成する                                       |
//+------------------------------------------------------------------+
void CreateBuySellButtons()
 {
//--- 「Buy」オブジェクトをチェックする
  if(ObjectFind(0,"Buy")>=0)
    {
    //--- 見つかったオブジェクトがボタンでない場合は削除する
    if(ObjectGetInteger(0,"Buy",OBJPROP_TYPE)!=OBJ_BUTTON)
        ObjectDelete(0,"Buy");
    }
  else
    ObjectCreate(0,"Buy",OBJ_BUTTON,0,0,0); // 「Buy」 ボタンを作成する
//--- 「Buy」 ボタンを設定する
  ObjectSetInteger(0,"Buy",OBJPROP_CORNER,CORNER_RIGHT_UPPER);
  ObjectSetInteger(0,"Buy",OBJPROP_XDISTANCE,100);
  ObjectSetInteger(0,"Buy",OBJPROP_YDISTANCE,50);
  ObjectSetInteger(0,"Buy",OBJPROP_XSIZE,70);
  ObjectSetInteger(0,"Buy",OBJPROP_YSIZE,30);
  ObjectSetString(0,"Buy",OBJPROP_TEXT,"Buy");
  ObjectSetInteger(0,"Buy",OBJPROP_COLOR,clrRed);
//--- 「Sell」オブジェクトの存在をチェックする
  if(ObjectFind(0,"Sell")>=0)
    {
    //--- 見つかったオブジェクトがボタンでない場合は削除する
    if(ObjectGetInteger(0,"Sell",OBJPROP_TYPE)!=OBJ_BUTTON)
        ObjectDelete(0,"Sell");
    }
  else
    ObjectCreate(0,"Sell",OBJ_BUTTON,0,0,0); // 「 Sell 」ボタンを作成する
//--- 「Sell」 ボタンを設定する
  ObjectSetInteger(0,"Sell",OBJPROP_CORNER,CORNER_RIGHT_UPPER);
  ObjectSetInteger(0,"Sell",OBJPROP_XDISTANCE,100);
  ObjectSetInteger(0,"Sell",OBJPROP_YDISTANCE,100);
  ObjectSetInteger(0,"Sell",OBJPROP_XSIZE,70);
  ObjectSetInteger(0,"Sell",OBJPROP_YSIZE,30);
  ObjectSetString(0,"Sell",OBJPROP_TEXT,"Sell");
  ObjectSetInteger(0,"Sell",OBJPROP_COLOR,clrBlue);
//--- ボタンをすぐに表示するためにチャートの強制アップデートを実行する
  ChartRedraw();
//---
 }
//+------------------------------------------------------------------+
//| OrderSendAsync() 非同期的関数を使用して買う                            |
//+------------------------------------------------------------------+
void BuyAsync(double volume)
 {
//--- リクエストを準備する
  MqlTradeRequest req={0};
  req.action      =TRADE_ACTION_DEAL;
  req.symbol      =_Symbol;
  req.magic       =MagicNumber;
  req.volume      =0.1;
  req.type        =ORDER_TYPE_BUY;
  req.price       =SymbolInfoDouble(req.symbol,SYMBOL_ASK);
  req.deviation   =10;
  req.comment     ="Buy using OrderSendAsync()";
  MqlTradeResult  res={0};
  if(!OrderSendAsync(req,res))
    {
    Print(__FUNCTION__,": error ",GetLastError(),", retcode = ",res.retcode);
    }
//---
 }
//+------------------------------------------------------------------+
//| OrderSendAsync() 非同期的関数を使用して売る                            |
//+------------------------------------------------------------------+
void SellAsync(double volume)
 {
//--- リクエストを準備する
  MqlTradeRequest req={0};
  req.action      =TRADE_ACTION_DEAL;
  req.symbol      =_Symbol;
  req.magic       =MagicNumber;
  req.volume      =0.1;
  req.type        =ORDER_TYPE_SELL;
  req.price       =SymbolInfoDouble(req.symbol,SYMBOL_BID);
  req.deviation   =10;
  req.comment     ="Sell using OrderSendAsync()";
  MqlTradeResult  res={0};
  if(!OrderSendAsync(req,res))
    {
    Print(__FUNCTION__,": error ",GetLastError(),", retcode = ",res.retcode);
    }
//---
 }
//+------------------------------------------------------------------+

「エキスパート」操作ログでのメッセージ表示の例:

12:52:52   ExpertAdvisor (EURUSD,H1)   => OnChartEvent: sparam = Sell
12:52:52   ExpertAdvisor (EURUSD,H1)   Sell EURUSD 0.01 lot
12:52:52   ExpertAdvisor (EURUSD,H1)   => OnTradeTransaction at 09:52:53
12:52:52   ExpertAdvisor (EURUSD,H1)   TRADE_TRANSACTION_REQUEST
12:52:52   ExpertAdvisor (EURUSD,H1)   ------------RequestDescription
12:52:52   ExpertAdvisor (EURUSD,H1)   TRADE_ACTION_DEAL
12:52:52   ExpertAdvisor (EURUSD,H1)   Symbol: EURUSD
12:52:52   ExpertAdvisor (EURUSD,H1)   Magic Number: 1234567
12:52:52   ExpertAdvisor (EURUSD,H1)   Order ticket: 16361998
12:52:52   ExpertAdvisor (EURUSD,H1)   Order type: ORDER_TYPE_SELL
12:52:52   ExpertAdvisor (EURUSD,H1)   Order filling: ORDER_FILLING_FOK
12:52:52   ExpertAdvisor (EURUSD,H1)   Order time type: ORDER_TIME_GTC
12:52:52   ExpertAdvisor (EURUSD,H1)   Order expiration: 1970.01.01 00:00
12:52:52   ExpertAdvisor (EURUSD,H1)   Price: 1.29313
12:52:52   ExpertAdvisor (EURUSD,H1)   Deviation points: 10
12:52:52   ExpertAdvisor (EURUSD,H1)   Stop Loss: 0
12:52:52   ExpertAdvisor (EURUSD,H1)   Take Profit: 0
12:52:52   ExpertAdvisor (EURUSD,H1)   Stop Limit: 0
12:52:52   ExpertAdvisor (EURUSD,H1)   Volume: 0.1
12:52:52   ExpertAdvisor (EURUSD,H1)   Comment: Sell using OrderSendAsync()
12:52:52   ExpertAdvisor (EURUSD,H1)  
12:52:52   ExpertAdvisor (EURUSD,H1)   ------------ ResultDescription
12:52:52   ExpertAdvisor (EURUSD,H1)   Retcode 10009
12:52:52   ExpertAdvisor (EURUSD,H1)   Request ID: 2
12:52:52   ExpertAdvisor (EURUSD,H1)   Order ticket: 16361998
12:52:52   ExpertAdvisor (EURUSD,H1)   Deal ticket: 15048668
12:52:52   ExpertAdvisor (EURUSD,H1)   Volume: 0.1
12:52:52   ExpertAdvisor (EURUSD,H1)   Price: 1.29313
12:52:52   ExpertAdvisor (EURUSD,H1)   Ask: 1.29319
12:52:52   ExpertAdvisor (EURUSD,H1)   Bid: 1.29313
12:52:52   ExpertAdvisor (EURUSD,H1)   Comment:
12:52:52   ExpertAdvisor (EURUSD,H1)  
12:52:52   ExpertAdvisor (EURUSD,H1)   HistorySelect( 09:34 , 09:52) = true
12:52:52   ExpertAdvisor (EURUSD,H1)   => OnTrade at 09:52:53
12:52:52   ExpertAdvisor (EURUSD,H1)   PositionsTotal() = 1 (+1)
12:52:52   ExpertAdvisor (EURUSD,H1)   OrdersTotal() = 0 (+0)
12:52:52   ExpertAdvisor (EURUSD,H1)   HistoryOrdersTotal() = 2 (+2)
12:52:52   ExpertAdvisor (EURUSD,H1)   HistoryDealsTotal() = 2 (+2)
12:52:52   ExpertAdvisor (EURUSD,H1)  
12:52:52   ExpertAdvisor (EURUSD,H1)   => OnTradeTransaction at 09:52:53
12:52:52   ExpertAdvisor (EURUSD,H1)   ------------ TransactionDescription
12:52:52   ExpertAdvisor (EURUSD,H1)   TRADE_TRANSACTION_ORDER_ADD
12:52:52   ExpertAdvisor (EURUSD,H1)   Symbol: EURUSD
12:52:52   ExpertAdvisor (EURUSD,H1)   Deal ticket: 0
12:52:52   ExpertAdvisor (EURUSD,H1)   Deal type: DEAL_TYPE_BUY
12:52:52   ExpertAdvisor (EURUSD,H1)   Order ticket: 16361998
12:52:52   ExpertAdvisor (EURUSD,H1)   Order type: ORDER_TYPE_SELL
12:52:52   ExpertAdvisor (EURUSD,H1)   Order state: ORDER_STATE_STARTED
12:52:52   ExpertAdvisor (EURUSD,H1)   Order time type: ORDER_TIME_GTC
12:52:52   ExpertAdvisor (EURUSD,H1)   Order expiration: 1970.01.01 00:00
12:52:52   ExpertAdvisor (EURUSD,H1)   Price: 1.29313
12:52:52   ExpertAdvisor (EURUSD,H1)   Price trigger: 0
12:52:52   ExpertAdvisor (EURUSD,H1)   Stop Loss: 0
12:52:52   ExpertAdvisor (EURUSD,H1)   Take Profit: 0
12:52:52   ExpertAdvisor (EURUSD,H1)   Volume: 0.1
12:52:52   ExpertAdvisor (EURUSD,H1)  
12:52:52   ExpertAdvisor (EURUSD,H1)   => OnTradeTransaction at 09:52:53
12:52:52   ExpertAdvisor (EURUSD,H1)   ------------ TransactionDescription
12:52:52   ExpertAdvisor (EURUSD,H1)   TRADE_TRANSACTION_ORDER_DELETE
12:52:52   ExpertAdvisor (EURUSD,H1)   Symbol: EURUSD
12:52:52   ExpertAdvisor (EURUSD,H1)   Deal ticket: 0
12:52:52   ExpertAdvisor (EURUSD,H1)   Deal type: DEAL_TYPE_BUY
12:52:52   ExpertAdvisor (EURUSD,H1)   Order ticket: 16361998
12:52:52   ExpertAdvisor (EURUSD,H1)   Order type: ORDER_TYPE_SELL
12:52:52   ExpertAdvisor (EURUSD,H1)   Order state: ORDER_STATE_STARTED
12:52:52   ExpertAdvisor (EURUSD,H1)   Order time type: ORDER_TIME_GTC
12:52:52   ExpertAdvisor (EURUSD,H1)   Order expiration: 1970.01.01 00:00
12:52:52   ExpertAdvisor (EURUSD,H1)   Price: 1.29313
12:52:52   ExpertAdvisor (EURUSD,H1)   Price trigger: 0
12:52:52   ExpertAdvisor (EURUSD,H1)   Stop Loss: 0
12:52:52   ExpertAdvisor (EURUSD,H1)   Take Profit: 0
12:52:52   ExpertAdvisor (EURUSD,H1)   Volume: 0.1
12:52:52   ExpertAdvisor (EURUSD,H1)  
12:52:52   ExpertAdvisor (EURUSD,H1)   HistorySelect( 09:34 , 09:52) = true
12:52:52   ExpertAdvisor (EURUSD,H1)   => OnTrade at 09:52:53
12:52:52   ExpertAdvisor (EURUSD,H1)   PositionsTotal() = 1 (+0)
12:52:52   ExpertAdvisor (EURUSD,H1)   OrdersTotal() = 0 (+0)
12:52:52   ExpertAdvisor (EURUSD,H1)   HistoryOrdersTotal() = 2 (+0)
12:52:52   ExpertAdvisor (EURUSD,H1)   HistoryDealsTotal() = 2 (+0)
12:52:52   ExpertAdvisor (EURUSD,H1)  
12:52:52   ExpertAdvisor (EURUSD,H1)   => OnTradeTransaction at 09:52:53
12:52:52   ExpertAdvisor (EURUSD,H1)   ------------ TransactionDescription
12:52:52   ExpertAdvisor (EURUSD,H1)   TRADE_TRANSACTION_HISTORY_ADD
12:52:52   ExpertAdvisor (EURUSD,H1)   Symbol: EURUSD
12:52:52   ExpertAdvisor (EURUSD,H1)   Deal ticket: 0
12:52:52   ExpertAdvisor (EURUSD,H1)   Deal type: DEAL_TYPE_BUY
12:52:52   ExpertAdvisor (EURUSD,H1)   Order ticket: 16361998
12:52:52   ExpertAdvisor (EURUSD,H1)   Order type: ORDER_TYPE_SELL
12:52:52   ExpertAdvisor (EURUSD,H1)   Order state: ORDER_STATE_FILLED
12:52:52   ExpertAdvisor (EURUSD,H1)   Order time type: ORDER_TIME_GTC
12:52:52   ExpertAdvisor (EURUSD,H1)   Order expiration: 1970.01.01 00:00
12:52:52   ExpertAdvisor (EURUSD,H1)   Price: 1.29313
12:52:52   ExpertAdvisor (EURUSD,H1)   Price trigger: 0
12:52:52   ExpertAdvisor (EURUSD,H1)   Stop Loss: 0
12:52:52   ExpertAdvisor (EURUSD,H1)   Take Profit: 0
12:52:52   ExpertAdvisor (EURUSD,H1)   Volume: 0
12:52:52   ExpertAdvisor (EURUSD,H1)  
12:52:52   ExpertAdvisor (EURUSD,H1)   HistorySelect( 09:34 , 09:52) = true
12:52:52   ExpertAdvisor (EURUSD,H1)   => OnTrade at 09:52:53
12:52:52   ExpertAdvisor (EURUSD,H1)   PositionsTotal() = 1 (+0)
12:52:52   ExpertAdvisor (EURUSD,H1)   OrdersTotal() = 0 (+0)
12:52:52   ExpertAdvisor (EURUSD,H1)   HistoryOrdersTotal() = 2 (+0)
12:52:52   ExpertAdvisor (EURUSD,H1)   HistoryDealsTotal() = 2 (+0)
12:52:52   ExpertAdvisor (EURUSD,H1)  
12:52:52   ExpertAdvisor (EURUSD,H1)   => OnTradeTransaction at 09:52:53
12:52:52   ExpertAdvisor (EURUSD,H1)   ------------ TransactionDescription
12:52:52   ExpertAdvisor (EURUSD,H1)   TRADE_TRANSACTION_DEAL_ADD
12:52:52   ExpertAdvisor (EURUSD,H1)   Symbol: EURUSD
12:52:52   ExpertAdvisor (EURUSD,H1)   Deal ticket: 15048668
12:52:52   ExpertAdvisor (EURUSD,H1)   Deal type: DEAL_TYPE_SELL
12:52:52   ExpertAdvisor (EURUSD,H1)   Order ticket: 16361998
12:52:52   ExpertAdvisor (EURUSD,H1)   Order type: ORDER_TYPE_BUY
12:52:52   ExpertAdvisor (EURUSD,H1)   Order state: ORDER_STATE_STARTED
12:52:52   ExpertAdvisor (EURUSD,H1)   Order time type: ORDER_TIME_GTC
12:52:52   ExpertAdvisor (EURUSD,H1)   Order expiration: 1970.01.01 00:00
12:52:52   ExpertAdvisor (EURUSD,H1)   Price: 1.29313
12:52:52   ExpertAdvisor (EURUSD,H1)   Price trigger: 0
12:52:52   ExpertAdvisor (EURUSD,H1)   Stop Loss: 0
12:52:52   ExpertAdvisor (EURUSD,H1)   Take Profit: 0
12:52:52   ExpertAdvisor (EURUSD,H1)   Volume: 0.1
12:52:52   ExpertAdvisor (EURUSD,H1)  
12:52:52   ExpertAdvisor (EURUSD,H1)   HistorySelect( 09:34 , 09:52) = true
12:52:52   ExpertAdvisor (EURUSD,H1)   => OnTrade at 09:52:53
12:52:52   ExpertAdvisor (EURUSD,H1)   PositionsTotal() = 1 (+0)
12:52:52   ExpertAdvisor (EURUSD,H1)   OrdersTotal() = 0 (+0)
12:52:52   ExpertAdvisor (EURUSD,H1)   HistoryOrdersTotal() = 2 (+0)
12:52:52   ExpertAdvisor (EURUSD,H1)   HistoryDealsTotal() = 2 (+0)
12:52:52   ExpertAdvisor (EURUSD,H1)