「KimIVの便利な機能」のみ。 - ページ 8

 

TakeProfitLastClosePos()関数を使用します。

TakeProfit(利食い): 最後に決済したポジションの利食い 価格、または-1を 返します。TakeProfitLastClosePos() 関数には、次のオプション・パラメータがあります。

  • sy- 楽器の名前です。""- 任意のシンボル、NULL- 現在のシンボル。初期値は"" である。
  • op- 貿易業務。有効な値:-1OP_BUYOP_SELL。デフォルト値は、-1- 任意の取引です。
  • mn- 取引識別子、MagicNumber。デフォルト値-1- 任意のマジック。
//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 20.10.2008                                                     |
//|  Описание : Возвращает цену TakeProfit последней закрытой позиций или -1.  |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    sy - наименование инструмента   (""   - любой символ,                   |
//|                                     NULL - текущий символ)                 |
//|    op - операция                   (-1   - любая позиция)                  |
//|    mn - MagicNumber                (-1   - любой магик)                    |
//+----------------------------------------------------------------------------+
double TakeProfitLastClosePos(string sy="", int op=-1, int mn=-1) {
  datetime t;
  double   r=-1;
  int      i, k=OrdersHistoryTotal();

  if (sy=="0") sy=Symbol();
  for (i=0; i<k; i++) {
    if (OrderSelect(i, SELECT_BY_POS, MODE_HISTORY)) {
      if (OrderSymbol()==sy || sy=="") {
        if (OrderType()==OP_BUY || OrderType()==OP_SELL) {
          if (op<0 || OrderType()==op) {
            if (mn<0 || OrderMagicNumber()==mn) {
              if (t<OrderCloseTime()) {
                t=OrderCloseTime();
                r=OrderTakeProfit();
              }
            }
          }
        }
      }
    }
  }
  return(r);
}

関数 MovingInWL()。

オープンポジションのStopLoss 価格水準をBreakevenに移動させます。MovingInWL() 関数は、以下のオプションパラメータを受け付ける。

  • sy- 楽器の名前です。""- 任意のシンボル、NULL- 現在のシンボル。初期値は"" である。
  • op- 貿易業務。有効な値:-1OP_BUYOP_SELL。デフォルト値は、-1- 任意の取引です。
  • mn- 取引識別子、MagicNumber。デフォルト値-1- 任意のマジックを使用します。

また、MovingInWL() 関数は、グローバル変数(スクリプトやExpert Advisorの外部パラメータ)を持っています。

  • int LevelProfit - 損益分岐点に移動するために、ポジションが到達しなければならないポイントでの利益のレベル。
  • int LevelWLoss - 損益分岐点レベル、ポイント単位で、利益がLevelProfitレベルに達した後にストップが転送される。
//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 11.09.2008                                                     |
//|  Описание : Перенос уровня стопа в безубыток                               |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    sy - наименование инструмента   ( ""  - любой символ,                   |
//|                                     NULL - текущий символ)                 |
//|    op - операция                   ( -1  - любая позиция)                  |
//|    mn - MagicNumber                ( -1  - любой магик)                    |
//+----------------------------------------------------------------------------+
void MovingInWL(string sy="", int op=-1, int mn=-1) {
  double po, pp;
  int    i, k=OrdersTotal();

  for (i=0; i<k; i++) {
    if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {
      po=MarketInfo(OrderSymbol(), MODE_POINT);
      if (OrderType()==OP_BUY) {
        if (OrderStopLoss()-OrderOpenPrice()<LevelWLoss*po) {
          pp=MarketInfo(OrderSymbol(), MODE_BID);
          if (pp-OrderOpenPrice()>LevelProfit*po) {
            ModifyOrder(-1, OrderOpenPrice()+LevelWLoss*po, -1);
          }
        }
      }
      if (OrderType()==OP_SELL) {
        if (OrderStopLoss()==0 || OrderOpenPrice()-OrderStopLoss()<LevelWLoss*po) {
          pp=MarketInfo(OrderSymbol(), MODE_ASK);
          if (OrderOpenPrice()-pp>LevelProfit*po) {
            ModifyOrder(-1, OrderOpenPrice()-LevelWLoss*po, -1);
          }
        }
      }
    }
  }
}
 

SimpleTrailing()関数。

TrailingStop アルゴリズムを使って、オープンポジションのStopLoss 価格レベルを移動させます。関数SimpleTrailing() は、以下のオプションパラメータを受け付けます。

  • sy- 楽器の名前です。""- 任意のシンボル、NULL- 現在のシンボル。初期値は"" である。
  • op- 貿易業務。有効な値:-1OP_BUYOP_SELL。デフォルト値は、-1- 任意の取引です。
  • mn- 取引識別子、MagicNumber。デフォルト値-1- 任意のマジックを使用します。

さらに、SimpleTrailing() 関数はグローバル変数(スクリプトまたはExpert Advisorの外部パラメータ)を含意します。

  • bool TSProfitOnly - トロールを開始するゾーンを切り替えます。Trueの 場合、ポジションの利益がTStop.Buy/Sell+TrailingStep ポイントの値に達したときにのみ、トロールが動作し始めます。Falseの 場合、Expert Advisorは、現在の価格に対するストップポジションが常にTStop.Buy/Sell+TrailingStep pipsより遠くにならないようにするだけです。つまり、True の 場合、Expert Advisor はポジションの利益領域でのみ動作し、False の 場合、ポジションのマイナス領域で動作することになります。
  • int TStop.Buy - 買いたいトロールの大きさ(ポイント)。
  • intTStop.Sell- 売りのためのポイントでのトロールのサイズ。
  • int TrailingStep - ポイント単位の末尾ステップ.頻繁な要求で販売店の邪魔にならないようにするために必要なのです。
//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 11.09.2008                                                     |
//|  Описание : Сопровождение позиций простым тралом                           |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    sy - наименование инструмента   ( ""  - любой символ,                   |
//|                                     NULL - текущий символ)                 |
//|    op - операция                   ( -1  - любая позиция)                  |
//|    mn - MagicNumber                ( -1  - любой магик)                    |
//+----------------------------------------------------------------------------+
void SimpleTrailing(string sy="", int op=-1, int mn=-1) {
  double po, pp;
  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=="") && (op<0 || OrderType()==op)) {
        po=MarketInfo(OrderSymbol(), MODE_POINT);
        if (mn<0 || OrderMagicNumber()==mn) {
          if (OrderType()==OP_BUY) {
            pp=MarketInfo(OrderSymbol(), MODE_BID);
            if (!TSProfitOnly || pp-OrderOpenPrice()>TStop.Buy*po) {
              if (OrderStopLoss()<pp-(TStop.Buy+TrailingStep-1)*po) {
                ModifyOrder(-1, pp-TStop.Buy*po, -1);
              }
            }
          }
          if (OrderType()==OP_SELL) {
            pp=MarketInfo(OrderSymbol(), MODE_ASK);
            if (!TSProfitOnly || OrderOpenPrice()-pp>TStop.Sell*po) {
              if (OrderStopLoss()>pp+(TStop.Sell+TrailingStep-1)*po || OrderStopLoss()==0) {
                ModifyOrder(-1, pp+TStop.Sell*po, -1);
              }
            }
          }
        }
      }
    }
  }
}

ArrayZ()関数。

この関数は,配列で参照渡しされた数値系列の Z カウントを計算し,返す。

//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 27.10.2008                                                     |
//|  Описание : Возвращает Z-счёт числового ряда.                              |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    arr - массив значений числового ряда                                    |
//+----------------------------------------------------------------------------+
double ArrayZ(double& arr[]) {
  double x, z;
  int    i, l=0, n=ArraySize(arr), r=1, w=0;

  for (i=0; i<n; i++) {
    if (i==0) r=1;
    else {
      if (arr[i-1]*arr[i]<0) r++;
    }
    if (arr[i]>0) w++; else l++;
  }

  if (n>2) {
    if (w>0 && l>0) {
      x=2*w*l;
      if (x!=n) z=(n*(r-0.5)-x)/MathSqrt(x*(x-n)/(n-1));
    } else {
      if (l==0) z=100; else z=-100;
      Print("ArrayZ(): Нет чередования серий!");
    }
    return(z);
  } else {
    Print("ArrayZ(): В массиве недостаточно элементов!");
    return(0);
  }
}
 

ArrayDeleteInt()関数

指定されたインデックスの配列要素の 削除を実行する。新しい配列のサイズを返し、何も削除されなかった場合は-1 を 返す。ArrayDeleteInt()関数は、以下の必須パラメータを受け付ける。

  • m- 要素の配列.
  • i- 配列の要素のインデックス.
//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 31.10.2008                                                     |
//|  Описание : Выполняет удаление элемента массива с заданным индексом.       |
//|             Возвращает размер нового массива или -1,                       |
//|             если не удалось ничего удалить.                                |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    m - массив элементов                                                    |
//|    i - индекс элемента                                                     |
//+----------------------------------------------------------------------------+
int ArrayDeleteInt(int& m[], int i) {
  int j, k=ArraySize(m);

  if (i>=0 && i<k) {
    for (j=i; j<k; j++) m[j]=m[j+1];
    k=ArrayResize(m, k-1);
    return(k);
  } else Print("ArrayDeleteInt(): Неверный индекс элемента массива! i=", i);

  return(-1);
}

ArrayDeleteDouble()関数

配列の指定されたインデックスの要素を削除する。新しい配列のサイズを返し、何も削除できなかった場合は-1 を 返す。ArrayDeleteDouble()関数は、以下の必須パラメータを受け付ける。

  • m-double 型の要素からなる配列.
  • i- 配列の要素のインデックス.
//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 31.10.2008                                                     |
//|  Описание : Выполняет удаление элемента массива с заданным индексом.       |
//|             Возвращает размер нового массива или -1,                       |
//|             если не удалось ничего удалить.                                |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    m - массив элементов                                                    |
//|    i - индекс элемента                                                     |
//+----------------------------------------------------------------------------+
int ArrayDeleteDouble(double& m[], int i) {
  int j, k=ArraySize(m);

  if (i>=0 && i<k) {
    for (j=i; j<k; j++) m[j]=m[j+1];
    k=ArrayResize(m, k-1);
    return(k);
  } else Print("ArrayDeleteDouble(): Неверный индекс элемента массива! i=", i);

  return(-1);
}
 

ArrayDeleteString()関数

指定されたインデックスの配列要素の 削除を実行する。新しい配列のサイズを返すか、何も削除できなかった場合は-1 を 返す。ArrayDeleteString()関数は、以下の必須パラメータを受け付ける。

  • m-文字列 型の要素からなる配列.
  • i- 配列の各項目のインデックス.
//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 31.10.2008                                                     |
//|  Описание : Выполняет удаление элемента массива с заданным индексом.       |
//|             Возвращает размер нового массива или -1,                       |
//|             если не удалось ничего удалить.                                |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    m - массив элементов                                                    |
//|    i - индекс элемента                                                     |
//+----------------------------------------------------------------------------+
int ArrayDeleteString(string& m[], int i) {
  int j, k=ArraySize(m);

  if (i>=0 && i<k) {
    for (j=i; j<k; j++) m[j]=m[j+1];
    k=ArrayResize(m, k-1);
    return(k);
  } else Print("ArrayDeleteString(): Неверный индекс элемента массива! i=", i);

  return(-1);
}

ArrayInsertDouble()関数

指定されたインデックスの配列の要素を挿入する。新しい配列の要素数(サイズ)を返す。挿入は次のように行います。まず、配列のサイズを1つ増やします。そして,挿入する要素以上のインデックスを持つすべての要素を1つずつ配列の末尾に移動させ,挿入する要素のためのスペースを確保します.最後に、必要なセルに値が書き込まれる。ArrayInsertDouble() 関数は、以下のパラメータを持ちます。

  • m-double 型の要素からなる配列.
  • e - 挿入される配列要素の値.
  • i- 挿入される配列要素のインデックス.インデックス値が 0 より小さいか、配列のサイズ以上の場合、その要素は配列の末尾に追加される。初期値は-1 である。
//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 31.10.2008                                                     |
//|  Описание : Выполняет вставку элемента массива с заданным индексом.        |
//|             Возвращает размер нового массива.                              |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    m - массив элементов типа double                                        |
//|    e - значение элемента                                                   |
//|    i - индекс элемента                  (-1 - добавить в конец массива)    |
//+----------------------------------------------------------------------------+
int ArrayInsertDouble(double& m[], double e, int i=-1) {
  int j, k=ArraySize(m);

  ArrayResize(m, k+1);
  if (i>=0 && i<k) {
    for (j=k; j>i; j--) m[j]=m[j-1];
    m[i]=e;
  } else m[k]=e;

  return(k+1);
}
 

BubbleSort2()関数です。

この関数は,2次元配列の要素を任意の列に分割してバブル化する。また、ソート方向も指定できます。BubbleSort2() 関数は、以下のパラメータを受け取ります。

  • a- 要素の2次元配列.オブリガードパラメーター。
  • r- 並べ替えの列(カラム)の番号(インデックス).デフォルト値は0- 最初の列(インデックスが 0 の列)です。
  • m- 並べ替えの方向。有効な値:MODE_ASCEND- 昇順、MODE_DESCEND- 降順。初期値はMODE_ASCEND である。
//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 04.11.2008                                                     |
//|  Описание : Выполняет пузырьковую сортировку элементов двумерного массива. |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    a - массив элементов                                                    |
//|    r - колонка сортировки          (     0       - первая (с индексом 0))  |
//|    m - направление сортировки      (MODE_ASCEND  - по возрастанию,         |
//|                                     MODE_DESCEND - по убыванию)            |
//+----------------------------------------------------------------------------+
void BubbleSort2(double& a[][], int r=0, int m=MODE_ASCEND) {
  double t;
  int    e, i, j;
  int    k=ArrayRange(a, 1);      // Количество колонок
  int    n=ArrayRange(a, 0);      // Количество строк

  if (r<0) r=0;
  if (r>k) r=k;

  for (i=n-1; i>0; i--) {
    for (j=0; j<i; j++) {
      if (m==MODE_ASCEND) {
        // по возрастанию
        if (a[j][r]>a[j+1][r]) {
          for (e=0; e<k; e++) {
            t=a[j][e];
            a[j][e]=a[j+1][e];
            a[j+1][e]=t;
          }
        }
      } else {
        // по убыванию
        if (a[j][r]<a[j+1][r]) {
          for (e=0; e<k; e++) {
            t=a[j][e];
            a[j][e]=a[j+1][e];
            a[j+1][e]=t;
          }
        }
      }
    }
  }
}

GetTypeLastDeleted()関数。

この関数は最後に削除された注文の型、または- 1を返します。EA操作ロジックを直前に削除された注文の型に関連付ける必要がある場合があります。例えば、BuyStopを 削除したばかりならそうすべきですが、BuyLimit なら別のことをすべき、などです。GetTypeLastDeleted()関数には、以下のオプションパラメータを指定することができる。

  • sy- 楽器の名称。""- 任意の文字、NULL- 現在の文字。初期値は"" である。
  • mn- ユーザーオーダーの識別子(MagicNumber)です。デフォルト値-1- 任意のマジック。
//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 13.10.2008                                                     |
//|  Описание : Возвращает тип последнего удалённого ордера или -1             |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    sy - наименование инструмента   (""   - любой символ,                   |
//|                                     NULL - текущий символ)                 |
//|    mn - MagicNumber                (-1   - любой магик)                    |
//+----------------------------------------------------------------------------+
int GetTypeLastDeleted(string sy="", int mn=-1) {
  datetime t;
  int      i, k=OrdersHistoryTotal(), r=-1;

  if (sy=="0") sy=Symbol();
  for (i=0; i<k; i++) {
    if (OrderSelect(i, SELECT_BY_POS, MODE_HISTORY)) {
      if ((OrderSymbol()==sy || sy=="") && (mn<0 || OrderMagicNumber()==mn)) {
        if (OrderType()>1 && OrderType()<6 && t<OrderCloseTime()) {
          t=OrderCloseTime();
          r=OrderType();
        }
      }
    }
  }
  return(r);
}
 

iBarLargest()関数を使用します。

この関数は、最大のバーのインデックスまたは -1 を返す。バーの大きさは、入力パラメータty- 検索項目の種類によって決まる2つの方法のうちの1つによって、この関数によって測定される。本体サイズだけでも、シャドウと合わせても。iBarLargest() 関数には、以下のオプションパラメータを指定できます。

  • sy- ツールの名前です。"" またはNULL- 現在のシンボルです。初期値は"" である。
  • tf- タイムフレーム.デフォルト値は、0- 現在のタイムフレームです。
  • ty- 検索項目の種類。有効値 -0- High-Low、1- abs(Open-Close)。
  • co- 時系列項目の数。デフォルト値 -0- すべての要素。
  • in- 最初のバーのインデックス.デフォルト値 -0- 現在のバー。
