Funciones útiles de KimIV - página 11

 
KimIV:
Todo hombre tiene derecho a la izquierda... hee... Voy a divertirme un poco con esto

Ilnar, en el tema Órdenes pendientes en fractales, preguntó, ¿Cómo hacer órdenes pendientes en fractales?


Supongo que Ilnar tuvo alguna dificultad para detectar los niveles de precios de los fractales. Por eso sugiero utilizar mi función:


//+----------------------------------------------------------------------------+
//| Автор    : Ким Игорь В. 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);
}
La función FindNearFractal() busca el fractal más cercano del tipo especificado en el símbolo especificado, en el marco temporal dado, y devuelve su nivel de precios. Conociendo el nivel de precios de la ubicación del fractal, ya es fácil colocar una orden a ese nivel.
¿Es posible que la función devuelva dos valores, por ejemplo, el número de la barra donde se encuentra el fractal, o debemos conectar otro?
 
xrust писал (а):
¿Es posible que la función devuelva dos valores, por ejemplo, también el número de barra donde se encuentra el fractal, o debo conectar otro?
¿Y por qué devolver dos valores cuando uno, el número de barra, es suficiente? Para ello, en la declaración:
return(NormalizeDouble(f, d));
escribir el valor del contador de barras s en lugar del nivel de precios. En la salida obtendrá el número de barra del fractal. Y obtendrá el nivel de precio con una de las funciones iHigh () o iLow() dependiendo del tipo de fractal.
 
No, todo está claro aquí, básicamente estoy preguntando. Gracias, tus posts son muy útiles.
 
xrust:
No, está claro, básicamente estoy preguntando.
ah... Bueno, si en principio, se puede utilizar un array pasado por referencia. Entonces el número de parámetros devueltos estaría limitado por el tamaño del array.
 

Función ExistOrdersByLot().

Devuelve un indicador de la existencia de una orden con el tamaño de lote especificado. Verdadero - el orden existe (establecido), Falso - el orden no existe (no establecido). Puede limitar la lista de órdenes a comprobar mediante los parámetros de la función:

  • sy - Nombre del instrumento. Si establece este parámetro, la función sólo comprobará las órdenes del instrumento especificado. NULL significa instrumento actual, y "" (por defecto) significa cualquier instrumento.
  • op - Operación, tipo de orden pendiente. Valores válidos: OP_BUYLIMIT, OP_BUYSTOP, OP_SELLLIMIT, OP_SELLSTOP o -1. El valor por defecto de -1 indica cualquier tipo de orden.
  • mn - Identificador del pedido (MagicNumber). El valor por defecto de -1 significa cualquier MagicNumber.
  • lo - Tamaño de un lote con una precisión de dos decimales. El valor por defecto es 0 - cualquier tamaño de lote.
//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. 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);
}
 

Ejemplos de cómo utilizar la función ExistOrdersByLot().

  1. Compruebe si hay algún pedido con tamaño de lote 0,2
    ExistOrdersByLot("", -1, -1, 0.2);
  2. Compruebe cualquier orden con tamaño de lote 0,3 en el símbolo del gráfico actual
    ExistOrdersByLot(NULL, -1, -1, 0.3);
  3. Comprueba si hay una orden BuyLimit con el tamaño de lote 0.5 para cualquier símbolo
    ExistOrdersByLot("", OP_BUYLIMIT, -1, 0.5);
  4. Comprobar la presencia de la orden SellStop con el tamaño de lote 0.1 y el número mágico 123456 por EURUSD
    ExistOrdersByLot("EURUSD", OP_SELLSTOP, 123456, 0.1);
  5. Compruebe la presencia de cualquier orden con el lote 0.4 con el número mágico 987 en USDJPY
    ExistOrdersByLot("USDJPY", -1, 987, 0.4);

Adjunto, como siempre, un script de trabajo con los ejemplos anteriores.

Archivos adjuntos:
 

Función GetLotLastOrder().

Devuelve el tamaño del lote de la última orden colocada o -1. Puede limitar la lista de órdenes a comprobar mediante los parámetros de la función:

  • sy - Nombre del instrumento. Si se da este parámetro, la función sólo comprobará las órdenes del instrumento especificado. NULL significa el instrumento actual, y "" (por defecto) significa cualquier instrumento.
  • op - Operación, tipo de orden pendiente. Valores válidos: OP_BUYLIMIT, OP_BUYSTOP, OP_SELLLIMIT, OP_SELLSTOP o -1. El valor por defecto de -1 significa cualquier orden.
  • mn - Identificador del pedido (MagicNumber). El valor por defecto -1 significa cualquier 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);
}
 

Ejemplos de cómo utilizar GetLotLastOrder().

  1. Buscar el tamaño del lote del último pedido realizado
    GetLotLastOrder();
  2. Encuentre el tamaño del lote de la última orden colocada en el símbolo actual
    GetLotLastOrder(NULL);
  3. Encontrar el tamaño del lote de la última orden BuyLimit en cualquier símbolo
    GetLotLastOrder("", OP_BUYLIMIT);
  4. Encuentre el tamaño del lote de la última orden SellStop con el número mágico 123456 en EURUSD
    GetLotLastOrder("EURUSD", OP_SELLSTOP, 123456);
  5. Especifique el tamaño del lote de la última orden con número mágico 2345 para el símbolo actual
    GetLotLastOrder(NULL, -1, 2345);

Adjuntamos un script que funciona tradicionalmente con los ejemplos anteriores.

Archivos adjuntos:
 

Función GetOrderOpenPrice().

Devuelve el precio de ajuste de la última orden abierta o 0. Puede limitar la lista de órdenes a comprobar con los parámetros de la función:

  • sy - Nombre del instrumento. Si se da este parámetro, la función sólo comprobará las órdenes del instrumento especificado. NULL significa instrumento actual, y "" (por defecto) significa cualquier instrumento.
  • op - Operación, tipo de orden pendiente. Valores válidos: OP_BUYLIMIT, OP_BUYSTOP, OP_SELLLIMIT, OP_SELLSTOP o -1. El valor por defecto de -1 indica cualquier orden.
  • mn - Identificador del pedido (MagicNumber). El valor por defecto -1 significa cualquier 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);
}
 

Ejemplos de cómo utilizar GetOrderOpenPrice().

  1. Obtener el precio de apertura del último pedido realizado
    GetOrderOpenPrice();
  2. Buscar el precio de la última orden realizada en el símbolo actual
    GetOrderOpenPrice(NULL);
  3. Encuentra el precio de ajuste de la última orden BuyLimit en cualquier símbolo
    GetOrderOpenPrice("", OP_BUYLIMIT);
  4. Encuentra el precio de la última orden SellStop colocada con la magia 123456 en el EURUSD
    GetOrderOpenPrice("EURUSD", OP_SELLSTOP, 123456);
  5. Especifique el precio de la última orden realizada con magic 2345 para el símbolo actual
    GetOrderOpenPrice(NULL, -1, 2345);

Adjunto un script que funciona perfectamente con los ejemplos anteriores.

Archivos adjuntos: