Funciones útiles de KimIV - página 115

 

¡Hola Andrey!

  1. Ya hay tres funciones para el precio de apertura:
  2. También hay funciones para las entradas. Hay dos:
Andrey, estas funciones tienen todo lo que necesitas, excepto la selección por tamaño de lote. Haré en un futuro próximo otras funciones en las que se pueda obtener el precio abierto y el ticket por tamaño de lote.

 
KimIV:

¡Hola Andrey!

  1. Ya hay tres funciones para el precio de apertura:
  2. También hay funciones para las entradas. Hay dos:
Andrey, estas funciones tienen todo lo que necesitas, excepto la selección por tamaño de lote. Haré en un futuro próximo otras funciones en las que se pueda obtener el precio abierto y el ticket por tamaño de lote.
Tal vez, son redundantes para mí y tengo que deshacerse de las condiciones innecesarias, tales como: el precio de la próxima posición abierta, la última posición abierta, más cerca del mercado. Y no siempre resulta correcto. Además, la comprensión de todas estas sutilezas será más rápida si las comparamos correctamente. Gracias, lo espero con ansias.
 

La función GetOpenPriceByLot().

Esta función devuelve el precio de apertura de una posición u orden por tamaño de lote. La selección de las posiciones a tener en cuenta se especifica mediante parámetros externos:

  • sy- Nombre del instrumento de mercado. Si se establece este parámetro, la función sólo tendrá en cuenta las posiciones del instrumento especificado. El valor por defecto"" significa cualquier instrumento de mercado. El valornulo significa el instrumento actual.
  • op- Operación comercial, posición o tipo de orden. Valores válidos:OP_BUY,OP_SELL, OP_BUYLIMIT, OP_BUYSTOP, OP_SELLLIMIT, OP_SELLSTOP o-1. El valor por defecto de-1 significa cualquier operación comercial.
  • mn- Identificador de una posición u orden, MagicNumber. El valor por defecto de-1 significa cualquier identificador.
  • lo- Lote. El valor por defecto0 significa cualquier lote.
//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 29.03.2013                                                     |
//|  Описание : Возвращает цену открытия позиции или ордера по размеру лота.   |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    sy - наименование инструмента   ( ""  - любой символ,                   |
//|                                     NULL - текущий символ)                 |
//|    op - торговая операция          ( -1  - любая операция)                 |
//|    mn - MagicNumber                ( -1  - любой магик)                    |
//|    lo - лот                        (  0  - любой лот)                      |
//+----------------------------------------------------------------------------+
double GetOpenPriceByLot(string sy="", int op=-1, int mn=-1, double lo=0) {
  double p=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=="") && (mn<0 || OrderMagicNumber()==mn)) {
        if ((op<0 || OrderType()==op) && OrderType()<6) {
          if (lo==0 || lo==NormalizeLot(OrderLots())) p=OrderOpenPrice();
        }
      }
    }
  }
  return(p);
}
ZS. Se adjunta un script para probar la funciónGetOpenPriceByLot().
Archivos adjuntos:
 

La función GetTicketByLot().

Esta función devuelve el ticket de una posición u orden por tamaño de lote. La selección de las posiciones a tener en cuenta se especifica mediante parámetros externos:

  • sy- Nombre del instrumento de mercado. Si se establece este parámetro, la función sólo tendrá en cuenta las posiciones del símbolo especificado. El valor por defecto"" significa cualquier instrumento de mercado. El valornulo significa el instrumento actual.
  • op- Operación comercial, posición o tipo de orden. Valores válidos:OP_BUY,OP_SELL, OP_BUYLIMIT, OP_BUYSTOP, OP_SELLLIMIT, OP_SELLSTOP o-1. El valor por defecto de-1 significa cualquier operación comercial.
  • mn- Identificador de una posición u orden, MagicNumber. El valor por defecto de-1 significa cualquier identificador.
  • lo - Lote. El valor por defecto 0 significa cualquier lote.
//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 29.03.2013                                                     |
//|  Описание : Возвращает тикет позиции или ордера по размеру лота.           |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    sy - наименование инструмента   ( ""  - любой символ,                   |
//|                                     NULL - текущий символ)                 |
//|    op - торговая операция          ( -1  - любая операция)                 |
//|    mn - MagicNumber                ( -1  - любой магик)                    |
//|    lo - лот                        (  0  - любой лот)                      |
//+----------------------------------------------------------------------------+
int GetTicketByLot(string sy="", int op=-1, int mn=-1, double lo=0) {
  int i, k=OrdersTotal(), t;

  if (sy=="0") sy=Symbol();
  for (i=0; i<k; i++) {
    if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {
      if ((OrderSymbol()==sy || sy=="") && (mn<0 || OrderMagicNumber()==mn)) {
        if ((op<0 || OrderType()==op) && OrderType()<6) {
          if (lo==0 || lo==NormalizeLot(OrderLots())) t=OrderTicket();
        }
      }
    }
  }
  return(t);
}

ZS. Se adjunta un script para probar la función GetTicketByLot().


Archivos adjuntos:
 

¡Hola Igor!

Muchas gracias por las novedades y por ser tan rápidos. Todo está muy bien. La función devuelve, por ejemplo, un pedido de entradas por condiciones, que pueden ser establecidas por variables externas o no se pueden utilizar. No tengo clara esta línea:

if ((op<0 || OrderType()==op) && (OrderType()>1 && OrderType()<6))