//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 28.03.2008                                                     |
//|  Описание : Возвращает индекс наибольшего бара или -1.                     |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    sy - наименование инструмента   (NULL или "" - текущий символ)          |
//|    tf - таймфрейм                  (          0 - текущий таймфрейм)       |
//|    ty - тип элементов поиска       (          0 - H-L, 1 - O-C)            |
//|    co - число элементов таймсерии  (          0 - все элементы)            |
//|    in - индекс начального бара     (          0 - текущий бар)             |
//+----------------------------------------------------------------------------+
int iBarLargest(string sy="", int tf=0, int ty=0, int co=0, int in=0) {
  if (sy=="" || sy=="0") sy=Symbol();
  if (tf<=0) tf=Period();
  if (in< 0) in=0;
  if (co<=0) co=iBars(sy, tf)-in;

  double r, rb=0;       // размер бара
  int    i, nb=-1;      // счётчик и номер бара

  for (i=co+in; i>=in; i--) {
    if (ty>0) r=MathAbs(iOpen(sy, tf, i)-iClose(sy, tf, i));
    else r=iHigh(sy, tf, i)-iLow(sy, tf, i);
    if (rb<r) {
      rb=r;
      nb=i;
    }
  }

  return(nb);
}

iBarOfDayCalc()関数を使用します。

この関数は、計算された日の先頭からのバーの数を返します。バーには1から順番に番号が振られています。つまり、ある日の中で最も開始時間の短いバーが1番、次のバーが2番...となります。入退場時間の最適化に有効な機能です。詳細が気になる人がいたら、質問してください。できる限りお答えします。iBarOfDayCalc() 関数は、以下のオプションのパラメータを受け取ります。

  • tf- タイムフレーム.デフォルト値は、0- 現在のタイムフレームです。
  • dt-バーのオープン日時。デフォルト値 -0- 現在の時刻。
//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 26.02.2008                                                     |
//|  Описание : Возвращает расчётный номер бара от начала суток.               |
//|           : Нумерация баров начинается с 1 (единица).                      |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    tf - таймфрейм                       (0 - текущий таймфрейм)            |
//|    dt - дата и время открытия бара      (0 - текущее время)                |
//+----------------------------------------------------------------------------+
int iBarOfDayCalc(int tf=0, datetime dt=0) {
  if (tf<=0) tf=Period();
  if (dt<=0) dt=TimeCurrent();
  if (tf>PERIOD_D1) {
    Print("iBarOfDayCalc(): Таймфрейм должен быть меньше или равен D1");
    return(0);
  }
  double ms=MathMod(dt/60, 1440);      // количество минут от начала суток
  int    bd=MathFloor(ms/tf)+1;        // номер бара от начала суток

  return(bd);
}
 

関数 iBarOfDayReal()。

この関数は、日の初めからの実際の小節番号を返します。バーには1から順に番号が振られています。つまり、ある一日のうちで最も開始時間の短いバーが1番、次のバーが2番、といった具合です。この機能の実用的な使い道は、まだ見つかっていないんです。しかし、私はそれを持つように書いている :-)関数iBarOfDayCalc() と一緒に。iBarOfDayReal() 関数には、以下のオプションパラメータを指定できます。

  • sy- 取引商品の名前。NULL または""- 現在のシンボル。初期値は"" である。
  • tf- タイムフレーム.デフォルト値 -0- 現在のタイムフレーム。
  • dt- バーが開かれる日時。デフォルト値 -0- 現在の時刻。
//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 26.02.2008                                                     |
//|  Описание : Возвращает реальный номер бара от начала суток.                |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    sy - наименование инструмента   (NULL или "" - текущий символ)          |
//|    tf - таймфрейм                  (          0 - текущий таймфрейм)       |
//|    dt - дата и время открытия бара (          0 - текущее время)           |
//+----------------------------------------------------------------------------+
int iBarOfDayReal(string sy="", int tf=0, datetime dt=0) {
  if (sy=="" || sy=="0") sy=Symbol();
  if (tf<=0) tf=Period();
  if (dt<=0) dt=TimeCurrent();
  if (tf>PERIOD_D1) {
    Print("iBarOfDayReal(): Таймфрейм должен быть меньше или равен D1");
    return(0);
  }

  int cd=TimeDay(dt);                       // текущий день месяца
  int nb=iBarShift(sy, tf, dt, False);      // номер текущего бара
  int bd=0;                                 // номер бара от начала суток

  while(TimeDay(iTime(sy, tf, nb))==cd) {
    nb++;
    bd++;
  }

  return(bd);
}

