Funciones útiles de KimIV - página 57

 

La función ArrayInsertDouble()

Inserta un elemento de un array con el índice dado. Devuelve el número de elementos (tamaño) del nuevo array. La inserción se realiza de la siguiente manera. En primer lugar, el tamaño de la matriz se incrementa en uno. A continuación, todos los elementos que tienen un índice mayor o igual que el que se va a insertar se desplazan al final de la matriz uno a uno, dejando espacio para el que se va a insertar. Finalmente, el valor se escribe en la celda requerida. La función ArrayInsertDouble( ) toma los siguientes parámetros:

  • m - Una matriz de elementos de tipo double.
  • e - Valor del elemento insertado de la matriz.
  • i - Índice del elemento de la matriz que se va a insertar. Si el valor del índice es menor que cero o mayor o igual que el tamaño del array, el elemento se añadirá al final del array. El valor por defecto es -1.
//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 31.10.2008                                                     |
//|  Описание : Выполняет вставку элемента массива с заданным индексом.        |
//|             Возвращает размер нового массива.                              |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    m - массив элементов типа double                                        |
//|    e - значение элемента                                                   |
//|    i - индекс элемента                  (-1 - добавить в конец массива)    |
//+----------------------------------------------------------------------------+
int ArrayInsertDouble(double& m[], double e, int i=-1) {
  int j, k=ArraySize( m);

  ArrayResize( m, k+1);
  if ( i>=0 && i< k) {
    for ( j= k; j> i; j--) m[ j]= m[ j-1];
    m[ i]= e;
  } else m[ k]= e;

  return( k+1);
}

SZY. Por favor, encuentre los scripts adjuntos para probar las funciones ArrayInsertDouble(), ArrayInsertInt(), ArrayInsertString().

ZZZY. He actualizado la biblioteca b-Array en mi sitio.

 

Igor, ya que estamos hablando de arrays, podemos volver a mi antigua petición, sobre la ordenación de arrays ('Funciones útiles de KimIV'). Lo que se ha hecho antes está un poco mal, lo siento por la TOR indirecta.

Necesito ordenar un array bidimensional por una determinada columna (fila), análogo a la operación en EXCEL. Este procedimiento es necesario para utilizar el estadístico de Spearman 'Spearman's Rank Correlation Coefficient', en alguna variante de análisis de matrices de correlación monedas (carteras).

 

La función BubbleSort2().

Esta función burbujea los elementos de una matriz bidimensional en una columna arbitraria. También puede especificar la dirección de la ordenación. La función BubbleSort2( ) toma los siguientes parámetros:

  • a - Matriz bidimensional de elementos. Parámetro obligatorio.
  • r - Número (índice) de la columna de clasificación (columna). El valor por defecto es 0 - la primera columna (columna con índice cero).
  • m - Dirección de clasificación. Valores válidos: MODE_ASCEND - orden ascendente, MODE_DESCEND - orden descendente. El valor por defecto es MODE_ASCEND.
//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 04.11.2008                                                     |
//|  Описание : Выполняет пузырьковую сортировку элементов двумерного массива. |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    a - массив элементов                                                    |
//|    r - колонка сортировки          (     0       - первая (с индексом 0))  |
//|    m - направление сортировки      (MODE_ASCEND  - по возрастанию,         |
//|                                     MODE_DESCEND - по убыванию)            |
//+----------------------------------------------------------------------------+
void BubbleSort2(double& a[][], int r=0, int m= MODE_ASCEND) {
  double t;
  int    e, i, j;
  int    k=ArrayRange( a, 1);      // Количество колонок
  int    n=ArrayRange( a, 0);      // Количество строк

  if ( r<0) r=0;
  if ( r> k) r= k;

  for ( i= n-1; i>0; i--) {
    for ( j=0; j< i; j++) {
      if ( m== MODE_ASCEND) {
        // по возрастанию
        if ( a[ j][ r]> a[ j+1][ r]) {
          for ( e=0; e< k; e++) {
            t= a[ j][ e];
            a[ j][ e]= a[ j+1][ e];
            a[ j+1][ e]= t;
          }
        }
      } else {
        // по убыванию
        if ( a[ j][ r]< a[ j+1][ r]) {
          for ( e=0; e< k; e++) {
            t= a[ j][ e];
            a[ j][ e]= a[ j+1][ e];
            a[ j+1][ e]= t;
          }
        }
      }
    }
  }
}
Adjunto un script para probar la función BubbleSort2().
Archivos adjuntos:
 

Función GetTypeLastDeleted().

Esta función devuelve el tipo de la última orden eliminada, o -1. Puede haber situaciones en las que necesitemos vincular la lógica de la operación de EA al tipo de una orden recién eliminada. Por ejemplo, si acaba de eliminar BuyStop, debería hacerlo, pero si BuyLimit, debería hacer otra cosa, etc. La función GetTypeLastDeleted() acepta los siguientes parámetros opcionales:

  • sy - Nombre del instrumento. "" - cualquier carácter, NULL - carácter actual. El valor por defecto es "".
  • mn - identificador de la orden del usuario (MagicNumber). Valor por defecto -1 - cualquier Magia.
//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 13.10.2008                                                     |
//|  Описание : Возвращает тип последнего удалённого ордера или -1             |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    sy - наименование инструмента   (""   - любой символ,                   |
//|                                     NULL - текущий символ)                 |
//|    mn - MagicNumber                (-1   - любой магик)                    |
//+----------------------------------------------------------------------------+
int GetTypeLastDeleted(string sy="", int mn=-1) {
  datetime t;
  int      i, k=OrdersHistoryTotal(), r=-1;

  if ( sy=="0") sy=Symbol();
  for ( i=0; i< k; i++) {
    if (OrderSelect( i, SELECT_BY_POS, MODE_HISTORY)) {
      if ((OrderSymbol()== sy || sy=="") && ( mn<0 || OrderMagicNumber()== mn)) {
        if (OrderType()>1 && OrderType()<6 && t<OrderCloseTime()) {
          t=OrderCloseTime();
          r=OrderType();
        }
      }
    }
  }
  return( r);
}
 
beginner писал(а) >>

Sí, ahora éste.

#include "b-KimIV.mqh" // Biblioteca de funciones adicionales

¡Hola Oleg!

Para la compilación sin errores de la biblioteca b-Positions. mqh, necesita las funciones que ya están en esta rama:

  • GetNameOP() - Devuelve el nombre de la operación comercial.
  • GetNameTF() - Devuelve el nombre del marco temporal.
  • IIFc() - Devuelve uno de los dos valores dependiendo de la condición.
  • Message() - Salida del mensaje en el comentario y en el registro.

Entonces, puedes hacer lo siguiente:

  1. Crea un archivo vacío llamado b-kimiv.mqh en la misma carpeta donde tienes b-Positions.mqh
  2. Inserta las funciones anteriores en él y compila b-Positions.mqh.

>> Buena suerte.

 

La función iBarLargest().

Esta función devuelve el índice de la barra más grande o -1. El tamaño de la barra es medido por la función de una de las dos maneras, determinada por el parámetro de entrada ty - tipo de elementos de búsqueda. Ya sea sólo el tamaño del cuerpo o junto con las sombras. La función iBarLargest() acepta los siguientes parámetros opcionales:

  • sy - Nombre de la herramienta. "" o NULL - el símbolo actual. El valor por defecto es "".
  • tf - Marco temporal. El valor por defecto es 0 - el marco temporal actual.
  • ty - Tipo de elementos de búsqueda. Valores válidos - 0 - Alto-Bajo, 1 - abs(Abierto-Cerrado).
  • co - Número de elementos de la serie temporal. Valor por defecto - 0 - todos los elementos.
  • in - Índice de la barra inicial. Valor por defecto - 0 - barra actual.
//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 28.03.2008                                                     |
//|  Описание : Возвращает индекс наибольшего бара или -1.                     |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    sy - наименование инструмента   (NULL или "" - текущий символ)          |
//|    tf - таймфрейм                  (          0 - текущий таймфрейм)       |
//|    ty - тип элементов поиска       (          0 - H-L, 1 - O-C)            |
//|    co - число элементов таймсерии  (          0 - все элементы)            |
//|    in - индекс начального бара     (          0 - текущий бар)             |
//+----------------------------------------------------------------------------+
int iBarLargest(string sy="", int tf=0, int ty=0, int co=0, int in=0) {
  if ( sy=="" || sy=="0") sy=Symbol();
  if ( tf<=0) tf=Period();
  if ( in< 0) in=0;
  if ( co<=0) co=iBars( sy, tf)- in;

  double r, rb=0;       // размер бара
  int    i, nb=-1;      // счётчик и номер бара

  for ( i= co+ in; i>= in; i--) {
    if ( ty>0) r=MathAbs(iOpen( sy, tf, i)-iClose( sy, tf, i));
    else r=iHigh( sy, tf, i)-iLow( sy, tf, i);
    if ( rb< r) {
      rb= r;
      nb= i;
    }
  }

  return( nb);
}
ZS. Se adjunta un script para probar la función iBarLargest().
Archivos adjuntos:
 

La función iBarOfDayCalc().

Esta función devuelve el número de compás calculado desde el principio del día. Las barras se numeran a partir del uno, es decir, la barra con el menor tiempo de apertura en un día determinado será la número uno, la siguiente barra será la número dos, etc. Esta función es útil para optimizar los tiempos de entrada/salida. Si alguien está interesado en los detalles, que pregunte. Haré todo lo posible por responder a ellas. La función iBarOfDayCalc( ) toma los siguientes parámetros opcionales:

  • tf - Marco temporal. El valor por defecto es 0 - el marco temporal actual.
  • dt - Fecha y hora de apertura del bar. El valor por defecto es 0 - hora actual.
