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

 

CorrectTF()関数。

この関数は、インジケータや EAの入力パラメータに、誤ったタイムフレーム(分単位の整数)を簡単に指定できることがあることを発見した後に書きました。例えば、時間給を60ではなく50と入力した。まあ...は、ちょっと寂しいですね。iRSI()関数が不正確な時間枠に対してゼロを返すことが判明しました。その他の機能については、チェックしていないので何とも言えません。私の不注意からくる誤解を避けるため、この機能は原始的なフールプルーフとして書きました。入力されたパラメータを最も近い適切な時間枠に調整し、その値を返します。

//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 02.03.2008                                                     |
//|  Описание : Корректирует таймфрейм под ближайший поддерживаемый МТ4.       |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    TimeFrame - таймфрейм (количество секунд)      (0 - текущий ТФ)         |
//+----------------------------------------------------------------------------+
int CorrectTF(int TimeFrame=0) {
  if (TimeFrame==0) TimeFrame=Period();
  if (TimeFrame< PERIOD_M5                         ) return(PERIOD_M1);
  if (TimeFrame>=PERIOD_M5  && TimeFrame<PERIOD_M15) return(PERIOD_M5);
  if (TimeFrame>=PERIOD_M15 && TimeFrame<PERIOD_M30) return(PERIOD_M15);
  if (TimeFrame>=PERIOD_M30 && TimeFrame<PERIOD_H1 ) return(PERIOD_M30);
  if (TimeFrame>=PERIOD_H1  && TimeFrame<PERIOD_H4 ) return(PERIOD_H1);
  if (TimeFrame>=PERIOD_H4  && TimeFrame<PERIOD_D1 ) return(PERIOD_H4);
  if (TimeFrame>=PERIOD_D1  && TimeFrame<PERIOD_W1 ) return(PERIOD_D1);
  if (TimeFrame>=PERIOD_W1  && TimeFrame<PERIOD_MN1) return(PERIOD_W1);
  if (TimeFrame>=PERIOD_MN1                        ) return(PERIOD_MN1);
}

関数 DateBeginQuarter()。

この関数は、四半期の開始日をその番号で返します。例えば、現在が2008年8月27日であれば、当四半期の開始日は2008年7月1日となります。この関数が受け取るパラメータは1つだけで、それは現在の四半期を基準とした四半期番号です。例えば、0は 現在の四半期、1は 次の四半期、- 1は前の四半期を表します。つまり、正の四分の一の数字は未来の日付を要求し、0と負の数字は過去の日付を要求します。1970年1月1日00時00分からの経過秒数が返される。

//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 12.05.2008                                                     |
//|  Описание : Возвращает дату начала квартала                                |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|                                    (-2 - позапрошлый)                      |
//|                                    (-1 - прошлый)                          |
//|    nq - номер квартала             ( 0 - текущий)                          |
//|                                    ( 1 - следующий)                        |
//|                                    ( 2 - последующий)                      |
//+----------------------------------------------------------------------------+
datetime DateBeginQuarter(int nq=0) {
  int ye=Year()-MathFloor(nq/4);
  nq=MathMod(nq, 4);
  int mo=Month()-MathMod(Month()+2, 3)+3*nq;
  if (mo<1) {
    mo+=12;
    ye--;
  }
  if (mo>12) {
    mo-=12;
    ye++;
  }

  return(StrToTime(ye+"."+mo+".01"));
}
 

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

この関数は、その週の開始日(月曜日)を番号で返します。例えば、現在が2008年8月29日であれば、現在の週の始まりの日付は2008年8月25日になります。この関数は、現在の週からの相対的な週数という1つのパラメータだけを受け取ります。例えば、0が 現在の週、1が 次の週、-1が 前の週です。つまり、正の週番号は未来の日付を要求し、0と負の週番号は過去の日付を要求する。戻り値は 1970 年 1 月 1 日 00:00 からの経過秒数である。

//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 13.05.2008                                                     |
//|  Описание : Возвращает дату понедельника по номеру недели                  |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|                                    (-2 - предпредыдущая неделя)            |
//|                                    (-1 - предыдущая неделя)                |
//|    nn - номер недели               ( 0 - текущая неделя)                   |
//|                                    ( 1 - следующая неделя)                 |
//|                                    ( 2 - последующая неделя)               |
//+----------------------------------------------------------------------------+
datetime DateOfMonday(int nn=0) {
  datetime dt=StrToTime(TimeToStr(TimeCurrent(), TIME_DATE));

  while (TimeDayOfWeek(dt)!=1) dt-=24*60*60;
  dt+=nn*7*24*60*60;

  return (dt);
}

関数Fibonacci()です。

この関数は、フィボナッチ級数の要素をそのシーケンス番号で返します。

//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 07.08.2008                                                     |
//|  Описание : Возвращает элемент ряда Фибоначчи по его порядковому номеру.   |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    n - номер элемента ряда                                                 |
//+----------------------------------------------------------------------------+
int Fibonacci(int n) {
  int a=0, b=0, i=1, s=0;

  if (n==1) s=1;
  if (n>1) {
    s=1;
    while (i<n) {
      i++;
      a=b;
      b=s;
      s=a+b;
    }
  }
  return(s);
}
 

GetNameMA()関数。

この関数は、MA のメソッド名(移動平均)を識別子で返します。コメントやインジケーター、Expert Advisorのメッセージに使用すると便利な機能です。

//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 01.09.2005                                                     |
//|  Описание : Возвращает наименование метода МА.                             |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    mm - идентификатор метода МА                                            |
//+----------------------------------------------------------------------------+
string GetNameMA(int mm) {
  switch (mm) {
    case MODE_SMA : return("SMA");
    case MODE_EMA : return("EMA");
    case MODE_SMMA: return("SMMA");
    case MODE_LWMA: return("LWMA");
    default       : return("Unknown Method");
  }
}
 

GetPriceDiffInPoint()関数。

この関数は、番号で指定された 2 本のバーの価格差を返す。この機能を開発した目的は、値動きの価値と方向を判断することであった。GetPriceDiffInPoint()関数は、考慮するバーの基準点(OpenまたはHighまたはLowまたはClose)を決定します。この関数は、以下のオプションパラメータを受け付ける。

  • sy- 楽器名。"" またはNULL- 現在のシンボル。デフォルトはNULL
  • tf- タイムフレーム.初期値0- 現在のシンボル。
  • n2- 左バー番号。初期値 -2.
  • n1- 右の小節番号.デフォルト値 -1.

戻り値です。

  • ポジティブ - バーN2とN1の間でレート上昇があった。
  • ネガティブ- バーN2とN1の間に減価償却があった。
//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 01.09.2005                                                     |
//|  Описание : Возвращает ценовую разницу в пунктах между двумя барами.       |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    sy - наименование инструмента        ("" или NULL - текущий символ)     |
//|    tf - таймфрейм                       (    0       - текущий таймфрейм)  |
//|    n2 - номер левого бара               (    2       - второй бар)         |
//|    n1 - номер правого бара              (    1       - первый бар)         |
//|  Возвращаемое значение:                                                    |
//|    положительное - между барами N2 и N1 был рост курса                     |
//|    отрицательное - между барами N2 и N1 было снижение курса                |
//+----------------------------------------------------------------------------+
int GetPriceDiffInPoint(string sy="0", int tf=0, int n2=2, int n1=1) {
  if (sy=="" || sy=="0") sy=Symbol();
  double p=MarketInfo(sy, MODE_POINT);
  int    d=MarketInfo(sy, MODE_DIGITS);
  int    dd=0, k=iBars(sy, tf);

  if (n1>k || n2>k)
    Print("GetPriceDiffInPoint(): Недостаточно баров для ",sy," ",GetNameTF(tf));
  else {
    if (n1>0 && n2>0) {
      int d1=NormalizeDouble((iHigh(sy, tf, n1)-iLow(sy, tf, n2))/p, d);
      int d2=NormalizeDouble((iLow(sy, tf, n1)-iHigh(sy, tf, n2))/p, d);

      if (MathAbs(d1)>MathAbs(d2)) dd=d1;
      if (MathAbs(d1)<MathAbs(d2)) dd=d2;
      if (MathAbs(d1)==MathAbs(d2)) {
        if (iOpen(sy, tf, n2)>iClose(sy, tf, n1)) dd=d2; else dd=d1;
      }
    }
  }

  return(dd);
}

