Funciones útiles de KimIV - página 25

 

La función TimeOpenLastPos().

Esta función devuelve la hora de la última posición abierta. La selección de las posiciones a tener en cuenta se define mediante parámetros externos:

  • sy - Nombre del instrumento de mercado. Si se establece este parámetro, la función sólo tendrá en cuenta las posiciones de este instrumento. El valor por defecto "" significa cualquier instrumento de mercado. Un valor de 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. El valor por defecto -1 significa cualquier identificador.
//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 19.02.2008                                                     |
//|  Описание : Возвращает время открытия последней открытой позиций.          |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    sy - наименование инструмента   (""   - любой символ,                   |
//|                                     NULL - текущий символ)                 |
//|    op - операция                   (-1   - любая позиция)                  |
//|    mn - MagicNumber                (-1   - любой магик)                    |
//+----------------------------------------------------------------------------+
datetime TimeOpenLastPos(string sy="", int op=-1, int mn=-1) {
  datetime t;
  int      i, k=OrdersTotal();

  if (sy=="0") sy=Symbol();
  for (i=0; i<k; i++) {
    if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {
      if (OrderSymbol()==sy || sy=="") {
        if (OrderType()==OP_BUY || OrderType()==OP_SELL) {
          if (op<0 || OrderType()==op) {
            if (mn<0 || OrderMagicNumber()==mn) {
              if (t<OrderOpenTime()) t=OrderOpenTime();
            }
          }
        }
      }
    }
  }
  return(t);
}
ZS. Se adjunta un script para probar la función TimeOpenLastPos().
Archivos adjuntos:
 
Prival:
¿Hay una función de clasificación de burbujas en la trastienda

No está disponible, pero me llevó 10 minutos hacer

//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 10.06.2008                                                     |
//|  Описание : Выполняет пузырьковую сортировку элементов массива.            |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    a - массив элементов                                                    |
//+----------------------------------------------------------------------------+
void BubbleSort(double& a[]) {
  double t;
  int    i, j, n=ArraySize(a);

  for (i=n-1; i>0; i--) {
    for (j=0; j<i; j++) {
      if (a[j]>a[j+1]) {
        t=a[j];
        a[j]=a[j+1];
        a[j+1]=t;
      }
    }
  }
}
ZS. Se adjunta un script para probar la función BubbleSort().
Archivos adjuntos:
 

La función BarsBetweenLastFractals().

Esta función devuelve el número de barras entre los dos últimos fractales o -1. El instrumento de mercado y el marco temporal del que se van a tomar los fractales se establecen mediante parámetros:

  • sy - Nombre del instrumento de mercado. El valor por defecto es "" o NULL para el instrumento de mercado actual.
  • tf - Marco temporal (número de minutos por barra). El valor por defecto 0 significa el marco temporal actual.
//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 10.06.2008                                                     |
//|  Описание : Возвращает количество баров между двумя последними фракталами. |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    sy - наименование инструмента        ("" или NULL - текущий символ)     |
//|    tf - таймфрейм                       (    0       - текущий ТФ)         |
//+----------------------------------------------------------------------------+
int BarsBetweenLastFractals(string sy="", int tf=0) {
  double fu=0, fd=0;
  int    i, nu=0, nd=0;

  if (sy=="" || sy=="0") sy=Symbol();
  for (i=2; i<100; i++) {
    fu=iFractals(sy, tf, MODE_UPPER, i);
    if (fu!=0) {
      if (nu==0) nu=i;
    }
    fd=iFractals(sy, tf, MODE_LOWER, i);
    if (fd!=0) {
      if (nd==0) nd=i;
    }
    if (nu>0 && nd>0) return(MathAbs(nu-nd));
  }
  Print("BarsBetweenLastFractals(): Фракталы не найдены");
  return(-1);
}
ZS. Se adjunta un script para probar la función BarsBetweenLastFractals().
Archivos adjuntos:
 

Función SecondsAfterCloseLastPos().

Esta función devuelve el número de segundos transcurridos desde que se cerró la última posición. La selección de las posiciones a tener en cuenta se especifica mediante los parámetros:

  • sy - Nombre del instrumento de mercado. Si se establece este parámetro, la función sólo tendrá en cuenta las posiciones del instrumento especificado. El valor por defecto - "" significa cualquier instrumento de mercado. El valor nulo 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. El valor por defecto de -1 significa cualquier identificador.
//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 19.02.2008                                                     |
//|  Описание : Возвращает количество секунд после закрытия последней позиций. |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    sy - наименование инструмента   (""   - любой символ,                   |
//|                                     NULL - текущий символ)                 |
//|    op - операция                   (-1   - любая позиция)                  |
//|    mn - MagicNumber                (-1   - любой магик)                    |
//+----------------------------------------------------------------------------+
datetime SecondsAfterCloseLastPos(string sy="", int op=-1, int mn=-1) {
  datetime t;
  int      i, k=OrdersHistoryTotal();

  if (sy=="0") sy=Symbol();
  for (i=0; i<k; i++) {
    if (OrderSelect(i, SELECT_BY_POS, MODE_HISTORY)) {
      if (OrderSymbol()==sy || sy=="") {
        if (OrderType()==OP_BUY || OrderType()==OP_SELL) {
          if (op<0 || OrderType()==op) {
            if (mn<0 || OrderMagicNumber()==mn) {
              if (t<OrderCloseTime()) t=OrderCloseTime();
            }
          }
        }
      }
    }
  }
  return(TimeCurrent()-t);
}
P.D. Se adjunta un script para probar la función SecondsAfterCloseLastPos().
Archivos adjuntos:
 

Hola

Algunos consejos.

Tengo un EA que pone órdenes a ambos lados a una hora determinada

Por favor, explique en sus dedos cómo hacer que la segunda orden se elimine automáticamente cuando la primera se dispara.

O bien, retocarlo

Gracias

 
aceventura:

Hola

Algunos consejos.

Tengo un EA que pone órdenes a ambos lados a una hora determinada

Por favor, explique en sus dedos cómo hacer que la segunda orden se elimine automáticamente cuando la primera se dispara.

O bien, retocarlo

Gracias

KimIV

Igor. ¿Tienes suficientes dedos?

 
aceventura:

Hola

Algunos consejos.

Tengo un EA que pone órdenes a ambos lados a una hora determinada

Por favor, explique en sus dedos cómo hacer que la segunda orden se elimine automáticamente cuando la primera se dispara.

O bien, retocarlo

Gracias

Primero toma la función número de órdenes en esta rama y si devuelve "== 1", "< 2" o "== número impar", entonces llama a la función de esta rama "cerrar órdenes".

 
Vinin:

KimIV

Igor. ¿Tienes suficientes dedos?

Probablemente no... Sólo tengo dos: el dedo índice y la empuñadura... hee

 
SergNF:

Primero toma la función de número de órdenes en esta rama, y luego si devuelve "== 1", "< 2" o "== número impar", entonces llama a la función "cerrar órdenes" desde esta rama.

La función de la cantidad de órdenes no funcionará, porque el EA está configurado de forma diferente para cada par. Y establece órdenes en diferentes pares al mismo tiempo. Entonces, si se hacen cuatro pedidos para dos pares y uno se dispara, se borran tres de ellos y se elimina el pedido contrario de cada uno.