Funciones útiles de KimIV - página 107

 
143alex:

¿No tienes (listo y dispuesto a comprar)))) lo mismo pero para trabajar con excel?

no, no está disponible... )))

 

La función GetPotentialLossInCurrency() devuelve la pérdida potencial total de las posiciones abiertas en la moneda del depósito. El cálculo se realiza a partir del precio de apertura de la posición y del nivel de precio StopLoss. Si el StopLoss no está establecido para ninguna posición, esta función devuelve el capital actual de la cuenta de trading.

La función GetPotentialLossInCurrency( ) acepta los siguientes parámetros:

  • 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. Valor por defecto -1 - significa cualquier posición.
  • mn - Identificador de posición (MagicNumber). El valor por defecto -1 significa cualquier MagicNumber.

//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 17.02.2012                                                     |
//|  Описание : Возвращает суммарный потенциальный убыток                      |
//|             открытых позиций в валюте депозита.                            |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    sy - наименование инструмента   (""   - любой символ,                   |
//|                                     NULL - текущий символ)                 |
//|    op - операция                   (-1   - любая позиция)                  |
//|    mn - MagicNumber                (-1   - любой магик)                    |
//+----------------------------------------------------------------------------+
double GetPotentialLossInCurrency(string sy="", int op=-1, int mn=-1) {
  double pl=0;
  double po, tv;                   // Пункт, спрэд и стоимость пункта
  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=="") && (mn<0 || OrderMagicNumber()==mn)) {
        if ((OrderType()==OP_BUY || OrderType()==OP_SELL) && (op<0 || OrderType()==op)) {
          if (OrderStopLoss()>0) {
            po=MarketInfo(OrderSymbol(), MODE_POINT);
            if (po==0) Message("В обзоре рынка отсутствует символ "+OrderSymbol()+". Точность расчётов не гарантируется!");
            else {
              tv=MarketInfo(OrderSymbol(), MODE_TICKVALUE);
              if (OrderType()==OP_BUY) {
                pl+=(OrderOpenPrice()-OrderStopLoss())/po*OrderLots()*tv;
              }
              if (OrderType()==OP_SELL) {
                pl+=(OrderStopLoss()-OrderOpenPrice())/po*OrderLots()*tv;
              }
              pl+=OrderCommission()+OrderSwap();
            }
          } else {
            pl=AccountBalance();
            break;
          }
        }
      }
    }
  }
  return(pl);
}

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

Archivos adjuntos:
 

Hola Igor. Enhorabuena por su conjunto de características tan útiles.

Puedo pedirte un poco de ayuda... Quiero hacer una especie de taquilla parcial. Pero hasta ahora no sé cómo arreglarlo. La idea es la siguiente:

Hay 4 - órdenes digamos -200$ -175$ -150$ y -25$ y hay 5+ órdenes que suman +400$.

Si 400 > -200+-175 pero menos de -200+-175+-150 entonces cierra 5 órdenes de más y menos -200 -175, es decir 2 órdenes con una pérdida de más a menos.

este ejemplo es demasiado tosco, por supuesto, pero creo que he captado la idea...

El primer problema es que necesito algo para anotarlas. (No entiendo muy bien Array) o encontrar otra manera.

El segundo problema se deriva del primero. Supongamos que tengo los[x] con lotes de 4 órdenes diferentes... ¿debo cargar los lotes ( los[x]) en un módulo que bus que eltiket según el precio o añado 1 (los[precio]) y 2 (los2[tiket]) mientras ordeno los lotes?

Tal vez puedas indicarme un lugar donde puedas hacerlo o enseñarme algo que yo no pueda =)

 

Probablemente todo trader, tarde o temprano, empieza a calcular el número de pips que le quedan antes de perder el depósito. El cálculo es sencillo: tomamos el dinero, lo dividimos por el número de lotes en el mercado, por el valor del punto y obtenemos la respuesta que buscamos. Esto es exactamente lo que hace mi nueva función ReserveDepositInPoint(), que toma los siguientes parámetros:

  • sy - Nombre del instrumento. Si establece este parámetro, la función comprobará las posiciones sólo 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. Valor por defecto -1 - significa cualquier posición.
  • mn - Identificador de posición (MagicNumber). El valor por defecto de -1 significa cualquier MagicNumber.

La función ReserveDepositInPoint( ) maneja correctamente las posiciones opuestas, es decir, calcula la diferencia entre los lotes de venta y de compra y utiliza exactamente esta diferencia en los cálculos. Los cálculos se basan en la equidad, es decir, se supone que el stopout es del 100%. No se tienen en cuenta los swaps, los impuestos ni las comisiones.

