アドバイザープロジェクト

 
こんにちは。
コードの量が増えてくると、時に難しくなり、混乱することもあります。
膨大な行数のEAコードを見たことがありますが、複雑なEAはどのように設計 されているのでしょうか、もしかしたらこのような複雑なアルゴリズムを扱うためのツールやトリックがあるのでしょうか?
 
Gregory Kovalenko:
こんにちは。
コードの量が増えてくると、時に難しくなり、混乱することもあります。
膨大な行数のEAコードを見たことがありますが、複雑なEAはどのように設計されているのでしょうか、もしかしたら、このような複雑なアルゴリズムを扱うためのツールやテクニックがあるのでしょうか?

どの程度が多すぎるのか?ファイルに分解できないほどなのでしょうか?

 
Gregory Kovalenko:
こんにちは。
コードの量が増えてくると、時に難しくなり、混乱することがあります。
膨大な行数のEAコードを見たことがありますが、複雑なEAはどのように設計されているのでしょうか。もしかしたら、このような複雑なアルゴリズムを扱うためのツールやテクニックがあるのでしょうか。
そう、とても簡単なことです。個々の機能を正確に文書化し、別のファイルに割り当てる必要があるのです。メインファイルはすぐに縮小され、読みやすくなります
 

基本は2つ。

1.コードを関数に分割する。1つの機能は多かれ少なかれ論理的に完結しており、一目でわかるように1画面分以下であることが望ましいです。

2.グローバル 変数の数を減らす。グローバル変数からは、プログラム実行中に変化しないパラメータのみを使用することが望ましい。

...などなど。

3.オブジェクト指向プログラミング

4.コードを複数のファイルに分割する(デバッグが煩雑になるが、意味はある)。

 
STARIJ:
それはとても簡単なことで、個々の機能を正確に文書化し、別のファイルに割り当てる必要があるのです。メインファイルはすぐに小さくなり、読みやすくなります

私はいつも1つのmq4/mq5ファイルと、クラスを持つたくさんのmqhファイルを持っていて、各クラスには別々のファイルを持っています。一般に、産業開発ではこうしている。すべてが混ざり合った1キロメートル単位のファイルはありません。

時々、EA全体がOnTickに詰め込まれ、この醜いシートに20回ずつ注文を開くための同じコードの断片がある傑作を目にすることがあります。すぐにでもゲロ袋を取り出したい ))

 
Gregory Kovalenko:
こんにちは。
コードの量が増えてくると、時に難しくなり、混乱することもあります。
私は膨大な行数のEAコードを見たことがありますが、複雑なEAはどのように設計されているのでしょうか、もしかしたらこのような複雑なアルゴリズムを扱うためのツールやトリックがあるのでしょうか?

このスタイルでは、常に一定で変化しない関数を書かないこと

void CloseOrders(int cmd)
  {
   for(int i=OrdersTotal()-1;i>=0;i--)
     {
      if(OrderSelect(i,SELECT_BY_POS))
        {
         if(OrderSymbol()==Symbol() && OrderMagicNumber()==Magic)
           {
            if(OrderType()==OP_BUY && cmd==OP_BUY)
              {
               if(!OrderClose(OrderTicket(),OrderLots(),Bid,Slippage,Blue))
                 {
                  Print("Order BUY not close! Error = ",GetLastError());
                 }
              }
            if(OrderType()==OP_SELL && cmd==OP_SELL)
              {
               if(!OrderClose(OrderTicket(),OrderLots(),Ask,Slippage,Red))
                 {
                  Print("Order SELL not close! Error = ",GetLastError());
                 }
              }
           }
        }
     }
  }

簡潔に書けば、どうせ誰も見ないし、スペースも半分で済む。

void CloseOrders(int cmd) {
 for(int i=OrdersTotal()-1;i>=0;i--) {
  if(OrderSelect(i,SELECT_BY_POS)) {
   if(OrderSymbol()==Symbol() && OrderMagicNumber()==Magic) {
    if(OrderType()==OP_BUY && cmd==OP_BUY) {
     if(!OrderClose(OrderTicket(),OrderLots(),Bid,Slippage,Blue)) Print("Order BUY not close! Error = ",GetLastError());
    }
     if(OrderType()==OP_SELL && cmd==OP_SELL) {
      if(!OrderClose(OrderTicket(),OrderLots(),Ask,Slippage,Red)) Print("Order SELL not close! Error = ",GetLastError());
    }
}}}}


コードに常にコメントし、コードのこの部分は何のために責任があるのか、それは難しいことではありません、そして今、あなたは常にコードが何であるかを知っているだろうし、それを勉強する時間を短縮する

 
Vitaly Muzichenko:

このスタイルで、常に一定で変化しない関数を書いてはいけない

簡潔に書けば、どうせ誰も見ないし、スペースも半分で済む。

このコードは何のためにあるのか、常にコメントすることで、難しいことではなく、常にコードが何であるかを知ることができ、それを勉強する時間を短縮することができます。

コメントはプログラム本文の半分を占めなければならない

 
Vitaly Muzichenko:

このスタイルで、常に一定で変化しない関数を書いてはいけない

簡潔に書けば、どうせ誰も見ないし、スペースも半分で済む。

コードのすべての時間をコメントし、コードのこの作品は何のために責任がある、それは難しいことではありませんし、ここで改訂は、常にどのようなコードを知っているだろうし、それを勉強する時間を削減する

括弧を並べ替えても、ラグが小さくなることはありません。アドバイスする前に、せめて自分のレベルを平均的なものまで上げてください。

 
STARIJ:

解説は番組本文の半分を占めること

その場合、コードの90%はコメントである必要がありますね。そして、より多くのコメントを付けるために、できるだけ無意味で可読性の低いコードが必要なのです!
 
Vasiliy Sokolov:
いや、じゃあ、コードの9割はコメントなんだ。そして、できるだけ多くの無意味で可読性の低いコードが必要で、そうすればより多くのコメントを付けることができるのです!

あなたのアイデアも注目です。もっと議論すべき

 

ずっと聞こうと思ってたんだ。mcl5では、インクルードファイル、クラスからインジケータデータを取得すると、最適化が速くなるのでしょうか?

つまり、Expert Advisor 自体のコードでインジケータ・ハンドルが呼び出されることはない。

理由: