设为首页 收藏本站 切换语言

OnTradeTransaction函数介绍

| 发表于 2023-1-18 23:44:53 | 显示全部楼层 |复制链接
© 本贴为 xxtz 原创/首发,严禁抄袭!
EA调用TradeTransaction事件发生的OnTradeTransaction()函数较少在本网站述及,在此记录学习过程。


void  OnTradeTransaction()
   const MqlTradeTransaction&    trans,     // trade transaction structure
   const MqlTradeRequest&        request,   // request structure
   const MqlTradeResult&         result     // response structure
   );
该函数有三个参数:
1.  trans
[in]  MqlTradeTransaction 类型变量,它主要用来描述交易类型。
2. request
[in]  MqlTradeRequest  类型变量 ,描述启动一个交易的请求,它包含TRADE_TRANSACTION_REQUEST 类型的值。它是个ENUM_TRADE_REQUEST_ACTIONS 枚举变量,主要描述请求动作:deal,pending,sltp,modify,remove,closeby.
3. result
[in]  MqlTradeResult 类型变量,包含了发出请求交易的执行结果。它包含TRADE_TRANSACTION_RESULT类型的值,描述服务器对应收到的交易请求的返回结果:return code,deal ticket,order ticket(针对pending order),volume,deal price,bid,ask,comment(经纪商对操作的注释),request ID(发出交易请求时终端设定),code of error(外部交易系统返回的)

OnTradeTransaction() 在如下4种情况下被调用(总记录最近的),用来处理交易服务器发给终端的 TradeTransaction 事件:
1. 从MQL5程序使用OrderSend()或OrderSendAsync()函数发出的交易请求和随后的执行;
2. 人工通过GUI发出的交易请求和随后的执行;
3. 在服务器上激活挂单;
4. 在服务器上执行操作;

MqlTradeTransaction 类型变量包括嗯呢trans变量,交易类型有枚举变量ENUM_TRADE_TRANSACTION_TYPE 描述,主要是Order_Add,Order_update(变更一个现存的order),Order_delete,deal_add(增加一个deal进入历史),deal_update,deal_delete,history_add(由于执行或取消而在交易历史中增加订单order),history_update(order历史中改变一个order),history_delete,position(与交易执行无关的开仓变化),request (服务器发出的交易请求已经被处理的通知以及处理结果已收到)。

在分析TradeTransaction时,为了收集必要的信息是有必要分析第二、三个参数(request和result)。
例如:发出开仓请求将导致:1. 请求已被服务去收到进行处理;2. 开仓订单在账户里创建;3. 订单被执行;4. 执行的订单将被从活动状态移除;5.到订单历史中 ;6. 随后的交易将被增加的历史中;7. 在账户中新的仓位被创建。 所有这些过程都是 TradeTransaction 事件。

EA的OnTradeTransaction函数句柄将用来处理交易。终端不断处理进来的交易,所以交易账户状态也会随着OnTradeTransaction函数的运行而不断变化,程序会被通知所有这些交易事件。

交易队列长度了1024个单元,OnTradeTransaction会由于队列过长,新的交易会取代在队列中前面的交易。

不要与OnTrade函数混淆,OnTrade是用来处理订单、仓位和交易清单的改变,它只能由EA调用。
OnTrade()函数句柄是在适当的 OnTradeTransaction() 函数调用后才被调用。一般来说, 函数OnTrade () 和 OnTradeTransaction () 调用数目并无精确的相关性。一个OnTrade() 调用对应了一个或几个OnTradeTransaction的调用.

以下是一个官网给出的例子:
  1. //+------------------------------------------------------------------+
  2. //| TradeTransaction function                                        |
  3. //+------------------------------------------------------------------+
  4. void OnTradeTransaction(const MqlTradeTransaction &trans,
  5.                         const MqlTradeRequest &request,
  6.                         const MqlTradeResult &result)
  7.   {
  8. //---
  9.    static int counter=0;   // counter of OnTradeTransaction() calls
  10.    static uint lasttime=0; // time of the OnTradeTransaction() last call
  11. //---
  12.    uint time=GetTickCount(); //自从系统开始所过去多少milliseconds,不关机会overfilled49.7天后
  13. //--- if the last transaction was performed more than 1 second ago,
  14.    if(time-lasttime>1000)
  15.      {
  16.       counter=0; // then this is a new trade operation, an the counter can be reset
  17.       if(IS_DEBUG_MODE)
  18.          Print(" New trade operation");
  19.      }
  20.    lasttime=time;
  21.    counter++;
  22.    Print(counter,". ",__FUNCTION__);
  23. //--- result of trade request execution
  24.    ulong            lastOrderID   =trans.order;
  25.    ENUM_ORDER_TYPE  lastOrderType =trans.order_type;
  26.    ENUM_ORDER_STATE lastOrderState=trans.order_state;
  27. //--- the name of the symbol, for which a transaction was performed
  28.    string trans_symbol=trans.symbol;
  29. //--- type of transaction   这个是比较经典的使用方法从type入手
  30.    ENUM_TRADE_TRANSACTION_TYPE  trans_type=trans.type;
  31.    switch(trans.type)
  32.      {
  33.       case  TRADE_TRANSACTION_POSITION:   // position modification
  34.         {
  35.          ulong pos_ID=trans.position;
  36.          PrintFormat("MqlTradeTransaction: Position  #%d %s modified: SL=%.5f TP=%.5f",
  37.                      pos_ID,trans_symbol,trans.price_sl,trans.price_tp);
  38.         }
  39.       break;
  40.       case TRADE_TRANSACTION_REQUEST:     // sending a trade request
  41.          PrintFormat("MqlTradeTransaction: TRADE_TRANSACTION_REQUEST");
  42.          break;
  43.       case TRADE_TRANSACTION_DEAL_ADD:    // adding a trade
  44.         {
  45.          ulong          lastDealID   =trans.deal;
  46.          ENUM_DEAL_TYPE lastDealType =trans.deal_type;
  47.          double        lastDealVolume=trans.volume;
  48.          //--- Trade ID in an external system - a ticket assigned by an exchange
  49.          string Exchange_ticket="";
  50.          if(HistoryDealSelect(lastDealID))
  51.             Exchange_ticket=HistoryDealGetString(lastDealID,DEAL_EXTERNAL_ID);
  52.          if(Exchange_ticket!="")
  53.             Exchange_ticket=StringFormat("(Exchange deal=%s)",Exchange_ticket);
  54.   
  55.          PrintFormat("MqlTradeTransaction: %s deal #%d %s %s %.2f lot   %s",EnumToString(trans_type),
  56.                      lastDealID,EnumToString(lastDealType),trans_symbol,lastDealVolume,Exchange_ticket);
  57.         }
  58.       break;
  59.       case TRADE_TRANSACTION_HISTORY_ADD: // adding an order to the history
  60.         {
  61.          //--- order ID in an external system - a ticket assigned by an Exchange
  62.          string Exchange_ticket="";
  63.          if(lastOrderState==ORDER_STATE_FILLED)
  64.            {
  65.             if(HistoryOrderSelect(lastOrderID))
  66.                Exchange_ticket=HistoryOrderGetString(lastOrderID,ORDER_EXTERNAL_ID);
  67.             if(Exchange_ticket!="")
  68.                Exchange_ticket=StringFormat("(Exchange ticket=%s)",Exchange_ticket);
  69.            }
  70.          PrintFormat("MqlTradeTransaction: %s order #%d %s %s %s   %s",EnumToString(trans_type),
  71.                      lastOrderID,EnumToString(lastOrderType),trans_symbol,EnumToString(lastOrderState),Exchange_ticket);
  72.         }
  73.       break;
  74.       default: // other transactions   
  75.         {
  76.          //--- order ID in an external system - a ticket assigned by Exchange
  77.          string Exchange_ticket="";
  78.          if(lastOrderState==ORDER_STATE_PLACED)
  79.            {
  80.             if(OrderSelect(lastOrderID))
  81.                Exchange_ticket=OrderGetString(ORDER_EXTERNAL_ID);
  82.             if(Exchange_ticket!="")
  83.                Exchange_ticket=StringFormat("Exchange ticket=%s",Exchange_ticket);
  84.            }
  85.          PrintFormat("MqlTradeTransaction: %s order #%d %s %s   %s",EnumToString(trans_type),
  86.                      lastOrderID,EnumToString(lastOrderType),EnumToString(lastOrderState),Exchange_ticket);
  87.         }
  88.       break;
  89.      }
  90. //--- order ticket     
  91.    ulong orderID_result=result.order;
  92.    string retcode_result=GetRetcodeID(result.retcode);
  93.    if(orderID_result!=0)
  94.       PrintFormat("MqlTradeResult: order #%d retcode=%s ",orderID_result,retcode_result);
  95. //---   
  96.   }
复制代码