GetTypePrice()関数

価格タイプの名称を返す。この関数は、オプションのパラメータを1つだけ受け取ります。有効な値:PRICE_CLOSE、PRICE_OPEN、PRICE_HIGH、PRICE_LOW、PRICE_MEDIAN、PRICE_TYPICAL、PRICE_WEIGHTED。 デフォルト値は0-PRICE_CLOSEです。

//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 01.09.2005                                                     |
//|  Описание : Возвращает наименование типа цены.                             |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    Applied_Price - тип цены                                                |
//+----------------------------------------------------------------------------+
string GetTypePrice(int Applied_Price=0) {
  switch (Applied_Price) {
    case PRICE_CLOSE   : return("Close");
    case PRICE_OPEN    : return("Open");
    case PRICE_HIGH    : return("High");
    case PRICE_LOW     : return("Low");
    case PRICE_MEDIAN  : return("Median");
    case PRICE_TYPICAL : return("Typical");
    case PRICE_WEIGHTED: return("Weighted");
    default            : return("Unknown Type Price");
  }
}
 

ArrayLR()関数です。

この関数は、線形回帰の値の配列を生成します。この関数は、以下の必須パラメータを受け付ける。

  • x は数値系列の値の配列である。入力パラメータです。この配列は、関数が呼ばれる前の値を含んでいなければなりません。
  • y は線形回帰の値の配列である。これは出力パラメータです.つまり,この関数が呼ばれた後に,この配列が埋められます.
//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 20.05.2008                                                     |
//|  Описание : Формирует массив значений линейной регрессии.                  |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    x - массив значений числового ряда                                      |
//|    y - массив значений линейной регрессии                                  |
//+----------------------------------------------------------------------------+
void ArrayLR(double& x[], double& y[]) {
  double a, b, c, sx=0, sx2=0, sxy=0, sy=0;
  int    i, n=ArraySize(x);

  if (n>1) {
    for (i=0; i<n; i++) {
      sx+=i+1;
      sy+=x[i];
      sxy+=(i+1)*x[i];
      sx2+=(i+1)*(i+1);
    }
    a=sx*sy-n*sxy;
    c=sx*sx-n*sx2;
    if (c!=0) a=a/c; else a=0;
    b=(sy-a*sx)/n;
    ArrayResize(y, n);
    for (i=0; i<n; i++) y[i]=a*(i+1)+b;
  } else Print("ArrayLR(): Недостаточное количество элементов ряда! n=", n);
}

ArrayMo()関数。

Modu関数は、分布密度曲線の最大値を返します。この関数は、以下のオプションパラメータを受け付ける。

  • x- 数値系列の値の配列.
  • d- 数値系列の値の精度、小数点 以下の桁数。
//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 21.06.2008                                                     |
//|  Описание : Возвращает Моду - максимум кривой плотности распределения.     |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    x - массив значений числового ряда                                      |
//|    d - точность значений числового ряда, количество знаков после запятой   |
//+----------------------------------------------------------------------------+
double ArrayMo(double& x[], int d=4) {
  double e, s=0;
  double m[][2];             // временный массив:
                             //  столбец 1 - количество значений
                             //  столбец 2 - значения
  int    i, k=ArraySize(x);
  int    n;                  // номер строки временного массива m
  int    r;                  // количество строк во временном массиве m

  if (k>0) {
    for (i=0; i<k; i++) {
      e=NormalizeDouble(x[i], d);
      n=ArraySearchDouble(m, e);
      if (n<0) {
        r=ArrayRange(m, 0);
        ArrayResize(m, r+1);
        m[r][0]++;
        m[r][1]=e;
      } else m[n][0]++;
    }
    ArraySort(m, WHOLE_ARRAY, 0, MODE_DESCEND);
    s=m[0][1];
  } else Print("ArrayMo(): Массив пуст!");

  return(s);
}
 

関数 ExistOrdersByPrice()。

