Полезные функции от KimIV - страница 107

Igor Kim
2729
Igor Kim  
143alex:

Нет ли у Вас (готов и купить)))) того же самого но для работы с экселем?

не-е, нету... )))

Igor Kim
2729
Igor Kim  

Функция GetPotentialLossInCurrency() возвращает суммарный потенциальный убыток открытых позиций в валюте депозита. Расчёт выполняется на основе цены открытия позиции и ценового уровня StopLoss. Если StopLoss какой-либо позиции не установлен, то функция возвращает текущий размер баланса торгового счёта.

Функция GetPotentialLossInCurrency() принимает следующие параметры:

  • sy - Наименование инструмента. Если задать этот параметр, то функция проверит позиции только заданного инструмента. NULL означает текущий инструмент, а "" (по умолчанию) - любой инструмент.
  • op - Торговая операция, тип позиции. Допустимые значения: OP_BUY, OP_SELL или -1. Значение по умолчанию -1 - означает любую позицию.
  • mn - Идентификатор позиции (MagicNumber). Значение по умолчанию -1 - любой магик.

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

Во вложении скрипт для проверки работы функции GetPotentialLossInCurrency().

Anatoly Banev
124
Anatoly Banev  

Здравствуйте Игорь. Респект вам за набор очень полезных функций.

Можно ли у вас попросить немного помощи… Хочу сделать что-то вроде частичного локера. Но пока не знаю как это организовать. Задумка в примерно такая :

есть 4 – ордера допустим -200$ -175$ -150$ и -25$ и есть 5+ ордеров суммарно на +400$

если 400 > -200+-175 но меньше чем -200+-175+-150 то закрыть ордера 5 плюсовых и минусовые -200 -175, то есть 2 ордера с убытком от большего к меньшему.

пример грубоват конечно но думаю идею я донес…

первая проблема в том что для начала мне бы как-то их куда-то записать. (в Array я пока не очень понимаю) или найти какой-то другой вариант.

2ая проблема вытекает из первой. Допустим мы получили los[x] с лосями от 4х ордеров … загонять лоси( los[x])скажем в модуль который будет искать тикит по цене или делать что-то при сортировке лосей чтобы он писал в 1у (los[price]) 2ую (los2[tiket])?

Возможно вы мну тыкнете носом в том месте где можно ковырнуть или научите тому чего не умею =)

Igor Kim
2729
Igor Kim  

Наверно, каждый трейдер рано или поздно начинает вычислять то количество пунктов, которое осталось до слива депозита. Вычисления несложные: берём деньги, делим их на на количество лотов в рынке, на стоимость пункта и получаем интересующий нас ответ. Именно этим и занимается моя новая функция ReserveDepositInPoint(), которая принимает следующие параметры:

  • sy - Наименование инструмента. Если задать этот параметр, то функция проверит позиции только заданного инструмента. NULL означает текущий инструмент, а "" (по умолчанию) - любой инструмент.
  • op - Торговая операция, тип позиции. Допустимые значения: OP_BUY, OP_SELL или -1. Значение по умолчанию -1 - означает любую позицию.
  • mn - Идентификатор позиции (MagicNumber). Значение по умолчанию -1 - любой магик.

Функция ReserveDepositInPoint() корректно обращается со встречными позициями, а именно, вычисляет разницу лотов Buy и Sell и в расчётах использует именно эту разницу. Расчёт ведётся от эквити, то есть предполагается, что стопаут равен 100%. Не учитываются свопы, налоги и комиссии.

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

Во вложении советник для проверки работы функции ReserveDepositInPoint().

Файлы:
Igor Kim
2729
Igor Kim  

Функция SetFibo().

Эта функция выполняет установку объекта OBJ_FIBO Уровни Фибоначчи на текущем графике.

  • cl - Массив цветов объекта Уровни Фибоначчи. Обязательный параметр. Два элемента. Первый устанавливает цвет объекта, а второй - цвет линий уровней.
  • st - Массив стилей объекта Уровни Фибоначчи. Обязательный параметр. Два элемента. Первый устанавливает стиль объекта, а второй - стиль линий уровней.
  • wd - Массив ширин объекта Уровни Фибоначчи. Обязательный параметр. Два элемента. Первый устанавливает ширину объекта, а второй - ширины линий уровней.
  • fl - Массив уровней Фибоначчи. Обязательный параметр.
  • nm - Наименование объекта. При передаче умолчательного значения - "" в качестве имени используется время открытия текущего бара.
  • t1 - Первая координата времени установки объекта. Значение по умолчанию - 0 - время открытия десятого бара.
  • p1 - Первая координата цены установки объекта. Значение по умолчанию - 0 - минимум десятого бара.
  • t2 - Вторая координата времени установки объекта. Значение по умолчанию - 0 - время открытия текущего бара.
  • p2 - Вторая координата цены установки объекта. Значение по умолчанию - 0 - минимум текущего бара.
  • ry - Флаг свойства ЛУЧ. Значение по умолчанию False.
//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. 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));
    }
  }
}
Во вложении скрипт для тестирования функции SetFibo().
Файлы:
Igor Kim
2729
Igor Kim  

Функция GetLastThreeExtremumZZ().

Выполняет поиск трёх последних экстремумов ЗигЗага и возвращает их значения: номер бара и ценовой уровень для каждого экстремума. Все эти данные укладываются в двумерный массив, который передаётся в качестве параметра функции. Вот весь перечень параметров функции:

  • zz - Двумерный массив значений ЗигЗага. В первый столбец складываются номера баров, а во второй - ценовые значения. Размерность массива должна быть zz[3,2].
  • sy - Наименование инструмента. "" или NULL - текущий символ. Значение по умолчанию NULL.
  • tf - Таймфрейм. Значение по умолчанию 0 - текущий символ.
  • dp, dv, bs - Параметры 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);
}

Во вложении скрипт для тестирования функции GetLastThreeExtremumZZ().

Igor Kim
2729
Igor Kim  

Функция NumberOfOrdersByPrice().

Возвращает количество ордеров, установленных на заданном ценовом уровне. Ограничить перечень проверяемых ордеров можно параметрами функции:

  • sy - Наименование рыночного инструмента. Если задать этот параметр, то функция проверит ордера только заданного инструмента. NULL означает текущий инструмент, а "" (по умолчанию) - любой инструмент.
  • op - Тип торговой операции, тип отложенного ордера. Допустимые значения: OP_BUYLIMIT, OP_BUYSTOP, OP_SELLLIMIT, OP_SELLSTOP или -1. Значение по умолчанию -1 - означает любой тип ордера.
  • mn - Идентификатор ордера (MagicNumber). Значение по умолчанию -1 - любой магик.
  • pp - Ценовой уровень установки ордера. Значение по умолчанию -1 - любая цена.
//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. 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);
}

Igor Kim
2729
Igor Kim  

Функция NumberOfLastLossPosFromDate().

Эта функция возвращает последнюю серию убыточных позиций (количество подряд), закрытых с определённой даты. Более точный отбор учитываемых позиций задаётся внешними параметрами:

  • sy - Наименование рыночного инструмента. Если задать этот параметр, то функция учтёт позиции только заданного инструмента. Значение по умолчанию -"" означает любой рыночный инструмент. NULL означает текущий инструмент.
  • op - Торговая операция, тип позиции. Допустимые значения: OP_BUY, OP_SELL или -1. Значение по умолчанию -1 означает любую позицию.
  • mn - Идентификатор позиции, MagicNumber. Значение по умолчанию -1 означает любой идентификатор.
  • dt - Дата и время в секундах с 1970 года. Значение по умолчанию - 0 означает учёт всех доступных в истории позиций.
//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. 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);
}

Igor Kim
2729
Igor Kim  

Функция ClosePosExceptTicket().

Эта функция выполняет закрытие всех позиции по рыночной цене за исключением одной с переданным тикетом. Более точный отбор закрываемых позиций задаётся внешними параметрами:

  • sy - Наименование инструмента. Если задать этот параметр, то функция проверит позиции только заданного инструмента. NULL означает текущий инструмент, а "" (по умолчанию) - любой инструмент.
  • op - Торговая операция, тип позиции. Допустимые значения: OP_BUY, OP_SELL или -1. Значение по умолчанию -1 - означает любую позицию.
  • mn - Идентификатор позиции (MagicNumber). Значение по умолчанию -1 - любой магик.
  • ti - Тикет позиции. Значение по умолчанию 0 - любой тикет.
//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. 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();
          }
        }
      }
    }
  }
}

Igor Kim
2729
Igor Kim  

Функция GetChangeBalance().

Возвращает неторговое (пополнения, снятия, внутренние переводы, начисления процентов, бонусы) изменение баланса с определённой даты, передаваемой в качестве параметра.

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