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

 

SetRegression() の使用例です。

  • 過去2日間のバーを基にした赤線の回帰チャネル。
    datetime d0=StrToTime(TimeToStr(TimeCurrent(), TIME_DATE));
    datetime d1=TimeCurrent()-24*60*60;
    while (TimeDayOfWeek(d1)==0 || TimeDayOfWeek(d1)==6) d1-=24*60*60;
    d1=StrToTime(TimeToStr(d1, TIME_DATE));
    SetRegression(Red, "", d1, 0, True);

  • 過去2日間のバーを元にした線形回帰の茶色のチャンネル。
    datetime d0=StrToTime(TimeToStr(TimeCurrent(), TIME_DATE));
    datetime d1=TimeCurrent()-24*60*60;
    while (TimeDayOfWeek(d1)==0 || TimeDayOfWeek(d1)==6) d1-=24*60*60;
    d1=StrToTime(TimeToStr(d1, TIME_DATE));
    datetime d2=d1-24*60*60;
    while (TimeDayOfWeek(d2)==0 || TimeDayOfWeek(d2)==6) d2-=24*60*60;
    d2=StrToTime(TimeToStr(d2, TIME_DATE));
    SetRegression(Brown, "", d2, d0, True, STYLE_DASH);

PS.SetRegression()関数をテストするためのスクリプトを添付します。

ファイル:
 

EquationDirect()関数です。

直線の方程式。グラフ上の任意の2点を通る直線との交点で、横軸Xに対する 縦軸Yの 値を計算する関数です。この関数は、以下の必須パラメータを受け取る。

  • x1,y1- 1番目の点の座標.
  • x2,y2- 2番目の点の座標.
  • x-Y 座標を計算するための横軸の値.
//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 12.10.2007                                                     |
//|  Описание : Уравнение прямой.                                              |
//|             Вычисляет значение Y для X в точке пересечения с прямой.       |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    x1,y1 - координаты первой точки,                                        |
//|    x2,y2 - координаты второй точки,                                        |
//|    x     - значение, для которого вычислить Y                              |
//+----------------------------------------------------------------------------+
double EquationDirect(double x1, double y1, double x2, double y2, double x) {
  if (x2==x1) return(y1);
  return((y2-y1)/(x2-x1)*(x-x1)+y1);
}
 

EquationDirect() の使用例です。

  • 赤い点は、バー23とバー11の最小値を通る線と、バー0の垂直線との交点にある。
    double y=EquationDirect(23, Low[23], 11, Low[11], 0);
    SetArrow(108, Red, "", 0, y);

  • 赤い点からグラフ上の任意の2点を通る直線。
    double p, x[2], y[2];
    int    cd=115, i, k, ot;
    string on;
    
    ArrayInitialize(x, 0.0);
    ArrayInitialize(y, 0.0);
    
    k=ObjectsTotal();
    for (i=k-1; i>=0; i--) {
      on=ObjectName(i);
      ot=ObjectType(on);
      if (ot==OBJ_ARROW) {
        if (ObjectGet(on, OBJPROP_ARROWCODE)==cd) ObjectDelete(on);
      }
    }
    k=ObjectsTotal();
    for (i=0; i<k; i++) {
      on=ObjectName(i);
      ot=ObjectType(on);
      if (ot==OBJ_ARROW) {
        if (x[0]==0) {
          x[0]=iBarShift(NULL, 0, ObjectGet(on, OBJPROP_TIME1));
          y[0]=ObjectGet(on, OBJPROP_PRICE1);
        } else {
          if (x[1]==0) {
            x[1]=iBarShift(NULL, 0, ObjectGet(on, OBJPROP_TIME1));
            y[1]=ObjectGet(on, OBJPROP_PRICE1);
          }
        }
      }
    }
    if (x[0]==0 || x[1]==0 || y[0]==0 || y[1]==0)
      Message("НЕ инициализированы исходные данные!");
    else {
      if (x[0]>x[1]) k=x[0]; else k=x[1];
      for (i=k; i>=0; i--) {
        if (i!=x[0] && i!=x[1]) p=EquationDirect(x[0], y[0], x[1], y[1], i);
        else {
          if (i==x[0]) p=y[0];
          if (i==x[1]) p=y[1];
        }
        SetArrow(cd, Red, "arr"+i, Time[i], p);
      }
    }

SZY. EquationDirect()をテストするスクリプトを添付します。

ファイル:
 

GetArrowInterval()関数。

この関数は、シグナル系指標、つまり明確な売買 シグナルを出す指標の開発の利便性を向上させるために書きました。このようなインジケーターのシグナルは、通常、バーのカイより上の 下向き矢印、または対応するバーの安値より下の 上向き矢印で表示されます。アンダー」「オーバー」の値は、矢印がバーを「ひかない」ように、通常数点であった。例えば、1時間のバーだけを対象にしたシングル・タイムフレーム・インディケーターの場合は、さほど問題にはなりませんでした。それぞれの時間枠で、「アンダー」と「オーバー」の値を変えていました。しかし、マルチフレームのインジケータでは、GetArrowInterval()関数を使用する必要がありました。

//+------------------------------------------------------------------+
//| Возвращает интервал установки сигнальных указателей              |
//+------------------------------------------------------------------+
int GetArrowInterval() {
  int p = Period();

  switch (p) {
    case 1:     return(4);
    case 5:     return(5);
    case 15:    return(6);
    case 30:    return(8);
    case 60:    return(10);
    case 240:   return(20);
    case 1440:  return(40);
    case 10080: return(80);
    case 43200: return(150);
  }
}

これは古いバリエーションですが、非常に早く、よりコンパクトで汎用性の高い形に変化しています。

//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 12.10.2007                                                     |
//+----------------------------------------------------------------------------+
//|  Описание : Возвращает интервал установки сигнальных указателей            |
//|  Параметры:                                                                |
//|    pr - процент относительно ценового размера окна                         |
//+----------------------------------------------------------------------------+
int GetArrowInterval(int pr=7) {
  if (pr<=0) pr=7;
  return((WindowPriceMax()-WindowPriceMin())/100*pr/Point);
}
 

GetArrowInterval()の使用例です。

  • 現在のバーの売りシグナル。
    SetArrow(242, Red, "", Time[0], High[0]+GetArrowInterval(15)*Point, 2);

  • 前(1本目)のバーで買いシグナル。
    SetArrow(233, Blue, "", Time[1], Low[1]-GetArrowInterval()*Point, 1);
    

SZYさん、GetArrowInterval()関数のテストスクリプトを添付します。

ファイル:
 
イゴールへe-SOTrailingでは、テイクポジションとストップポジションを変更する必要があります。
 
khorosh писал (а)>>
e-SOTrailingのEAでは、テイクとストップを変更する必要があります。

ありがとうございました。完了...修正したEAは私のホームページに掲載しています。

 
KimIV писал (а)>>

EquationDirect()関数です。

直線の方程式。グラフ上の任意の2点を通る直線との交点で、横軸Xに対する 縦軸Yの 値を計算する関数です。この関数は、以下の必須パラメータを受け取る。

  • x1,y1- 1番目の点の座標.
  • x2,y2- 2番目の点の座標.
  • x-Y 座標を計算するための横軸の値.

線分方程式の後半部分を書いてください。

グラフ上の任意の1点を通り、与えられた角度で引いた線と交わる点でのXの 横軸に対する縦軸Yの 値を計算しなさい。この関数は、以下の必須パラメータを受け取る。

  • x1,y1 - 1番目の点の座標.
  • a - 角度(度).
  • x - 値.y 軸の横軸を計算するための値.

ありがとうございます。

 
本物のプログラマー・イゴール大きな敬意と尊敬を込めて。
 
djday писал (а)>>

直線の方程式の後半部分を書いてください。

グラフ上の任意の1点を通り、与えられた角度で引いた線と交わる点での横軸Xに対する 縦軸Yの 値を算出する。この関数は、以下の必須パラメータを受け取る。

  • x1,y1 - 1番目の点の座標.
  • a - 角度(度).
  • x - 値.Y 座標の横軸を計算するためのもの.

ありがとうございます。

45°の角度は、カテドラルが等しいときに発生します。カテーテルの単位がメートル法の場合、問題はない。片方のカテドラルは2m、もう片方も2mです。つまり、45°の角度ですね。しかし、一方のカテが棒グラフの本数や時間であり、もう一方のカテが価格である場合はどうだろうか。角度が45°になるように、両者が等しくなるようにするにはどうしたらよいでしょうか。スケールの大きさの問題です。支点を与えれば、地面を動かす(c)。