MQL4、MQL5に関する初心者からの質問、アルゴリズムやコードに関するヘルプ、ディスカッションなど。 - ページ 608

 
for(int h = OrdersTotal()-1; h >= 0; h--) // Начинаем цикл перебора ордеров
    {
     if(OrderSelect(h, SELECT_BY_POS)) //Выбираем ордер с индексом h
      {
       if((cnt_OO >= 2))//Если cnt_OO больше либоравно 2 выполняем блок иначе переходим к Метке 1
        {
       if((OrderMagicNumber() == Magic)&&(OrderLots() <= Lots/Prikup - Dplus))//Если мейджик выбраного ордера совпадает и лотность совпадает с Lots/Prikup - Dplus
//(если переменные типа double необходимо обязательно нормализовать) выполняем блок иначе переходим к Метке 1
        {
         Nextstep  = NextStep;
         BaseNext  = OrderOpenPrice();
         LotsNext  = NormalizeDouble(OrderLots()*K,lotDigit);
         if(NewPB > 0)
          PBcloseON = true;
         Alert ("Pospedny Order NEXT  ",OrderTicket());
         Alert ("Otkritih orderov  ",cnt_OO);
        break; //Прерываем цикл
        }}
//Метка 1
         LotsNext    = NormalizeDouble(Lots*Prikup,lotDigit); 
         Alert ("Otkritih orderov NEXT net ");
        Alert ("Otkritih orderov  ",cnt_OO);
         break;// Прерываем цикл 
     
        }}

最初の問題Lots/Prikup - Dplus は,正規化しなければなりません。 注意深く読んでください。 もし変数がdouble型 であれば,4/2が期待した2ではなく,1.999999999を出すことに驚きとともに気づくでしょう - おそらくあなたはまだこの問題に直面したことがないはずです。

つまり、もし((OrderMagicNumber() == Magic)&&(OrderLots() <= Lots/Prikup - Dplus)) が偽で、高い確率で偽だと言えるなら、たとえ cnt_OO が1より大きくてもラベル1の後のブロックに来ることが保証されている。だから、すべてエラーなく動作する 問題はデータ処理ロジックにある。

2つ目の問題は、リストの最後のオーダーだけを処理することが保証されているため、わざわざforループを使用する必要があるかということです。

テスターの時だけこれをやって、リストから最後のオーダーを選ぶと、本当に必要なオーダーが出る、とは限りません。実際の市場では、特に複数のExpert Advisorが動作している場合、期待とは異なるものが得られることが保証されており、breakコマンドを使用して最初のパス後にループが壊れることが保証されています。

 
Vitaly Gorbunov:

最初の問題Lots/Prikup - Dplus は,正規化する必要があります。 よく読んでください。 もし変数がdouble型 であれば,4/2が期待した2ではなく,1.999999999を出すことに驚くでしょう - おそらくあなたはまだこの問題に直面したことがないはずです。

つまり、もし((OrderMagicNumber() == Magic)&&(OrderLots() <= Lots/Prikup - Dplus)) が偽で、高い確率で偽だと言えるなら、たとえ cnt_OO が1より大きくてもラベル1の後のブロックに来ることが保証されている。だから、すべてエラーなしで動く 問題はデータ処理のロジックだ。

2つ目の問題は、リストの最後のオーダーだけを処理することが保証されているため、わざわざforループを使用する必要があるかということです。

テスターの時だけこれをやって、リストから最後のオーダーを選ぶと、本当に必要なオーダーが出る、とは限りません。実際の市場では、特に複数のExpert Advisorが動作している場合、期待とは異なるものが得られることが保証されており、ループは最初のパスで壊れます。

ヴィタリー・ゴルブノフ

最初の問題Lots/Prikup - Dplus は正規化する必要があります。 変数がdouble 型の 場合,4/2 が期待した 2 ではなく 1.9999999999 を出力すると驚きますが,おそらくあなたはまだこの問題に直面していないでしょう。

つまり、もし((OrderMagicNumber() == Magic)&&(OrderLots() <= Lots/Prikup - Dplus)) が偽で、高い確率で偽だと言えるなら、たとえ cnt_OO が1より大きくてもラベル1の後のブロックに来ることが保証されている。だから、すべてエラーなしで動く 問題はデータ処理のロジックだ。

2つ目の問題は、リストの最後のオーダーだけを処理することが保証されているため、わざわざforループを使用する必要があるかということです。

テスターの時だけこれをやって、リストから最後のオーダーを選ぶと、本当に必要なオーダーが出る、とは限りません。実際の市場では、特に複数のExpert Advisorが動作している場合、正確に間違った注文を得ることが保証され、ループは最初のパスの後にbreakコマンドで中断されます。

正規化については......ありがとうございます、抜けていることに気づきませんでした。目がおかしくなってしまったんです。

forループについて:アーカイブには、異なる魔導師と、異なるペアから、異なるオーダーがあります。必要なものを見つけるまで、端から見ていくんです。EAがまだ動作しておらず、私が必要とする新しい注文がリストに表示されていない場合に起こります。ループは最初のパスではなく、必要な順序が見つかった時点で中断されます。

OnlinitとOnDeinitという関数を正しく理解する必要があります。その必要性は明らかです。

 

この実装では、ループは動作しません。あなたのコードを異なるバリアントで常に1パスで実行しました。

そして今、あなたがどこで間違えたのかがわかりましたよ。

for(int h = OrdersTotal()-1; h >= 0; h--) // Начинаем цикл перебора ордеров
    {
     if(OrderSelect(h, SELECT_BY_POS)) //Выбираем ордер с индексом h
      {
       if((cnt_OO >= 2))//Если cnt_OO больше либоравно 2 выполняем блок иначе переходим к Метке 1
        {
       if((OrderMagicNumber() == Magic)&&(OrderLots() <= Lots/Prikup - Dplus))//Если мейджик выбраного ордера совпадает и лотность совпадает с Lots/Prikup - Dplus
//(если переменные типа double необходимо обязательно нормализовать) выполняем блок иначе переходим к команде continue
        {
         Nextstep  = NextStep;
         BaseNext  = OrderOpenPrice();
         LotsNext  = NormalizeDouble(OrderLots()*K,lotDigit);
         if(NewPB > 0)
          PBcloseON = true;
         Alert ("Pospedny Order NEXT  ",OrderTicket());
         Alert ("Otkritih orderov  ",cnt_OO);
        break; //Прерываем цикл
        }

        continue; //Вернёмся в цикл за следующим ордером если предыдущий не прошёл проверку
       }
//Метка 1
         LotsNext    = NormalizeDouble(Lots*Prikup,lotDigit); 
         Alert ("Otkritih orderov NEXT net ");
        Alert ("Otkritih orderov  ",cnt_OO);
         break;// Прерываем цикл 
     
        }}

なるべく全部コメントしましたぜひお試しください。

 
Vitaly Gorbunov:

この実装では、ループは動作しません。あなたのコードを異なるバリアントで常に1パスで実行しました。

そして今、あなたがどこでミスをしたのかが明確になりました

なるべく全部コメントしましたぜひお試しください。

ありがとう、わかったよ。正規化されていないというエラーの回避策を紹介します。リカバリーアルゴリズムを精査した結果、Condition&&(OrderLots() <= Lots/Prikup - Dplus)は不要と思わ れた。

皆様、良いアドバイスをありがとうございました。



以下はテスト結果です。リアルでも同じぐらい、さらに良くなっています。あらかじめご了承ください。これはマーチンゲールではありません。あなたが思っている以上にひどいんですよ :=)。ドローダウン1.3% 利益507$。

 
良い結果ですね。これ以上問題があっても、何が問題なのか、正しい情報を聞き出すのは難しい。もしよろしければ、迷子にならないよう、私を友達として追加してください。
 
Vitaly Muzichenko:

うまくいって、その結果を共有しても構わない場合 - 問題の解決策を書く

うまくいきませんでした(phpのopensslライブラリを使用しました)。別の方法で問題を解決した。

 
Juer:

動作しませんでした(phpのopensslライブラリを使用しました)。別の方法で問題を解決した。

結局、MTで暗号化し、.phpで復号化したんですか?どちらの方法で使用されましたか?

 
Vitaly Muzichenko:

結局、MTで暗号化し、.phpで復号化したんですか?どのような方法で行ったのですか?

いや、だからダメだってば。あきらめていたんです。私の場合、ハッシュで十分でした。ハッシュを送受信し、確認として別のハッシュを返していました。

そのため、PHPで復号化することができませんでした。誰かがこの問題を真剣に調べてくれるといいのですが。開発者とかかな。

 
Juer:

いや、うまくいかないと書いたんです。あきらめていたんです。私の仕事にはハッシュがあれば十分でした。ハッシュを送信して受信し、確認として別のハッシュを返しました。

そのため、PHPで復号化することができませんでした。誰かがこの問題を真剣に調べてくれるといいのですが。開発者とかかな。

puch で独自の暗号化関数を書き、mq に移植する。そうすれば解読されることはないし、どちらにしても100%機能する。

 
Vitaly Muzichenko:

もしうまくいき、その結果を共有しても構わないのであれば、解決策を投稿してください。

google "PKCS#7パディングフォーマット"