//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 26.02.2008                                                     |
//|  Описание : Возвращает расчётный номер бара от начала суток.               |
//|           : Нумерация баров начинается с 1 (единица).                      |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    tf - таймфрейм                       (0 - текущий таймфрейм)            |
//|    dt - дата и время открытия бара      (0 - текущее время)                |
//+----------------------------------------------------------------------------+
int iBarOfDayCalc(int tf=0, datetime dt=0) {
  if ( tf<=0) tf=Period();
  if ( dt<=0) dt=TimeCurrent();
  if ( tf>PERIOD_D1) {
    Print("iBarOfDayCalc(): Таймфрейм должен быть меньше или равен D1");
    return(0);
  }
  double ms=MathMod( dt/60, 1440);      // количество минут от начала суток
  int    bd=MathFloor( ms/ tf)+1;        // номер бара от начала суток

  return( bd);
}

SZY. Adjunto un script para probar la función iBarOfDayCalc(). La siguiente ilustración muestra cómo utilizar el script.

Archivos adjuntos:
 

Función iBarOfDayReal().

Esta función devuelve el número de compás actual desde el principio del día. Las barras se numeran con el uno, es decir, la barra con el menor tiempo de apertura en un día determinado tendrá el número uno, la siguiente barra tendrá el número dos, etc. Todavía no he encontrado ningún uso práctico para esta función. Pero lo he escrito para tenerlo :-) junto con la función iBarOfDayCalc(). La función iBarOfDayReal() acepta los siguientes parámetros opcionales:

  • sy - Nombre del instrumento de negociación. NULL o "" - símbolo actual. El valor por defecto es "".
  • tf - Marco temporal. Valor por defecto - 0 - marco temporal actual.
  • dt - Fecha y hora de apertura del bar. Valor por defecto - 0 - hora actual.
//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 26.02.2008                                                     |
//|  Описание : Возвращает реальный номер бара от начала суток.                |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    sy - наименование инструмента   (NULL или "" - текущий символ)          |
//|    tf - таймфрейм                  (          0 - текущий таймфрейм)       |
//|    dt - дата и время открытия бара (          0 - текущее время)           |
//+----------------------------------------------------------------------------+
int iBarOfDayReal(string sy="", int tf=0, datetime dt=0) {
  if ( sy=="" || sy=="0") sy=Symbol();
  if ( tf<=0) tf=Period();
  if ( dt<=0) dt=TimeCurrent();
  if ( tf>PERIOD_D1) {
    Print("iBarOfDayReal(): Таймфрейм должен быть меньше или равен D1");
    return(0);
  }

  int cd=TimeDay( dt);                       // текущий день месяца
  int nb=iBarShift( sy, tf, dt, False);      // номер текущего бара
  int bd=0;                                 // номер бара от начала суток

  while(TimeDay(iTime( sy, tf, nb))== cd) {
    nb++;
    bd++;
  }

  return( bd);
}

SZY. Adjunto un script para probar la función iBarOfDayReal(). La siguiente ilustración muestra cómo utilizar el script.

Archivos adjuntos:
 
KimIV писал(а) >>

La función iBarOfDayReal().

Todavía no he encontrado una aplicación práctica para esta función.

yyyy... :)

Estoy aquí como una herramienta de entrenamiento, decidió escribir un script que calcula la distancia recorrida.

Si alguien sabe que hay un programa que cuenta cuántos kilómetros corrió el ratón en el monitor.

Por lo tanto, aquí se suman las barras de apertura y cierre del día actual (semana, mes o año) o si se imagina

de otra manera, como un hilo y una aguja que cosen un abrigo de piel: Abrir-cerrar-cerrar-cerrar-cerrar... en el transcurso del gráfico.

Lo mismo pero en el alto-bajo...

*

El problema comenzó desde los primeros pasos.

¿Cómo puedo filtrar las barras del día actual del gráfico...

Intentaré aplicar sus funciones para estos escarceos.

 

Igor. Buenas tardes.

Tal vez pueda dibujar una tarea sencilla para usted: la tarea (para mí) es la siguiente:

La tarea es la siguiente: establecer a qué valor de precio la línea de señal cruzará el MACD, o, en otras palabras, el histograma del MACD se hará igual a cero.

La solución de este problema es necesaria, por ejemplo, para calcular un precio stop o límite de orden para la siguiente barra en las señales de un sistema de trading que utilice este indicador,

que mostrará visualmente el nivel de precios, en el que el histograma MACD cruzará la línea de cero (es decir, el cruce de una línea sobre el precio - línea en el gráfico)

Se refiere al porcentaje de MACD calculado mediante la fórmulaMACD= (FastEMA/SlowEMA - 1). Períodos 12, 26, Señal 9.

Tengo códigos para Omega y Metostock, no encuentro en ningún sitio cómo implementarlo en MT4.

Gracias