MT4からMT5への乗り換えの問題。正確には、MT5で一部のアルゴリズムをerrなしで実行できないことです。 - ページ 9

 
Vict:

そうです、例外を使ったコードはずっとシンプルできれいです。常にエラーチェックをすることで、混乱に陥ります。しかし、例外なくμlには問題が多い。 開発者はクロスを引かなかった。

私見では、違いはありません。

リターンコードについては、RETURN_IF_BAD_RESULT()のようなマクロを書いて、結果を返すすべての関数に貼り付ける必要があります。

例外として、TRY-CACTHセクションを書く必要があります。さらに、どの関数が例外を投げ、どの関数が例外を投げないかを覚えておく必要があるため、コードに // 例外というコメントを追加します。

何かは楽勝、何かは...。

 
Vict:

そう、例外を使ったコードはずっとシンプルでクリーンです。常にエラーをチェックし続けることで、コードがこんがらがってしまいます。しかし、例外なくμlには問題が多い。 開発者がクロスを引けなかったのです。

いや、例外の話でもなく...逆に「悪のコバンザメ」がいるかもしれない...。配列の 外側のトリップをすべて例外にする人 )))

imho、あなたは、OSにexitとreturnのすべてを分割する方法が必要です... それはいくつかのExit()であるように、あなたは正しいアイデアを得た、私は無限のコードスプールを掛けるしたくない - 常にすべての関数呼び出しをラップする意味はありません。

void OnStart()
{
if(!MyFuncReadOHLC_1()) return;
if(!MyFuncReadOHLC_2()) return;
....
}
 
Georgiy Merts:

私見では、違いはありません。

リターンコードについては、RETURN_IF_BAD_RESULT()のようなマクロを書いて、結果を返すすべての関数に貼り付ける必要があります。

例外として、TRY-CACTHセクションを書く必要があります。さらに、どの関数が例外を投げ、どの関数が例外を投げないかを覚えておき、コードに // 例外というコメントを追加してください。

なんかゴチャゴチャしてる、なんかゴチャゴチャしてる...。

例外で私は何も覚えておく必要はありません、しばしばさえTRY-CACTHは必要ありません(ちょうどプログラムのクラッシュを終了します)、それは排他的な状況であり、通常は発生しません、if - elseブロックにそれらを有効にしないでください。例えば、私はベクターライクなものを書きましたが、アロケーションに失敗したときに例外を投げる代わりに、オペレータ!をねじ込んで、挿入のたびにそれを引っ張らなければなりませんでした(忘れましたが)、怪しい利益です。

 
Igor Makanu:

imhoは、OSで全部割り切れるようにすればいいんです...。

うん、それもOK、ないのが不思議.

 
Vict:

そう、何もないのが不思議なくらいです・・・。

これはMQL4の典型的なテンプレートで、「新しいバー」をチェックし、インジケータをチェックし、注文で動作するかしないかを確認します。

void OnTick()
  {
   int takeprofit,stoploss; 
   double lot;
   ENUM_CMD CMD1,CMD2,CMD3;
   CMD1 = ind1();
   CMD2 = ind2();
   CMD3 = ind3();
   if(NewBar())
     {
      DeleteOrdersLimits(Magic);
      if(CMD1==CMD_BUY && CMD2==CMD_BUY && CMD3==CMD_BUY)
        {
         CalcTakeProfitStopLoss(takeprofit,stoploss);
         lot=CalcLot(stoploss);
         if(ReversSignal)SELL_STOP_PR(Low[1],lot,Magic,stoploss,takeprofit); else BUY_STOP_PR(High[1],lot,Magic,stoploss,takeprofit);
        }
      if(CMD1==CMD_SELL && CMD2==CMD_SELL && CMD3==CMD_SELL)
        {
         CalcTakeProfitStopLoss(takeprofit,stoploss);
         lot=CalcLot(stoploss);
         if(ReversSignal)BUY_STOP_PR(High[1],lot,Magic,stoploss,takeprofit);else SELL_STOP_PR(Low[1],lot,Magic,stoploss,takeprofit);
        }
     }
  }
//+------------------------------------------------------------------+

この例では、インジケータは異なるTFで動作するため、「すべてのティックを引っ張る」...というのは、どうでもいいことです。

ind1(),ind2(),ind3()とNewBar()でOHLCのデータを使用しています。

もし、1回の関数呼び出しで タイムセリーズアクセスエラーが発生したら、このコードを実行し続ける意味はあるのでしょうか?- OSを終了して新しいティックを待つ必要があります。つまり、ind1(),ind2(),ind3()とNewBar()でGetLastError()をチェックして、エラーを受け取ったら直ちにOSでExit()してEAログに書き込む のです。

 
Vict:

例外は何も覚える必要がなく、TRY-CACTHさえも必要ない場合が多い(緊急時にはプログラムが終了するだけ)、それは排他的な状況で、通常は起こらない、if-elseブロックに変えない。例えば、私はベクターライクなものを書きましたが、アロケーションに失敗したときに例外を投げる代わりに、オペレータ!をねじ込んで、挿入のたびにそれを引っ張らなければなりませんでした(忘れましたが)、怪しい利益です。

まあ、いいじゃないか、相棒...

何も覚える必要はない」と言いながら、続けて「TRY-CATCHすら不要な場合が多い」。 この同じ「よくある」というのは、どこかのブロックが必要で、どこかが不要で、それを覚える必要があるということ。 リターンコードと同じ状況で、何らかのリソースを要求して例外が発生(エラーが返る)すれば、リソースは拒否しなければなりません。つまり、どんな場合でも、どの関数が例外を投げ、どの関数が例外を投げないかを覚えておく必要があります。

あ、「例外的な状況」についてですが...。まあ、なんというか...。引用符の不在は、例外を投げる合理的な理由のようですが、それは「例外的な状況」なのでしょうか?

 
Igor Makanu:

これはMQL4の典型的なテンプレートで、「新しいバー」をチェックし、インジケータをチェックし、注文で動作するかしないかを確認します。

この例では、インジケータは異なるTFで動作するため、「すべてのティックを引っ張る」...というのは、どうでもいいことです。

ind1(),ind2(),ind3()とNewBar()でOHLCのデータを使用しています。

もし、1回の関数呼び出しで タイムセリーズアクセスエラーが発生したら、このコードを実行し続ける意味はあるのでしょうか?- OSを終了して新しいティックを待つ必要があります。つまり、ind1(),ind2(),ind3()とNewBar()でGetLastError()をチェックして、エラーが出たらすぐにOSでExit()してEAログに記録して います。

return(iErrCode)を呼び出すと何が問題なのでしょうか?

 
Georgiy Merts:

また、return(iErrrCode)を呼び出すと何が問題なのでしょうか?

うーん、コードで表示してみます。OHLCデータの処理が間違っていた場合にexitするようにコードを書き直したら、こんな感じになります。

void OnTick()
  {
   int takeprofit,stoploss; 
   double lot;
   bool nb;
   ENUM_CMD CMD1,CMD2,CMD3;
   if(!ind1( CMD1 )) return;
   if(!ind2( CMD2 )) return;
   if(!ind3( CMD3 )) return;
   if(!NewBar( nb )) return;
   
   if( nb )
     {
      DeleteOrdersLimits(Magic);
      if(CMD1==CMD_BUY && CMD2==CMD_BUY && CMD3==CMD_BUY)
        {
         CalcTakeProfitStopLoss(takeprofit,stoploss);
         lot=CalcLot(stoploss);
         if(ReversSignal)SELL_STOP_PR(Low[1],lot,Magic,stoploss,takeprofit); else BUY_STOP_PR(High[1],lot,Magic,stoploss,takeprofit);
        }
      if(CMD1==CMD_SELL && CMD2==CMD_SELL && CMD3==CMD_SELL)
        {
         CalcTakeProfitStopLoss(takeprofit,stoploss);
         lot=CalcLot(stoploss);
         if(ReversSignal)BUY_STOP_PR(High[1],lot,Magic,stoploss,takeprofit);else SELL_STOP_PR(Low[1],lot,Magic,stoploss,takeprofit);
        }
     }
  }

関数の値を参照で取得し、関数が正しく処理されなかった場合は終了するようにした(議論の文脈では、端末がTFによって履歴データを 準備しなかった)。

 
Georgiy Merts:

まあ、いいじゃないか、相棒...

何も覚える必要はない」と言いながら、続けて「TRY-CATCHすら不要な場合が多い」。 この同じ「よくある」というのは、どこかのブロックが必要で、どこかが不要で、それを覚える必要があるということ。 リターンコードと同じ状況で、何らかのリソースを要求して例外が発生(エラーが返る)すれば、リソースは拒否しなければなりません。つまり、どんな場合でも、どの関数が例外を投げ、どの関数が例外を投げないかを覚えておく必要があります。

あ、「例外的な状況」についてですが...。まあ、なんというか...。引用符の不在は例外を投げるには合理的ですが、「例外的な状況」なのでしょうか?

なんとなく自分なりに例外を間違って使ってしまっている、らしい。一般に、この関数が例外を投げるかどうかは気にする必要はないでしょう。TRY-CATCHの搭載は任意です。また、リソースの問題を回避するために、RAIIhttps://ru.wikipedia.org/wiki/%D0%9F%D0%BE%D0%BB%D1%83%D1%87%D0%B5%D0%BD%D0%B8%D0%B5_%D1%80%D0%B5%D1%81%D1%83%D1%80%D1%81%D0%B0_%D0%B5%D1%81%D1%82%D1%8C_%D0%B8%D0%BD%D0%B8%D1%86%D0%B8%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D1%8F を取得し、 スタックをスピンアップすることで、すべてをクリーンアップします。

そして、「例外的な状況」についてですが...。まあ、なんというか...。引用符の欠如は、例外を投げるための合理的な言い訳のように思えますが、「例外的な状況」なのでしょうか?
排他性はコード作成者次第ですが、例外は当然ながらif-elseに類するものであってはなりません。
 

変な話、今まで思いつかなかったんです。

// Немедленное завершение, деструкторы не вызываются
void abort() {Alert(1/(uint)MathAbs(0));}

メモリ割り当ての ような大量のエラーチェックを取り除くことができます。