2

我正在尝试修改订单,但我总是得到Error #1.

根据我的研究,我发现错误 1 ​​意味着我输入参数的方式错误。如何修复我的OrderModify()功能?

    stoploss = NormalizeDouble(Ask - Point * TrailingStop,Digits);
    int ticket;
    takeprofit = NormalizeDouble(Ask + Point * TrailingStopTP,Digits);
    double minstoplevel = MarketInfo( Symbol(), MODE_STOPLEVEL );
    if(stoploss > NormalizeDouble(Ask - Point*minstoplevel,Digits)) {
        stoploss = NormalizeDouble(Ask - Point*minstoplevel,Digits);
    }
    if(takeprofit < NormalizeDouble( Ask + Point*minstoplevel2, Digits )) {
        takeprofit = NormalizeDouble( Ask + Point*minstoplevel2, Digits );
    }
    if(AccountFreeMarginCheck(Symbol(),OP_SELL,lotsize)>0) {
        ticket=OrderSend(Symbol(),OP_BUY,lotsize,Ask, 0, 0.0, 0.0, "comment", MagicNumber, 0, Lime);
        if(ticket<0) {
            Print("Order send failed with error #",GetLastError());       
        } else {
            Print("Order send sucesso!! Ticket#", ticket);
            res=OrderModify(ticket,OrderOpenPrice(),stoploss,takeprofit,0,Blue);
            if(res==false) {
                Print("Error modifying order!, error#",GetLastError());
            } else {
                Print("Order modified successfully, res#", res);
            }            
        }
    } else {
        Print("Sem dinheiro na conta D=");
    }
 }
4

2 回答 2

4

不完全“错误”,OrderModify()合法设置_LastError == 1

可能会有一点意外,但OrderModify()有义务发出信号_LastError == 1,以防调用在语法和语义上都是正确的,但是,为修改提供的值实际上是相同的,因为已识别ticket#数据库中已经有。

这意味着,没有什么可修改的,因为所有属性都已经具有“”目标值。

可以预先检查所有字段的潜在身份,这可能允许我们的代码OrderModify()在这种身份的情况下跳过调用 - { current | 目标}值。

ERR_NO_RESULT == 1               // No error returned, but the result is unknown

GetLastError()- 返回最后生成的错误代码。相同的值可通过名为 的系统变量获得_LastError。它的值可以在关键活动之前通过调用重置为零ResetLastError()

错误代码在 中定义stderror.mqh

要打印错误描述,您可以使用文件ErrorDescription()中定义的函数stdlib.mqh

#include <stderror.mqh>
#include <stdlib.mqh>
于 2015-10-05T11:35:20.090 回答
1

问题在于,即使看涨期权的入场价、止损和止盈参数OrderModify()看起来相同,它们也可能相差一个单位的一小部分(小于“数字”)。

要解决此问题,
只需对参数进行规范化以确保它们最多为Digits小数位。

double entryPrice = NormalizeDouble( entryPrice, Digits );
double stoploss   = NormalizeDouble( stoploss,   Digits );
double target     = NormalizeDouble( target,     Digits );

然后将它们传递给OrderModify()调用。

于 2017-01-17T19:17:04.060 回答