以下是在N根K线后开单的使用OnTransactionTrade的虚拟程序的例子:
  1. -------One deal in N bars---------
  2. #property version   "1.00"
  3. //--- input parameters
  4. input uchar    InpBars              = 10;     //   10根K线后下单
  5. input ulong    InpDeviation     = 1000; // 偏差点数, in points (1.09123-1.08123=1000 points)
  6. input ulong    InpMagic           = 2;      // 幻数
  7. //---
  8. datetime m_last_deal_IN = 0;              // "0" -> D'1970.01.01 00:00';
  9.   
  10. void OnTick()
  11.   {
  12. //--- 在这写的入场或其他信号
  13.    if(PositionsTotal()==0)
  14.      {
  15.       datetime time[];
  16.       ArraySetAsSeries(time,true);
  17.       int start_pos=0;           // 拷贝时间的开始位置
  18.       int count=InpBars+1;  // 拷贝多少根K线
  19.       if(CopyTime(Symbol(),Period(),start_pos,count,time)!=count)
  20.          return;
  21.       //--- check
  22.       if(time[InpBars]>m_last_deal_IN)// 前第10根K线的开始时间已经大于最近一次开仓时间
  23.         {
  24.          //--- 开仓
  25.         }
  26.      }
  27.   }  
  28.   
  29. void OnTradeTransaction(const MqlTradeTransaction &trans,
  30.                         const MqlTradeRequest &request,
  31.                         const MqlTradeResult &result)
  32.   {
  33.    ENUM_TRADE_TRANSACTION_TYPE type=trans.type;
  34.    if(type==TRADE_TRANSACTION_DEAL_ADD)  
  35.      {
  36.       long     deal_ticket       =0;
  37.       long     deal_order        =0;
  38.       long     deal_time         =0;
  39.       long     deal_time_msc     =0;
  40.       long     deal_type         =-1;
  41.       long     deal_entry        =-1;
  42.       long     deal_magic        =0;
  43.       long     deal_reason       =-1;
  44.       long     deal_position_id  =0;
  45.       double   deal_volume       =0.0;
  46.       double   deal_price        =0.0;
  47.       double   deal_commission   =0.0;
  48.       double   deal_swap         =0.0;
  49.       double   deal_profit       =0.0;
  50.       string   deal_symbol       ="";
  51.       string   deal_comment      ="";
  52.       string   deal_external_id  ="";
  53.       if(HistoryDealSelect(trans.deal))
  54.         {
  55.          deal_ticket         =HistoryDealGetInteger(trans.deal,DEAL_TICKET);
  56.          deal_order         =HistoryDealGetInteger(trans.deal,DEAL_ORDER);
  57.          deal_time           =HistoryDealGetInteger(trans.deal,DEAL_TIME);
  58.          deal_time_msc   =HistoryDealGetInteger(trans.deal,DEAL_TIME_MSC);
  59.          deal_type           =HistoryDealGetInteger(trans.deal,DEAL_TYPE);
  60.          deal_entry          =HistoryDealGetInteger(trans.deal,DEAL_ENTRY);
  61.          deal_magic         =HistoryDealGetInteger(trans.deal,DEAL_MAGIC);
  62.          deal_reason        =HistoryDealGetInteger(trans.deal,DEAL_REASON);
  63.          deal_position_id  =HistoryDealGetInteger(trans.deal,DEAL_POSITION_ID);
  64.          deal_volume           =HistoryDealGetDouble(trans.deal,DEAL_VOLUME);
  65.          deal_price               =HistoryDealGetDouble(trans.deal,DEAL_PRICE);
  66.          deal_commission    =HistoryDealGetDouble(trans.deal,DEAL_COMMISSION);
  67.          deal_swap               =HistoryDealGetDouble(trans.deal,DEAL_SWAP);
  68.          deal_profit               =HistoryDealGetDouble(trans.deal,DEAL_PROFIT);
  69.          deal_symbol            =HistoryDealGetString(trans.deal,DEAL_SYMBOL);
  70.          deal_comment        =HistoryDealGetString(trans.deal,DEAL_COMMENT);
  71.          deal_external_id      =HistoryDealGetString(trans.deal,DEAL_EXTERNAL_ID);
  72.         }
  73.       else
  74.          return;
  75.       ENUM_DEAL_ENTRY enum_deal_entry=(ENUM_DEAL_ENTRY)deal_entry;
  76.       if(deal_symbol==Symbol() && deal_magic==InpMagic)
  77.         {
  78.          if(deal_type==DEAL_TYPE_BUY || deal_type==DEAL_TYPE_SELL)
  79.            {
  80.             if(deal_entry==DEAL_ENTRY_IN)
  81.               {
  82.                m_last_deal_IN=iTime(Symbol(),Period(),0);
  83.               }
  84.            }
  85.         }
  86.      }
  87.   }
复制代码
举报

评论 使用道具

精彩评论7

xinhua123
DDD
| 发表于 2023-1-19 02:30:18 | 显示全部楼层
举报

点赞 评论 使用道具

dongxu64
DDD
| 发表于 2023-1-21 11:38:09 | 显示全部楼层
楼主辛苦
举报

点赞 评论 使用道具

ken138888
CCC
| 发表于 2023-1-21 16:11:22 | 显示全部楼层
谢谢分享
举报

点赞 评论 使用道具

qwe11
CCC
| 发表于 2023-1-23 15:21:49 | 显示全部楼层
学习一下吗
举报

点赞 评论 使用道具

umi0665
DD
| 发表于 2023-1-23 17:15:59 | 显示全部楼层
學習了~
举报

点赞 评论 使用道具

yalihenda
DD
| 发表于 2023-2-3 11:30:57 | 显示全部楼层
谢谢分享学习了!
举报

点赞 评论 使用道具

ken138888
CCC
| 发表于 2023-3-3 13:49:52 | 显示全部楼层
具体有什么作用呢?
举报

点赞 评论 使用道具

发新帖
EA交易
您需要登录后才可以评论 登录 | 立即注册

简体中文
繁體中文
English(英语)
日本語(日语)
Deutsch(德语)
Русский язык(俄语)
بالعربية(阿拉伯语)
Türkçe(土耳其语)
Português(葡萄牙语)
ภาษาไทย(泰国语)
한어(朝鲜语/韩语)
Français(法语)