搜索订单的任务 - 页 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算法,也许你可以摆脱在每个tick 上寻找两个底部、两个顶部的需要。
 
Dmitry Fedoseev:

没有更快捷的方法。如果你需要更快,你应该考虑整个EA的算法,也许你可以摆脱在每个tick上搜索两个低点和两个高点的必要性。

在你的变体中,数据将是相等的,即第一个和第二个最高订单将有相同的票。

很抱歉...

 

我是这样做的

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:)在测试器中或在模拟账户中测试订单。你可以在第一眼看到的时候就错了。