Funciones útiles de KimIV - página 4

 

Más ejemplos de cómo utilizar la función SetOrder().

Para mayor claridad, debemos seleccionar un símbolo con un nivel mínimo admisible de stop loss/stake profit en pips. He elegido AUDCAD, en el que este nivel en mi empresa de corretaje seleccionada para la prueba es de 10 puntos.

1. Estableciendo una orden BuyLimit con el lote 0.1, 5 pips por debajo del precio actual. Elegí a propósito el nivel de ajuste de la orden por debajo del nivel mínimo permitido para obtener el error 130 (paradas incorrectas) y mostrar cómo la función SetOrder lo resolverá.

SetOrder(NULL, OP_BUYLIMIT, 0.1, Ask-5*Point);

Contenido del protocolo (leído de abajo a arriba):
2008.03.17 09:06:24 test_SetOrder AUDCAD,M5: eliminado
2008.03.17 09:06:24 stdlib AUDCAD,M5: eliminado
2008.03.17 09:06:24 stdlib AUDCAD,M5: uninit reason 0
2008.03.17 09:06:24 test_SetOrder AUDCAD,M5: uninit reason 0
2008.03.17 09:06:24 test_SetOrder AUDCAD,M5: open #21616412 buy limit 0.10 AUDCAD at 0.9180 ok
2008.03.17 09:06:15 test_SetOrder AUDCAD,M5: SetOrder(): Niveles de precios corregidos
2008.03.17 09:06:15 test_SetOrder AUDCAD,M5: Ask=0.919 Bid=0.918 sy=AUDCAD ll=0.1 op=Buy Limit pp=0.9185 sl=0 tp=0 mn=0
2008.03.17 09:06:15 test_SetOrder AUDCAD,M5: Error(130) set order: invalid stops, try 1
2008.03.17 09:06:15 stdlib AUDCAD,M5: cargado con éxito
2008.03.17 09:06:14 test_SetOrder AUDCAD,M5: cargado con éxito

El protocolo muestra que esta función ha intentado colocar una orden de 0,9185 (pp=0,9185) pero el servidor de operaciones no aceptó dicha orden y devolvió el error 130. A continuación, la función corrige el nivel de ajuste de la orden de acuerdo con el nivel mínimo permitido y realiza el siguiente intento de operación que finaliza con éxito. La orden se fija en 0,9180.

2. Establecer una orden BuyStop con el lote 0.3 a 6 pips por encima del precio actual con un stop de 9 pips

SetOrder(NULL, OP_BUYSTOP, 0.3, Ask+6*Point, Ask+(6-9)*Point);

Contenido del protocolo (leído de abajo hacia arriba):
2008.03.17 09:27:36 test_SetOrder AUDCAD,M5: eliminado
2008.03.17 09:27:36 stdlib AUDCAD,M5: eliminado
2008.03.17 09:27:36 stdlib AUDCAD,M5: uninit reason 0
2008.03.17 09:27:36 test_SetOrder AUDCAD,M5: uninit reason 0
2008.03.17 09:27:36 test_SetOrder AUDCAD,M5: open #21617419 buy stop 0.30 AUDCAD at 0.9209 sl: 0.9195 ok
2008.03.17 09:27:26 test_SetOrder AUDCAD,M5: SetOrder(): Niveles de precios corregidos
2008.03.17 09:27:26 test_SetOrder AUDCAD,M5: Ask=0.9198 Bid=0.9188 sy=AUDCAD ll=0.3 op=Buy Stop pp=0.9204 sl=0.9195 tp=0 mn=0
2008.03.17 09:27:26 test_SetOrder AUDCAD,M5: Error(130) set order: invalid stops, try 1
2008.03.17 09:27:26 stdlib AUDCAD,M5: cargado con éxito
2008.03.17 09:27:25 test_SetOrder AUDCAD,M5: cargado con éxito

Este ejemplo muestra cómo el nivel de ajuste de la orden ha cambiado de 0,9204 a 0,9209. Al mismo tiempo, el nivel de parada se ha mantenido sin cambios en sl=0,9195. Es decir, el stop en pips ha pasado de 9 a 14.

 

3. Establecer una orden SellLimit con 0,5 lotes a 8 puntos por encima del precio actual con un stop de 9 puntos y una orden take de 7 puntos

SetOrder(NULL, OP_SELLLIMIT, 0.5, Bid+8*Point, Bid+(8-9)*Point, Bid-(8+7)*Point);

Contenido del protocolo:
2008.03.17 10:38:50 test_SetOrder AUDCAD,M5: eliminado
2008.03.17 10:38:50 stdlib AUDCAD,M5: eliminado
2008.03.17 10:38:50 stdlib AUDCAD,M5: uninit reason 0
2008.03.17 10:38:50 test_SetOrder AUDCAD,M5: uninit reason 0
2008.03.17 10:38:49 test_SetOrder AUDCAD,M5: open #21620553 sell limit 0.50 AUDCAD at 0.9190 sl: 0.9201 tp: 0.9179 ok
2008.03.17 10:38:40 test_SetOrder AUDCAD,M5: SetOrder(): Niveles de precios corregidos
2008.03.17 10:38:40 test_SetOrder AUDCAD,M5: Ask=0.919 Bid=0.918 sy=AUDCAD ll=0.5 op=Sell Limit pp=0.9188 sl=0.9197 tp=0.9179 mn=0
2008.03.17 10:38:40 test_SetOrder AUDCAD,M5: Error(130) set order: invalid stops, try 1
2008.03.17 10:38:40 stdlib AUDCAD,M5: cargado con éxito
2008.03.17 10:38:39 test_SetOrder AUDCAD,M5: cargado con éxito

En este ejemplo se vuelve a intentar colocar una orden limitada demasiado cerca del mercado. El nivel de fijación de órdenes se ha ajustado al alza en 2 pips, de 0,9188 a 0,9190. El nivel de parada también se ha ajustado, pero en 4 puntos, de 0,9197 a 0,9201. Sólo el nivel de Take ha permanecido sin cambios, que lo aumentó de 9 a 11 pips.

Creo que son suficientes ejemplos. Ya son bastante difíciles de entender. ¿Qué conclusiones se pueden sacar?
1. La función hará todo lo posible para completar su tarea, es decir, intentará establecer un orden. Ajustará los niveles a los cambios del mercado y tratará de hacer su trabajo una y otra vez.
2. El ajuste del nivel de fijación de la orden de stop conduce a un aumento del nivel de stop en puntos en relación con el precio de fijación. Esto se debe al hecho de que el nivel de la orden de stop permanece en su lugar y el nivel de ajuste de la orden se aleja del nivel de stop. El nivel de la orden BuyStop se desplaza hacia arriba y la orden SellStop se desplaza hacia abajo. Estas manipulaciones con el nivel de ajuste de la orden aumentan el tamaño del tope en puntos por el valor del ajuste del nivel de ajuste de la orden.
3. El ajuste del nivel de ajuste de la orden limitada resulta en el aumento del nivel de la línea de toma en puntos relativamente al precio de ajuste. Esto se implementa de la siguiente manera. Los tees permanecen en su lugar mientras que los stops y los niveles de configuración se desplazan hacia arriba para BuyLimit y hacia abajo para SellLimit. El tamaño de los puntos de toma aumenta por el valor de la corrección del nivel de ajuste de la orden.

¡Atención! He cambiado el código de la función SetOrder intercambiando algunas líneas. El antiguo post no se puede editar, así que pego aquí la función corregida. También se adjunta un script para probar en línea la función SetOrder.


Archivos adjuntos:
 

Para acelerar la publicación de la función ModifyOrder, decidí cambiar a las funciones de posición por un tiempo, y luego volver a las funciones de orden y terminar con ellas.

¡Atención!
Defino lasposiciones como operaciones de negociación OP_BUY y OP_SELL. Las posiciones se abren y se cierran.
Llamo a las operaciones comerciales OP_BUYLIMIT, OP_BUYSTOP, OP_SELLLIMIT y OP_SELLSTOPcomo órdenes. Los pedidos se hacen y se borran. Si una orden se activa, se convierte en una posición.

La función ExistPositions().

Esta función sirve para comprobar si hay posiciones abiertas de compra o de venta. Similar a la función ExistOrders. Por defecto, comprueba todas las posiciones: la actual y las demás. Puede afinar la selección con una combinación de filtros - parámetros de función:

  • sy - Impone una restricción al nombre del instrumento. El parámetro por defecto es "" - sin restricción, es decir, cualquier instrumento. Si pasa NULL, la selección de la posición se limitará al instrumento actual.
  • op - pone una restricción en el tipo de posición (Compra/Venta). Por defecto, no hay ninguna restricción, es decir, se comprueba cualquier tipo de posición. Los valores válidos para este parámetro son -1, OP_BUY y OP_SELL.
  • mn - Aplica la restricción del número de identificación ("mágico") de la posición. Por defecto no hay ninguna restricción, es decir, se comprueba la posición con cualquier número mágico.
  • ot - Aplica la restricción de la hora de apertura de la posición. Se comprueba si la posición se abrirá más tarde que el valor de este parámetro. Ninguna restricción por defecto, es decir, se comprueba la posición con cualquier tiempo abierto.