与えられた設定価格での注文が存在するかどうかのフラグを返します。True- オーダーが存在する(設定されている)、False- オーダーが存在しない(設定されていない)。関数のパラメータを使用して、チェックする注文のリストを制限することができます。

  • sy- 市場商品の名前。このパラメータが指定された場合、この関数は指定された商品の注文のみをチェックします。NULLは 現在の楽器、""(デフォルト)は任意の楽器を意味します。
  • op- 取引の種類、保留中の注文の種類。有効な値:OP_BUYLIMITOP_BUYSTOPOP_SELLLIMITOP_SELLSTOP、または-1。デフォルトの値である- 1は、任意のオーダータイプを示す。
  • mn- オーダー識別子(MagicNumber)。初期値の- 1は任意のMagicNumberを意味する。
  • pp- 注文が設定される価格水準です。デフォルト値は-1- 任意の価格です。
//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 30.07.2008                                                     |
//|  Описание : Возвращает флаг существования ордеров по цене установки        |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    sy - наименование инструмента   (""   - любой символ,                   |
//|                                     NULL - текущий символ)                 |
//|    op - операция                   (-1   - любая позиция)                  |
//|    mn - MagicNumber                (-1   - любой магик)                    |
//|    pp - цена                       (-1   - любая цена)                     |
//+----------------------------------------------------------------------------+
bool ExistOrdersByPrice(string sy="", int op=-1, int mn=-1, double pp=-1) {
  int d, 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)) {
        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) return(True);
          }
        }
      }
    }
  }
  return(False);
}

テスターのClosePosBySelect()関数です。

あらかじめ選択された1つのポジションを閉じます。13ページ で紹介した同名の機能を簡略化したものです。 余分なものはありません。余分な機能はありません。私の実務では、テスターでクローズしなかったポジションはありません。そのため、この機能にはチェックがありません。テスターでは不要です。

//+----------------------------------------------------------------------------+
//|  Автор   : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                    |
//+----------------------------------------------------------------------------+
//|  Версия  : 13.06.2007                                                      |
//|  Описание: Закрытие одной предварительно выбранной позиции                 |
//+----------------------------------------------------------------------------+
void ClosePosBySelect() {
  double pp;

  if (OrderType()==OP_BUY) {
    pp=MarketInfo(OrderSymbol(), MODE_BID);
    OrderClose(OrderTicket(), OrderLots(), pp, Slippage, clCloseBuy);
  }
  if (OrderType()==OP_SELL) {
    pp=MarketInfo(OrderSymbol(), MODE_ASK);
    OrderClose(OrderTicket(), OrderLots(), pp, Slippage, clCloseSell);
  }
}
 

テスター用のCountOrders()関数です。

私のテスト版(MT4のテスター専用)では、ExistOrders(),ExistPositions(),NumberOfOrders(),NumberOfPositions() という関数の代わりに、CountOrders() という関数を使って、任意のポジションや注文があるか、それぞれの種類の取引量が分かるようになっています。このような取引所には独自の利点があり、それは1ティックの注文ベースを1回参照するだけで、必要な情報を一度に取得できることに表れています。そして、上記の機能は、特に併用する場合、それぞれが独立して1つの同じオーダーベースで動作するため、同じ呼び出しを繰り返してしまいます。その結果、CountOrders() 関数は、1回のパスの時間を数秒短縮することができ、最適化の時間を短縮することができる。

関数CountOrders() は、以下のパラメータをとる。

  • mo- 注文の種類別の件数の配列。関数が実行された後、配列は6つの要素を持ちます。0 要素-買い タイプの取引数、1 要素-売り 注文の数、2 要素-BuyLimit3 要素-SellLimit4 要素-BuyStop5 要素-SellStop です。
  • mn- ポジションまたは注文の識別子(MagicNumber)。デフォルト値は-1- 任意のMagicNumberです。
//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 03.08.2008                                                     |
//|  Описание : Рассчитывает количество ордеров по типам.                      |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    mo - массив количества ордеров по типам                                 |
//|    mn - MagicNumber                          (-1 - любой магик)            |
//+----------------------------------------------------------------------------+
void CountOrders(int& mo[], int mn=-1) {
  int i, k=OrdersTotal();

  if (ArraySize(mo)!=6) ArrayResize(mo, 6);
  for (i=0; i<k; i++) {
    if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {
      if (mn<0 || OrderMagicNumber()==mn) mo[OrderType()]++;
    }
  }
}

テスターのModifyOrder()関数です。

これは、7ページで 公開したModifyOrder() 関数のライトバージョンで、あらかじめ選択した1つの注文またはポジションの絶対価格水準を変更するためのものです。

ModifyOrder() 関数は、以下のパラメータを受け付けます。

  • pp- オーダー設定価格。0以下の値を渡すと、この価格水準の修正は行われない。初期値は-1 である。
  • sl- ストッププライス・レベル。0より小さい値を渡すと、価格水準の修正は行われない。 デフォルト値は0 である。
  • tp- 価格水準を取る。0未満の値を渡すと、価格水準の修正は実施されない。 デフォルト値は0 である。
  • ex- 保留注文の有効期限。初期値は0 である。
//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 28.03.2008                                                     |
//|  Описание : Модификация ордера. Версия функции для тестов на истории.      |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    pp - цена открытия позиции, установки ордера                            |
//|    sl - ценовой уровень стопа                                              |
//|    tp - ценовой уровень тейка                                              |
//|    ex - дата истечения                                                     |
//+----------------------------------------------------------------------------+
void ModifyOrder(double pp=-1, double sl=0, double tp=0, datetime ex=0) {
  int    dg=MarketInfo(OrderSymbol(), MODE_DIGITS), er;
  double op=NormalizeDouble(OrderOpenPrice() , dg);
  double os=NormalizeDouble(OrderStopLoss()  , dg);
  double ot=NormalizeDouble(OrderTakeProfit(), dg);
  color  cl;

  if (pp<=0) pp=OrderOpenPrice();
  if (sl<0 ) sl=OrderStopLoss();
  if (tp<0 ) tp=OrderTakeProfit();
  
  pp=NormalizeDouble(pp, dg);
  sl=NormalizeDouble(sl, dg);
  tp=NormalizeDouble(tp, dg);

  if (pp!=op || sl!=os || tp!=ot) {
    if (MathMod(OrderType(), 2)==0) cl=clModifyBuy; else cl=clModifySell;
    if (!OrderModify(OrderTicket(), pp, sl, tp, ex, cl)) {
      er=GetLastError();
      Print("Error(",er,") modifying order: ",ErrorDescription(er));
      Print("Ask=",Ask," Bid=",Bid," sy=",OrderSymbol(),
            " op="+GetNameOP(OrderType())," pp=",pp," sl=",sl," tp=",tp);
    }
  }
}
 

IIFc()関数です。

フォークの組み立てという点では非常に便利な機能です。だとしたら、この色。そして、そうでない場合は、別の色。関数IIFc()は3つの必須パラメータをとる。

  • condition-論理式。真であっても偽であってもよい。
  • ifTrue-条件 式が真である場合にIIFc() が返す色。
  • ifFalse-条件が 偽の場合、IIFc() が返す色です。
//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 18.07.2008                                                     |
//|  Описание : Возвращает одно из двух значений взависимости от условия.      |
//+----------------------------------------------------------------------------+
color IIFc(bool condition, color ifTrue, color ifFalse) {
  if (condition) return(ifTrue); else return(ifFalse);
}

IIFd()関数。

実数でも同様の利便性がある。もしそうなら、それは実数である。そうでない場合は、別の番号になります。IIFd() 関数は、3つの必須パラメータをとる。

  • condition- 論理式。真であっても偽であってもよい。
  • ifTrue-条件 式が真であれば、IIFd() が返す実数。
  • ifFalse-条件が 偽の場合、IIFd() が返す実数。
//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 01.02.2008                                                     |
//|  Описание : Возвращает одно из двух значений взависимости от условия.      |
//+----------------------------------------------------------------------------+
double IIFd(bool condition, double ifTrue, double ifFalse) {
  if (condition) return(ifTrue); else return(ifFalse);
}

IIFi()関数です。

