修改订单时的错误#1

 

我怎样才能摆脱这个该死的错误?我已经厌烦了。我正在检查函数的每个输入参数。对我来说,目前,它是这样的。

if (OrderOpenPrice() != ND (fd_MurreyLevelsValue[11]))
   New_OOP = ND (fd_MurreyLevelsValue[11]);
else New_OOP = OrderOpenPrice();
if (OrderStopLoss() != ND (fd_MurreyLevelsValue[12]))
   New_SL = ND (fd_MurreyLevelsValue[12]);
else New_SL = OrderStopLoss();
if (OrderTakeProfit() != ND (fd_MurreyLevelsValue[2]))
   New_TP = ND (fd_MurreyLevelsValue[2]);
else New_TP = OrderTakeProfit();

也就是说,如果参数没有被改变,就没有必要去改变它。我以前没有这样做过,但我决定...

然后参数被传递给订单修改方法,像这样。

 if (!fOrderModify (Ticket,  New_OOP, New_SL, New_TP))
{
   if (_LastError != 0)
     WriteLog (StringConcatenate (__FUNCTION__, ". В строке ", __LINE__, " ", CErrs.ErrorToString (_LastError)),
                     CLogs.GetNeedLogs(), CLogs.GetPrintUP(), CLogs.GetCommentUP());
}

日志中没有输出。

modify #2  sell limit 0.10 EURUSD at 1.34048 sl: 1.34125 tp: 1.33362 ok
OrderModify error 1

因此,期刊通知我们,如修改:好的,但随后一个错误。所有的参数都没有改变。

该命令正在等待中。因此,我们可能会改变开盘价、停盘价和收盘价。而这一点,据我所知,并没有与文件相矛盾。

谁遇到过这样的事情?如何解决这个问题?

 
hoz:

我怎样才能摆脱这个该死的错误?我已经厌烦了。我正在检查函数的每个输入参数。对我来说,目前,它是这样的。

也就是说,如果参数没有被改变,就没有必要去改变它。我以前没有这样做过,但我决定...

然后,参数被传递给订单修改方法,如下所示。

日志中没有输出。

因此,期刊通知我们,如修改:好的,但随后...一个错误。所有的参数都没有改变。

该命令正在等待中。因此,我们可能会改变开盘价、停盘价和收盘价。而这一点,据我所知,并没有与文件相矛盾。

谁遇到过这样的事情?如何解决这个问题?

你在错误地处理错误代码,忘记了错误代码在你的众多函数之后已经被覆盖。

因此,当一个错误发生时,你需要将错误代码保存到一个局部变量 中,并在你后续的大量调用之后,从那里打印出来。

 
Renat:

你错误地处理了错误代码,忘记了错误代码在你的众多函数之后已经被重写了。

因此,当一个错误发生时,它的代码必须保存在一个局部变量中,只有这样,在你后续的大量调用之后,才能将它打印出来。

你为什么不也创建一个错误数组呢?文档中白纸黑字写着:_LastError变量存储的是最后一个错误的编号。并通过ResetLastError()函数将其重置。如果在调用_LastError之间没有更多的错误,_LastError存储最后一个错误的值。我的代码中不再有任何错误。嗯,这不是问题所在。

此外,在每个方法中为错误创建变量,然后将这些变量打印到Expert Advisors中,这不是很符合逻辑。

毕竟,如果有一个收集错误的变量,为什么还要制造新的错误?

 

evillive,你说没有检查是什么意思?我在上面写道。

if (OrderOpenPrice() != ND (fd_MurreyLevelsValue[11]))    \\ Если текущая цена не равна новой.. из массива, то..
   New_OOP = ND (fd_MurreyLevelsValue[11]);               \\.. новая цена равна этому новому значению цены из массива( расчитанного ).
else New_OOP = OrderOpenPrice();                          \\ Иначе новая цена равно текущей цене выбранного ордера. Т.е. не изменяется.
if (OrderStopLoss() != ND (fd_MurreyLevelsValue[12]))
   New_SL = ND (fd_MurreyLevelsValue[12]);
else New_SL = OrderStopLoss();
if (OrderTakeProfit() != ND (fd_MurreyLevelsValue[2]))
   New_TP = ND (fd_MurreyLevelsValue[2]);
else New_TP = OrderTakeProfit();

我甚至给了第一个评论。虽然那里一切都很初级。

你在这里还能怎么检查?

 
我做了双重检查,它不平等,并指向你期望的地方!
 
evillive:
我意识到了,这就是为什么我清理了))))。
你太无礼了!;)
 
borilunad:
我确实仔细检查了一下,它不是平等的,并指向你所期望的地方。

鲍里斯,你这么说是什么意思?因为我清楚地写着,如果价格不是那么...否则......。目前...这有什么意义?你可以检查20次...:)这是不可能的。我已经在这个代码上挣扎了第二天了。我以前从未遇到过这样的错误。现在我已经面对它了。我已经把所有这些方法写出来并测试了很多次。我在这里遇到了一个问题。

问题是,我更喜欢稍微不同的战术。但在写最新的《猫头鹰》时,遇到了这个故障。这是我自己不知道在哪里挖,因为pristrintovav所有代码的长度,否则我没有更多的想法。这就是为什么OrderModify() 函数是内置的。而且我不知道它的执行情况。

 
hoz:

evillive,你说没有检查是什么意思?我在上面写道。

我甚至给了第一个评论。虽然那里一切都很初级。

你在这里还能怎么检查?

维克多,经过检查,新值是否被分配...你必须要检查。

if (OrderOpenPrice() != ND (fd_MurreyLevelsValue[11])  // Если текущая цена не равна новой.. из массива
 || OrderStopLoss() != ND (fd_MurreyLevelsValue[12])   // или 
 || OrderTakeProfit() != ND (fd_MurreyLevelsValue[2])) // или
  // если одно из условий выполнено пойдём в модифай... 
 
AlexeyVik:

维克多,在检查了新值是否被分配后...而且你必须检查

阿列克谢,你在哪里有一个检查,以确保被传递的函数的值是不变的?我在上面已经考虑到了这一点。而一般情况下,修改的需要是在一开始就完成的。那里有水平,如果指标报告 说水平已经改变,我们就继续前进......

 
hoz:

鲍里斯,你这么说是什么意思?因为我清楚地写着,如果价格不是那么...否则......。目前...这有什么意义?你可以检查20次...:)这是不可能的。我已经在这个代码上挣扎了第二天了。我以前从未遇到过这样的错误。现在我已经面对它了。我已经把所有这些方法写出来并测试了很多次。我在这里遇到了一个问题。

问题是,我更喜欢稍微不同的战术。但在写最新的《猫头鹰》时,遇到了这个故障。这是我自己不知道在哪里挖,因为pristrintovav所有代码的长度,否则我没有更多的想法。这就是为什么OrderModify() 函数是内置的。而且我不知道它的执行情况...

维克多,你雷纳特,在一般情况下,正确地指出,阿列克谢显示必要的最后检查,和更早,检查所有必要的检查,每个参数的所有细微差别,以避免歧义的意思,并没有错过任何条件
 
hoz:

evillive,你说没有检查是什么意思?我在上面写道。

if (OrderOpenPrice() != ND (fd_MurreyLevelsValue[11]))    \\ Если текущая цена не равна новой.. из массива, то..
   New_OOP = ND (fd_MurreyLevelsValue[11]);               \\.. новая цена равна этому новому значению цены из массива( расчитанного ).
else New_OOP = OrderOpenPrice();                          \\ Иначе новая цена равно текущей цене выбранного ордера. Т.е. не изменяется.
if (OrderStopLoss() != ND (fd_MurreyLevelsValue[12]))
   New_SL = ND (fd_MurreyLevelsValue[12]);
else New_SL = OrderStopLoss();
if (OrderTakeProfit() != ND (fd_MurreyLevelsValue[2]))
   New_TP = ND (fd_MurreyLevelsValue[2]);
else New_TP = OrderTakeProfit();

我甚至给了第一个评论。虽然那里一切都很初级。

你在这里还能怎么检查?

我们还需要检查,如果3个参数都没有改变,那么就不应该触及OrderModify。或者说,如果这些参数中至少有一个发生了变化,才去找OrderModify。