//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 06.03.2008                                                     |
//|  Описание : Возвращает флаг существования позиций                          |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    sy - наименование инструмента   (""   - любой символ,                   |
//|                                     NULL - текущий символ)                 |
//|    op - операция                   (-1   - любая позиция)                  |
//|    mn - MagicNumber                (-1   - любой магик)                    |
//|    ot - время открытия             ( 0   - любое время открытия)           |
//+----------------------------------------------------------------------------+
bool ExistPositions(string sy="", int op=-1, int mn=-1, datetime ot=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()==OP_BUY || OrderType()==OP_SELL) {
          if (op<0 || OrderType()==op) {
            if (mn<0 || OrderMagicNumber()==mn) {
              if (ot<=OrderOpenTime()) return(True);
            }
          }
        }
      }
    }
  }
  return(False);
}
 

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

1. Comprobar la existencia de cualquier posición

ExistPositions();

2. Comprobar la existencia de cualquier posición en el símbolo del gráfico actual

ExistPositions(NULL);

3. Comprobar la existencia de la compra en cualquier instrumento

ExistPositions("", OP_BUY);

4. Compruebe si hay una venta con el número mágico 123456 en EURUSD

ExistPositions("EURUSD", OP_SELL, 123456);

5. Comprobar la existencia de cualquier posición con hora de apertura no anterior a 15 minutos

ExistPositions("", -1, -1, TimeCurrent()-15*60);

El tráiler contiene un script para probar la función ExistPositions. Los cuatro primeros ejemplos están comentados.

Archivos adjuntos:
 
Lo siento, pero ni OrderSet_1 ni OrderSet_2 funcionan. Genera errores: ¡no compila! ¿Qué debo hacer?
 
SoloEgoist:
Lo siento, pero ni OrderSet_1 ni OrderSet_2 funcionan. Genera errores: ¡no compila! ¿Qué debo hacer?
Los archivos OrderSet_1 o OrderSet_2 son códigos fuente de la función OrderSet en diferentes versiones. Sólo el código fuente, eso es todo. No se compilan ni se ejecutan correctamente (sin errores). Para obtener al menos algunos resultados, también debe crear un entorno de trabajo que utilice la función OrderSet. He creado un ejemplo de este entorno de trabajo en test_SetOrder.
 
Gracias. Ya veo, lo intentaré, pero no sé mucho del idioma.
 

Las funciones y formas de trabajar con la fecha y la hora serían muy útiles...

Por ejemplo:
- restar 2 horas a la hora actual
- X días para el vencimiento...

Además... no sé si esto es relevante... :(

Funciones para las estadísticas. Por ejemplo:
- cuántas velas horarias a las 21:00 cada lunes
- de los cuales: 215 alcista, 245 bajista
- de velas alcistas: min. 12 pips máx. 54 pips
- etc...

o
- el mínimo de cada primera vela de 15H del día es mayor/menor que la segunda X número de veces

Lo importante no son las funciones en sí, sino cómo se crean, y es más fácil implementar tus propias funciones,
mientras se aprende a programar...
Me quejo una vez más :))) A veces muchas cosas no están muy claras, y los libros sobre C pueden ayudar.
Por supuesto, puedes leerlos, pero ¿realmente necesitas llenarte la cabeza con información innecesaria, centrándote sólo en µl4?
¿Qué tipo de oscuridad? Por ejemplo esto: ||

 
kombat:

Las funciones y formas de tratar la fecha y la hora serían muy útiles...

Por ejemplo:
- restar 2 horas a la hora actual
- Quedan X días para la expiración...

...


no hace falta que escriba esa función, ¡hay una solución muy sencilla!


int gHora = 2;
datetime gDosHoras ;


gTwoHourTime = TimeCorrent() - ((86400)/24) * gHora ); // 2 horas
gTwoHourTime = TimeCorrent() - 7200; // lo mismo pero sin cálculos de carga

es decir, tenemos 86400 ticks en un día

así que 2 horas = 7200 ticks, es decir, 86400/24 * 2 = 7200
1 hora = 3600; etc.
 
kombat:

Sería útil disponer de funciones y formas de trabajar con la fecha y la hora.

Funciones para las estadísticas. Por ejemplo:
- cuántas velas de 21:00 cada lunes
- de los cuales: 215 alcista, 245 bajista
- de velas alcistas: min. 12 pips máx. 54 pips
- etc...

o
- el mínimo de cada primera vela de 15H del día es mayor/menor que la segunda X número de veces

Lo importante no son las funciones en sí, sino cómo se crean, y es más fácil implementar tus propias funciones,
mientras se aprende a programar...

Tomo nota... :-)

kombat escribió (a):
me quejaré de nuevo :))) a veces muchas cosas no están muy claras, y dicen que los libros C ayudarán.
Señalan que un montón de libros de C te ayudarán. Por supuesto, puedes leerlos, pero ¿realmente necesitas llenarte la cabeza de información innecesaria, centrándote sólo en µl4?
¿Qué tipo de oscuridad? Por ejemplo esto: ||

Es un OR lógico. Permítanme explicarlo con un ejemplo. La expresión "Si x>2 o x<-3, entonces x=5" en MQL4 tendrá la siguiente forma

if (х>2 || х<-3) х=5;