//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 29.02.2012                                                     |
//|  Описание : Возвращает запас депозита в пунктах.                           |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    sy - наименование инструмента   (""   - любой символ,                   |
//|                                     NULL - текущий символ)                 |
//|    op - операция                   (-1   - любая позиция)                  |
//|    mn - MagicNumber                (-1   - любой магик)                    |
//+----------------------------------------------------------------------------+
int ReserveDepositInPoint(string sy="", int op=-1, int mn=-1) {
  int    i, k=OrdersTotal();      // Номера позиций
  int    n, r;                    // Номер символа в массиве, запас депозита в пунктах
  double ol[], tv;                // Массив лотов, стоимость пункта
  string os[];                    // Массив символов

  if (sy=="0") sy=Symbol();
  ArrayResize(os, 0);
  ArrayResize(ol, 0);

  for (i=0; i<k; i++) {
    if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {
      if ((OrderSymbol()==sy || sy=="") && (mn<0 || OrderMagicNumber()==mn)) {
        n=ArraySearchString(os, OrderSymbol());
        if (n<0) {
          n=ArraySize(os);
          ArrayResize(os, n+1);
          ArrayResize(ol, n+1);
        }
        os[n]=OrderSymbol();
        if ((op<0 || OrderType()==op) && (OrderType()==OP_BUY || OrderType()==OP_SELL)) {
          if (OrderType()==OP_BUY ) ol[n]+=OrderLots();
          if (OrderType()==OP_SELL) ol[n]-=OrderLots();
        }
      }
    }
  }

  n=ArraySize(os);
  for (i=0; i<n; i++) {
    tv=MarketInfo(os[i], MODE_TICKVALUE);
    if (tv==0) Message("В обзоре рынка отсутствует символ "+os[i]+". Точность расчётов не гарантируется!");
    else {
      if (ol[i]!=0) {
        ol[i]=MathAbs(ol[i]);
        r+=AccountEquity()/tv/ol[i];
      }
    }
  }
  if (n>1) r/=n*n;

  return(r);
}

Se adjunta un Asesor Experto para comprobar la función ReserveDepositInPoint().

Archivos adjuntos:
 

Función SetFibo().

Esta función establece los niveles de Fibonacci del objeto OBJ_FIBO en el gráfico actual.

  • cl - Matriz de colores del objeto Niveles de Fibonacci. Parámetro obligatorio. Dos elementos. El primero establece el color del objeto, el segundo - el color de las líneas de los niveles.
  • st - Conjunto de estilos de objetos Niveles de Fibonacci. Parámetro obligatorio. Dos elementos. El primero establece el estilo del objeto, el segundo - el estilo de las líneas de los niveles.
  • wd - Matriz de anchos deobjeto Niveles de Fibonacci. Parámetro obligatorio. Dos elementos. El primero establece la anchura del objeto, el segundo - la anchura de las líneas de los niveles.
  • fl - Conjunto de niveles de Fibonacci. Parámetro obligatorio.
  • nm - Nombre del objeto. Cuando se pasa el valor por defecto - "", se utiliza como nombre la hora de apertura de la barra actual.
  • t1 - Primera coordenada del tiempo de ajuste del objeto. Valor por defecto - 0 - tiempo de apertura del décimo compás.
  • p1 - Primera coordenada del objeto que fija el precio. Valor por defecto - 0 - mínimo de la décima barra.
  • t2 - Segunda coordenada del tiempo de ajuste del objeto. Valor por defecto - 0 - tiempo de apertura de la barra actual.
  • p2 - Segunda coordenada del objeto que fija el precio. Valor por defecto - 0 - barra actual baja.
  • ry - Bandera de la propiedad BLUE. El valor por defecto es Falso.
