Funciones útiles de KimIV - página 114

 

Buenas tardes.

Todavía soy nuevo en la programación, si alguien tiene algún consejo.

Pregunta. Tenemos una o varias órdenes abiertas y sabemos que cerrarán con un beneficio de 20 dólares.

Necesitamos saber a qué precio se cerrarán las órdenes con 20 dólares de beneficio.

Calculamos el volumen total de lotes abiertos, ¡y luego!

Por favor, aconseja cómo hacerlo.

¿Quizás haya una función lista?

Gracias de antemano.

 
KimIV:

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 desea una implementación específica de alguna de estas opciones, escriba sus peticiones aquí. Cumpliré todas las solicitudes dentro del marco de lo que he enumerado anteriormente.

SZY-SZY. Se adjunta una plantilla para experimentar con la función DistMarketAndPos().


HolaKimIV, la función es muy buena, funciona, le doy la vuelta, también funciona, pero no puedo conectar las dos mitades.

     int start()

{

      if (DistMarketAndPos()>150)

{                                     

      OrderSend(Symbol(),OP_BUY,1.0,Ask,3,0,Ask+150*Point);

   }     

      return(0);

   }

int DistMarketAndPos(string sy="", int op=OP_BUY, 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, "")<0) p=0.00001; 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);

}  


 

Por favor, dale la vuelta, todo el mundo dice que no está bien pero funciona.
 
Los recién llegados pueden hacer sus preguntas en el hilo dedicado a ello.
 

Nueva versión de la función Message().


La función Message( ) ha sufrido dos cambios desde su publicación. El primer cambio añadió la posibilidad de deshabilitar la salida al registro de Expertos mediante Print() y la posibilidad de emitir sólo el primer mensaje de una serie de otros similares. El segundo cambio añadió direcciones de salida, es decir, además de las funciones existentes Comment() e Print() se utilizaron Alert(), SendMail() y SendNotification(). Es este último cambio el que estoy publicando.

La función Message( ) está diseñada para emitir el mensaje de texto en diferentes direcciones. Puede utilizarse tanto para la depuración como en aplicaciones preparadas para explicar la situación actual de la negociación, para registrar el funcionamiento del programa, para informar oportunamente al operador sobre cambios importantes, etc. La función acepta tres parámetros, los dos últimos opcionales:
  • ms - Cadena, mensaje de texto a emitir, transmitido.
  • nv - Una cadena de banderas que especifican la dirección de la salida del mensaje. Cinco banderas son cinco lugares significativos. Cada cara de la bandera con cero enciende y uno apaga una dirección de salida particular. De izquierda a derecha en orden son Alerta, Comentario, Impresión, SendMail y SendNotification. El valor por defecto es "01100", es decir, Comentario e Impresión están activados, los demás están desactivados.
  • am - Lógico, Verdadero - salida de todos los mensajes, Falso - de una serie de mensajes idénticos salida sólo del primero. El valor por defecto es Falso.

En cuanto a las direcciones de salida de Alerta e Impresión (espacios 1 y 3), hay que tener en cuenta que son capaces de emitir el mensaje línea por línea. Es decir, si hay un salto de línea en el texto del mensaje - carácter de control "\n", entonces cada línea se imprimirá independientemente. Prueba el script de prueba en el archivo adjunto, creo que te gustará :-)

//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 08.03.2013                                                     |
//|  Описание : Вывод текстового сообщения.                                    |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    ms - текст сообщения                                                    |
//|    nv - флаги направлений вывода сообщения:   (0-выкл, 1-вкл)              |
//|           Alert, Comment, Print, SendMail, SendNotification                |
//|    am - флаг всех повторяющихся сообщений                                  |
//+----------------------------------------------------------------------------+
void Message(string ms, string nv="01100", bool am=False) {
  static string prevMessage="";
  string as[];
  int    i, k;

  if (StrToInteger(StringSubstr(nv, 1, 1))==1) Comment(ms);
  if ((StringLen(ms)>0) && (am || prevMessage!=ms)) {
    if (StrToInteger(StringSubstr(nv, 0, 1))==1) {
      k=StrSplit(ms, as, "\n");
      for (i=0; i<k; i++) Alert(as[i]);
    }
    if (StrToInteger(StringSubstr(nv, 2, 1))==1) {
      k=StrSplit(ms, as, "\n");
      for (i=0; i<k; i++) Print(as[i]);
    }
    if (StrToInteger(StringSubstr(nv, 3, 1))==1) SendMail(WindowExpertName(), ms);
    if (StrToInteger(StringSubstr(nv, 4, 1))==1) SendNotification(ms);
    prevMessage=ms;
  }
}

SZY. Se adjunta un script para probar la función Message().

Archivos adjuntos:
 
KimIV:

Nueva versión de la función Message().


La función Message( ) ha sufrido dos cambios desde su publicación. El primer cambio añadió la posibilidad de deshabilitar la salida al registro de Expertos por medio de Print() y la posibilidad de emitir sólo el primer mensaje en una serie de similares. El segundo cambio añadió direcciones de salida, es decir, además de las funciones existentes Comment() e Print() se utilizaron Alert(), SendMail() y SendNotification(). Es este último cambio el que estoy publicando.

La función Message( ) está diseñada para emitir el mensaje de texto en diferentes direcciones. Puede utilizarse tanto para la depuración como en aplicaciones preparadas para explicar la situación actual de la negociación, para registrar el funcionamiento del programa, para informar oportunamente al operador sobre cambios importantes, etc. La función acepta tres parámetros, los dos últimos opcionales:
  • ms - Cadena, mensaje de texto a emitir, transmitido.
  • nv - Una cadena de banderas que especifican la dirección de la salida del mensaje. Cinco banderas son cinco lugares significativos. Cada cara de la bandera con cero enciende y uno apaga una dirección de salida particular. De izquierda a derecha en orden son Alerta, Comentario, Impresión, SendMail y SendNotification. El valor por defecto es "01100", es decir, Comentario e Impresión están activados, los demás están desactivados.
  • am - Lógico, Verdadero - salida de todos los mensajes, Falso - de una serie de mensajes idénticos salida sólo del primero. El valor por defecto es Falso.

En cuanto a las direcciones de salida de Alerta e Impresión (espacios 1 y 3), hay que tener en cuenta que son capaces de emitir el mensaje línea por línea. En otras palabras, si hay un salto de línea en el texto del mensaje -carácter de control "\n"-, cada línea se imprimirá de forma independiente. Prueba el script de prueba en el archivo adjunto, creo que te gustará :-)


SZY. Se adjunta un script para probar la función Message().

¿Ha añadido una comprobación de parada a su función OpenPosition?
 
sv.:
¿Ha añadido una comprobación de nivelación de parada a su función OpenPosition?


No... ¿a qué tipo de comprobación se refiere? Digamos que la parada y la toma fallaron el cheque, ¿qué hacer? Hay opciones:

  1. No abrir,
  2. Ajustar el tope y la retirada.

 
KimIV:


no... ¿a qué tipo de comprobación se refiere? Digamos que la parada y la toma no pasaron el control, ¿qué se hace? Hay opciones:

  1. No abrir,
  2. Ajustar la parada y la toma.

Podrías introducir un interruptor personalizado entre los puntos 1 y 2. Siguiendo el patrón:
 int           modeSetOrders = 1;      // Способ установки ордеров:
                                       //  0 - по заданной цене
                                       //  1 - скорректировать цены
                                       //  2 - вход по текущим ценам
 

Nueva versión de la funciónOpenPosition() en el script de prueba.

¿Qué hay de nuevo?

1. Cuando el error 130 Stops inválidos y el valor de la variable NumberOfTry>1 se establece, la función tratará de ajustar los niveles de precio StopLoss y TakeProfit a los valores de MODE_STOPLEVEL+MODE_SPREAD relativos a Bid para OP_SELL y Ask para OP_BUY.

Nota:

La variable globalNumberOfTry debeser mayor que 1 para que se corrijan los niveles de precios, ya queel primer intento de abrir una posición revela el error 130 y corrige los niveles de precios, mientras que el segundo y siguientes intentos de abrir una posición con niveles corregidos.

Archivos adjuntos:
 
KimIV, me alegro de verte de nuevo por aquí con novedades.
 

Buenas tardes.

¿Es posible complementar la biblioteca de funciones útiles de KimIV con algunas funciones simples como :

1.Precio de apertura, seleccionado por algún criterio de posición (símbolo, tipo, tamaño de lote, número mágico). Este precio puede ser almacenado en variables globales y utilizado como un determinado nivel de precios, a partir del cual se puede construir el algoritmo del Asesor Experto.

Devuelve una entrada seleccionada según algunos criterios de una posición o una orden (símbolo, tipo, tamaño de lote, número mágico). El billete es un identificador importante, se puede utilizar en todas partes e incluso como bandera de existencia.

Cuantas más funciones sencillas de este tipo haya, más fácil será encontrar las mejores para usted, sin temor a equivocarse al modificar las existentes.

Gracias por sus funciones.