NameDayOfWeek()関数

パラメータとして渡された数字による曜日の名前を返す。

  • ndw - 曜日番号.必須パラメータです。
//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 01.09.2005                                                     |
//|  Описание : Возвращает наименование дня недели                             |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    ndw - номер дня недели                                                  |
//+----------------------------------------------------------------------------+
string NameDayOfWeek(int ndw) {
  if (ndw==0) return("Воскресенье");
  if (ndw==1) return("Понедельник");
  if (ndw==2) return("Вторник");
  if (ndw==3) return("Среда");
  if (ndw==4) return("Четверг");
  if (ndw==5) return("Пятница");
  if (ndw==6) return("Суббота");
}
 

関数 NormalizeLot()。

この関数は、取引中のロットの正規化された値を返します。 正規化の他に、ロットサイズをディーリングセンターが設定した制限に適合させます(ロットの最小値、最大値、ロット変更ステップをチェックします)。関数NormalizeLot() は、以下のパラメータを受け付ける。

  • lo- NormalizeLot 値.必須パラメータです。
  • ro- 丸め方式.False- 小さくなった側へ、True- 大きくなった側へ。初期値 -False- 下側へ。
  • sy- 取引商品の名称。NULL または""- 現在のシンボル。デフォルト値 -""。
//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 16.05.2008                                                     |
//|  Описание : Возвращает нормализованное значение торгуемого лота.           |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    lo - нормализуемое значение лота.                                       |
//|    ro - способ округления          (   False    - в меньшую,               |
//|                                        True     - в большую сторону)       |
//|    sy - наименование инструмента   ("" или NULL - текущий символ)          |
//+----------------------------------------------------------------------------+
double NormalizeLot(double lo, bool ro=False, string sy="") {
  double l, k;
  if (sy=="" || sy=="0") sy=Symbol();
  double ls=MarketInfo(sy, MODE_LOTSTEP);
  double ml=MarketInfo(sy, MODE_MINLOT);
  double mx=MarketInfo(sy, MODE_MAXLOT);

  if (ml==0) ml=0.1;
  if (mx==0) mx=100;

  if (ls>0) k=1/ls; else k=1/ml;
  if (ro) l=MathCeil(lo*k)/k; else l=MathFloor(lo*k)/k;

  if (l<ml) l=ml;
  if (l>mx) l=mx;

  return(l);
}

NormalizePrice()関数。

MarketInfo(MODE_TICKSIZE || MODE_DIGITS)関数の値を用いて正規化した価格値を返します。NormalizePrice()関数は、以下のパラメータを受け取ります。

  • np- 正規化されたロット値.必須パラメータです。
  • sy- 取引商品の名称。NULL または""- 現在のシンボル。初期値は"" である。
//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 21.08.2008                                                     |
//|  Описание : Возвращает нормализованное под размер тика значение цены.      |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    np - нормализуемое значение цены.                                       |
//|    sy - наименование инструмента        ("" или NULL - текущий символ)     |
//+----------------------------------------------------------------------------+
double NormalizePrice(double np, string sy="") {
  if (sy=="" || sy=="0") sy=Symbol();
  double pp, ts=MarketInfo(Symbol(), MODE_TICKSIZE);
  int    di=MarketInfo(Symbol(), MODE_DIGITS);

  if (ts>0) pp=NormalizeDouble(np/ts, 0)*ts;
  else {
    if (di>0) pp=NormalizeDouble(np*di, 0)/di; else pp=np;
  }
  return(pp);
}
 

WeekOfMonth()関数を使用します。

この関数は、その月の週を日付別に返します。オプションのパラメータを1つだけ受け付けます。

//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 12.08.2008                                                     |
//|  Описание : Возвращает номер недели месяца по дате                         |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    dt - дата, время           (0 - сейчас по времени торгового сервера)    |
//+----------------------------------------------------------------------------+
int WeekOfMonth(datetime dt=0) {
  if (dt<=0) dt=TimeCurrent();
  datetime d;
  int      i, kd=TimeDay(dt), nn=1;

  for (i=2; i<=kd; i++) {
    d=StrToTime(TimeYear(dt)+"."+TimeMonth(dt)+"."+i);
    if (TimeDayOfWeek(d)==1) nn++;
  }
  return(nn);
}

関数 ClosePosBySortLots()。

