もしかしたら、カウンタがEA内のどこかで別の値を取得するのかもしれません。
void start() { int counter=0, MaxCount = 10000; while( counter <= MaxCount ) {Print("Counter ", counter); counter++; } return; }
皆さん、こんにちは。
私のEA(600以前のビルドでテストしたことはありませんが、コードは2年前のものです)は、ビルド625でWHILEの間にスタックしてしまいます。
実際、WHILEが始まるとき、式をチェックすることができないようです:その結果、それは決して出てきません。開始関数に配置されます。
私は何が起こっているかを理解するために、非常に簡単なEAを試してみました。
さて、最初のカウンタ値は、通常、0からではなく、9500以上のランダムな値から始まります。
なぜでしょうか?何か提案はありますか?
あなたはカウンターをグローバルに宣言しました。
OnStart()のコードで、counter++は、カウンタ値を10000まで押し上げます。
つまり、静的であるため、次のtickでは、カウンタは最初から10,000になっています。
あなたは、カウンターをグローバルに宣言していますが、これは静的であることを意味します。
OnStart()のコード、counter++は、カウンターの値を10,000まで押し上げる。
ということは、静的なので、次のtickでは、カウンタは最初から10,000になっています。
と書いています。
さて、最初のカウンタ値は、通常0からではなく、9500以上のランダムな値から始まります。
なぜでしょうか?何か提案はありますか?
というわけで、これが私の答えです。
多分、カウンターはEA内部の他のどこかで別の値を取得します。
void start() { int counter=0, MaxCount = 10000; while( counter <= MaxCount ) {Print("Counter ", counter); counter++; } return; }
皆さん、こんにちは。
私のEA(600以前のビルドでテストしたことはありませんが、コードは2年前のものです)は、ビルド625でWHILEの間にスタックしてしまいます。
実際、WHILEが始まるとき、式をチェックすることができないようです:その結果、それは決して出てきません。開始関数に配置されています。
私は何が起こっているかを理解するために、非常に単純なEAを試してみました。
さて、最初のカウンタ値は、通常、0からではなく、9500以上のランダムな値から始まります。
なぜでしょうか?何か提案はありますか?
このような高速ループに対応できない「エキスパート」タブで見ている可能性が高いです。
実際のログファイルを開いてみてください。
ひとつ言えることは、コードのどこかでもう一度カウンタ変数を呼び出して、その値を10,001以下に戻さない限り、whileループは2回目には実行されないということです。変数のグローバルな宣言には注意が必要です。
GumRaiさん、その通りです。ログには1から始まるすべての出力が報告されます。
変数宣言をOnStart()内ではなくグローバルスペースに置くことの違いは、最初のケースではループが一回実行されるのに対し、2番目のケースでは無限に繰り返されることです。
しかし...カウントサイクルがうまく実行されているので、私が間違ったデバッグ例を選択したことが明らかです。
すべては次のEAから始まった。
以下がそのコードです。
extern int SwingBarCount = 100;
int start() { int SwingHighShift = 0; string StringHighStatus = "False"; int SwingHigh = 0; while (StringHighStatus == "False" || SwingHighShift <= SwingBarCount) { if(iFractals(NULL, 0, MODE_UPPER, SwingHighShift) == iHigh(NULL, 0, SwingHighShift) && iFractals(NULL, 0, MODE_UPPER, SwingHighShift) > Close[0]) { StringHighStatus = "True"; SwingHigh = SwingHighShift; ObjectDelete("SwingHigh"); ObjectCreate("SwingHigh", OBJ_VLINE, 0, Time[SwingHigh], 0); ObjectSet("SwingHigh", OBJPROP_COLOR, Red); } else { SwingHighShift++; } } }}
ブレークポイントを置いたので、WHILEまで実行されています。
WHILE条件が真で始まり、StringHighStatusが真になるかStringHighShiftがSwingBarCountに達するまでIF ELSEを循環させるはずです。
しかし、WHILEの後にCOMMENTとPRINTコマンドが続き、何も出力されないため、いつまでも終わらないのです。
StringHighStatusがfalseのままでも、カウンタがSwingBarCountに到達しなければならないのです。
私はそれが動作するために、このように変更する必要がありました。
while (!EndCycle) { if(iFractals(NULL, 0, MODE_UPPER, SwingHighShift) == iHigh(NULL, 0, SwingHighShift) && iFractals(NULL, 0, MODE_UPPER, SwingHighShift) > Close[0]) { StringHighStatus = "True"; SwingHigh = SwingHighShift; ObjectDelete("SwingHigh"); ObjectCreate("SwingHigh", OBJ_VLINE, 0, Time[SwingHigh], 0); ObjectSet("SwingHigh", OBJPROP_COLOR, Red); } else { SwingHighShift++; } if( StringHighStatus == "True" ) EndCycle = TRUE; if( SwingHighShift > SwingBarCount ) EndCycle = TRUE; }
なぜEndCycleを処理し、他の条件を処理しないのか理解できません。
ご回答ありがとうございました。
if( StringHighStatus == "True" ) EndCycle = TRUE; else if( SwingHighShift > SwingBarCount ) EndCycle = TRUE;try includeelse.
- 無料取引アプリ
- 8千を超えるシグナルをコピー
- 金融ニュースで金融マーケットを探索
皆さん、こんにちは。
私のEA(600以前のビルドでテストしたことはありませんが、コードは2年前のものです)は、ビルド625でWHILEの間にスタックしてしまいます。
実際、WHILEが始まるとき、式をチェックすることができないようです:その結果、それは決して出てきません。開始関数に 配置されます。
私は何が起こっているかを理解するために、非常に単純なEAを試してみました。
さて、最初のカウンタ値は、通常、0からではなく、9500以上のランダムな値から始まります。
なぜでしょうか?何か提案はありますか?