- 显示:
- 1628
- 等级:
- 已发布:
- 2017.05.03 13:55
- 已更新:
- 2017.05.03 14:12
-
需要基于此代码的EA交易或指标吗?请在自由职业者服务中订购 进入自由职业者服务
本 EA 交易展示了一个如何解决以下问题的实例: 如何确定挂单被触发的时刻?
EA交易如何工作: 在OnTradeTransaction() 函数中, 我们等待类型为 "TRADE_TRANSACTION_DEAL_ADD"的事务:
TRADE_TRANSACTION_DEAL_ADD | 在历史中加入一个交易。它是一个订单执行的结果或是在账户余额上的操作。 |
当我们 "抓到" 这样的事务时,我们立即 使用 "bln_find_order" 标志 来搜索订单,并且 把订单编号赋给 "ul_find_order" 变量:
//+------------------------------------------------------------------+ //| TradeTransaction 函数 | //+------------------------------------------------------------------+ void OnTradeTransaction(const MqlTradeTransaction &trans, const MqlTradeRequest &request, const MqlTradeResult &result) { //+------------------------------------------------------------------+ //| TRADE_TRANSACTION_DEAL_* | //| MqlTradeTransaction 结构的以下栏位 | //| 以相关交易的交易事务处理填充 | //| (TRADE_TRANSACTION_DEAL_ADD, TRADE_TRANSACTION_DEAL_UPDATE | //| 以及 TRADE_TRANSACTION_DEAL_DELETE): | //| •deal - 交易编号; | //| •order - 订单编号,基于交易执行的订单; | //| •symbol - 交易的交易品种名称; | //| •type - 交易事务类型; | //| •deal_type - 交易类型; | //| •price - 交易价格; | //| •price_sl - 止损价格 ( 如果在订单中指定并填充, | //| •基于已经执行的交易); | //| •price_tp - 获利价格 ( 如果在订单中指定并填充 | //| 基于已经执行的交易); | //| •volume - 交易量手数. | //| •position - 已建仓位的单号, | //| 通过交易执行结果可以修改或者关闭. | //| •position_by - 反向仓位的单号. | //| 它只由交易填充 | //| (通过反向仓位关闭仓位). | //+------------------------------------------------------------------+ //--- 取得事务类型,为枚举值 ENUM_TRADE_TRANSACTION_TYPE type=trans.type; //--- 如果事务是历史中加上的结果 if(type==TRADE_TRANSACTION_DEAL_ADD) { bln_find_order=true; // true -> 您应当搜索订单 ul_find_order=trans.order; } }
在 OnTick() 中, 我们总要检查"bln_find_order" 标志的状态; 一旦标志等于 true, 我们就搜索订单。
- 首先我们尝试根据单号找到订单,
- 如果尝试成功 (也就是说订单已经写入历史), 我们就 确定订单类型. 为了从交易历史中访问订单的属性,要使用 HistoryOrderGetInteger.
//+------------------------------------------------------------------+ //| EA交易订单分时函数 | //+------------------------------------------------------------------+ void OnTick() { //--- if(bln_find_order) // true -> 您应当搜索订单 { static long counter=0; Print("尝试次数 ",counter); ResetLastError(); if(HistoryOrderSelect(ul_find_order)) { long type_order=HistoryOrderGetInteger(ul_find_order,ORDER_TYPE); if(type_order==ORDER_TYPE_BUY_LIMIT || type_order==ORDER_TYPE_BUY_STOP || type_order==ORDER_TYPE_SELL_LIMIT ||type_order==ORDER_TYPE_SELL_STOP) { Print("挂单 ",ul_find_order," 已经找到!订单类型是 ", EnumToString((ENUM_ORDER_TYPE)HistoryOrderGetInteger(ul_find_order,ORDER_TYPE))); bln_find_order=false; // true -> 您应当搜索订单 counter=0; return; } else { Print("订单 ",ul_find_order," 不是挂单"); bln_find_order=false; // true -> 您应当搜索订单 return; } } else { Print("订单 ",ul_find_order," 没有找到, 错误#",GetLastError()); } counter++; } }
由MetaQuotes Ltd译自俄语
原代码: https://www.mql5.com/ru/code/17610

根据交易历史返回仓位的利润点数。

CDir 类可以取得在MQL5沙盒之外的文件和文件夹信息,就和 MS-DOS 的 Dir 命令类似。因为它使用了系统DLL调用,所以您应当启用它们的使用。