Características úteis da KimIV - página 107

 
143alex:

Você não tem (pronto e disposto a comprar)))) o mesmo, mas para trabalhar com excel?

não, não disponível... )))

 

A função GetPotentialLossInCurrency() retorna a perda potencial total de posições em aberto na moeda de depósito. O cálculo é realizado com base no preço de abertura da posição e no nível de preço StopLoss. Se o StopLoss não for definido para nenhuma posição, esta função retorna o patrimônio líquido atual da conta de negociação.

A função GetPotentialLossInCurrency() aceita os seguintes parâmetros:

  • sy - Nome do instrumento. Se definirmos este parâmetro, a função só verificará as posições do instrumento especificado. NULL significa instrumento atual, enquanto "" (padrão) significa qualquer instrumento.
  • op - Operação comercial, tipo de posição. Valores válidos: OP_BUY, OP_SELL ou -1. Valor por default -1 - significa qualquer posição.
  • mn - Identificador de posição (MagicNumber). O valor padrão -1 significa qualquer 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);
}

Em anexo está um roteiro para testar a função GetPotentialLossInCurrency().

Arquivos anexados:
 

Olá Igor. Kudos para você por seu conjunto de características muito úteis.

Posso pedir-lhe ajuda... Quero fazer uma espécie de cacifo parcial. Mas, até agora, não sei como organizar isso. A idéia é assim:

Há 4 pedidos, digamos -200$ -175$ -150$ e -25$ e há mais de 5 pedidos, totalizando +400$.

Se 400 > -200+-175 mas menos de -200+-175+-150 então feche 5 pedidos mais e menos -200 -175, ou seja 2 pedidos com uma perda de mais a menos.

este exemplo é bastante rude, mas acho que tenho a idéia...

O primeiro problema é que eu preciso de algo para escrevê-los. (Eu realmente não entendo o Array) ou encontrar outra forma.

O segundo problema decorre do primeiro. Suponha que eu tenha perdido[x] com lotes de 4 pedidos diferentes... devo carregar lotes ( los[x]) em um módulo que irá procurar pelo tiket de acordo com o preço ou eu adiciono 1 (los[preço]) e 2 (los2[tiket]) enquanto ordeno os lotes?

Talvez você possa me indicar um lugar onde você possa fazer isso ou me ensinar algo que eu não possa =)

 

Provavelmente cada comerciante, mais cedo ou mais tarde, começa a calcular o número de pips restantes antes que o depósito seja perdido. O cálculo é simples: pegamos o dinheiro, dividimo-lo pelo número de lotes no mercado, pelo valor do ponto e obtemos a resposta que estamos procurando. Isto é exatamente o que minha nova função ReserveDepositInPoint() faz, ela toma os seguintes parâmetros:

  • sy - Nome do instrumento. Se você definir este parâmetro, a função verificará apenas as posições do instrumento especificado. NULL significa o instrumento atual, enquanto "" (por padrão) significa qualquer instrumento.
  • op - Operação comercial, tipo de posição. Valores válidos: OP_BUY, OP_SELL ou -1. Valor por default -1 - significa qualquer posição.
  • mn - Identificador de posição (MagicNumber). O valor padrão de -1 significa qualquer MagicNumber.

A função ReserveDepositInPoint() trata corretamente as posições opostas, ou seja, calcula a diferença entre Vender e Comprar lotes e utiliza exatamente esta diferença nos cálculos. Os cálculos são baseados em equidade, ou seja, supõe-se que a parada é de 100%. Trocas, impostos e comissões não são considerados.

//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. 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);
}

Em anexo está um Expert Advisor para verificar a função ReserveDepositInPoint().

Arquivos anexados:
 

Função SetFibo().

Esta função define os níveis de Fibonacci do objeto OBJ_FIBO no gráfico atual.

  • cl - Matriz de cores do objeto de níveis Fibonacci. Parâmetro obrigatório. Dois elementos. A primeira define a cor do objeto, a segunda - a cor das linhas dos níveis.
  • st - Array de estilos de objetos Níveis de Fibonacci. Parâmetro necessário. Dois elementos. O primeiro define o estilo do objeto, o segundo - o estilo das linhas dos níveis.
  • wd - Conjunto de larguras deobjetos Níveis de Fibonacci. Parâmetro necessário. Dois elementos. A primeira define a largura do objeto, a segunda - as larguras das linhas dos níveis.
  • fl - Níveis de Fibonacci. Parâmetro necessário.
  • nm - Nome do objeto. Quando o valor padrão é passado - "", o tempo de abertura da barra atual é usado como o nome.
  • t1 - Primeira coordenada do tempo de ajuste do objeto. Valor padrão - 0 - tempo de abertura da décima barra.
  • p1 - Primeira coordenada do objeto que fixa o preço. Valor padrão - 0 - mínimo da décima barra.
  • t2 - Segunda coordenada do tempo de ajuste do objeto. Valor padrão - 0 - tempo de abertura da barra atual.
  • p2 - Segunda coordenada do objeto que fixa o preço. Valor padrão - 0 - barra de corrente baixa.
  • ry - Bandeira da propriedade AZUL. O valor padrão é 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));
    }
  }
}
Em anexo está um roteiro para testar a função SetFibo().
Arquivos anexados:
 

Função GetLastThreeExtremumZZ().

Realiza a busca dos três últimos extremos do ZigZag e retorna seus valores: número de barras e nível de preço para cada extremo. Todos estes dados estão contidos em uma matriz bidimensional que é passada como parâmetro para a função. Aqui está a lista completa dos parâmetros das funções:

  • zz - matriz bidimensional de valores ZigZag. Os números de barra são adicionados à primeira coluna e os valores de preço são adicionados à segunda coluna. A dimensão da matriz deve ser zz[3,2].
  • sy - Nome do instrumento. "" ou NULL - símbolo atual. O valor padrão é NULL.
  • tf - Cronograma. Valor padrão 0 - símbolo atual.
  • 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);
}

Em anexo está um roteiro para testar a função GetLastThreeExtremumZZ().

Arquivos anexados:
 

A função NumberOfOrdersByPrice().

Devolve o número de pedidos definidos a um determinado nível de preço. Você pode limitar a lista de pedidos a serem verificados com parâmetros de função:

  • sy - Nome do instrumento de mercado. Se este parâmetro for dado, a função somente verificará as ordens do instrumento especificado. NULL significa instrumento atual, e "" (por padrão) significa qualquer instrumento.
  • op - Tipo de comércio, tipo de ordem pendente. Valores válidos: OP_BUYLIMIT, OP_BUYSTOP, OP_SELLLIMIT, OP_SELLSTOP ou -1. O valor padrão de -1 indica qualquer tipo de pedido.
  • mn - Identificador do pedido (MagicNumber). O valor padrão de -1 significa qualquer MagicNumber.
  • pp - O nível de preço em que o pedido é estabelecido. O valor padrão de -1 é qualquer preço.
//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. 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);
}

 

A função NumberOfLastLossPosFromDate().

Esta função retorna a última série de posições perdidas (número em uma linha) fechadas desde uma determinada data. Uma seleção mais precisa das posições a serem levadas em conta é especificada usando parâmetros externos:

  • sy - Nome do instrumento de mercado. Se este parâmetro for definido, a função considerará apenas as posições deste instrumento. O valor padrão -" significa qualquer instrumento de mercado. NULL significa o instrumento atual.
  • op - Operação comercial, tipo de posição. Valores válidos: OP_BUY, OP_SELL ou -1. O valor padrão -1 significa qualquer posição.
  • mn - Identificador de posição, MagicNumber. O valor padrão -1 significa qualquer identificador.
  • dt - Data e hora em segundos desde 1970. Valor padrão - 0 significa que todas as posições disponíveis na história são levadas em conta.
//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. 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);
}

 

A função ClosePosExceptTicket().

Esta função fecha todas as posições ao preço de mercado, exceto aquela com o bilhete aprovado. Uma seleção mais precisa das posições a serem fechadas é especificada por parâmetros externos:

  • sy - Nome do instrumento. Se este parâmetro for definido, a função verifica as posições somente para o instrumento especificado. NULL significa o instrumento atual, enquanto "" (padrão) significa qualquer instrumento.
  • op - Operação comercial, tipo de posição. Valores válidos: OP_BUY, OP_SELL ou -1. O valor padrão -1 significa qualquer posição.
  • mn - Identificador de posição (MagicNumber). Valor por default -1 - qualquer MagicNumber.
  • ti - Bilhete para a posição. Valor padrão 0 - qualquer bilhete.
//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. 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();
          }
        }
      }
    }
  }
}

 

Função GetChangeBalance().

O saldo de devoluções não comercializadas (depósitos, saques, transferências internas, acumulação de juros, bônus) muda a partir de uma determinada data passada 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);
}
Razão: