KimIVの便利な機能 - ページ 107

 
143alex:

同じでもエクセルと連動するような(買う気満々の))ものはないのでしょうか?

いや、使えない...。)))

 

GetPotentialLossInCurrency()関数は、預入通貨における未決済ポジションの潜在的な損失の合計を返します。ポジションの開始価格とStopLossの価格レベルに基づいて計算されます。StopLossがどのポジションにも設定されていない場合、この関数は取引口座の現在の資本を返します。

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() 関数をテストするスクリプトを添付しています。

 

イゴールさん、こんにちは。非常に便利な機能の数々に拍手です。

ちょっとお伺い したいのですが... 部分的にロッカーのよう なものを作りたいのです。でも今のところ、どうアレンジしたらいいのかわからないんです。このような考え方です。

200$ -175$ -150$ と -25$ の4つの注文があり、5つ以上の注文で合計 +400$ とします。

400が-200+-175を超え、-200+-175+-150以下であれば、5つのプラスとマイナスの注文を閉じる -200 -175、それは損失の大きいか小さいかの2つの注文である。

この例はかなり粗雑ですが、アイデアは得られたと思います。

まず問題なのは、それらを書き留めるものが必要だということです。(Arrayがよくわからない) 、他の方法を探してみてください。

2番目の問題は、1番目の問題から導かれる。例えば 4つの異なるオーダーからのロットで los[x]を得たとします。ロット( los[x] )を、価格に従ってtiketを検索するモジュールにロードすべき でしょうか?それとも、ロットをソートしながら1 (los[price] )と2 (los2[tiket])を追加 するのでしょうか?

もしかしたら、こんなことができるんだよと指南してくれたり、知らないことを教えてくれるかもしれません =)

 

おそらくすべてのトレーダーは遅かれ早かれ、保証金が失われる前に残りのpips数を計算し始めるでしょう。計算方法は簡単で、お金を取り、それを市場のロット数で割り、ポイント値で割れば、求めている答えが得られるのです。これはまさに私の新しい関数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()関数を確認するExpert Advisorを添付して います。

ファイル:
 

関数 SetFibo()。

この関数は、OBJ_FIBO オブジェクトのフィボナッチレベルを現在のチャートに設定します。

  • cl-フィボナッチレベルズオブジェクトの 色の配列.オブリガードパラメーター。2つの要素最初のものはオブジェクトの色を設定し、2番目はレベルの線の色を設定します。
  • st- オブジェクト スタイルの配列 フィボナッチレベル。必須パラメータです。2つの要素1番目はオブジェクトのスタイル、2番目はレベルの線のスタイルを設定します。
  • wd-オブジェクトの 幅の配列 フィボナッチレベル。必須パラメータです。2つの要素1番目はオブジェクトの幅を設定し、2番目はレベルの線の幅を設定します。
  • fl- フィボナッチレベルの配列。必須パラメータです。
  • nm- オブジェクトの名前です。デフォルト値である"" を渡すと、現在のバーの開始時刻が名前として使用される。
  • t1- オブジェクト設定時間の最初の座標.デフォルト値 -0- 10小節目のオープニング時間。
  • p1- 価格を設定するオブジェクトの最初の座標.初期値 -0- 10本目のバーの最小値。
  • t2- オブジェクト設定時間の第2座標.デフォルト値 -0- 現在のバーのオープン時間。
  • p2- オブジェクト設定価格の2番目の座標.デフォルト値 -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()関数を使用します。

ジグザグの最後の3つの極値を検索し、その値(各極値のバー番号と価格レベル)を返します。このデータはすべて2次元配列に格納され、関数のパラメータとして渡される。以下は、関数のパラメータ全体のリストです。

  • zz- ZigZag 値の2次元配列.1列目にバーナンバー、2列目にプライス値が追加されます。配列の次元は 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- Ticket to position.初期値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);
}