if(cnt_OO>0) //Если нет ордеров то и не надо ни чего делать
{
for(int h = OrdersTotal()-1; h >= 0; h--)
{
if(OrderSelect(h, SELECT_BY_POS))
{
if(cnt_OO==1)
{
//Если ордер один проверяем тот ли ордер (майджик и прочее) и что то там делаем
}
else
{
//Если ордеров больше чем 1 проверяем те ли ордера (майджик и прочее) и что то там делаем
}
}
}
}
Сразу же после того, как клиентский терминал загрузит программу (эксперт или пользовательский индикатор) и запустит процесс инициализации глобальных переменных, будет послано событие Init, которое обрабатывается функцией OnInit(), если она есть. Это событие также генерируется после смены финансового инструмента и/или периода графика, после...
必要なオーダー数をどこかで確認したのはいいのですが、このブロックでは、もう一度すべてのオーダーを実行して確認するのです
コードをきちんと分解すれば、一発でわかる!
こんな風に試してみてください
あなたのコードには、他に何も見当たりません
他のケースを投げる、何が間違っているのか見てみよう :)
論理を慎重に検討した結果、あなたのコードをリバース・エンジニアリングしました。
こんな感じに仕上がりました。
そういうふうにすればいいんです。しかし、チュートリアルでは、条件が満たされない場合、if()演算子の条件を処理するブロックを閉じる中括弧の後のコマンドが処理されると書かれています。そんなことはないのです。
もう一つ不具合があった。
最初のif演算子にもう一つ条件を追加すると、つまり次の条件を追加すると、うまくいかなくなりました。
2つの提案があります。
1.バカな戦略テスターこうした状況はプログラムのデバッグ段階で発生するため、実際のアカウントで確認するのは、よほどのバカでなければできない。また、デモ口座でも、再稼働の状況を再現することは難しいのでテスターがアホなのは、MT4のウィンドウで複数の注文の決済が一度に行われると、その順番が実際のものと一致しないことが多いということを物語っているのです。これは、プログラム中の最後のオーダーを再計算するとよくわかります。このエラーによって、私は誰がおかしいのか、1週間も悩んだ。
テスターの操作のロジックそのものが、ティック履歴上でも、実生活とはかけ離れているのです。私のアルゴリズムにとって非常に重要なものです。
2.推測として。MQL/MT4だけでなく、システムの専門家など、特に上級者の方に質問です。
- 同じペアで2つの同じEAを別々のウィンドウで使っています。例えば、週末にコンピュータを休ませた後、月曜日にEAを実行すると、最初のティックが表示されたときに、両方とも同時に動き始めます。まず国家を復興させるために、どちらかが先に動いてくれればと思ったのです。運のいい人が先に働いていた。
実際、データ復旧のメッセージはまちまちです。つまり、プログラムの実行は、システムタイマーなどの何らかの条件によって中断され、その後継続されます。例えば、別のアカウントに切り替えて様子を見るなど、興味深い状況が発生します。口座を確認する条件は、プログラムの最初と、最初の口座に戻る瞬間に、プログラムは途中で、今ある口座が何であるかはどうでもよくなるのです。
私は解決策を見つけました。各ブロックの最初に、口座番号を確認するのです。どこがどうなっているのかわからない。
Amon1953 私が修正した最初のバージョンはご覧になりましたか?効果はあるのか?まさにif()のマニュアルに書かれている通りで、長年使っていてもうまくいきます。問題は、あなたのコードで、間違ったブロックにブレークを置いたことです。
if((OrderSelect(i,SELECT_BY_POS,MODE_HISTORY))&&(OrderMagicNumber() == Magic)&&(OrderLotsOld==zLots)) 変数に何が代入されているかをチェックしなければなりません。
2つ目のポイントとして、両方のフクロウが並列に動作しているため、両者からのメッセージが混在してしまいます。 あなたが説明したように、フクロウのコピー間でセマフォリングを実装する必要があります。そして、アカウントを変更すると変なことが起こるのがとても面白いです。OnInitとOnDeinitは是非とも欲しいところです。ほとんどの場合、問題はそこにある。
Amon1953 私が修正した最初のバージョンはご覧になりましたか?効果はあるのか?まさにif()のマニュアルに書かれている通りで、長年使っていてもうまくいきます。問題は、あなたのコードで、間違ったブロックにブレークを置いたことです。
if((OrderSelect(i,SELECT_BY_POS,MODE_HISTORY))&&(OrderMagicNumber() == Magic)&&(OrderLotsOld==zLots)) 変数に何が代入されているかをチェックしなければなりません。
2つ目のポイントとして、両方のフクロウが並列に動作しているため、両者からのメッセージが混在してしまいます。 あなたが説明したように、フクロウのコピー間でセマフォリングを実装する必要があります。そして、アカウントを変更すると変なことが起こるというのが非常に面白いですね。OnInitとOnDeinitは是非とも欲しいところです。ほとんどの場合、問題はそこにある。
最後の順番でループを抜ける必要があるため、確認していません(リストの1番目です)。
私は経験豊富なプログラマーではないので、OnInitとOnDeinitの動作を完全に理解しているわけではありません。そのため、私のコードでは使用していませんが、途中で中断することなくプログラムを実行することができるようです。
セマフォもよくわからない、アドバイザーは別々のウィンドウにインストールされ、異なるメジャーを持つ
最近プログラミングを始めたばかりの方へのアドバイスとしては、プログラミングの基本をもう一度勉強してみることです。悪気はないのですが、あなたはとてもコミュニケーションが取りにくいです。
ありがとうございます。初心者のためのコーナーです。このようなコミュニケーションでも、私は恩恵を受けています。EAのアルゴリズムとプログラムコードの両方をやるのは大変(特にプログラミング言語がかなり未経験なので)
ベースを締める必要がありそうですねー。あなたのコードからは、どのようなロジックを実装したいのかがよく分からないので、言葉で説明してみてください。そして、どこに間違いがあるのか説明してみます。
私が必要とするものは、以前にも説明したとおりです。詳細を明らかにしていこうと思います。
EAを再起動するときは、アルゴリズムが注文の連鎖であるため、以前の状態を復元する必要があります。最初のオーダーは基本的なもので、そこから次のオーダーのパラメータを計算することができます。例えば、2回目の注文のボリュームはベースの50%、3回目は75%、といった具合です。EAを再起動する場合、次の注文の数量は最後の注文から計算されるため、ベースラインと最後の注文の数量を知っておく必要があります。例えば、3つの未決済注文がある場合、次の(4つ目の)注文を計算するために、最後に開いた注文の数量を求める必要があります。
注文が1つしかない場合は、それは基本的なものであり、私たちはこの件には興味がなく、別のユニットが担当していることを意味します。
アルゴリズムは非常にシンプルです。しかし、それは2つのif()演算子でしか動作しません。
私が必要とするものは、以前にも説明したとおりです。詳細を明らかにしていこうと思います。
EAを再起動 するときは、アルゴリズムが注文の連鎖であるため、以前の状態を復元する必要が あります。最初のオーダーは基本的なもので、そこから次のオーダーのパラメータを計算することができます。例えば、2回目の注文のボリュームはベースの50%、3回目は75%、といった具合です。EAを再起動する場合、次の注文の数量は最後の注文から計算されるため、ベースラインと最後の注文の数量を知っておく必要があります。例えば、3つの未決済注文がある場合、次の(4つ目の)注文を計算するために、最後の未決済注文の数量を求める必要があります。
注文が1つしかない場合は、それがベースのものであることを意味し、この場合、我々は関心を持たず、別のユニットが処理する。
アルゴリズムは非常にシンプルです。しかし、それは2つのif()演算子でしか動作しません。
最後のオーダーでループを抜ける必要があるため、確認していません(リストの最初のオーダーです)。
私は経験豊富なプログラマーではないので、OnInitとOnDeinitの動作がよく わかりません。そのため、私のコードでは使用していませんが、途中で中断することなくプログラムを実行することができるようです。
セマフォについても、明確ではありません。 Expert Advisorは、異なるウィンドウにインストールされ、異なるメジャーを持ちます。
ドキュメントをお読みください。
オンイット
OnInit()関数は、Init イベントハンドラです。void 型 または int 型で、パラメータを 持たない。
voidOnInit()。
InitイベントはExpert AdvisorやIndicatorをロードした直後に生成されます。OnInit()関数は、初期化に使用される。OnInit()の戻り値が int 型の場合、0 以外の戻り値は初期化に失敗したことを意味し、初期化解除理由コード REASON_INITFAILEDでDeinit イベントを発生させる。
また、変数の可視性を整理してください。