同じ動作をさせる条件において、多くの "or"(|)を避けることは可能でしょうか? - ページ 7

 

今夜は実りある夜でした!寝ている間に面白いことをたくさん投げかけてもらって、本当に感謝しています。そして、あなたの朝も夕方より賢かった!?

提案されたものにざっと目を通すと、相変わらず疑問が湧いてきますが、とりあえず、かなり広範囲なので、最後の式を1つのAction()だけで行うことが可能かどうかを調べたいのです。

if (!A) if (!B) if (!C) if (!D)
else Action();


もっと早くてもいいような気がします。確かに、最後の1つだけが実行される場合、すべての条件をチェックすることを妨げない、あるいは私が間違っている、その方がいいと思います。

いかがでしょうか?

 
FAQ:
クソMQL4」が嫌な奴は逃げた方がいい、逃げた方が。なぜなら、このアカウントの長所や古さはともかく、彼がここで何をしているのかが不明だからだ。
素人にもわかるように説明してください!
 
Meat:
一般的には、一番早い選択肢はこれでしょう。

ただし、else result=falseの行は、最初の行と組み合わせた方が、速度に影響しない。一般に、A、B、C、Dに単純な条件(最小限の演算で、すべての数学関数などを呼び出さない)が含まれている場合、このような最適化による性能向上はあまり期待できません(もちろん、この構築が何千万回と実行されない限り)。 しかしコードのオーバーロードは大きな意味を持つことがあります。

私は、あるスレッドで、すべては合理的に処理されなければならないと書きました。 なぜか、あなたのコードは、より重要な場所に満ちているようです。 その最適化は、本当に大きな性能向上を与えるでしょう。 あなたは、基本アルゴリズムから始めるべきです。 ほとんどの初心者は、TSまたはオープンオーダーに関するすべての条件を毎ティックでチェックするのが馬鹿らしいです。しかし、ほとんどの場合、例えば、高値や安値がある値に達したときや、新しいバーが現れたときなど、境界条件だけをチェックすれば十分です。 その後で、さらにチェックを行うことができます。

まあ、リソースを大量に消費する計算の他は、これらの計算をDLLに移行することを考える必要がありますね。そうでなければ、クソMQL4で13分も待たさ れるのは(2~3分で同じ結果が得られるのに)不幸なことだと思います :)


とはいえ、最初の部分には全く同意見です。
 
icas:

その方がさらに速いんです。

ある物語が頭に浮かぶ。

"ある会社の役員会で2つの質問があった。

1.シンクロファソトロンの建設が決定。

2.従業員用の駐輪場を作ることにしたこと。

最初の課題では、1分間のディスカッションが行われました。

2日、2時間以上にわたる討論が行われた。

ああ、そうだな...駐輪場について...
 
borilunad:

今夜は実りある夜でした!寝ている間に面白いことをたくさん投げかけてもらって、本当に感謝しています。そして、あなたの朝も夕方より賢かった!?

提案されたものにざっと目を通すと、相変わらず疑問が湧いてきますが、とりあえず、かなり広範囲なので、最後の式を1つのAction()のみで行うことが可能かどうか調べたいのです。

もっと早くてもいいような気がします。確かに、最後の1つだけが実行される場合、すべての条件をチェックすることを妨げない、あるいは私が間違っている、その方がいいと思います。

いかがでしょうか?

いや、そういうわけにはいかない。まず、if()の後に何か、少なくともセミコロン(つまり空の演算 子)だけでもなければなりません。次に、あなたのelseオペレータは、どのifに属することを意図しているのでしょうか?もし、最後の1つだけを参照するのであれば(あなたが書いたように)、A、B、Cが偽で、Dの条件が真である場合にのみ、Actionが実行されます。ロジックを明確にするために、中括弧を置くことを常に推奨します。

 
FAQ:

ありがとうございました。DLLなどのプロMCLogoの使用は今のところ避けています。

この場を借りて、Alexey(Meat)さんに、M1ではありますが、全てのポジションオープンは 新しいバーで行われますが、それ以外は全てのティックで動作すると返信させていただきます。また、必要な関数をたくさん使っています(起動時にすべてチェックすると、コードがとても重くなります)。MathPow()も1つありますが、これはMathematicianが提案する指数に置き換えてみます。それ以外については、修正と閉鎖のために必要なすべてのオーバーシュート。それがない場合はどうすればいいのか。

 
注文の監視と再計算に注意を払うこと。これは、通常、アドバイザーが最も行うことです。
 
alsu:

いや、そういうわけにもいかない。まず、if()の後に何か、少なくともセミコロンだけでも(つまり空の演算子)なければなりません。次に、あなたのelseオペレータは、どのifに属していることになるのでしょうか?もし、最後の1つだけを参照するのであれば(あなたが書いたように)、A、B、Cが偽で、Dの条件が真である場合にのみ、Actionが実行されます。ロジックを明確にするために、中括弧を置くことが常に望ましい。

ありがとうございました。でも、Action();は1つだけでいいんです! でも、どうしたらいいかわからないんです!ヒントを教えてください。

 
FAQ:
コントロールとオーダーの再計算に注意を払う。これは通常、アドバイザーが最も行うことです。
しかし、それらは避けられないもので、そうでなければエラーが発生するのです
 

私のプログラムでは、ifがたくさんある場合、そもそもfalseを出すことが多い条件を入れて、この構文を使っています。

if (A>B)
{  if (C>=10)
   {  if (D<=5)
      {  if(E=1)
         Action:
      }
   }
}
また、多くのif-opsをチェックする必要がある場合は、次のようになります。
if (A>B || N<M)
{  if (C>=10 || P<100)
   {  if (D<=5 || R>1)
      {  if(E=1 || S!=0)
         Action:
      }
   }
}