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

 

GetNearestDownFractal()の使用例です。

  • 現在のチャートで最も近い上方フラクタルの価格水準。フラクタル式は2-2(標準)。
    Message(GetNearestUpFractal());
  • USDJPY H1チャートの直近の上段フラクタルの価格水準。フラクタル5-2.の式
    Message(GetNearestUpFractal("USDJPY", PERIOD_H1, 5));
  • 現在のチャートで最も近い上段フラクタル4-3の価格水準を通る水平線を 引く。
    double p=GetNearestUpFractal(NULL, 0, 4, 3);
    SetHLine(Red, "", p);

SZY. GetNearestUpFractal()関数をテストするスクリプトを添付しています。

ファイル:
 

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);
}
SZY. CorrectTF()関数をテストするためのスクリプトを添付します。
ファイル:
 

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

P.S. DateBeginQuarter() 関数をテストするスクリプトを添付します。

ファイル:
 

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

追伸:DateOfMonday()関数をテストするスクリプトを添付します。

ファイル:
 

フィボナッチ()関数です。

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

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

追伸:Fibonacci()をテストするスクリプトを添付します。

ファイル:
 

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");
  }
}
 
KimIV писал (а)>>

GetNameMA()関数。

この関数は、MA のメソッド名(移動平均)を識別子で返します。この機能は、コメント、インジケーター、Expert Advisorで有効です。

小難しいことを考えないでください・・・。

default       : return("Unknown Method");

ただ、一貫性を持たせるなら、とことんまでやらないと...。
 
TheXpert писал (а)>>

ナンパと思わないでください...。

ぜひともおつかれさまでした修正しました。

 
KimIV

こんにちは。

エキスポをほんの少し伝えるのを手伝ってください。

条件付きでこのスタックを閉じないで、注文を開けるなんて。

すなわち、案件が1つだけならポーズから抜け出し、案件が2つならシャットダウンしてしまうのです。

ファイル:
panzer.mq4  5 kb
 

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