Aquí comprobamos la condición de la declaración if, es decir, si la variable externa <0, cualquier tipo de orden está disponible O si escribimos, por ejemplo, OP_BUY en la llamada a la función, la selección se hará entre las órdenes OP_BUY. Esta condición es clara, pero además tenemos una condición equivalente escrita a través de&& que establece queOrderType() debe estar dentro del rango de órdenes pendientes, es decir, de 1 a 5. Nuestro tipo OP_BUY no está incluido en este rango y, por tanto, la condición del operador debe ser falsa y el control debe pasar al operador que sigue al operador if-else, es decir, me resulta difícil decir dónde, en algún lugar detrás de la flecha del cuerpo rizado. Me parece que deberíamos especificar aquí la condición para las órdenes de mercado y una función separada de las órdenes pendientes del mismo tipo. Es decir, si quiero hacer una selección entre las órdenes de mercado y no conozco su tipo exacto, tomo la variable externa <0 pero dirijo la función donde se especifican las condiciones de 0 a 1. El mismo proceso se aplica a las órdenes pendientes. Por lo tanto, he llegado a la conclusión de que debemos utilizar una función diferente para cada categoría de tipos de órdenes cuando utilicemos esta útil condición.

Además, tengo un problema de conexión con la biblioteca. He buscado y leído, pero la conexión da un error al compilar el EA que estoy escribiendo. No tengo tiempo para ocuparme de ello todavía, quiero escribir un Asesor Experto rentable más rápido, así que he copiado las tres bibliotecas necesarias y las he adjuntado después de la función especial start(), y he colocado sus variables globales en las variables globales del EA y he comentado las referencias a ellas. No es muy conveniente, pero funciona.
 
00007:

No tengo clara esta línea:

if ((op<0 || OrderType()==op) && (OrderType()>1 && OrderType()<6))

Gracias. Corregido... Esto es una consecuencia de la copia, es decir, de la utilización de una preforma de otra función destinada a trabajar sólo con órdenes limitadas y stop.

00007:

También tengo un problema con la conexión de las bibliotecas. He buscado y leído, pero la conexión me da un error al compilar el Asesor Experto que estoy escribiendo. No tengo tiempo para averiguarlo, y quiero escribir un Asesor Experto rentable más rápido, así que he copiado las tres bibliotecas necesarias y las he adjuntado después de la función especial start(), y he colocado sus variables globales en las variables globales del EA y he comentado las referencias a ellas. No es muy conveniente, pero funciona.

Por cierto, no uso mis propias bibliotecas en forma de archivos MQH. Normalmente copio las funciones que necesito en mi EA, es decir, mi EA estándar ya preparado es un único archivo MQ4. Todo lo que necesito está dentro de este archivo. Sí, hay cierta repetición en el código. Pero no hay problemas con las versiones de las funciones.

 

Por cierto, también me he dado cuenta de que tienes scripts de prueba para cada función y tienen todas las funciones adicionales que necesitas, que simplemente puedes añadir a tu EA junto con la función y estará todo en un archivo sin nada extra. Las funciones son sencillas y útiles, pero con su permiso voy a hacer cuatro para mí: dos para posiciones y dos para paradas. Serán más universales para los requisitos delicados de mi EA. Pero ahora veo lo fácil que es hacerlo. Muchas gracias Igor.

Saludos Andrei.

 

La función TimeOpenFirstPos().

Esta función devuelve la hora de la primera posición abierta. La selección de las posiciones a tener en cuenta se especifica mediante parámetros externos:

  • sy- Nombre del instrumento de mercado. Si se establece este parámetro, la función sólo tendrá en cuenta las posiciones de este instrumento. El valor por defecto"" significa cualquier instrumento de mercado. El valornulo significa el instrumento actual.
  • op- Operación comercial, tipo de posición. Valores válidos:OP_BUY,OP_SELL o-1. El valor por defecto-1 significa cualquier posición.
  • mn- Identificador de posición, MagicNumber. El valor por defecto de-1 significa cualquier identificador.
//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 25.01.2012                                                     |
//|  Описание : Возвращает время открытия первой открытой позиций.             |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    sy - наименование инструмента   (""   - любой символ,                   |
//|                                     NULL - текущий символ)                 |
//|    op - операция                   (-1   - любая позиция)                  |
//|    mn - MagicNumber                (-1   - любой магик)                    |
//+----------------------------------------------------------------------------+
datetime TimeOpenFirstPos(string sy="", int op=-1, int mn=-1) {
  datetime t=TimeCurrent();
  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()==OP_BUY || OrderType()==OP_SELL) {
          if (op<0 || OrderType()==op) {
            if (mn<0 || OrderMagicNumber()==mn) {
              if (t>OrderOpenTime()) t=OrderOpenTime();
            }
          }
        }
      }
    }
  }
  return(t);
}
El uso de la función es similar a TimeOpenLastPos()
 

Hola

Cómo añadir una foeba a su canal SetRegression()(https://www.mql5.com/ru/forum/107476/page35 ).

 
gince:

Hola

Cómo añadir una foeba a su canal SetRegression()(https://www.mql5.com/ru/forum/107476/page35 ).

Duck, es fácil:

  1. Se fija el primer punto de la línea de fibo (se calcula de dónde se quiere que venga).
  2. Decide en qué barra conseguir el segundo punto.
  3. A continuación, utiliceEquationDirect() para obtener el precio.
  4. Teniendo las coordenadas de dos puntos, dibujar una línea a través de ellos utilizando la funciónSetTLine().