オーダーを探すという作業 - ページ 13

 
Vladimir Pastushak:
ああ、誰かもっといい方法を知っている人がいるんじゃないかと思ったんだ.
   double Max1=0;
   double Max2=0; 
   
   int Ticket1=0;
   int Ticket2=0;

   int t=OrdersTotal();
   for(int i=0;i<t;i++){
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)){
         if(OrderMagicNumber()==Magic && OrderSymbol()==Symbol()){
            if(OrderType()==OP_BUY){
               if(OrderOpenPrice()>Max1){
                  Max2=Max1;
                  Ticket2=Ticket1;                  
                  Max1=OrderOpenPrice();
                  Ticket1=OrderTicket();
               }
               else if(OrderOpenPrice()>Max2){
                  Max2=OrderOpenPrice();
                  Ticket2=OrderTicket();                  
               }
            }
         }
      }
      else{
         return(false);
      }
   }

手っ取り早い方法はありません。もし、より速くしたいのであれば、EAのアルゴリズム全体を考える必要があり、もしかしたら、すべてのティックで 2つのボトムと2つのトップを探す必要性を取り除くことができるかもしれません。
 
Dmitry Fedoseev:

手っ取り早い方法はありません。もし、より速くする必要があるなら、EAのアルゴリズム全体を考えるべきで、もしかしたら、すべてのティックで2つの下値と2つの上値を検索する必要をなくせるかもしれません。

あなたのバリアントでは、データは等しくなります。つまり、1番目と2番目のトップオーダーは同じチケットになります。

申し訳ありません.

 

こんなことをしました

void OrdersInfo :: SearchTicketPriceType()
  {
   double   price_max=0,price_min=0,price_max2=0,price_min2=0,op=0;
   int      tc=-1;
   m_tick_upper  = 0;
   m_tick_upper_ = 0;
   m_tick_lower  = 0;
   m_tick_lower_ = 0;
   Counter=0;
   for(int i=OrdersTotal()-1; i>=0; i--)
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
         if(OrderMagicNumber()==m_magic || m_magic==-1)
            if(OrderSymbol  ()==m_symbol || m_symbol==NULL)
               if(OrderType()==m_type_order)
                 {
                  Counter++;
                  op=OrderOpenPrice();
                  tc=OrderTicket   ();
                  //---
                  if(op>price_max) // Самый верхний ордер
                    {
                     price_max=op;
                     m_tick_upper=tc;
                    }
                  if(op<price_min || price_min==0) // Самый нижний ордер
                    {
                     price_min=op;
                     m_tick_lower=tc;
                    }
                  if(tc!=m_tick_upper) // Предпоследний верхний ордер
                     if(op>price_max2)
                       {
                        price_max2=op;
                        m_tick_upper_=tc;
                       }
                  if(tc!=m_tick_lower)
                     if(op<price_min2 || price_min2==0) // Предпоследний нижний ордер
                       {
                        price_min2=op;
                        m_tick_lower_=tc;
                       }
                  //---
                 }
  }
 
Dmitry Fedoseev:

普遍的なものを作ろうとするよりも、それぞれの仕事に必要な機能を、その仕事に特化して研ぎ澄ましたものを、シンプルに組み立てるのがいいのです。


100%

ポータブルなソリューションを作ると、特定のタスクに適用したときに、どこかが冗長になるに違いない。ユニバーサルにしようとすればするほど、冗長性の尾が長くなってしまうのです。この冗長性がコーダーと製品の人生を複雑にしないように、時間的に止める価値がある。

 
Vladimir Pastushak:

こんなことをしました

正常に動作しているか、確認しましたか?
 
Dmitry Fedoseev:
正常に動作しているか、確認しましたか?
そう思います ))) ...
 
Alexander Puzanov:


100%

移植可能な解決策を作っても、特定のタスクに適用すると、ある部分で冗長になるに違いない。ユニバーサルにしようとすればするほど、冗長性の尾は長くなります。この冗長性がコーダーと製品の人生を複雑にしないよう、時間的に止める価値があるのです

なんとなくOOPに乗り換えようとしています。 OOPを褒めると、たくさんの関数を集めてカタログ化できると書かれていますが、以前はたくさんの関数を使ったファイルを持っていました...。全部ファイリングしてしまおうかと思ったのですが、何かの拍子に別冊が必要になると、図書館の目録の意味がなくなってしまうので......。

99%のケースで冗長性を回避するためには、やはりすべてのコードを手書きで書く必要があることがわかりました...。ゼロから...というのは

 
Vladimir Pastushak:
そう思います ))) ...
ええ、ノーム
 
Dmitry Fedoseev:
ああ、わかったよ
このスレッドを作成したとき、私はそれを望んでいたのです、皆さんありがとうございます
 
Vladimir Pastushak:
このスレッドを作成することによって、私が得たかったものです。

OTKではありません:)テスターまたはデモ口座での注文でテストしてください。一見、間違っているように見えても