整数の場合も同様の利便性があります。もしそうなら、それは整数である。そして、そうでない場合は、別の番号になります。IIFi() 関数は、3つの必須パラメータをとる。

  • condition- 論理式。真であっても偽であってもよい。
  • ifTrue-条件 式が真である場合にIIFi() が返す整数値です。
  • ifFalse-条件が 偽の場合にIIFi() が返す整数値です。
//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 01.02.2008                                                     |
//|  Описание : Возвращает одно из двух значений взависимости от условия.      |
//+----------------------------------------------------------------------------+
int IIFi(bool condition, int ifTrue, int ifFalse) {
  if (condition) return(ifTrue); else return(ifFalse);
}

IIFis()関数。

文字列についても同様の利便性があります。もしそうなら、そのような文字列。そして、そうでない場合は、別の文字列。IIFs() 関数は、3つの必須パラメータをとる。

  • condition- 論理式。真であっても偽であってもよい。
  • ifTrue-条件 式が真である場合に、IIFs() 関数によって返される文字列。
  • ifFalse-条件が 偽の場合、IIFs() が返す文字列。
//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 01.02.2008                                                     |
//|  Описание : Возвращает одно из двух значений взависимости от условия.      |
//+----------------------------------------------------------------------------+
string IIFs(bool condition, string ifTrue, string ifFalse) {
  if (condition) return(ifTrue); else return(ifFalse);
}
 

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

日付の間にクローズ(削除)されたポジションや注文が履歴に存在するかどうかのフラグを返します。関数ExistInHistoryCloseBetween() は、以下のパラメータを受け取る。

  • sy- 市場商品の名前。""- 任意のシンボル、NULL- 現在のシンボル。初期値は"" である。
  • op- 貿易業務。有効な値:-1OP_BUYOP_SELLOP_BUYLIMITOP_BUYSTOPOP_SELLLIMITOP_SELLSTOP。デフォルト値-1- 任意の操作。
  • mn- 貿易業務の識別子、MagicNumber。デフォルト値-1- 任意のマジックナンバー。
  • d1- ポジション終了時刻(注文削除待ち)。初期値は0-任意の閉時間(削除)です。時間d 1はd2より 短くなければならない。
  • d2- ポジション終了時刻 (注文の削除待ち).デフォルト値 -0- 任意のクローズ(削除)時間。時間d 2は時間d1より 長くなければならない。
//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 27.08.2008                                                     |
//|  Описание : Возвращает флаг существования в истории позиции или ордера,    |
//|           : закрытой (удалённого) между датами.                            |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    sy - наименование инструмента   (""   - любой символ,                   |
//|                                     NULL - текущий символ)                 |
//|    op - операция                   (-1   - любая операция)                 |
//|    mn - MagicNumber                (-1   - любой магик)                    |
//|    d1 - время закрытия             ( 0   - любое время закрытия)           |
//|    d2 - время закрытия             ( 0   - любое время закрытия)           |
//+----------------------------------------------------------------------------+
bool ExistInHistoryCloseBetween(string sy="", int op=-1, int mn=-1,
                                datetime d1=0, datetime d2=0) {
  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=="") && (op<0 || OrderType()==op)) {
        if (mn<0 || OrderMagicNumber()==mn) {
          if (d1<=OrderCloseTime() && (d2==0 || d2>=OrderCloseTime())) return(True);
        }
      }
    }
  }
  return(False);
}

関数 ExistInHistoryOpenBetween()。

日付の間にオープン(設定)されたポジションまたはオーダーの履歴に存在するフラグを返します。関数ExistInHistoryOpenBetween() は、以下のパラメータを受け取る。

  • sy- 楽器の名前です。""- 任意の文字、NULL- 現在のシンボル。初期値は"" である。
  • op- 貿易業務。有効な値:-1OP_BUYOP_SELLOP_BUYLIMITOP_BUYSTOPOP_SELLLIMITOP_SELLSTOP。デフォルト値-1- 任意の操作。
  • mn- 貿易業務の識別子、MagicNumber。デフォルト値-1- 任意のマジックナンバー。
  • d1- ポジション開始時間(注文の発注待ち).初期値は0-任意のオープニング(設定)時間です。d1 時間はd2 時間より短くする必要があります。
  • d2- ポジションがオープンする時間(注文の保留)。デフォルト値は0- 任意のオープン(設定)時間です。時間d 2は時間d1より 長くなければならない。
//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 27.08.2008                                                     |
//|  Описание : Возвращает флаг существования в истории позиции или ордера,    |
//|           : открытой (установленного) между датами.                        |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    sy - наименование инструмента   (""   - любой символ,                   |
//|                                     NULL - текущий символ)                 |
//|    op - операция                   (-1   - любая позиция)                  |
//|    mn - MagicNumber                (-1   - любой магик)                    |
//|    d1 - время открытия             ( 0   - любое время открытия)           |
//|    d2 - время открытия             ( 0   - любое время открытия)           |
//+----------------------------------------------------------------------------+
bool ExistInHistoryOpenBetween(string sy="", int op=-1, int mn=-1,
                               datetime d1=0, datetime d2=0) {
  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=="") && (op<0 || OrderType()==op)) {
        if (mn<0 || OrderMagicNumber()==mn) {
          if (d1<=OrderOpenTime() && (d2==0 || d2>=OrderOpenTime())) return(True);
        }
      }
    }
  }
  return(False);
}
 

関数 ExistInHistoryToDay()。

本日オープン(設定)したポジションまたはオーダーの履歴の中の存在フラグを返します。関数ExistInHistoryToDay() は、以下のパラメータを受け取る。

  • sy- 楽器の名前です。""- 任意のシンボル、NULL- 現在のシンボル。初期値は"" である。
  • op-貿易業務。有効な値:-1OP_BUYOP_SELLOP_BUYLIMITOP_BUYSTOPOP_SELLLIMITOP_SELLSTOP。デフォルト値-1- 任意の操作。
  • mn- 貿易業務の識別子、MagicNumber。デフォルト値は-1-任意のマジックナンバーです。
//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 06.08.2008                                                     |
//|  Описание : Возвращает флаг наличия ордера или позиции в истории за сегодня|
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    sy - наименование инструмента   (""   - любой символ,                   |
//|                                     NULL - текущий символ)                 |
//|    op - операция                   (-1   - любая позиция)                  |
//|    mn - MagicNumber                (-1   - любой магик)                    |
//+----------------------------------------------------------------------------+
bool ExistInHistoryToDay(string sy="", int op=-1, int mn=-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 (op<0 || OrderType()==op) {
          if (mn<0 || OrderMagicNumber()==mn) {
            if (TimeDay  (OrderOpenTime())==Day()
            &&  TimeMonth(OrderOpenTime())==Month()
            &&  TimeYear (OrderOpenTime())==Year()) return(True);
          }
        }
      }
    }
  }
  return(False);
}

TakeProfitLastPos()関数。

この関数は、最後のオープンポジションのTakeProfitの 価格レベルまたは-1を 返します。TakeProfitLastPos() 関数には、次のオプション・パラメータがあります。

  • sy- 楽器の名前です。""- 任意のシンボル、NULL- 現在のシンボル。初期値は"" である。
  • op- 貿易業務。有効な値:-1OP_BUYOP_SELL。デフォルト値は、-1- 任意の取引です。
  • mn- 取引識別子、MagicNumber。デフォルト値-1- 任意のマジックを使用します。
//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 06.08.2008                                                     |
//|  Описание : Возвращает цену TakeProfit последней открытой позиций или -1.  |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    sy - наименование инструмента   (""   - любой символ,                   |
//|                                     NULL - текущий символ)                 |
//|    op - операция                   (-1   - любая позиция)                  |
//|    mn - MagicNumber                (-1   - любой магик)                    |
//+----------------------------------------------------------------------------+
double TakeProfitLastPos(string sy="", int op=-1, int mn=-1) {
  datetime t;
  double   r=-1;
  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=="") {
        if (OrderType()==OP_BUY || OrderType()==OP_SELL) {
          if (op<0 || OrderType()==op) {
            if (mn<0 || OrderMagicNumber()==mn) {
              if (t<OrderOpenTime()) {
                t=OrderOpenTime();
                r=OrderTakeProfit();
              }
            }
          }
        }
      }
    }
  }
  return(r);
}