Funciones útiles de KimIV - página 15

 
KimIV:
B_Dima:
Si el valor del CCI está por encima de 100, entonces abra una posición de compra hasta que el valor esté por debajo de -100, y cuando esté por debajo de -100, entonces abra una posición de venta hasta que esté por encima de 100.

Para ti, Dima, puedo sugerir esta función:

int CCI_period=14;
int Applied_Price=PRICE_CLOSE;

//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 28.24.2008                                                     |
//|  Описание : Возвращает торговый сигнал:                                    |
//|              1 - покупай                                                   |
//|              0 - сиди, кури бамбук                                         |
//|             -1 - продавай                                                  |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    sy - наименование инструмента   ("" или NULL - текущий символ)          |
//|    tf - таймфрейм                  (    0       - текущий таймфрейм)       |
//|    nb - номер бара                 (    0       - текущий номер бара)      |
//+----------------------------------------------------------------------------+
int GetTradeSignal(string sy="", int tf=0, int nb=0) {
  if (sy=="" || sy=="0") sy=Symbol();
  double cci0=iCCI(sy, tf, CCI_period, Applied_Price, nb);
  double cci1=iCCI(sy, tf, CCI_period, Applied_Price, nb+1);
  int bs=0;

  if (cci1<=+100 && cci0>+100) bs=+1;
  if (cci1>=-100 && cci0<-100) bs=-1;

  return(bs);
}

Esta función devuelve 1 cuando se compra y -1 cuando se vende. Las condiciones de compra/venta son las que tú quieras. Lo único que hay que hacer ahora es que cada garrapata haga lo siguiente:

1. Obtiene el valor de GetTradeSignal().

2. Si el valor recibido es ==0, no se hace nada.

Si el valor recibido >0, entonces cierra todas las ventas y compra.

4. Si el valor calculado es <0, entonces cierra todas las operaciones y vende.

:)))) por supuesto gracias por la ayuda, pero mi error, no lo expliqué con suficiente precisión, el indicador CCI con un intervalo de 50 muestra la dirección y el cambio de tendencia y la apertura se produce cuando el precio toca la EMA 8 y también utiliza stop-loss y take-profit y otros indicadores para determinar la corrección. La imagen es que cuando el CCI rompe a través de +100 se abre una posición de compra al toque de la EMA y no importa donde esté el CCI (+10 o -20), lo principal es que cuando cruza -100 se abre una posición de venta. En el lapso de tiempo entre el cruce de 100 velas y la apertura de 10 o más posiciones, el CCI>=+100 y el CCI<=-100 pueden pasar por 100 velas. Espero que quede claro. Si tienes algún consejo, estaré encantado de ayudarte.

 
B_Dima писал (а):
Mi error, no lo he explicado con suficiente precisión,

Bueno... El error es suyo para corregirlo :-)

Te he dado la dirección correcta. Esto nos llevará a la meta. Así que adelante...

 
KimIV:

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

Decidí dar los primeros ejemplos que me han preguntado muchas veces. Se trata de la apertura de posiciones en términos de ejecución de órdenes de mercado Market Watch. Es cuando no podemos dar simultáneamente una orden de apertura de posición a precio de mercado y adjuntarle una orden pendiente. Dicha apertura en Market Watch debe realizarse en dos etapas: primero, abrimos una posición, y luego le adjuntamos una orden pendiente, es decir, establecemos los niveles de precio StopLoss y TakeProfit.

1. Compre 0,1 lotes del símbolo actual y fije un stop de 30 puntos

int ti=OpenPosition(NULL, OP_BUY, 0.1);
if (OrderSelect(ti, SELECT_BY_TICKET))
  ModifyOrder(-1, Ask-30*Point, -1, clModifyBuy);

2. Vender 0,15 lotes del instrumento actual y establecer SL=45, TP=99

int ti=OpenPosition(NULL, OP_SELL, 0.15);
if (OrderSelect(ti, SELECT_BY_TICKET))
  ModifyOrder(-1, Bid+45*Point, Bid-99*Point, clModifySell);
En el tráiler se incluye un guión de trabajo con ejemplos.


Igor, por favor, comprueba de nuevo - el script no funciona:

1) En las empresas de corretaje normales no hay límite en el número de órdenes abiertas (se abren infinitamente)

2) En las sociedades de corretaje donde las órdenes se abren a mercado - (Error131). Puedes probarlo, por ejemplo, con NorthFinance.

 

Tantas funciones útiles dispuestas... Tal vez se quiera escribir una plantilla para escribir un EA de trading que pueda abrir y cerrar órdenes pendientes, posiciones, establecer take y stoploss, modificar órdenes y posiciones, dependiendo de las condiciones definidas por el usuario... Esta plantilla le permitirá escribir rápidamente un EA en el que sólo cambie el bloque de condiciones (por supuesto, esta parte será insertada por el usuario en función de la estrategia)...


Si hay funciones útiles de Kim, es decir, un cierto estándar de versatilidad en el uso, entonces por qué no poner el código de una plantilla para un EA de comercio de Kim...

 
Set777 писал (а):
Igor, por favor, compruebe de nuevo - el script no funciona:
1) En las empresas de corretaje normales no hay límite en el número de órdenes abiertas (se abre infinitamente)
2) En las empresas de corretaje donde las órdenes se abren por el mercado - (Error131). Puedes probarlo, por ejemplo NorthFinance.

1. No se comprueba el número de posiciones abiertas en el script. El número de veces que se ejecuta el script, el número de posiciones que se abrirá.

Error 131 - Volumen incorrecto, tamaño del lote. Probablemente, es 0,15. Sustitúyelo por 0,2

 
kharko писал (а):
Tantas funciones útiles dispuestas...

Ni siquiera una quinta parte de lo que tengo en mente todavía... Estaré aburriendo a todos aquí hasta el otoño. Así que tened paciencia conmigo...

kharko escribió (a):
Tal vez hay un deseo de escribir alguna plantilla para escribir un asesor de comercio, que puede abrir y cerrar las órdenes pendientes, las posiciones, establecer la toma y stoploss, modificar las órdenes y posiciones, en función de las condiciones definidas por el usuario ...
Plantilla... Plantilla... ¡Buena idea! Gracias. Pero primero las funciones...
 

Función DistMarketAndPos().

¡Aquí vamos! ¡Aquí vienen más funciones interesantes! Por ejemplo, devuelve la distancia en pips entre el mercado y la posición más cercana. La selección más precisa de las posiciones a comprobar se establece mediante parámetros externos:

  • sy - Nombre del instrumento. Si se establece este parámetro, la función sólo comprobará las posiciones del instrumento especificado. El "" o NULL 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). Valor por defecto -1 - cualquier MagicNumber.
//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 19.02.2008                                                     |
//|  Описание : Возвращает расстояние в пунктах между рынком и ближайшей       |
//|             позицей                                                        |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    sy - наименование инструмента   ("" или NULL - текущий символ)          |
//|    op - торговая операция          (    -1      - любая позиция)           |
//|    mn - MagicNumber                (    -1      - любой магик)             |
//+----------------------------------------------------------------------------+
int DistMarketAndPos(string sy="", int op=-1, int mn=-1) {
  double d, p;
  int i, k=OrdersTotal(), r=1000000;

  if (sy=="" || sy=="0") sy=Symbol();
  p=MarketInfo(sy, MODE_POINT);
  if (p==0) if (StringFind(sy, "JPY")<0) p=0.0001; else p=0.01;
  for (i=0; i<k; i++) {
    if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {
      if ((OrderSymbol()==sy) && (op<0 || OrderType()==op)) {
        if (mn<0 || OrderMagicNumber()==mn) {
          if (OrderType()==OP_BUY) {
            d=MathAbs(MarketInfo(sy, MODE_ASK)-OrderOpenPrice())/p;
            if (r>d) r=NormalizeDouble(d, 0);
          }
          if (OrderType()==OP_SELL) {
            d=MathAbs(OrderOpenPrice()-MarketInfo(sy, MODE_BID))/p;
            if (r>d) r=NormalizeDouble(d, 0);
          }
        }
      }
    }
  }
  return(r);
}
 

Ejemplos de uso de DistMarketAndPos().

¿Por qué se necesita una función que determine a qué distancia está el mercado de la posición más cercana? Veo al menos cuatro opciones básicas:

  1. Comprado o vendido. El mercado se ha movido en nuestra dirección. Y tan pronto como pase cierta distancia, las posiciones existentes han ganado algo de beneficio, inmediatamente hacemos un depósito - entrar de nuevo en la misma dirección.
  2. Compramos o vendemos. El mercado fue en nuestra dirección. Una vez que ha recorrido una determinada distancia, y las posiciones existentes han obtenido un determinado beneficio, nos damos cuenta inmediatamente de que ¡eso es todo! ¡El retroceso está cerca! Es el momento de dar la vuelta. Cerramos nuestras posiciones actuales y abrimos en la dirección opuesta.
  3. Compramos o vendemos. El mercado se ha vuelto contra nosotros. Pero por alguna razón, estamos seguros de que tenemos razón y, a cierta distancia del punto de entrada más cercano, es decir, a cierto nivel de pérdida, promediamos y abrimos en la misma dirección.
  4. Compramos o vendemos. El mercado ha ido en contra nuestra. Y nos hemos dado cuenta de que entramos en el mercado de forma incorrecta. Por lo tanto, nos fijamos en un determinado nivel de pérdida y abrimos en la otra dirección.

Si quiero colocar una orden con el orden adecuado, debe hacerse dentro del marco de las condiciones del mercado. Cumpliré todas las peticiones dentro del marco de lo que he enumerado anteriormente.

ZZY-ZY. Se adjunta un script "plantilla" para experimentar con la función DistMarketAndPos().

Archivos adjuntos:
 
Estimado KimIV En la función idPriceLevel() que forma parte de su Asesor Experto e-TFL_v2 hay un error: en la última condición gdUpPrice==0 se repite dos veces. Probablemente, en el segundo caso quiso escribir gdDnPrice==0. Por alguna razón, este EA funciona en el Probador de Estrategias en modo visual, pero la posición de la cuenta demo no se abre, aunque los comentarios informan sobre los niveles de compra y venta. Tal vez pueda decirme qué es lo que está mal.
 
khorosh:
hay un error en la función bool idPriceLevel() incluida en el Asesor Experto e-TFL_v2: gdUpPrice==0 se repite dos veces en la última condición, probablemente quiso escribir gdDnPrice==0 en el segundo caso.

Gracias. He subido la versión corregida de e-TFL_v2 al sitio web.


khorosh:
Por alguna razón este EA funciona en mi Probador de Estrategias en modo visual pero no abre posiciones en una cuenta demo, aunque reporta niveles de compra y venta en los comentarios. Tal vez pueda decirme cuál es el problema.

No sé... Acabo de terminar de probar este Asesor Experto en una demo de NorthFinance. Ayer llamé a mi amigo de Moscú. Se quejó del mismo Asesor Experto. Dice que abre posición por la línea y luego más y más hasta que lo paras y abre muchas posiciones. Por lo tanto, había dos objetivos para las pruebas:

1. En cuanto a su pregunta. Comprobación del funcionamiento general.

2. Sobre la pregunta de mi amigo. Abrí sólo una posición de una línea.

Para comprobarlo, puse el Asesor Experto e-TFL_v2 en los marcos de tiempo de 5 minutos EURUSD, GBPUSD, USDCHF y USDJPY. Utilizando las líneas de tendencia dibujé canales en las últimas 20-30 barras. Como resultado, el Asesor Experto funcionó como debería. El euro se ha comprado por la línea inferior, mientras que el yen se ha vendido por la superior. Para la libra y el chyf todo era correcto también. Así que deberías comprobarlo por tu cuenta. El Asesor Experto funciona.