Funciones útiles de KimIV - página 44

 

Ejemplos de cómo utilizar GetNearestDownFractal().

  • El nivel de precios del fractal ascendente más cercano en el gráfico actual. La fórmula fractal es 2-2 (estándar).
    Message(GetNearestUpFractal());
  • El nivel de precios del fractal superior más cercano en el gráfico H1 del USDJPY. La fórmula del fractal 5-2.
    Message(GetNearestUpFractal("USDJPY", PERIOD_H1, 5));
  • Dibuje una línea horizontal que pase por el nivel de precios del fractal superior 4-3 más cercano en el gráfico actual.
    double p=GetNearestUpFractal(NULL, 0, 4, 3);
    SetHLine(Red, "", p);

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

Archivos adjuntos:
 

Función CorrectTF().

Escribí esta función después de descubrir que a veces puedo especificar fácilmente un marco de tiempo incorrecto, que es igual a un número entero de minutos, en los parámetros de entrada de un indicador o un EA. Por ejemplo, introduje 50 por hora en lugar de 60. Bueno... como si se perdiera. Resulta que la función iRSI() devuelve cero para un marco temporal incorrecto. No puedo decir nada sobre otras funciones, porque no las he comprobado. Para evitar malentendidos resultantes de mis propios errores de falta de atención, escribí esta función como una primitiva a prueba de tontos. Ajusta el parámetro de entrada al marco temporal "más cercano" apropiado y correcto y devuelve su valor.

//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 02.03.2008                                                     |
//|  Описание : Корректирует таймфрейм под ближайший поддерживаемый МТ4.       |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    TimeFrame - таймфрейм (количество секунд)      (0 - текущий ТФ)         |
//+----------------------------------------------------------------------------+
int CorrectTF(int TimeFrame=0) {
  if (TimeFrame==0) TimeFrame=Period();
  if (TimeFrame< PERIOD_M5                         ) return(PERIOD_M1);
  if (TimeFrame>=PERIOD_M5  && TimeFrame<PERIOD_M15) return(PERIOD_M5);
  if (TimeFrame>=PERIOD_M15 && TimeFrame<PERIOD_M30) return(PERIOD_M15);
  if (TimeFrame>=PERIOD_M30 && TimeFrame<PERIOD_H1 ) return(PERIOD_M30);
  if (TimeFrame>=PERIOD_H1  && TimeFrame<PERIOD_H4 ) return(PERIOD_H1);
  if (TimeFrame>=PERIOD_H4  && TimeFrame<PERIOD_D1 ) return(PERIOD_H4);
  if (TimeFrame>=PERIOD_D1  && TimeFrame<PERIOD_W1 ) return(PERIOD_D1);
  if (TimeFrame>=PERIOD_W1  && TimeFrame<PERIOD_MN1) return(PERIOD_W1);
  if (TimeFrame>=PERIOD_MN1                        ) return(PERIOD_MN1);
}
SZY. Se adjunta un script para probar la función CorrectTF().
Archivos adjuntos:
 

La función DateBeginQuarter().

Esta función devuelve la fecha de inicio del trimestre por su número. Por ejemplo, si ahora es 27.08.2008, la fecha de inicio del trimestre actual será 01.07.2008. La función sólo toma un parámetro: el número de trimestre relativo al trimestre actual. Por ejemplo, 0 es el trimestre actual, 1 es el trimestre siguiente y -1 es el trimestre anterior. Es decir, los números positivos de los trimestres solicitarán fechas del futuro, mientras que el cero y el negativo solicitarán fechas del pasado. El valor devuelto es el número de segundos transcurridos desde las 00:00 del 1 de enero de 1970.

//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 12.05.2008                                                     |
//|  Описание : Возвращает дату начала квартала                                |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|                                    (-2 - позапрошлый)                      |
//|                                    (-1 - прошлый)                          |
//|    nq - номер квартала             ( 0 - текущий)                          |
//|                                    ( 1 - следующий)                        |
//|                                    ( 2 - последующий)                      |
//+----------------------------------------------------------------------------+
datetime DateBeginQuarter(int nq=0) {
  int ye=Year()-MathFloor(nq/4);
  nq=MathMod(nq, 4);
  int mo=Month()-MathMod(Month()+2, 3)+3*nq;
  if (mo<1) {
    mo+=12;
    ye--;
  }
  if (mo>12) {
    mo-=12;
    ye++;
  }

  return(StrToTime(ye+"."+mo+".01"));
}

P.D. Se adjunta un script para probar la función DateBeginQuarter().

Archivos adjuntos:
 

La función DateOfMonday().

Esta función devuelve la fecha de inicio de la semana (la fecha del lunes) por su número. Por ejemplo, si ahora es 29.08.2008, la fecha de inicio de la semana actual será 25.08.2008. La función sólo toma un parámetro: el número de semana relativo a la semana actual. Por ejemplo, 0 es la semana actual, 1 es la semana siguiente y -1 es la semana anterior. Es decir, los números de semana positivos solicitarán fechas del futuro, mientras que los números cero y negativos solicitarán fechas del pasado. El valor devuelto es el número de segundos transcurridos desde las 00:00 del 1 de enero de 1970.

//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 13.05.2008                                                     |
//|  Описание : Возвращает дату понедельника по номеру недели                  |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|                                    (-2 - предпредыдущая неделя)            |
//|                                    (-1 - предыдущая неделя)                |
//|    nn - номер недели               ( 0 - текущая неделя)                   |
//|                                    ( 1 - следующая неделя)                 |
//|                                    ( 2 - последующая неделя)               |
//+----------------------------------------------------------------------------+
datetime DateOfMonday(int nn=0) {
  datetime dt=StrToTime(TimeToStr(TimeCurrent(), TIME_DATE));

  while (TimeDayOfWeek(dt)!=1) dt-=24*60*60;
  dt+=nn*7*24*60*60;

  return (dt);
}

P.D. Se adjunta un script para probar la función DateOfMonday().

Archivos adjuntos:
 

La función Fibonacci().

Esta función devuelve un elemento de una serie de Fibonacci por su número de secuencia.

//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 07.08.2008                                                     |
//|  Описание : Возвращает элемент ряда Фибоначчи по его порядковому номеру.   |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    n - номер элемента ряда                                                 |
//+----------------------------------------------------------------------------+
int Fibonacci(int n) {
  int a=0, b=0, i=1, s=0;

  if (n==1) s=1;
  if (n>1) {
    s=1;
    while (i<n) {
      i++;
      a=b;
      b=s;
      s=a+b;
    }
  }
  return(s);
}

P.D. Se adjunta un script para probar Fibonacci().

Archivos adjuntos:
 

Función GetNameMA().

Esta función devuelve el nombre del método MA (Moving Averages) por su identificador. Esta función es conveniente utilizarla en los comentarios, indicadores y mensajes de los Asesores Expertos.

//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 01.09.2005                                                     |
//|  Описание : Возвращает наименование метода МА.                             |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    mm - идентификатор метода МА                                            |
//+----------------------------------------------------------------------------+
string GetNameMA(int mm) {
  switch (mm) {
    case MODE_SMA : return("SMA");
    case MODE_EMA : return("EMA");
    case MODE_SMMA: return("SMMA");
    case MODE_LWMA: return("LWMA");
    default       : return("Unknown Method");
  }
}
 
KimIV писал (а) >>

Función GetNameMA().

Esta función devuelve el nombre del método MA (Moving Averages) por su identificador. Esta función es útil en los comentarios, indicadores y Asesores Expertos.

No pienses en ello como en un puntilloso ....

default       : return("Unknown Method");

Es que si vas a ser consistente, tienes que ir hasta el final...
 
TheXpert писал (а) >>

No pienses en ello como si te estuvieras metiendo en ....

por todos los medios... Gracias. Corregido.

 
KimIV

Buenas tardes.

Ayúdame a que la expo se transmita un poco.

No puedo creer que abra órdenes y no cierre esta pila en condiciones.

Es decir, si un acuerdo es uno solo, saldrá de la pose y si hay 2 acuerdos, se cierra.

Archivos adjuntos:
panzer.mq4  5 kb
 

Función GetPriceDiffInPoint().

Esta función devuelve la diferencia de precio entre dos barras, que se especifican por sus números. El propósito de desarrollar esta función era determinar el valor y la dirección del movimiento del precio. La función GetPriceDiffInPoint() determina los puntos de referencia (Apertura o Alta o Baja o Cierre) de las barras a tener en cuenta. La función acepta los siguientes parámetros opcionales:

  • sy - Nombre del instrumento. "" o NULL - símbolo actual. El valor por defecto es NULL.
  • tf - Marco temporal. Valor por defecto 0 - símbolo actual.
  • n2 - Número de barra izquierda. Valor por defecto - 2.
  • n1 - Número de barra derecha. Valor por defecto - 1.

Valor devuelto:

  • positivo : hubo un aumento de la tasa entre las barras N2 y N1.
  • Negativo: hubo una disminución entre las barras N2 y N1.
//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 01.09.2005                                                     |
//|  Описание : Возвращает ценовую разницу в пунктах между двумя барами.       |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    sy - наименование инструмента        ("" или NULL - текущий символ)     |
//|    tf - таймфрейм                       (    0       - текущий таймфрейм)  |
//|    n2 - номер левого бара               (    2       - второй бар)         |
//|    n1 - номер правого бара              (    1       - первый бар)         |
//|  Возвращаемое значение:                                                    |
//|    положительное - между барами N2 и N1 был рост курса                     |
//|    отрицательное - между барами N2 и N1 было снижение курса                |
//+----------------------------------------------------------------------------+
int GetPriceDiffInPoint(string sy="0", int tf=0, int n2=2, int n1=1) {
  if (sy=="" || sy=="0") sy=Symbol();
  double p=MarketInfo(sy, MODE_POINT);
  int    d=MarketInfo(sy, MODE_DIGITS);
  int    dd=0, k=iBars(sy, tf);

  if (n1>k || n2>k)
    Print("GetPriceDiffInPoint(): Недостаточно баров для ",sy," ",GetNameTF(tf));
  else {
    if (n1>0 && n2>0) {
      int d1=NormalizeDouble((iHigh(sy, tf, n1)-iLow(sy, tf, n2))/p, d);
      int d2=NormalizeDouble((iLow(sy, tf, n1)-iHigh(sy, tf, n2))/p, d);

      if (MathAbs(d1)>MathAbs(d2)) dd=d1;
      if (MathAbs(d1)<MathAbs(d2)) dd=d2;
      if (MathAbs(d1)==MathAbs(d2)) {
        if (iOpen(sy, tf, n2)>iClose(sy, tf, n1)) dd=d2; else dd=d1;
      }
    }
  }

  return(dd);
}