文章 "轻松快捷开发 MetaTrader 程序的函数库(第四部分):交易事件" - 页 3

 

就内容而言,这就像是一场非常有趣的讲座。我一定会关注整个系列。

遗憾的是,可能还会有故意犯的小错误--内容非常复杂,也许你应该继续关注。

在"

CMarketCollection::Refresh

"中找不到 total_market 字段--这种情况以前在 ORDER_STATUS_MARKET 中出现过。从简单到复杂的转变令人印象深刻。

在刷新点,我无法再继续下去,因为下一个对象也不想直接运行。因此,我很乐意使用下载。

mfG

马克-托尔克米特

 

很奇怪,我无法用您的方法实现最简单的逻辑......

在这里,我需要获得 最后一笔交易的收盘时间。该库似乎有一种机制可以处理类似 MT4 的抽象订单,但我没有看到任何处理它们的方法。

我请求 Deals,但不支持 ORDER_PROP_TIME_CLOSE:

bool last_trade_time_filter=true;
   CArrayObj *all_trades=engine.GetListDeals();
   if(all_trades!=NULL && all_trades.Total()>0)
     {
      CArrayObj *sym_all_trades=CSelect::ByOrderProperty(all_trades,ORDER_PROP_SYMBOL,Symbol(),EQUAL);
      if(sym_all_trades!=NULL && sym_all_trades.Total()>0)
        {
         CArrayObj *sym_all_trades_recent=CSelect::ByOrderProperty(sym_all_trades,ORDER_PROP_TIME_CLOSE,iTime(NULL,PERIOD_CURRENT,1),EQUAL_OR_MORE);
         if(sym_all_trades_recent.Total()>0)
           {
            // 它不在这里
            last_trade_time_filter=false;
           }
            
        }
     }
 
leonerd 获得 最后一笔交易的收盘时间。该库似乎有一种机制可以处理类似 MT4 的抽象订单,但我没有看到任何处理它们的方法。

我请求 Deals,但不支持 ORDER_PROP_TIME_CLOSE:

好吧,请求交易的平仓时间在某种程度上是不正确的。但在 GetListHistoryOrders() 中也不起作用...

 
leonerd 获得 最后一笔交易的收盘时间。该库似乎有一种机制可以处理类似 MT4 的抽象订单,但我没有看到任何处理它们的方法。

我请求 Deals,但不支持 ORDER_PROP_TIME_CLOSE:

在测试的智能交易系统中,在按钮按下处理程序中。

//+------------------------------------------------------------------+
//| 处理按钮按下|
//+------------------------------------------------------------------+
void PressButtonEvents(const string button_name)

(这只是如何处理事件和获取数据的一个示例)。

那里有负责平仓的代码块。您可以看到它是如何实现的。例如,一个代码块用于关闭当前符号的买入,并获得最大利润:

      //--- 如果按下 BUTT_CLOSE_BUY(关闭买入)按钮:以最大利润关闭买入
      else if(button==EnumToString(BUTT_CLOSE_BUY))
        {
         //--- 获取所有空缺职位列表
         CArrayObj* list=engine.GetListMarketPosition();
         //--- 仅从列表中选择买入头寸,且仅按当前符号选择
         list=CSelect::ByOrderProperty(list,ORDER_PROP_SYMBOL,Symbol(),EQUAL);
         list=CSelect::ByOrderProperty(list,ORDER_PROP_TYPE,POSITION_TYPE_BUY,EQUAL);
         //--- 按利润排序,将佣金和掉期计算在内
         list.Sort(SORT_BY_ORDER_PROFIT_FULL);
         //--- 获取利润最高的买入头寸的指数
         int index=CSelect::FindOrderMax(list,ORDER_PROP_PROFIT_FULL);
         if(index>WRONG_VALUE)
           {
            //--- 获取买入位置对象并关闭票据位置
            COrder* position=list.At(index);
            if(position!=NULL)
              {
               //--- 如果未按下创建待处理请求的按钮 - 关闭位置
               if(!pressed_pending_close_buy)
                  engine.ClosePosition((ulong)position.Ticket());
               //--- 否则 - 创建一个待处理请求,以关闭票据上的仓位
               //--- 并根据活动按钮设置条件
               else
                 {
                  int id=engine.ClosePositionPending(position.Ticket());
                  if(id>0)
                    {
                     //--- 设置待处理请求的价格和激活时间,并设置激活参数
                     double bid=SymbolInfoDouble(NULL,SYMBOL_BID);
                     double price_activation=NormalizeDouble(bid+distance_pending_request*g_point,g_digits);
                     ulong  time_activation=TimeCurrent()+bars_delay_pending_request*PeriodSeconds();
                     SetPReqCriterion((uchar)id,price_activation,time_activation,BUTT_CLOSE_BUY,EQUAL_OR_MORE,bid,TimeCurrent());
                    }
                 }
              }
           }
        }

关于平仓 - 我很久以前就做过了,现在我无法告诉你如何一目了然地获得你需要的东西。我稍后再看看,然后再写 - 我现在很忙。

 
Artyom Trishkin #:

在测试的智能交易系统中,在按钮按下处理程序中

(这只是一个如何处理事件和获取数据的示例)。

那里有负责平仓的代码块。您可以看到它是如何实现的。例如,一个代码块用于关闭在当前符号上的买入,并获得最大利润:

关于平仓 - 我很久以前就做过了,现在我无法告诉你如何一目了然地获得你需要的东西。我稍后再看看,然后再写 - 我现在很忙。

谢谢,但没必要赶活动。

 
ORDER_STATUS_MARKET_ORDER 显示错误:未声明标识符。看起来最近的 MQL 5 版本发生了变化,它在 COrder::OrderMagicNumber 和 CMarketOrder 构造函数中都出现了!
 
theonementor # :
ORDER_STATUS_MARKET_ORDER 显示错误:未声明标识符。看起来最近的 MQL 5 版本发生了变化,它同时出现在 COrder::OrderMagicNumber 和 CMarketOrder 构造函数中!

我下载了文章所附的 MQL5.zip 压缩文件 - 每个文件单独编译和所有文件一起编译(编译 Engine.mqh 或 TestDoEasyPart04.mq5 时)都没有错误。

您到底在做什么,导致出现编译错误?

 
Artyom Trishkin #:

我下载了文章所附的 MQL5.zip 压缩文件--每个文件单独编译和所有文件一起编译(编译 Engine.mqh 或 TestDoEasyPart04.mq5 时)都没有错误。

您到底在做什么才会出现编译错误?

我想出来了,定义枚举中少了一个条目。
 
theonementor # :
虽然我把教程中的代码复制粘贴到了编辑器中,但它还是不见了。

文章中的代码并不总是与附件中的代码一致。有时我可能在描述过程中遗漏了一些内容,有时则是在写完文章后添加了一些内容。这篇文章不是 "阅读-复制-使用 "式的分步指南,而只是以培训材料的形式进行详细说明。小的错误和遗漏会让你思考,这很好)