オーダー変更時のエラー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());
}

ログにNw出力。

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

だから、ジャーナルは、修正:OKのように通知しますが、その後がエラーになる。どのパラメータも変更されていません。

注文は保留されています。そのため、オープン、ストップ、テイクプライスを 変更することがあります。そしてこれは、私の理解では、ドキュメントと矛盾するものではありませんでした。

このようなことに遭遇したことがある人はいますか?どうすれば解決するのか?

 
hoz:

どうしたらこのクソエラーを解消できる?もう、うんざりです。関数の入力パラメータを全てチェックしています。私の場合、今のところ、こんな感じです。

つまり、パラメータが変更されていなければ、変更する必要はないのです。今までやったことなかったけど、やってみようと思って...。

そして、このように注文変更メソッドにパラメータが渡されます。

ログにNw出力。

だから、ジャーナルは、修正:OK、しかし、その後...のように通知します。がエラーになる。どのパラメータも変更されていません。

注文は保留されています。そのため、オープン、ストップ、テイクプライスを変更することがあります。そしてこれは、私の理解では、ドキュメントと矛盾するものではありませんでした。

このようなことに遭遇したことがある人はいますか?どうすれば解決するのか?

エラーコードが、あなたの数々の機能の後にすでに上書きされていることを忘れて、誤った処理をしているのです。

ですから、エラーが発生したら、エラーコードをローカル変数に 保存して、そこから、後続の呼び出しが大量に発生した後に、プリントアウトする必要があります。

 
Renat:

エラーコードの扱いを間違えている、エラーコードはすでに多数の関数の後に上書きされていることを忘れているのだ。

したがって、エラーが発生したら、そのコードをローカル変数に保存し、それ以降の呼び出しが大量に発生してから、プリントアウトする必要があります。

エラー配列も作ってみてはどうでしょうか?変数_LastErrorには最後のエラーの番号が格納されることがドキュメントに白黒書かれています。そして、ResetLastError()関数でリセットされる。LastErrorの呼び出しの間にもうエラーがない場合、_LastErrorは最後のエラーの 値を格納する。私のコードには、もうエラーはありませんでした。まあ、そういう問題じゃないんですけどね。

それに、各メソッドでエラー用の変数を作成し、その変数をExpert Advisorに出力するのはあまり論理的ではありません。

結局のところ、エラーを収集する変数があるなら、なぜ新しいものを作るのか?

 

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();

最初の1枚にはコメントもつけました。そこではすべてが初歩的なことですが。

他にここで確認できることは?

 
イコール、期待するところに向けられたものではない、というダブルチェックをしていますよ。
 
evillive:
気づいたからこその掃除です)))
失礼だろ!;)
 
borilunad:
期待するところにイコールで指示されていないか、ダブルチェックはしていますよ。

ボリス どういうことだ?だって、値段がそうでないなら...とはっきり書いてあるんですもの。でないと...の何が言いたいの?20回確認することができる...:)意味がないんです。このコードと格闘して2日目になります。こんなバグに遭遇したのは初めてです。今、私はそれと向き合いました。これらの方法はすべて、すでに何度も書いてテストしています。ここで問題に直面しました。

私はどちらかというと、少し変わった戦術が好きだということです。しかし、最新のOwlsを書いていて、この不具合に出くわしました。それは自分自身は、pristrintovavすべてのコード縦とそれ以外の場合、私はより多くの考えを持っているので、掘る場所を知らないです。そのため、OrderModify() 関数が組み込まれているのです。そして、その実装を知らない。

 
hoz:

evillive、チェックがないとはどういうことですか?上に書きました。

最初の1枚にはコメントもつけました。そこではすべてが初歩的なことですが。

他にここで確認できることは?

ビクター、チェックの結果、新しい値が割り当てられるかどうか...。確認する必要があります。

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

ビクター、新しい値が割り当てられたかどうかを確認した後......。と確認する必要があります。

アレクセイ、それと、渡される関数の値が変わらないことを確認するためのチェックはどこにあるんだ?このことは、すでに上記で考慮済みです。そして、一般的な改造の必要性は、スタート時点で終わっています。そこにレベルがある、レベルが変わったとインジケータが報告 したら、次に行こう...。

 
hoz:

ボリス どういうことだ?だって、値段がそうでないなら...とはっきり書いてあるんですもの。でないと...の何が言いたいの?20回確認することができる...:)意味がないんです。このコードと格闘して2日目になります。こんなバグに遭遇したのは初めてです。今、私はそれと向き合いました。これらの方法はすべて、すでに何度も書いてテストしています。ここで問題に直面しました。

私はどちらかというと、少し変わった戦術が好きだということです。しかし、最新のOwlsを書いていて、この不具合に出くわしました。それは自分自身は、pristrintovavすべてのコード縦とそれ以外の場合、私はより多くの考えを持っているので、掘る場所を知らないです。そのため、OrderModify() 関数が組み込まれているのです。そして、その実装がわからない...。

ビクター、あなたRenatは、一般的に、正しく指摘し、アレクセイは、必要な最後のチェックを示し、以前は、意味のあいまいさを避けるために、すべてのニュアンスを持つ各パラメータのすべての必要なチェックを確認し、任意の条件を欠場することなく、!。
 
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();

最初の1枚にはコメントもつけました。そこではすべてが初歩的なことですが。

他にここで確認できることは?

また、3つのパラメータのいずれにも変更がない場合は、OrderModifyに触れてはいけないことを確認する必要があります。というか、これらのパラメータのうち少なくとも1つが変更されていれば、それだけでOrderModifyに進みます。
理由: