Funciones útiles de KimIV - página 109

 
He retocado un poco la función. Ahora calcula las intersecciones sin que se cuelgue.
Parámetros de entrada: |
nm1 - nombre de la primera línea |

nm2 - nombre de la segunda línea

sobre la producción M - nivel de precios.

void Middle(string nm1,string nm2)
  {
  double x1, x2, x3, x4;
  double y1, y2, y3, y4;
  double k1, k3;
  
  if(ObjectFind(nm1)==0 && ObjectFind(nm2)==0)
    {
    y1=ObjectGet(nm1, OBJPROP_PRICE1);
    y2=ObjectGet(nm1, OBJPROP_PRICE2);
    x1=ObjectGetShiftByValue(nm1, y1);
    x2=ObjectGetShiftByValue(nm1, y2);
    
    y3=ObjectGet(nm2, OBJPROP_PRICE1);
    y4=ObjectGet(nm2, OBJPROP_PRICE2);
    x3=ObjectGetShiftByValue(nm2, y3);
    x4=ObjectGetShiftByValue(nm2, y4);
    
    k1=(y2-y1)/(x2-x1); 
    k3=(y4-y3)/(x4-x3);
    
    if(k1 != k3)
      {
      T = (y1 - y3 + k3*x3 - k1*x1)/(k3 - k1);
      M = y1 + k1*(T - x1);
      }
    }
  return(0);
  }

PS. Perdón al autor de este hilo por publicar mi código aquí. Sólo pensé que tal vez alguien luchó con el cruce también...

 
Shuba: Sólo pensé que tal vez alguien también tuvo problemas con los cruces...

Me viene a la mente (ya en los Anales):

Novozar 23.07.2011 12:18
Por favor, dime la salida. Tengo un indicador llamado Average Directional Movement Index y dibuja líneas discontinuas. Quiero atrapar las líneas cruzadas. No creo que sea necesario dibujar líneas discontinuas.
 
Shuba:

PS. Pido disculpas al autor de este hilo por publicar mi código aquí. Sólo pensé que tal vez alguien también luchó con las intersecciones...

Muy bien. Perdónalo...
 
Shuba:
He retocado un poco la función. Ahora calcula las intersecciones sin que se cuelgue.
Parámetros de entrada: |
nm1 - nombre de la primera línea |

nm2 - nombre de la segunda línea

producción M - nivel de precios.

PS. Siento al autor de este hilo por publicar mi código aquí. Sólo pensé que tal vez alguien luchó con el cruce también...

Pues bien, ¡tal vez esta función debería devolver este mismo nivel de precios (como en la variante anterior)! Además, hay una variable no declarada "T" en tu código.
 
TarasBY:
Pues bien, ¡tal vez esta función debería devolver este mismo nivel de precios (como en la variante anterior)! Además, tu código contiene una variable "T" no declarada.

Bueno, lo devuelve)

sobre las variables no declaradas - lo siento. Me corrijo.

doble M - nivel de precios de cruce. Esta variable se declara al principio.

void Middle(string nm1,string nm2)
  {
  double x1, x2, x3, x4;
  double y1, y2, y3, y4;
  double k1, k3;
  
  if(ObjectFind(nm1)==0 && ObjectFind(nm2)==0)
    {
    y1=ObjectGet(nm1, OBJPROP_PRICE1);
    y2=ObjectGet(nm1, OBJPROP_PRICE2);
    x1=ObjectGetShiftByValue(nm1, y1);
    x2=ObjectGetShiftByValue(nm1, y2);
    
    y3=ObjectGet(nm2, OBJPROP_PRICE1);
    y4=ObjectGet(nm2, OBJPROP_PRICE2);
    x3=ObjectGetShiftByValue(nm2, y3);
    x4=ObjectGetShiftByValue(nm2, y4);
    
    k1=(y2-y1)/(x2-x1); 
    k3=(y4-y3)/(x4-x3);
    
    if(k1 != k3)
      {
      double T = (y1 - y3 + k3*x3 - k1*x1)/(k3 - k1);
      M = y1 + k1*(T - x1);
      }
    }
  return(0);
  }

El tráiler es un Asesor Experto para ver cómo funciona.

 

No pude conseguir que se cargara de inmediato...

Archivos adjuntos:
proba_per_1.mq4  11 kb
 
Shuba:

No pude conseguir que se cargara de inmediato...


No hay que agitar las aguas, IMHO - bombardear las bibliotecas de funciones con descripciones aquí y eso es todo...

Los que lo necesiten lo encontrarán.

 

La función ClosePosByTakeProfitZone().

Esta función cierra una posición al precio del mercado si el precio se mantiene durante un número de barras en la zona cercana al TakeProfit, o si intenta salir de esta zona. La selección de las posiciones a cerrar se especifica mediante parámetros externos:

  • sy - Nombre del instrumento. Si establecemos este parámetro, la función sólo comprobará las posiciones del instrumento especificado. NULL significa el instrumento actual, mientras que "" (por defecto) significa cualquier instrumento.
  • 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 MagicNumber.
  • tf - Marco de tiempo del gráfico, en el que se cuentan las barras, durante las cuales el precio pisa la zona de TakeProfit. El valor por defecto 0 es el marco temporal actual.