//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 12.03.2012                                                     |
//|  Описание : Установка объекта OBJ_FIBO Уровни Фибоначчи.                   |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    cl - массив цветов линий                                                |
//|    st - массив стилей линий                                                |
//|    wd - массив ширин линий                                                 |
//|    fl - массив уровней Фибоначчи                                           |
//|    nm - наименование               (  ""  - время открытия текущего бара)  |
//|    t1 - время открытия бара        (  0   - Time[10]                       |
//|    p1 - ценовой уровень            (  0   - Low[10])                       |
//|    t2 - время открытия бара        (  0   - текущий бар)                   |
//|    p2 - ценовой уровень            (  0   - Bid)                           |
//|    ry - луч                        (False - не луч)                        |
//+----------------------------------------------------------------------------+
void SetFibo(color& cl[], int& st[], int& wd[], double& fl[], string nm="",
             datetime t1=0, double p1=0, datetime t2=0, double p2=0,
             bool ry=False) {
  if (nm=="") nm=DoubleToStr(Time[0], 0);
  if (t1<=0) t1=Time[10];
  if (p1<=0) p1=Low[10];
  if (t2<=0) t2=Time[0];
  if (p2<=0) p2=Bid;

  int i, k=ArraySize(fl);

  if (ObjectFind(nm)<0) ObjectCreate(nm, OBJ_FIBO, 0, 0,0, 0,0);
  ObjectSet(nm, OBJPROP_TIME1     , t1);
  ObjectSet(nm, OBJPROP_PRICE1    , p1);
  ObjectSet(nm, OBJPROP_TIME2     , t2);
  ObjectSet(nm, OBJPROP_PRICE2    , p2);
  ObjectSet(nm, OBJPROP_COLOR     , cl[0]);
  ObjectSet(nm, OBJPROP_RAY       , ry);
  ObjectSet(nm, OBJPROP_STYLE     , st[0]);
  ObjectSet(nm, OBJPROP_WIDTH     , wd[0]);
  ObjectSet(nm, OBJPROP_LEVELCOLOR, cl[1]);
  ObjectSet(nm, OBJPROP_LEVELSTYLE, st[1]);
  ObjectSet(nm, OBJPROP_LEVELWIDTH, wd[1]);
  if (k>0) {
    ObjectSet(nm, OBJPROP_FIBOLEVELS, k);
    for (i=0; i<k; i++) {
      ObjectSet(nm, OBJPROP_FIRSTLEVEL+i, fl[i]);
      ObjectSetFiboDescription(nm, i, DoubleToStr(100*fl[i], 1));
    }
  }
}
Adjunto un script para probar la función SetFibo().
Archivos adjuntos:
 

Función GetLastThreeExtremumZZ().

Realiza la búsqueda de los tres últimos extremos del ZigZag y devuelve sus valores: número de barra y nivel de precio de cada extremo. Todos estos datos están contenidos en una matriz bidimensional que se pasa como parámetro a la función. Aquí está la lista completa de los parámetros de la función:

  • zz - matriz bidimensional de valores ZigZag. Los números de las barras se añaden a la primera columna y los valores de los precios se añaden a la segunda columna. La dimensión del array debe ser zz[3,2].
  • 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.
  • dp, dv, bs - Parámetros ZigZaga: ExtDepth, ExtDeviation, ExtBackstep.
//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 12.03.2012                                                     |
//|  Описание : Возвращает последние три экстремума ЗигЗага.                   |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    zz - двумерный массив значений ЗигЗага                                  |
//|    sy - наименование инструмента   (NULL или "" - текущий символ)          |
//|    tf - таймфрейм                  (      0     - текущий ТФ)              |
//|    dp - ExtDepth                                                           |
//|    dv - ExtDeviation                                                       |
//|    bs - ExtBackstep                                                        |
//+----------------------------------------------------------------------------+
bool GetLastThreeExtremumZZ(double& zz[][], string sy="", int tf=0, int dp=12, int dv=5, int bs=3) {
  if (sy=="" || sy=="0") sy=Symbol();
  double z;
  int i, k=iBars(sy, tf), ke=0;
  ArrayInitialize(zz, 0);

  for (i=0; i<k; i++) {
    z=iCustom(sy, tf, "ZigZag", dp, dv, bs, 0, i);
    if (z!=0) {
      zz[ke][0]=i;
      zz[ke][1]=NormalizePrice(z, sy);
      ke++;
      if (ke>3) return(True);
    }
  }
  Print("GetLastThreeExtremumZZ(): Недостаточно баров!");
  return(False);
}

Adjunto un script para probar la función GetLastThreeExtremumZZ().

Archivos adjuntos:
 

La función NumberOfOrdersByPrice().

Devuelve el número de órdenes establecidas a un nivel de precio determinado. Puede limitar la lista de órdenes a comprobar con los parámetros de la función:

  • sy - Nombre del instrumento de mercado. Si se da este parámetro, la función sólo comprobará las órdenes del instrumento especificado. NULL significa instrumento actual, y "" (por defecto) significa cualquier instrumento.
  • op - Tipo de operación, tipo de orden pendiente. Valores válidos: OP_BUYLIMIT, OP_BUYSTOP, OP_SELLLIMIT, OP_SELLSTOP o -1. El valor por defecto de -1 indica cualquier tipo de orden.
  • mn - Identificador del pedido (MagicNumber). El valor por defecto de -1 significa cualquier MagicNumber.
  • pp - El nivel de precio al que se establece la orden. El valor por defecto de -1 es cualquier precio.
//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 13.03.2012                                                     |
//|  Описание : Возвращает количество ордеров, установленных по заданной цене. |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    sy - наименование инструмента   (""   - любой символ,                   |
//|                                     NULL - текущий символ)                 |
//|    op - операция                   (-1   - любая позиция)                  |
//|    mn - MagicNumber                (-1   - любой магик)                    |
//|    pp - цена                       (-1   - любая цена)                     |
//+----------------------------------------------------------------------------+
int NumberOfOrdersByPrice(string sy="", int op=-1, int mn=-1, double pp=-1) {
  int d, i, k=OrdersTotal(), ko=0;

  if (sy=="0") sy=Symbol();
  for (i=0; i<k; i++) {
    if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {
      if ((OrderSymbol()==sy || sy=="") && (op<0 || OrderType()==op)) {
        if (OrderType()>1 && OrderType()<6) {
          d=MarketInfo(OrderSymbol(), MODE_DIGITS);
          pp=NormalizeDouble(pp, d);
          if (pp<0 || pp==NormalizeDouble(OrderOpenPrice(), d)) {
            if (mn<0 || OrderMagicNumber()==mn) ko++;
          }
        }
      }
    }
  }
  return(ko);
}

 

La función NumberOfLossPosFromDate().

Esta función devuelve la última serie de posiciones perdedoras (número en una fila) cerradas desde una fecha determinada. Una selección más precisa de las posiciones a tener en cuenta se especifica 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. 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.
  • dt - Fecha y hora en segundos desde 1970. Valor por defecto - 0 significa que se tienen en cuenta todas las posiciones disponibles en el historial.
//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 14.03.2012                                                     |
//|  Описание : Возвращает последнюю серию убыточных позиций                   |
//|             (количество подряд), закрытых с определённой даты.             |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    sy - наименование инструмента             (""   - любой символ,         |
//|                                               NULL - текущий символ)       |
//|    op - операция                             (-1   - любая позиция)        |
//|    mn - MagicNumber                          (-1   - любой магик)          |
//|    dt - Дата и время в секундах с 1970 года  ( 0   - с начала истории)     |
//+----------------------------------------------------------------------------+
int NumberOfLastLossPosFromDate(string sy="", int op=-1, int mn=-1, datetime dt=0) {
  int i, k=OrdersHistoryTotal(), kp=0;

  if (sy=="0") sy=Symbol();
  for (i=0; i<k; i++) {
    if (OrderSelect(i, SELECT_BY_POS, MODE_HISTORY)) {
      if ((OrderSymbol()==sy || sy=="") && (op<0 || OrderType()==op)) {
        if (OrderType()==OP_BUY || OrderType()==OP_SELL) {
          if (mn<0 || OrderMagicNumber()==mn) {
            if (dt<OrderCloseTime()) {
              if (OrderProfit()<0) kp++; else kp=0;
            }
          }
        }
      }
    }
  }
  return(kp);
}

 

La función ClosePosExceptTicket().

Esta función cierra todas las posiciones al precio de mercado, excepto la que tiene el ticket pasado. Una selección más precisa de las posiciones a cerrar se especifica mediante parámetros externos:

  • sy - Nombre del instrumento. Si se establece este parámetro, la función comprueba las posiciones sólo para el 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). Valor por defecto -1 - cualquier MagicNumber.
  • ti - Billete a la posición. Valor por defecto 0 - cualquier billete.
//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 20.03.2009                                                     |
//|  Описание : Закрытие позиций по рыночной цене за исключением одной,        |
//|           :  с переданным тикетом.                                         |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    sy - наименование инструмента   (""   - любой символ,                   |
//|                                     NULL - текущий символ)                 |
//|    op - операция                   (-1   - любая позиция)                  |
//|    mn - MagicNumber                (-1   - любой магик)                    |
//|    ti - тикет позиции              ( 0   - любой тикет)                    |
//+----------------------------------------------------------------------------+
void ClosePosExceptTicket(string sy="", int op=-1, int mn=-1, int ti=0) {
  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 (OrderType()==OP_BUY || OrderType()==OP_SELL) {
          if (mn<0 || OrderMagicNumber()==mn) {
            if (ti==0 || ti!=OrderTicket()) ClosePosBySelect();
          }
        }
      }
    }
  }
}

 

Función GetChangeBalance().

Devuelve los cambios de saldo no comercial (depósitos, retiros, transferencias internas, intereses acumulados, bonificaciones) a partir de una fecha determinada pasada como parámetro.

//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 30.04.2010                                                     |
//|  Описание : Возвращает неторговое изменение баланса с определённой даты    |
//|             (пополнения, снятия, внутренние переводы).                     |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    dt - Дата и время в секундах с 1970 года  (0 - с начала истории)        |
//+----------------------------------------------------------------------------+
double GetChangeBalance(datetime dt=0)
{
  double p=0;
  int    i, k=OrdersHistoryTotal();

  for (i=0; i<k; i++) {
    if (OrderType()==6) {
      if (dt<OrderCloseTime()) p+=OrderProfit();
    }
  }
  return(p);
}