KimIV的有用功能 - 页 11

 
KimIV:
每个人都有向左转的权利...嘻...我将对这个问题进行一番探讨

Ilnar 在 "待定分形订单"的话题中问道,如何在分形上做待定订单?


我猜伊尔纳在分形价格水平方面遇到了一些困难。这就是为什么我建议使用我的函数。


//+----------------------------------------------------------------------------+
//| Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                    |
//+----------------------------------------------------------------------------+
//| Версия   : 07.10.2006                                                      |
//| Описание : Поиск ближайшего фрактала.                                      |
//+----------------------------------------------------------------------------+
//| Параметры:                                                                 |
//|   sy - наименование инструмента     (NULL - текущий символ)                |
//|   tf - таймфрейм                    (  0  - текущий ТФ)                    |
//|   mode - тип фрактала               (MODE_LOWER|MODE_UPPER)                |
//+----------------------------------------------------------------------------+
double FindNearFractal(string sy="0", int tf=0, int mode=MODE_LOWER) {
  if (sy=="" || sy=="0") sy=Symbol();
  double f=0;
  int d=MarketInfo(sy, MODE_DIGITS), s;
  if (d==0) if (StringFind(sy, "JPY")<0) d=4; else d=2;
 
  for (s=2; s<100; s++) {
    f=iFractals(sy, tf, mode, s);
    if (f!=0) return(NormalizeDouble(f, d));
  }
  Print("FindNearFractal(): Фрактал не найден");
  return(0);
}
函数FindNearFractal()在给定的时间范围内,在指定的符号上搜索指定类型的最近的分形,并返回其价格水平。知道了分形的位置的价格水平,就已经很容易在该水平下单了。
该函数是否有可能返回两个值,例如,分形所处的酒吧的编号,或者我们应该连接另一个?
 
xrust писал (а):
该函数是否有可能返回两个值,例如也是分形所在的酒吧号码,或者我应该连接另一个?
为什么要返回两个值,而只有一个--酒吧号码--就足够了?为此,在声明中。
return(NormalizeDouble(f, d));
写出酒吧柜台 价值,而不是价格水平。在输出中,你将得到分形条数。而你将根据分形的类型,用iHigh()或iLow() 函数之一获得价格水平。
 
不,这里都很清楚,我基本上是在问。谢谢你,你的帖子很有帮助。
 
xrust:
不,这很清楚,我基本上是在问。
啊...好吧,如果在原则上,你可以使用一个通过引用传递的数组。那么返回参数的数量将受到数组大小 的限制。
 

函数ExistOrdersByLot()。

返回一个标志,表明存在一个具有指定手数的订单。True- 秩序存在(已设定),False- 秩序不存在(未设定)。你可以用函数参数限制要检查的订单列表。

  • sy- 仪器的名称。如果你设置了这个参数,函数将只检查指定工具的订单。NULL 表示当前的仪器,而""(默认)表示任何仪器。
  • op- 操作,待定订单的类型。有效值:OP_BUYLIMIT、OP_BUYSTOP、OP_SELLLIMIT、OP_SELLSTOP-1。默认值为-1 表示任何订单类型。
  • mn- 订单标识符(MagicNumber)。默认值为-1 意味着任何MagicNumber。
  • lo- 地段的大小,精确度为小数点后两位。默认值是0- 任何批次的大小。
//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 28.11.2006                                                     |
//|  Описание : Возвращает флаг существования ордера по размеру лота.          |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    sy - наименование инструмента   (""   - любой символ,                   |
//|                                     NULL - текущий символ)                 |
//|    op - операция                   (-1   - любой ордер)                    |
//|    mn - MagicNumber                (-1   - любой магик)                    |
//|    lo - лот                        ( 0   - любой лот)                      |
//+----------------------------------------------------------------------------+
bool ExistOrdersByLot(string sy="", int op=-1, int mn=-1, double lo=0) {
  int i, k=OrdersTotal(), ot;
  lo=NormalizeDouble(lo, 2);

  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) {
            if (lo<=0 || NormalizeDouble(OrderLots(), 2)==lo) return(True);
          }
        }
      }
    }
  }
  return(False);
}
 

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

  1. 检查任何手数为0.2的订单
    ExistOrdersByLot("", -1, -1, 0.2);
  2. 检查当前图表符号上手数为0.3的任何订单
    ExistOrdersByLot(NULL, -1, -1, 0.3);
  3. 检查任何符号是否有手数为0.5的买入限价单。
    ExistOrdersByLot("", OP_BUYLIMIT, -1, 0.5);
  4. 检查欧元兑美元是否存在手数为0.1和神奇数字123456的SellStop订单。
    ExistOrdersByLot("EURUSD", OP_SELLSTOP, 123456, 0.1);
  5. 检查是否存在任何手数为0.4的神奇数字987的USDJPY订单
    ExistOrdersByLot("USDJPY", -1, 987, 0.4);