//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 01.04.2012                                                     |
//|  Описание : Закрытие позиций при нахождении цены в зоне TakeProfit         |
//|             в течение заданного количества баров,                          |
//|             а также при попыте выйти из этой зоны.                         |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    sy - наименование инструмента   (""   - любой символ,                   |
//|                                     NULL - текущий символ)                 |
//|    op - операция                   (-1   - любая позиция)                  |
//|    mn - MagicNumber                (-1   - любой магик)                    |
//|    tf - таймфрейм                  ( 0   - текущий таймфрейм)              |
//+----------------------------------------------------------------------------+
void ClosePosByTakeProfitZone(string sy="", int op=-1, int mn=-1, int tf=0) {
  double pa, pb, po, pp, tp;
  int    i, k=OrdersTotal();

  if (sy=="0") sy=Symbol();
  for (i=k-1; i>=0; i--) {
    if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {
      if ((OrderSymbol()==sy || sy=="") && (op<0 || OrderType()==op)) {
        if ((mn<0 || OrderMagicNumber()==mn) && OrderTakeProfit()>0) {
          po=MarketInfo(OrderSymbol(), MODE_POINT);
          if (po==0) Message("В обзоре рынка отсутствует символ "+OrderSymbol());
          else {
            if (OrderType()==OP_BUY) {
              RefreshRates();
              pb=MarketInfo(OrderSymbol(), MODE_BID);
              pp=iLow(OrderSymbol(), tf, iLowest(OrderSymbol(), tf, MODE_LOW, TP.ZoneBars, 0));
              tp=OrderTakeProfit()-TP.ZonePoint*po;
              if (pp>tp || (pb<tp && (iHigh(OrderSymbol(), tf, 0)>tp) || (iHigh(OrderSymbol(), tf, 1)>tp))) ClosePosBySelect();
            }
            if (OrderType()==OP_SELL) {
              RefreshRates();
              pa=MarketInfo(OrderSymbol(), MODE_ASK);
              pp=iHigh(OrderSymbol(), tf, iHighest(OrderSymbol(), tf, MODE_HIGH, TP.ZoneBars, 0));
              tp=OrderTakeProfit()+TP.ZonePoint*po;
              if (pp<tp || (pb>tp && (iLow(OrderSymbol(), tf, 0)<tp) || (iLow(OrderSymbol(), tf, 1)<tp))) ClosePosBySelect();
            }
          }
        }
      }
    }
  }
}
Se adjunta un Asesor Experto para probar la función ClosePosByTakeProfitZone(). puede probarlo tanto en el probador como en línea.
Archivos adjuntos:
 

¡Buenas noches, Igor!

Comencé a estudiar sus funciones no hace mucho tiempo, en la página 36 no entendí bien las funciones, por favor ayúdenme a entender:


Función GetArrowInterval().


//+------------------------------------------------------------------+
//| Devuelve el intervalo de ajuste del puntero de la señal |
//+------------------------------------------------------------------+
int GetArrowInterval() {
int p = Period();

switch (p) {
case 1: return(4);
case 5: return(5);
case 15: return(6);
case 30: return(8);
case 60: return(10);
case 240: return(20);
case 1440: return(40);
case 10080: return(80);
case 43200: return(150);
} xml-ph-0015@deep

es decir, esta función se utilizó para establecer las flechas utilizando la función SetArrow(), es decir, en lugar del nivel de precios en la línea ObjectCreate(nm, OBJ_ARROW, 0, 0,0), dígame cómo sucedió, no está claro para mí lo que significan los valores de retorno (4,5,6,8,10....)


La nueva versión de la función tampoco está clara:





//+----------------------------------------------------------------------------+
//| Autor : Kim Igor V. aka KimIV, http://www.kimiv.ru |
//+----------------------------------------------------------------------------+
//| Versión : 12.10.2007 |
//+----------------------------------------------------------------------------+
//| Descripción : Devuelve el intervalo del puntero de la señal |
//| Parámetros: |
//| pr - porcentaje relativo al tamaño del precio de la ventana |
//+-------------------

return((WindowPriceMax()-WindowPriceMin())/100*pr/Point);


La función WindowPriceMax() devuelve el valor máximo de la escala vertical, es decir, es el valor máximo del precio, pero ¿en qué periodo?

Y gracias por tu duro trabajo....))))

 
Lisi4ka330:

Empecé a estudiar sus funciones no hace mucho tiempo, en la página 36 no entendí bien las funciones, por favor ayúdeme a entender:

es decir, esta función se utilizó para establecer flechas utilizando la función SetArrow(), es decir, en lugar del nivel de precios en la línea ObjectCreate(nm, OBJ_ARROW, 0, 0,0), dime cómo se hizo...

Debes haber entendido mal el propósito de estas funciones. No operan con precios y no ponen iconos; sólo devuelven la distancia en pips dependiendo del marco temporal actual. Consulte la siguiente imagen.

Si coloca dicho marcador no cerca del precio, sino a cierta distancia y por ejemplo en el marco temporal H1, y luego cambia a M1, probablemente no verá el marcador. La escala cambiará y el icono irá hacia abajo o hacia arriba. Las funciones que mencionas están diseñadas para que los iconos estén siempre visibles en el gráfico en cualquier marco temporal.

Lisi4ka330:

...qué significan los valores de retorno (4,5,6,8,10....)

Distancia en pips, según el marco temporal actual.


Lisi4ka330:

La función WindowPriceMax() devuelve el valor máximo de la escala vertical, es decir, es el valor máximo del precio, pero ¿en qué periodo?

No para cualquier período... Sólo en la ventana actual. Por ejemplo, en la figura siguiente, el precio máximo es de 97,35

Razón de la queja: