新人对MQL4和MQL5的任何问题,对算法和代码的帮助和讨论 - 页 502

 
Vitaly Muzichenko:

该函数按时间顺序排列并选择最新的一个,即最后一个

接下来,我们有一个选定的,我们把它代入函数iBarShift(sym, tf,oot ,true)

该函数按时间返回酒吧编号。这就是全部。

不幸的是,我不能检查它,但当我使用它时,它完美地工作,以及我在这里发表的所有功能。

如果我打开一个订单时指定了一个票据,并且该功能选择了一个连续的数字,这可以吗?
 
Вадим Мотеюнас:
写下错误提示if( iOpen[0] != time_open )'iOpen' - 未声明的标识

我写的东西有点不对,有点在另一个思考方向。将iOpen[0]改为 Open[0]。 纠正了。简而言之,虽然。当我打开一个酒吧时,我记得酒吧开放的时间,而且这个酒吧已经没有订单了。

 

在函数描述中还写到

要考虑的位置的选择是由外部参数设定的。

  • sy- 市场工具的名称。如果你设置这个参数,函数将只考虑指定仪器的位置。默认值--NULL 表示当前的市场工具。
  • tf- 时间框架。默认值0 表示当前的时间框架。
  • op-贸易操作,职位类型。有效值:OP_BUYOP_SELL-1。默认值-1 意味着任何位置。
  • mn- 位置标识符,MagicNumber。默认值-1 表示任何标识符。
这些值应该在第一个特殊函数之前声明,也就是说,它们包含在NumberOfBarOpenLastPos() 函数本身的描述中,这还不够?

 
Вадим Мотеюнас:

在函数描述中还写到

要考虑的位置的选择是由外部参数设定的。

  • sy- 市场工具的名称。如果你设置这个参数,函数将只考虑指定仪器的位置。默认值--NULL 表示当前的市场工具。
  • tf- 时间框架。默认值0 表示当前的时间框架。
  • op-贸易操作,职位类型。有效值:OP_BUYOP_SELL-1。默认值-1 意味着任何位置。
  • mn- 位置标识符,MagicNumber。默认值-1 表示任何标识符。
通过外部参数? 是否有必要在第一个特殊函数之前声明它们?也就是说,它们在NumberOfBarOpenLastPos() 函数本身的描述中是不够的?

够了。在外部参数中,你可以输入你需要的值:MagicNumber,你要找的是哪个位置,如果你要买入(0)和卖出(1)--那么就写"-1"。

 
Konstantin Nikitin:

我写的东西有点不对,有点在另一个思考方向。将iOpen[0]改为 Open[0]。 纠正了。简而言之,虽然。当我打开一个酒吧时,它会记住酒吧打开的时间,并且在这个酒吧上不会有任何订单被打开。

很多订单被打开,看起来在非订单打开之前,条件if(NumberOfBarOpenLastPos(Symbol(),0,-1,-1)>0)被满足了,因为NumberOfBarOpenLastPos返回-1。

 
Вадим Мотеюнас:

很多订单被打开,似乎条件if(NumberOfBarOpenLastPos(Symbol(),0,-1,-1)>0)在非订单被打开之前就已经满足,因为NumberOfBarOpenLastPos返回-1。

你在寻找订单,那么你需要使用完整版本的功能,即具有按订单搜索的能力,而不仅仅是按头寸搜索。

int NumberOfBarOpenLastPos(string sym="",int tf=0,int op=-1,int mn=-1)
  {
   datetime oot=0; // Инициализируем нулём
   int      i,k=OrdersTotal();

   if(sym=="") sym=Symbol();
   for(i=0; i<k; i++)
     {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
        {
         if(OrderSymbol()==sym)
           {
            if(OrderType()<6) // Ищем и по ордерам
              {
               if(op<0 || OrderType()==op)
                 {
                  if(mn<0 || OrderMagicNumber()==mn)
                    {
                     if(oot<OrderOpenTime()) oot=OrderOpenTime(); // Ищем последнее
                    }
                 }
              }
           }
        }
     }
   return(iBarShift(sym, tf, oot, true));
  }
 
Vitaly Muzichenko:

这就足够了。在外部参数中,你可以输入所需的值:Majik,寻找什么位置,也许只有买入,如果需要买入(0)和卖出(1)--那么我们写"-1"。

当我在测试器中启动时,没有未结订单,也许这就是为什么返回-1,这就是为什么条件if(NumberOfBarOpenLastPos(Symbol(),0,-1,-1)>0)不成立?

 
Вадим Мотеюнас:

在测试器中启动时,没有未结订单,也许这就是为什么返回-1,因此条件if(NumberOfBarOpenLastPos(Symbol(),0,-1,-1)>0)不符合?

我现在就去检查。

 
Vitaly Muzichenko:

你在寻找订单,那么你需要使用完整版本的功能,即具有按订单搜索的能力,而不仅仅是按头寸搜索。

仍然返回-1

 
Вадим Мотеюнас:

仍然返回-1

它的效果非常好!

从两个位置中,它选择了最后一个,也就是第11条,你可以在截图中看到。


检查代码。

 void OnTick() 
  {
   ...
   Comment( NumberOfBarOpenLastPos("",0,-1,-1) );
   ...
  }

int NumberOfBarOpenLastPos(string sym="",int tf=0,int op=-1,int mn=-1)
  {
   datetime oot=0; // Инициализируем нулём
   int      i,k=OrdersTotal();

   if(sym=="") sym=Symbol();
   for(i=0; i<k; i++)
     {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
        {
         if(OrderSymbol()==sym)
           {
            if(OrderType()<6) // Ищем и по ордерам
              {
               if(op<0 || OrderType()==op)
                 {
                  if(mn<0 || OrderMagicNumber()==mn)
                    {
                     if(oot<OrderOpenTime()) oot=OrderOpenTime(); // Ищем последнее
                    }
                 }
              }
           }
        }
     }
   return(iBarShift(sym, tf, oot, true));
  }
原因: