KimIV的有用功能 - 页 12

 

IndexByTicket()函数。

返回票据上的订单或头寸的索引(在已设订单或未结头寸的总列表中的序号)。如果IndexByTicket() 不能找到一个具有所需票据的订单或头寸,它将返回-1。我们可以用函数参数限制要检查的订单或头寸的列表。

  • sy- 仪器的名称。如果你指定这个参数,函数将只检查指定工具的订单和头寸。NULL 表示当前的仪器,""(默认)表示任何仪器。
  • op- 交易操作,挂单或头寸的类型。有效值:OP_BUY,OP_BUYLIMIT,OP_BUYSTOP,OP_SELL,OP_SELLLIMIT,OP_SELLSTOP-1。默认值为-1,表示任何顺序或位置。
  • mn- 一个订单或头寸的标识符(MagicNumber)。默认值-1 表示任何MagicNumber。
//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 20.04.2007                                                     |
//|  Описание : Возвращает индекс ордера или позиции по тикету                 |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    ti - тикет ордера, позиции                                              |
//|    sy - наименование инструмента   (""   - любой символ,                   |
//|                                     NULL - текущий символ)                 |
//|    op - операция                   (-1   - любая позиция)                  |
//|    mn - MagicNumber                (-1   - любой магик)                    |
//+----------------------------------------------------------------------------+
int IndexByTicket(int ti, string sy="", int op=-1, int mn=-1) {
  int i, k=OrdersTotal();

  if (sy=="0") sy=Symbol();
  for (i=0; i<k; i++) {
    if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {
      if ((OrderSymbol()==sy || sy=="") && (op<0 || OrderType()==op)) {
        if ((mn<0 || OrderMagicNumber()==mn) && OrderTicket()==ti) return(i);
      }
    }
  }
  return(-1);
}
 

我在一个自定义EA中写了IndexByTicket() 函数。我记得,我不能没有它,否则我为什么要写它?但我不记得它在那里是如何使用的,也不记得我为什么实际写了它 :-)找寻顾问的源代码是很无聊的。有数以百计的人。

总之,我不认为举出像我已经举过的那些例子有什么意义。如果我们聪明的话,我们可以想出把参数 "放在 "哪里。如果有人有使用IndexByTicket() 函数的好主意,请在这里发表。我将努力实现它。


一个简短的公告。

取消了SelectByTicket()SelectByTicketFromHistory() 函数。我自己不会使用它们,所以我不认为发表它们有什么意义。我们随时欢迎那些希望就这个问题进行讨论的人。我将展示我所有的妄想,就像现在这样。

 

NumberOfOrders()函数。

这个函数返回订单的数量,在功能上完全覆盖了ExistOrders()。为了用NumberOfOrders() 函数取代ExistOrders( ) 函数,有必要且足以检查返回值,使其大于零。你可以用函数参数限制要检查的订单列表。

  • sy- 仪器的名称。如果给出这个参数,函数将只检查指定工具的订单。NULL 表示当前的仪器,而""(默认)表示任何仪器。
  • op- 待定订单的类型。有效值:OP_BUYLIMIT、OP_BUYSTOP、OP_SELLLIMIT、OP_SELLSTOP-1。默认值为-1 意味着任何顺序。
  • mn- 订单标识符(MagicNumber)。默认值-1 表示任何MagicNumber。
//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 28.11.2006                                                     |
//|  Описание : Возвращает количество ордеров.                                 |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    sy - наименование инструмента   (""   - любой символ,                   |
//|                                     NULL - текущий символ)                 |
//|    op - операция                   (-1   - любой ордер)                    |
//|    mn - MagicNumber                (-1   - любой магик)                    |
//+----------------------------------------------------------------------------+
int NumberOfOrders(string sy="", int op=-1, int mn=-1) {
  int i, k=OrdersTotal(), ko=0, ot;

  if (sy=="0") sy=Symbol();
  for (i=0; i<k; i++) {
    if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {
      ot=OrderType();
      if (ot>1 && ot<6) {
        if ((OrderSymbol()==sy || sy=="") && (op<0 || ot==op)) {
          if (mn<0 || OrderMagicNumber()==mn) ko++;
        }
      }
    }
  }
  return(ko);
}
 

如何使用NumberOfOrders()函数的例子。

  1. 获取所有订单的总金额
    NumberOfOrders();
  2. 获取当前符号的下单数量
    NumberOfOrders(NULL);
  3. 获得任何符号的买入限价订单的数量
    NumberOfOrders("", OP_BUYLIMIT);
  4. 获得欧元兑美元的神奇数字123456的SellStop订单的数量
    NumberOfOrders("EURUSD", OP_SELLSTOP, 123456);
  5. 获取当前符号的神奇数字2345的订单数量
    NumberOfOrders(NULL, -1, 2345);

这里又附上了一个带有上述例子的工作脚本。

附加的文件:
 
KimIV:

NumberOfOrders()函数。

这个函数返回订单的数量,在功能上完全覆盖了ExistOrders()。为了用NumberOfOrders() 函数取代ExistOrders( ) 函数,有必要且足以检查返回值,使其大于零。你可以用函数参数限制要检查的订单列表。

  • sy- 仪器的名称。如果给出这个参数,函数将只检查指定工具的订单。NULL 表示当前的仪器,而""(默认)表示任何仪器。
  • op- 待定订单的类型。有效值:OP_BUYLIMIT、OP_BUYSTOP、OP_SELLLIMIT、OP_SELLSTOP-1。默认值为-1 意味着任何顺序。
  • mn- 订单标识符(MagicNumber)。默认值为-1 意味着任何MagicNumber。

我有点糊涂了。出于某种原因,我看到了一些矛盾之处。就在这里。

"...检查返回值是否大于零是必要的,也是足够的。"

如果你勾选了 "这个,而且只有这个",那么关于订单数量 的函数就没有意义了

这就是我开始接触它的原因。我已经在我的专家顾问中插入了这个功能。我在参数和条件中设置m=1为开仓。

if (NumberOfOrders("", -1, MagicNumber)<m) {//если открытых позиций МЕНЬШЕ m

但是,专家顾问仿佛没有看到这个限制!而且它在每个信号下都会开出订单。

这里会有什么问题呢?

 
rid писал (а):
我有点糊涂了。出于某些原因,我看到了某种矛盾。就在这里。
"...检查返回值是否大于零是必要和充分的"。
如果我们检查 "这个,而且只有这个",那么订单数量的函数就没有意义了!

嗯...你似乎没有注意到ExistOrders()NumberOfOrders() 函数各自返回的信息量。ExistOrders() 函数只返回关于订单存在的 信息,NumberOfOrders() 函数返回关于订单数量 的信息。关于订单数量的信息包含了关于订单存在的信息。当我们需要回答一个订单是否存在的问题时,关于订单数量的信息就是多余的了。这就是为什么我说,如果我们想用NumberOfOrders() 函数取代ExistOrders( ) 函数,我们必须检查NumberOfOrders() 函数返回的值,以确保它大于零。毕竟,很明显,如果这个值等于零,就没有订单,如果这个值大于零,就有订单存在。当我们不需要订单数量的信息时,可以使用ExistOrders() 函数,而当我们不需要订单数量的信息时,可以使用NumberOfOrders() 函数。在这个意义上,NumberOfOrders() 函数完全取代了ExistOrders() 函数。

摆脱

以下是我开始研究的原因。我已经在我的专家顾问中插入了这个功能。我在参数和条件中设置m=1为开仓。

if (NumberOfOrders("", -1, MagicNumber)<m) {//если открытых позиций МЕНЬШЕ m

但是,就像专家顾问没有看到这个约束一样!而且它在每个信号下都会开出订单。

这里可能有什么问题?

所以......在这里,你似乎把立场和权证混淆了。对我来说,它们是不同的东西。什么是职位?它们是OP_BUY和OP_SELL交易,而我理解的订单是OP_BUYLIMIT、OP_BUYSTOP、OP_SELLLIMIT和OP_SELLSTOP交易。我开立头寸,我设置订单。那你是怎么打开的呢?NumberOfOrders() 函数被设计用来处理订单。
 

谢谢你。得到了这一切。在第一个问题和第二个问题上都是如此。

换句话说,"扩展的 "NumberOfOrders()函数本质上已经包括IndexByTicket( )函数

是的,确实如此。我打开了 OP_BUY和OP_SELL !

仍需举例说明你的下一个函数,它正好与位置一起工作。(不含订单)。

我记得你已经在这个论坛的某个地方发过了。我找不到它。

 
rid писал (а):
仍需举例说明你的下一个函数,它正好与位置一起工作。(不含订单)

我已经完成了订单的功能。接下来是职位的职能。大约有30人。


rid 写道(a):
我记得在论坛的某个地方,你已经把它贴出来了。我找不到它。

搜索

 

亲爱的伊戈尔,我请求你的帮助!我需要添加一个EA,使其可以在多个工具上持仓。有2个EA在工作,标准MACD和Ema,每个有6个位置,但只有一个位置打开...我读了你关于这个问题的评论,但由于我不善于语言,我不明白哪里该加什么...如果你不介意的话,请帮助...抄写Ema顾问...谢谢你!



//+------------------------------------------------------------------+
//| Parabolic.mq4 |
//| Vitalik |
//| wwwita@mail.ru |
//+------------------------------------------------------------------+
extern double Lots=0。1;
extern double Pip=5;
extern double MoveBack=3;
extern int chk=0;
extern double SL=20;
//+------------------------------------------------------------------+
//|
//+------------------------------------------------------------------+
int start()
{
double hi=High[1];
double lo=Low[1];
double EMA, EMA1, EMA2, EMA3;
int cnt=0, ticket, total;
EMA=iMA(0,0,5,0,MODE_EMA,PRICE_MEDIAN,1);
EMA1=iMA(0,0,10,0,MODE_EMA,PRICE_MEDIAN,1) 。
EMA2=iMA(0,0,5,0,MODE_EMA,PRICE_MEDIAN,0);
EMA3=iMA(0,0,10,0,MODE_EMA,PRICE_MEDIAN,0);
total=OrdersTotal();
if(total<1)
{
if(AccountFreeMargin()<(1000*Lots)
{
Print("You have no money.Free funds = ", AccountFreeMargin());
return(0);
}
如果(((EMA>EMA1) && (EMA2<EMA3)) || ((EMA<EMA1) && (EMA2>EMA3))
{
chk=1;
Print("position is possible!");
}
如果(chk==1)
{
if(EMA3-EMA2>2*Point && Bid>=(lo+MoveBack*Point))
{
ticket=OrderSend(Symbol(,OP_SELL,Lots,Bid,3,0,0,
"EMA位置:",16385,0,Red);
if(ticket>0)
{
if(OrderSelect(ticket,SELECT_BY_TICKET, MODE_TRADES)
Print("Sell order open : " ,OrderOpenPrice());
chk=0;
}
else
{
Print("Error opening SELL order : " ,GetLastError());
return(0);
}
}
if(EMA2-EMA3>2*Point && Ask<=(hi-MoveBack*Point))
{
ticket=OrderSend(Symbol(,OP_BUY,Lots,Ask,3,0,0,
"EMA位置:",16385,0,Green);
if(ticket>0)
{
if(OrderSelect(ticket,SELECT_BY_TICKET, MODE_TRADES)
Print("BUY order open : " ,OrderOpenPrice());
chk=0;
}
else
{
Print("Order BUY open error : " ,GetLastError());
return(0);
}
}
}
return(0);
} }
for(cnt=0;cnt<total;cnt++)
{
OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES);
if(OrderType()<=OP_SELL && // is this anopen position?OP_BUY或OP_SELL
OrderSymbol()==Symbol()) //工具匹配?
{
if(OrderType()==OP_BUY) //多头头寸已开
{
//检查是否已经到了平仓时间?
if(Bid>=(OrderOpenPrice()+Pip*Point) )
{
chk=0;
OrderClose(OrderTicket(),OrderLots(),Bid,3,Violet); //平仓
return(0); //退出
}
if(Bid<=(OrderOpenPrice()-SL*Point))
{
chk=0;
OrderClose(OrderTicket(),OrderLots(),Bid,3,Violet); //平仓
return(0); //退出
}
}
else //否则这是一个空仓
{
//检查是否已经是平仓时间?
if(Ask<=(OrderOpenPrice()-Pip*Point)
{
chk=0;
OrderClose(OrderTicket(),OrderLots(),Ask,3,Violet); //平仓
return(0); //退出
}
if(Ask>=(OrderOpenPrice()+SL*Point))
{
chk=0;
OrderClose(OrderTicket(),OrderLots(),Ask,3,Violet); // Close position
return(0); // exit
}
}
}
}
return(0);
}
//+------------------------------------------------------------------+
 

伊戈尔,我在"处理INI文件的函数库 " 中问过你一个问题,但没有答案 :(