文章 "使用限价订单替代止盈且无需修改 EA 的原始代码" - 页 6

 
就会出现<堆栈 溢出> 错误!问题出在库文件中:
<LimitTakeProfit.mqh>。
有人知道出了什么问题吗?
 

读者朋友们,你们好!

有没有人遇到过"堆栈 溢出 "错误?

我认为问题出在 "LimitTakeProfit.mqh "库中

 

你好,德米特里、


感谢您的有趣文章!


请您解释一下与以下各行(第 54、55、56 行)相关的错误 "参数传递为引用,预期为变量"(paramter passed as reference, variable expected)。


CSymbolInfo CLimitTakeProfit::c_Symbol = new CSymbolInfo();

CArrayLong CLimitTakeProfit::i_TakeProfit = new CArrayLong();

CArrayDouble CLimitTakeProfit::d_TakeProfit = new CArrayDouble();


谢谢!

 
Mario Marconi CArrayDouble CLimitTakeProfit::d_TakeProfit = new CArrayDouble();


谢谢!

您好,您使用的是?

#include <Arrays\ArrayDouble.mqh>
#include <Arrays\ArrayLong.mqh>
#include <Trade\SymbolInfo.mqh>
 
Dmitriy Gizlyk #:

您好,请问您使用?

你好,德米特里、

以下几行正是写在您的 "LimitTakeProfit.mqh "上的:

#include <Arrays\ArrayDouble.mqh>
#include <Arrays\ArrayLong.mqh>
#include <Trade\SymbolInfo.mqh>

更确切地说, 您的 EA " MACD Sample LImitTP.mq5 " 在编译时出现了 "参数传递为引用,变量为预期 " 的错误。


感谢您的回答!

 
Mario Marconi #:

你好,德米特里、

以下几行正是写在您的 "LimitTakeProfit.mqh "上的:

更确切地说, 您的 EA " MACD Sample LImitTP.mq5 " 在编译时出现了 "参数传递为引用,变量为预期 " 的错误。


感谢您的回答!

您好,必须在 paprameter 前添加 *。

CSymbolInfo    * CLimitTakeProfit::c_Symbol       =  new CSymbolInfo();
CArrayLong     * CLimitTakeProfit::i_TakeProfit   =  new CArrayLong();
CArrayDouble   * CLimitTakeProfit::d_TakeProfit   =  new CArrayDouble();
 
Dmitriy Gizlyk #:

嗨,您必须在 paprameter 前加上 *。

你好,德米特里、


还是有问题,同样的三行出现了以下错误:

- 参数传递为引用,预期为变量 LimitTakeProfit.mqh 54 57

- 重新定义;类型修饰符不同 LimitTakeProfit.mqh 54 35


感谢您的回答

 

你好,德米特里、

我知道这篇文章发表有一段时间了,但我还是想谢谢你!这篇文章非常有用,你的解释非常清楚,而且这门课也非常好用。谢谢!

我相信我在发布的代码中发现了一个小错误。在函数 SetTakeProfits 执行到一半时,我们发现了这一行:

switch((ENUM_POSITION_TYPE)PositionGetInteger(POSITION_TYPE))

这一行位于所有 TP 的循环中。问题是,在循环的稍后部分,函数 CheckLimitOrder 被调用,而 CheckLimitOrder 反过来又调用函数 CheckOrderInHistory,这时可能会选择另一个位置。这意味着在循环的下一次迭代中,上述代码中的 "开关 "可能会不同。

为了解决这个问题,我认为应该在循环开始之前将position_type 保存在一个变量中。这样就可以了:

bool CLimitTakeProfit::SetTakeProfits(ulong position_ticket, double new_tp=0)

// (...)

   double position_volume=PositionGetDouble(POSITION_VOLUME);

//********** 添加下一行
   ENUM_POSITION_TYPE position_type=(ENUM_POSITION_TYPE)PositionGetInteger(POSITION_TYPE);
//****************************

   double closed=0;
   double closed_perc=0;
   double fix_closed_per=0;
//---
   for(int i=0;i<total;i++)
     {
      tp_request.comment="TP"+IntegerToString(i)+"_"+IntegerToString(position_ticket);
      if(i_TakeProfit.At(i)<tp_int && d_TakeProfit.At(i)>0)
        {
         if(closed>=100 || fix_closed_per>=100)
            break;
//---
         double lot=position_volume*MathMin(d_TakeProfit.At(i),100-closed_perc)/(100-fix_closed_per);
         lot=MathMin(position_volume-closed,lot);
         lot=c_Symbol.LotsMin()+MathMax(0,NormalizeDouble((lot-c_Symbol.LotsMin())/c_Symbol.LotsStep(),0)*c_Symbol.LotsStep());
         lot=NormalizeDouble(lot,2);
         tp_request.volume=lot;

//********** 修改下一行
         //switch((ENUM_POSITION_TYPE)PositionGetInteger(POSITION_TYPE))
         switch(position_type)
//*******************************
           {
            case POSITION_TYPE_BUY:
              tp_request.type=ORDER_TYPE_SELL_LIMIT;
              tp_request.price=c_Symbol.NormalizePrice(open_price+i_TakeProfit.At(i)*c_Symbol.Point());

// (...)

希望这能说得通。再次感谢您的出色工作!

 

大家好!

我遇到了[无效过期]问题,有人知道如何解决吗?

 

您好。

在使用 LimitTakeProfit 测试 EA 时,它返回以下错误信息:"无效到期日"。

我试着在交易请求结构 中添加到期时间,但无济于事。

谁能帮帮我?

版主进行了机器翻译