ロットサイズ順にポジションをクローズする機能です。つまり、この機能を使えば、ロット数の昇順または降順でポジションを決済することができます。関数ClosePosBySortLots() は、以下のオプションパラメータを受け付けます。

  • sy- 取引商品の名前。""- 任意の楽器、NULL- 現在の楽器。デフォルト値 -""。
  • op- 貿易業務の種類。有効な値-1- 任意のポジション、OP_BUY- 買い、OP_SELL- 売りを指定します。初期値は-1 である。
  • mn- MagicNumber、取引操作の一意な識別子。デフォルト値-1- 任意のMagicNumber。
  • sd- ロットサイズのソート方向.有効な値MODE_ASCEND- 昇順、MODE_DESCEND- 降順。初期値はMODE_DESCEND である。
//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 11.12.2008                                                     |
//|  Описание : Закрытие позиций в порядке сортировки по размерам лотов.       |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    sy - наименование инструмента        (    ""       - любой символ,      |
//|                                             NULL      - текущий символ)    |
//|    op - операция                        (    -1       - любая позиция)     |
//|    mn - MagicNumber                     (    -1       - любой магик)       |
//|    sd - Направление сортировки лотов    (MODE_ASCEND  - возрастание,       |
//|                                          MODE_DESCEND - убывание)          |
//+----------------------------------------------------------------------------+
void ClosePosBySortLots(string sy="", int op=-1, int mn=-1, int sd=MODE_DESCEND) {
  double a[][2];                  // Массив лотов и тикетов
  int    i, k=OrdersTotal();      // Счётчик и количество ордеров
  int    p=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()==OP_BUY || OrderType()==OP_SELL) {
          if (mn<0 || OrderMagicNumber()==mn) {
            p++;
            ArrayResize(a, p);
            a[p-1][0]=OrderLots();
            a[p-1][1]=OrderTicket();
          }
        }
      }
    }
  }

  // вдруг позиций нету, тогда и закрывать нечего
  if (p>0) {
    ArraySort(a, WHOLE_ARRAY, 0, sd);
    for (i=0; i<p; i++) {
      if (OrderSelect(a[i][1], SELECT_BY_TICKET)) {
        // проверим незакрытость на всякий случай,
        // может какая-то позиция уже закрылась по стопу/тейку
        if (OrderCloseTime()==0) ClosePosBySelect();
      }
    }
  }
}
 

AddLeadingZero()関数です。

この関数は、文字列の長さがある値に等しくなるように、先頭(左)のゼロ "0" をいくつでも追加します。AddLeadingZero() 関数は、以下の必須パラメータを受け付ける。

  • s- 先頭のゼロが追加される文字列.
  • k- 結果として得られる文字列Sの 長さ.
//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 01.09.2005                                                     |
//|  Описание : Добавляет к строке S столько лидирующих нулей "0",             |
//|           : чтобы длина строки S стала равна K.                            |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    s - строка                                                              |
//|    k - длина строки S                                                      |
//+----------------------------------------------------------------------------+
string AddLeadingZero(string s, int k) {
  while(StringLen(s)<k) s=StringConcatenate("0", s);
  return(s);
}

関数 toTime()。

この関数は,2つ/3つの整数を 時刻形式の文字 列に変換する。この関数に2つの数値を渡すと、最初の数値が時間として、2番目の数値が分として使用されます。フォーマット文字列は "HH:MM "が返される。数字が3つある場合、3つ目の数字は秒に置き換えられ、この関数は「HH:MM:SS」文字列を返します。toTime() 関数には、以下のオプションパラメータを指定することができる。

  • h- 時計初期値は0 です。
  • m- 議事録。初期値は0 です。
  • s- 秒数.0- 使用しないでください。初期値0
//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 01.09.2005                                                     |
//|  Описание : Преобразует два/три целых числа в строку в формате времени     |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    h - часы                                                                |
//|    m - минуты                                                              |
//|    s - секунды           (0 - не использовать)                             |
//+----------------------------------------------------------------------------+
string toTime(int h=0, int m=0, int s=0) {
  string st="";

  if (h==0) st="00:";
  else      st=StringConcatenate(AddLeadingZero(h, 2), ":");

  if (m==0) st=StringConcatenate(st, "00");
  else      st=StringConcatenate(st, AddLeadingZero(m, 2));

  if (s!=0) st=StringConcatenate(st, ":", AddLeadingZero(s, 2));

  return(st);
}