像往常一样,附在后面的是一个带有上述例子的工作脚本。

附加的文件:
 

GetLotLastOrder()函数。

返回最后下单的手数或-1。你可以用函数参数限制要检查的订单列表。

  • 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                                                     |
//|  Описание : Возвращает размер лота последнего выставленного ордера или -1  |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    sy - наименование инструмента   (""   - любой символ,                   |
//|                                     NULL - текущий символ)                 |
//|    op - операция                   (-1   - любая позиция)                  |
//|    mn - MagicNumber                (-1   - любой магик)                    |
//+----------------------------------------------------------------------------+
double GetLotLastOrder(string sy="", int op=-1, int mn=-1) {
  datetime o;
  double   l=-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=="") {
        if (OrderType()>1 && OrderType()<6) {
          if (op<0 || OrderType()==op) {
            if (mn<0 || OrderMagicNumber()==mn) {
              if (o<OrderOpenTime()) {
                o=OrderOpenTime();
                l=OrderLots();
              }
            }
          }
        }
      }
    }
  }
  return(l);
}
 

如何使用GetLotLastOrder()的例子。

  1. 查找最后一个订单的批量大小
    GetLotLastOrder();
  2. 查找在当前符号下的最后一笔订单的手数
    GetLotLastOrder(NULL);
  3. 查找任何符号的最后一个买入限价订单的手数大小
    GetLotLastOrder("", OP_BUYLIMIT);
  4. 在欧元兑美元上找到最后一个具有神奇数字123456的SellStop订单的手数。
    GetLotLastOrder("EURUSD", OP_SELLSTOP, 123456);
  5. 指定当前符号的最后一笔订单的手数,魔法号码为2345
    GetLotLastOrder(NULL, -1, 2345);

这里附上一个传统的工作脚本,其中有上述例子。

附加的文件:
 

GetOrderOpenPrice()函数。

返回最后打开的订单的设置价格或0。你可以用函数参数限制要检查的订单列表。

  • 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                                                     |
//|  Описание : Возвращает цену установки последнего ордера или 0.             |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    sy - наименование инструмента   (""   - любой символ,                   |
//|                                     NULL - текущий символ)                 |
//|    op - операция                   (-1   - любая позиция)                  |
//|    mn - MagicNumber                (-1   - любой магик)                    |
//+----------------------------------------------------------------------------+
double GetOrderOpenPrice(string sy="", int op=-1, int mn=-1) {
  datetime t;
  double   r=0;
  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=="") {
        if (OrderType()>1 && OrderType()<6) {
          if (op<0 || OrderType()==op) {
            if (mn<0 || OrderMagicNumber()==mn) {
              if (t<OrderOpenTime()) {
                t=OrderOpenTime();
                r=OrderOpenPrice();
              }
            }
          }
        }
      }
    }
  }
  return(r);
}
 

如何使用GetOrderOpenPrice()的例子。

  1. 获取最后一次下单的开盘价
    GetOrderOpenPrice();
  2. 查找在当前符号下的最后一笔订单的价格
    GetOrderOpenPrice(NULL);
  3. 查找任何符号的最后一个买入限价订单的设置价格
    GetOrderOpenPrice("", OP_BUYLIMIT);
  4. 找出最后一次在欧元兑美元上用魔法123456下的SellStop订单的价格。
    GetOrderOpenPrice("EURUSD", OP_SELLSTOP, 123456);
  5. 指定当前符号的最后一次用magic 2345下单的价格
    GetOrderOpenPrice(NULL, -1, 2345);

附上一个完美工作的脚本,其中有上述例子。

附加的文件: