新人对MQL4和MQL5的任何问题,对算法和代码的帮助和讨论 - 页 833

 
Igor Zakharov:

纠正了...但由于某种原因,还剩下一个。



而且我无法在测试器中重现它。我只是没有把它放在同一个日期。


 

为什么我不能从c++连接mql4中的库?以下是我在C++ Visual Studio 2012中的代码。文件main.以cpp为扩展名(main.csr)。

#define  MT4_EXPFUNC __declspec(dllexport) создал макрос чтобы не писать запись __declspec(dllexport)int __stdcall add(int a=0, int b=0)
//__declspec(dllexport)int __stdcall add(int a=0, int b=0)и так пробовал тоже
MT4_EXPFUNC int __cdecl add(int a=0, int b=0)//stdcall данная примитивная функция ничего не делает а просто возвращает значение 18
{return (18);пробовал так return 18;}

然后我创建了一个主扩展名为def的文件(main.def),其中有一个导出的函数 列表,代码看起来像这样。

LIBRARY "dllmt42"
EXPORTS
add

然后我把它导入编译器

#import "dllmt42.dll"
int _add(int a=0, int b=0);
#import

编译后没有问题,但当你把EA留在图表上时,我就感到困惑了

未解决的导入函数调用,在'dllmt42.dll'中找到'_add'。拖动文件时,Total Comander会看到该函数以及编译器本身

谁能提供帮助?

 
Alexandr Sokolov:

纠正了...但由于某种原因,还剩下一个。

而且我无法在测试器中重现它。我在同一日期没有出现这种错误

这个错误表明,你正试图在你之前进行修改的价格上修改一个头寸/订单...

 

试图用一个函数在MT5中检索指标数据。

//************************************************************************************************/
double Envelopes(string symb, ENUM_TIMEFRAMES TF_1, int period, int method, int shift, int price,double Deviation(ENUM_TIMEFRAMES TF_2, int kanal), int buff, int index)
{
  double buf[1];
  int handle=iEnvelopes(Symbol(), TF_1, period, method, shift, price, Deviation(TF_2, kanal), buff);
   if(handle<0)
   {
    Print("Failed to create handle ATR, Error: ",GetLastError());
    return(WRONG_VALUE);
   } else
   {
    if(CopyBuffer(handle,0,index,1,buf)<0)
    {
     Print("Failed to copy data from the indicator ATR, Error: ",GetLastError());
     return(WRONG_VALUE);
    }
   }
   return(buf[0]);
}
//************************************************************************************************/

我得到一个错误。


请告知如何纠正MT5的代码

 
Vladimir Pastushak:

这个错误表明,你试图在已经修改过的价格上修改一个头寸/订单...

不,我已经检查过很多次了,问题出在测试产品时选择MQL的输入参数的随机性上,这些参数并不总是兼容的--我也修正了这一点。但现在我收到了一条信息,说没有未结订单。


虽然我把它们放在相同的货币对和时间框架上

 
Alexandr Sokolov:

不,我已经检查过很多次了。 问题出在测试产品时选择MQL的输入参数的随机性上,这些参数并不总是兼容的--我也已经修复了。但现在我收到了一条信息,说没有未结订单。


但我把它们放在相同的货币对和时间框架上。

我不知道为什么我的EA不交易了。

 
Vladimir Pastushak:

找出EA不交易的原因。

如果输入参数是随机选择的,以至于信号根本没有出现,它可能不会交易。但你也不应该限制它

 

什么叫" 交易冻结距离"?通过以下方式收到的

SymbolInfoInteger(_Symbol,SYMBOL_TRADE_FREEZE_LEVEL)

MQL4

 

我在修改时又出现了1号错误。在这个EA中,SL或TP水平只在四个区块中被修改


1个街区

if(OrderMagicNumber() == id_number && OrderStopLoss() != NormalizeDouble(0,_Digits) && BMod(OrderTicket()) == true)
           {
            if(OrderType() == OP_BUY)
              {
               if(OrderComment() == "1" && Bid - OrderOpenPrice() >= a1 && OrderStopLoss() != NormalizeDouble(OrderOpenPrice() + l1,_Digits)) {bol = OrderModify(OrderTicket(),OrderOpenPrice(),NormalizeDouble(OrderOpenPrice()+l1,_Digits),OrderTakeProfit(),0,clrNONE);};
               if(OrderComment() == "2" && Bid - OrderOpenPrice() >= a2 && OrderStopLoss() != NormalizeDouble(OrderOpenPrice() + l2,_Digits)) {bol = OrderModify(OrderTicket(),OrderOpenPrice(),NormalizeDouble(OrderOpenPrice()+l2,_Digits),OrderTakeProfit(),0,clrNONE);};
              }
            else
              {
               if(OrderComment() == "1" && OrderOpenPrice() - Ask >= a1 && OrderStopLoss() != NormalizeDouble(OrderOpenPrice() - l1,_Digits)) {bol = OrderModify(OrderTicket(),OrderOpenPrice(),NormalizeDouble(OrderOpenPrice()-l1,_Digits),OrderTakeProfit(),0,clrNONE);};
               if(OrderComment() == "2" && OrderOpenPrice() - Ask >= a2 && OrderStopLoss() != NormalizeDouble(OrderOpenPrice() - l2,_Digits)) {bol = OrderModify(OrderTicket(),OrderOpenPrice(),NormalizeDouble(OrderOpenPrice()-l2,_Digits),OrderTakeProfit(),0,clrNONE);};
              };


2块

if(BMod(OrderTicket()) == true && OrderMagicNumber() == id_number && (OrderStopLoss() == NormalizeDouble(0,_Digits) || OrderTakeProfit() == NormalizeDouble(0,_Digits)))
           {
            if(OrderComment() == "1")
              {
               bol = OrderModify(OrderTicket(),OrderOpenPrice(),(OrderType() == OP_BUY ? OrderOpenPrice() - sl : OrderOpenPrice() + sl),(OrderType() == OP_BUY ? OrderOpenPrice() + t1 : OrderOpenPrice() - t1),0,clrNONE);
              }
            else if(OrderComment() == "2")
              {
               bol = OrderModify(OrderTicket(),OrderOpenPrice(),(OrderType() == OP_BUY ? OrderOpenPrice() - sl : OrderOpenPrice() - sl),(OrderType() == OP_BUY ? OrderOpenPrice() + t2 : OrderOpenPrice() - t2),0,clrNONE);
              };


3块

if(BMod(OrderTicket()) == true && OrderMagicNumber() == id_number && (OrderStopLoss() == NormalizeDouble(0,_Digits) || OrderTakeProfit() == NormalizeDouble(0,_Digits)))
           {
            if(OrderComment() == "1")
              {
               bol = OrderModify(OrderTicket(),OrderOpenPrice(),(OrderType() == OP_BUY ? OrderOpenPrice() - sl : OrderOpenPrice() + sl),(OrderType() == OP_BUY ? OrderOpenPrice() + t1 : OrderOpenPrice() - t1),0,clrNONE);
              }
            else if(OrderComment() == "2")
              {
               bol = OrderModify(OrderTicket(),OrderOpenPrice(),(OrderType() == OP_BUY ? OrderOpenPrice() - sl : OrderOpenPrice() + sl),(OrderType() == OP_BUY ? OrderOpenPrice() + t2 : OrderOpenPrice() - t2),0,clrNONE);
              };


4块

if(BMod(OrderTicket()) == true && OrderMagicNumber() == id_number && OrderTakeProfit() == NormalizeDouble(0,_Digits))
              {
               if(MyOrders() == 1)
                 {
                  bol = OrderModify(OrderTicket(),OrderOpenPrice(),OrderStopLoss(),(OrderType() == OP_BUY ? OrderOpenPrice() + t1 : OrderOpenPrice() - t1),0,clrNONE);
                 }
               else if(OrderTakeProfit() == 0)
                 {
                  bol = OrderModify(OrderTicket(),OrderOpenPrice(),OrderStopLoss(),(OrderType() == OP_BUY ? OrderOpenPrice() + (OrderComment() == "1" ? t1 : t2) : OrderOpenPrice() - (OrderComment() == "1" ? t1 : t2)),0,clrNONE);
                 };


我已经检查了很多遍,但我找不到任何错误。

 
Alexandr Sokolov:

我在修改时又出现了1号错误。在这个EA中,SL或TP水平只在四个区块中被修改



OrderStopLoss() != NormalizeDouble(0,_Digits)


这是不正确的,在其他例子中也是如此

如果你在1.2356处设置了止损,在新的时间点上,你又在1.2356处设置了止损,你会得到错误1

原因: