どんな新人の質問でも、フォーラムを乱雑にしないように。プロフェッショナルは、通り過ぎないでください。Nowhere without you - 6. - ページ 156

 

1)int err=0 を宣言したとき、なぜすぐに初期化しないのか?

2) 確認していませんが、ドキュメントに よると err は何らかの変数に格納され、GetLastError() 関数を使用すると自動でゼロになるようです。

また、一部の機能(主にターミナル)を使用すると常に変化します。

3)OrderSelect で存在しないチケット番号を参照した後、 GetLastError() が値 0 を与えたのは、このためです。

" その他の関数は、いかなる状況でも変数last_errorの値を変更しません"

 
hoz:

よく、関数の中でこのように変数を宣言することがあります。

さらに内部では、ある条件ですでにエラーがあるかどうかを確認するために呼び出しています。まあ、私だけでなく、私が遭遇したコードの多くの場所でそうなのですが。言ってみれば、典型的なシチュエーションですね。今日思ったのは、エラー制御をしたい各関数で毎回同じ変数を宣言するのは論理的ではない、ということです。よく考えたら、一度グローバルに宣言して、initで初期化する方が簡単だという結論に達しました。こんな感じです。

そしてさらに、ユーザー関数でerr変数を呼び出す必要があるとき、すでに値を持っていることを知っていることです。実は、GetLastError() は最後に発生したエラーのコードを出力するので、エラーコードを出力する役割を持つ各計算の最後に、この変数errを各関数で呼び出し、GetLastError()を呼べば、全て正しくなりますよね?

しかし、この変数を何らかの関数の最後で(コード実行の連鎖をたどって)呼ばないと、リセットされず、前の実行でエラーがあったが、現在の実行ではエラーがなく、最後にエラーコードが返された場合、間違った実行をすることになる.........。そして、それをリセットするためには、この関数GetLastError()を呼び出す必要があります。つまり、ここではすべてが呼び出されたかどうかにかかっているのです。どこまでも続くと確信が持てないなら、毎回再保険をかけてリセットしたほうが楽でしょう?

グローバルに宣言し、start() でGetLastError() を呼び出す前にそれをリセットすることができます。

int err;
//------------------
int init() 
{
  // ...
  return(0);
}
//------------------
int start() 
{ 
  // ...
  RefreshRates();
  OrderClose(...);
  err=0;     // обнуление
  err=GetLastError();
  SomeErrFunction(err);
  // ...
return(0);
}
 
ALXIMIKS:

1)int err=0 を宣言したとき、なぜすぐに初期化しないのか?


お試しあれ!:)私には効果がありませんでした。私の理解では、グローバル変数での特殊関数による初期化は認められて いないようです。ドキュメントには何も書かれていないようですが。
ALXIMIKS

2) 確認していませんが、ドキュメントに よると err は何らかの変数に格納され、GetLastError() 関数を使用すると自動でゼロになるようです。

また、一部の機能(主にターミナル)を使用すると常に変化します。

ゼロにすることについては上に書きましたが、そこで、LastError 変数に値が入った後に(), であれば、それをリセットするために、GetLastError 関数を呼び出す必要があります。() を呼び出すと、最後のエラーのコードが返され、LastError 変数 がリセットされます。そうでなければ、最後のエラーのコードはGetLastError() その結果、最後のエラーのコードが存在しない場合、そのコードを返すことがある。(例:ログやプリントを読みにくくするために別の関数で)。
ALXIMIKS

3)OrderSelect で存在しないチケット番号を参照した後、 GetLastError() が値 0 を与えたのは、このためです。

" その他の関数は、いかなる状況下でも変数last_errorの値を変更しない..............................................................................................."

これはOrderSelect() が原因ではなく、 他の何かが間違って いる可能性が高いです (同じ関数内の近く) 特に、他の多くのものから影響を受けることが多い。
 
paladin80:

err をグローバルに宣言し、start() でそれをゼロにしてから GetLastError() を呼び出すことができます。

スタート時に宣言しておいて、コード中に1つ以上エラーが出るようなら、もうロジックがおかしくなっています。GetLastError() が常に呼び出されるのでなければ(理論的には各ユーザー関数の最後で)。
 
hoz:
となると、すでに論理的な問題がある。GetLastError() が常に呼び出されるのでなければ(理論的には 各ユーザー関数の最後に)。

時にはもっと頻繁に呼び出す必要があります
 

Victor(hoz)さん、最後の エラーで大騒ぎするのは理解できません。

エラー処理用の関数を宣言し、必要な場所で呼び出す。すべてがローカルになり、どこでも使えるようになる。

// Объявление:
void CommentError(int nLastCodeError, string sComment)
 {
  if (nLastCodeError != 0) Print(sComment, "  ", ErrorDescription(nLastCodeError));
 }

// Вызов:
void start()
 {
  CommentError(GetLastError(), "Ошибка в функции start()!");
 }
 
Zhunko:

Victor(hoz)さん、最後のエラーで大騒ぎするのは理解できません。

エラー処理用の関数を宣言し、必要な場所で呼び出す。すべてがローカルになり、どこでも使えるようになる。


それは理解できる。しかし、この関数は私が必要とするとき、つまりエラーがあるかどうかをチェックしたいときに呼び出されることになります。でも、前にどこかでエラーがあって、今この瞬間にエラーがない場合は、前のエラーを返してしまう...。なぜなら、あなたの関数Vadimでは、GetLastError() を呼び出すことによって、LastError 変数がゼロにならないからです。ここからが本題...
 
hoz:

それは理解できる。しかし、この関数は私が必要とするとき、つまりエラーがあるかどうかをチェックしたいときに呼び出されます。でも、さっきどこかでエラーがあったのに、今この瞬間にエラーがなかったら、前のエラーを返してしまう...。なぜなら、あなたの関数Vadimでは、GetLastError()を呼び出すことによって、LastError 変数がゼロにならないからです。そこがポイントなんですが...。

ゼロにリセットしてはならない。関数の後、いたるところでエラーをチェックする習慣があるはずです。また、通話不可にする必要があります。戦闘モードで遅くならないように。つまり、そういうデバッガなのです。

もちろん、判断のために分析が必要なエラーは例外です。

 
hoz:

それは理解できる。しかし、この関数は私が必要とするとき、つまりエラーがあるかどうかをチェックしたいときに呼び出されることになります。でも、前にどこかでエラーがあって、今この瞬間にエラーがない場合は、前のエラーを返してしまう...。なぜなら、あなたの関数Vadimでは、GetLastError()を呼び出すことによって、LastError 変数がゼロにならないからです。ここがポイント...
まずゼロにし(err=0;)、次にアクションを呼び、err=GetLastError()を代入して 処理し、再びerr=0にすることを妨げるものは何でしょう。
 
T/P、S/Lを変えた場合のプロフィットファクターの計算方法。テイクとストップが20pipsずつなら、儲かったトレードと損したトレードの数を計算して割り算してみよう、というのはわかりやすいですね。TPを40pips、ストップを30pipsとした場合、どのように計算すればよいのでしょうか? 同じ場所で同じように使っていく。