KimIV的有用功能 - 页 107

 
143alex:

难道你没有(准备并愿意购买)))),但要与excel合作?

不,没有...)))

 

GetPotentialLossInCurrency() 函数返回存款货币的未平仓头寸的总潜在损失。该计算是根据头寸的开盘价和止损价位进行的。如果没有为任何头寸设置止损,该函数将返回交易账户的当前资产。

GetPotentialLossInCurrency() 函数接受以下参数。

  • sy - 文书的名称如果我们设置这个参数,函数将只检查指定仪器的位置。NULL 表示当前的仪器,而""(默认)表示任何仪器。
  • op -贸易操作,职位类型。有效值:OP_BUYOP_SELL -1。默认值-1- 意味着任何位置。
  • mn - 位置标识符(MagicNumber)默认值-1 表示任何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);
}

附上一个测试GetPotentialLossInCurrency() 函数的脚本。

附加的文件:
 

你好,伊戈尔。为你的这套非常有用的功能鼓掌叫好。

我可以向你寻求一些帮助吗...... ,我想做一些部分储物柜。但到目前为止,我还不知道如何安排它。这个想法是这样的。

有4个-订单,比方说-200美元-175美元-150美元和-25美元,有5个以上的订单,总计+400美元。

如果400>-200+-175,但小于-200+-175+-150,那么就关闭5个加减单 -200 -175,也就是2个亏多赚少的订单。

这个例子比较粗糙,但我想我已经明白了......

第一个问题是,我需要一些东西来写下它们。(我不太明白Array) ,或者找一些其他的方法。

第二个问题是由第一个问题引起的。假设我得到了 来自4个不同订单的手数的 los[x]......我是否应该将手数( los[x]加载 到一个模块中,该模块将根据价格搜索tiket,或者我在对手数进行排序时加入1(los[price])和2(los2[tiket])?

也许你可以给我指出一个地方,你可以这样做,或者教我我不知道的东西=)

 

可能每个交易员迟早都会开始计算存款损失前剩余的点数。计算方法很简单:我们把钱拿出来,除以市场上的手数,再除以点值,就可以得到我们要找的答案。这正是我的新函数ReserveDepositInPoint() 所做的,它接受以下参数。

  • sy - 文书的名称如果你设置了这个参数,函数将只检查指定仪器的位置。NULL 表示当前的仪器,而""(默认)表示任何仪器。
  • op - 贸易操作,职位类型有效值:OP_BUYOP_SELL -1。默认值-1- 意味着任何位置。
  • mn - 位置标识符(MagicNumber)默认值为-1 意味着任何MagicNumber。

ReserveDepositInPoint() 函数正确地处理了对立的头寸,即它计算了卖出买入手数 之间的差额,并在计算中正好使用这一差额。计算是基于权益的,即假定停损率为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()函数

附加的文件:
 

函数SetFibo()。

此函数在当前图表上设置OBJ_FIBO 对象的斐波那契水平。

  • cl-Fibonacci Levels 对象的颜色阵列。义务性参数。两个要素。第一个是设置对象的颜色,第二个是设置水平线的颜色。
  • st- 对象 样式数组 Fibonacci水平。必要的参数。两个要素。第一个是设置对象的风格,第二个是设置水平线的风格。
  • wd-对象 宽度的数组 Fibonacci 水平。必要的参数。两个要素。第一个设置对象的宽度,第二个设置水平线的宽度。
  • fl- 斐波那契水平的阵列。必要的参数。
  • nm- 对象的名称。当传递默认值--""时,就会 使用当前条形图的开盘时间作为名称。
  • t1- 对象设置时间的第一个坐标。默认值 -0- 第十条的开放时间。
  • p1- 设定价格的对象的第一个坐标。默认值 -0- 第十条的最小值。
  • t2- 对象设置时间的第二个坐标。默认值--0--当前酒吧的开放时间。
  • p2- 设定价格的对象的第二个坐标。默认值--0--当前条形图的低点。
  • ry- BLUE属性的标志。 默认值是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() 函数的脚本。
附加的文件:
 

GetLastThreeExtremumZZ()函数。

对ZigZag的最后三个极值进行搜索,并返回它们的值:每个极值的条数和价格水平。所有这些数据都包含在一个二维数组中,作为参数传递给函数。下面是函数参数的整个列表。

  • zz- ZigZag值的二维数组。酒吧号码被添加到第一栏,而价格值被添加到第二栏。数组的尺寸应该是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() 函数的脚本。

附加的文件:
 

NumberOfOrdersByPrice()函数。

返回在给定价格水平上设置的订单数量。你可以用函数参数限制要检查的订单列表。

  • sy- 市场工具的名称。如果给出这个参数,函数将只检查指定工具的订单。NULL 表示当前的仪器,而""(默认)表示任何仪器。
  • op- 交易的类型,挂单的类型。有效值:OP_BUYLIMITOP_BUYSTOPOP_SELLLIMITOP_SELLSTOP -1。默认值为-1 表示任何订单类型。
  • mn- 订单标识符(MagicNumber)。默认值为-1 意味着任何MagicNumber。
  • 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);
}

 

NumberOfLastLossPosFromDate()函数。

该函数返回自某一日期以来关闭的最后一系列亏损头寸(一排的数量)。使用外部参数指定要考虑的位置的更精确选择。

  • sy- 市场工具的名称。如果设置了这个参数,函数将只考虑这个仪器的位置。默认值-" 指任何市场工具。NULL 表示当前的仪器。
  • op- 贸易操作,职位类型。有效值:OP_BUYOP_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);
}

 

ClosePosExceptTicket()函数。

这个函数以市场价格关闭所有的头寸,除了有传票的头寸。要关闭的位置的更精确选择是由外部参数指定的。

  • sy- 仪器的名称。如果设置了这个参数,函数只检查指定仪器的位置。NULL 表示当前的仪器,而""(默认)表示任何仪器。
  • op- 贸易操作,职位类型。有效值:OP_BUYOP_SELL-1。默认值-1 意味着任何位置。
  • mn- 位置标识符(MagicNumber)。默认值-1 - 任何MagicNumber。
  • 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();
          }
        }
      }
    }
  }
}

 

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);
}