//+----------------------------------------------------------------------------+//| Автор : Ким Игорь В. aka KimIV, http://www.kimiv.ru |//+----------------------------------------------------------------------------+//| Версия : 17.05.2008 |//| Описание : Возвращает значение минимального элемента массива. |//+----------------------------------------------------------------------------+//| Параметры: |//| x - массив значений числового ряда |//+----------------------------------------------------------------------------+double ArrayMin(double& x[]) {
if (ArraySize(x)>0) return(x[ArrayMinimum(x)]);
else {
Print("ArrayMin(): Массив пуст!");
return(0);
}
}
//+----------------------------------------------------------------------------+//| Автор : Ким Игорь В. aka KimIV, http://www.kimiv.ru |//+----------------------------------------------------------------------------+//| Версия : 07.10.2006 |//| Описание : Возвращает номер бара экстремума ЗигЗага по его номеру. |//+----------------------------------------------------------------------------+//| Параметры: |//| sy - наименование инструмента (NULL или "" - текущий символ) |//| tf - таймфрейм ( 0 - текущий ТФ) |//| ne - номер экстремума ( 0 - последний) |//| dp - ExtDepth |//| dv - ExtDeviation |//| bs - ExtBackstep |//+----------------------------------------------------------------------------+int GetExtremumZZBar(string sy="", int tf=0, int ne=0, int dp=12, int dv=5, int bc=3) {
if (sy=="" || sy=="0") sy=Symbol();
double zz;
int i, k=iBars(sy, tf), ke=0;
for (i=0; i<k; i++) {
zz=iCustom(sy, tf, "ZigZag", dp, dv, bc, 0, i);
if (zz!=0) {
ke++;
if (ke>ne) return(i);
}
}
Print("GetExtremumZZBar(): Экстремум ЗигЗага номер ",ne," не найден");
return(-1);
}
//+----------------------------------------------------------------------------+//| Автор : Ким Игорь В. aka KimIV, http://www.kimiv.ru |//+----------------------------------------------------------------------------+//| Версия : 16.05.2008 |//| Описание : Возвращает среднее аримфетическое элементов массива. |//+----------------------------------------------------------------------------+//| Параметры: |//| x - массив значений числового ряда |//+----------------------------------------------------------------------------+double ArrayAvg(double& x[]) {
double s=0;
int i, k=ArraySize(x);
for (i=0; i<k; i++) s+=x[i];
if (k>0) s/=k; elsePrint("ArrayAvg(): Массив пуст!");
return(s);
}
ArrayAvGeom()関数を使用します。
この関数は,配列の各項目の幾何平均を返します。
x-double 型の要素を要素とする配列.
//+----------------------------------------------------------------------------+//| Автор : Ким Игорь В. aka KimIV, http://www.kimiv.ru |//+----------------------------------------------------------------------------+//| Версия : 16.06.2008 |//| Описание : Возвращает среднее геометрическое элементов массива. |//+----------------------------------------------------------------------------+//| Параметры: |//| x - массив значений числового ряда |//+----------------------------------------------------------------------------+double ArrayAvGeom(double& x[]) {
double s=1, k=ArraySize(x);
int i;
for (i=0; i<k; i++) s*=x[i];
if (k>0) s=MathPow(s, 1/k); elsePrint("ArrayAvGeom(): Массив пуст!");
return(s);
}
//+----------------------------------------------------------------------------+//| Автор : Ким Игорь В. aka KimIV, http://www.kimiv.ru |//+----------------------------------------------------------------------------+//| Версия : 30.03.2008 |//| Описание : Установка объекта OBJ_HLINE горизонтальная линия |//+----------------------------------------------------------------------------+//| Параметры: |//| cl - цвет линии |//| nm - наименование ("" - время открытия текущего бара) |//| p1 - ценовой уровень (0 - Bid) |//| st - стиль линии (0 - простая линия) |//| wd - ширина линии (0 - по умолчанию) |//+----------------------------------------------------------------------------+void SetHLine(color cl, string nm="", double p1=0, int st=0, int wd=1) {
if (nm=="") nm=DoubleToStr(Time[0], 0);
if (p1<=0) p1=Bid;
if (ObjectFind(nm)<0) ObjectCreate(nm, OBJ_HLINE, 0, 0,0);
ObjectSet(nm, OBJPROP_PRICE1, p1);
ObjectSet(nm, OBJPROP_COLOR , cl);
ObjectSet(nm, OBJPROP_STYLE , st);
ObjectSet(nm, OBJPROP_WIDTH , wd);
}
//+----------------------------------------------------------------------------+//| Автор : Ким Игорь В. aka KimIV, http://www.kimiv.ru |//+----------------------------------------------------------------------------+//| Версия : 02.07.2008 |//| Описание : Установка объекта OBJ_VLINE вертикальная линия |//+----------------------------------------------------------------------------+//| Параметры: |//| cl - цвет линии |//| nm - наименование ("" - время открытия текущего бара) |//| t1 - время (0 - время открытия текущего бара) |//| st - стиль линии (0 - простая линия) |//| wd - ширина линии (1 - по умолчанию) |//+----------------------------------------------------------------------------+void SetVLine(color cl, string nm="", datetime t1=0, int st=0, int wd=1) {
if (nm=="") nm=DoubleToStr(Time[0], 0);
if (t1<=0) t1=Time[0];
if (ObjectFind(nm)<0) ObjectCreate(nm, OBJ_VLINE, 0, 0,0);
ObjectSet(nm, OBJPROP_TIME1, t1);
ObjectSet(nm, OBJPROP_COLOR, cl);
ObjectSet(nm, OBJPROP_STYLE, st);
ObjectSet(nm, OBJPROP_WIDTH, wd);
}
//+----------------------------------------------------------------------------+//| Автор : Ким Игорь В. aka KimIV, http://www.kimiv.ru |//+----------------------------------------------------------------------------+//| Версия : 12.10.2007 |//| Описание : Установка объекта OBJ_TREND трендовая линия |//+----------------------------------------------------------------------------+//| Параметры: |//| cl - цвет линии |//| nm - наименование ( "" - время открытия текущего бара) |//| t1 - время открытия бара ( 0 - Time[10] |//| p1 - ценовой уровень ( 0 - Low[10]) |//| t2 - время открытия бара ( 0 - текущий бар) |//| p2 - ценовой уровень ( 0 - Bid) |//| ry - луч (False - по умолчанию) |//| st - стиль линии ( 0 - простая линия) |//| wd - ширина линии ( 1 - по умолчанию) |//+----------------------------------------------------------------------------+void SetTLine(color cl, string nm="",
datetime t1=0, double p1=0, datetime t2=0, double p2=0,
bool ry=False, int st=0, int wd=1) {
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;
if (ObjectFind(nm)<0) ObjectCreate(nm, OBJ_TREND, 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);
ObjectSet(nm, OBJPROP_RAY , ry);
ObjectSet(nm, OBJPROP_STYLE , st);
ObjectSet(nm, OBJPROP_WIDTH , wd);
}
//+----------------------------------------------------------------------------+//| Автор : Ким Игорь В. aka KimIV, http://www.kimiv.ru |//+----------------------------------------------------------------------------+//| Версия : 12.10.2007 |//| Описание : Установка объекта OBJ_TRENDBYANGLE трендовая линия по углу |//+----------------------------------------------------------------------------+//| Параметры: |//| cl - цвет линии |//| nm - наименование ( "" - время открытия текущего бара) |//| t1 - время открытия бара ( 0 - Time[10] |//| p1 - ценовой уровень ( 0 - Low[10]) |//| t2 - время открытия бара ( 0 - время открытия текущего бара) |//| p2 - ценовой уровень ( 0 - по углу) |//| an - угол ( 0 - по умолчанию) |//| ry - луч (False - не луч) |//| st - стиль линии ( 0 - простая линия) |//| wd - ширина линии ( 1 - по умолчанию) |//+----------------------------------------------------------------------------+void SetTLineByAngle(color cl, string nm="",
datetime t1=0, double p1=0, datetime t2=0, double p2=0,
double an=0, bool ry=False, int st=0, int wd=1) {
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 (ObjectFind(nm)<0) ObjectCreate(nm, OBJ_TRENDBYANGLE, 0, 0,0);
ObjectSet(nm, OBJPROP_TIME1 , t1);
ObjectSet(nm, OBJPROP_PRICE1, p1);
ObjectSet(nm, OBJPROP_TIME2 , t2);
if (p2>0) ObjectSet(nm, OBJPROP_PRICE2, p2);
else ObjectSet(nm, OBJPROP_ANGLE, an);
ObjectSet(nm, OBJPROP_COLOR, cl);
ObjectSet(nm, OBJPROP_RAY , ry);
ObjectSet(nm, OBJPROP_STYLE, st);
ObjectSet(nm, OBJPROP_WIDTH, wd);
}
//+----------------------------------------------------------------------------+//| Автор : Ким Игорь В. aka KimIV, http://www.kimiv.ru |//+----------------------------------------------------------------------------+//| Версия : 12.10.2007 |//| Описание : Установка значка на графике, объекта OBJ_ARROW. |//+----------------------------------------------------------------------------+//| Параметры: |//| cd - код значка |//| cl - цвет значка |//| nm - наименование ("" - время открытия текущего бара) |//| t1 - время открытия бара (0 - текущий бар) |//| p1 - ценовой уровень (0 - Bid) |//| sz - размер значка (0 - по умолчанию) |//+----------------------------------------------------------------------------+void SetArrow(int cd, color cl,
string nm="", datetime t1=0, double p1=0, int sz=0) {
if (nm=="") nm=DoubleToStr(Time[0], 0);
if (t1<=0) t1=Time[0];
if (p1<=0) p1=Bid;
if (ObjectFind(nm)<0) ObjectCreate(nm, OBJ_ARROW, 0, 0,0);
ObjectSet(nm, OBJPROP_TIME1 , t1);
ObjectSet(nm, OBJPROP_PRICE1 , p1);
ObjectSet(nm, OBJPROP_ARROWCODE, cd);
ObjectSet(nm, OBJPROP_COLOR , cl);
ObjectSet(nm, OBJPROP_WIDTH , sz);
}
//+----------------------------------------------------------------------------+//| Автор : Ким Игорь В. aka KimIV, http://www.kimiv.ru |//+----------------------------------------------------------------------------+//| Версия : 12.10.2007 |//| Описание : Установка текстовой метки, объект OBJ_LABEL. |//+----------------------------------------------------------------------------+//| Параметры: |//| nm - наименование объекта |//| tx - текст |//| cl - цвет метки |//| xd - координата X в пикселах |//| yd - координата Y в пикселах |//| cr - номер угла привязки (0 - левый верхний, |//| 1 - правый верхний, |//| 2 - левый нижний, |//| 3 - правый нижний ) |//| fs - размер шрифта (9 - по умолчанию ) |//+----------------------------------------------------------------------------+void SetLabel(string nm, string tx, color cl, int xd, int yd, int cr=0, int fs=9) {
if (ObjectFind(nm)<0) ObjectCreate(nm, OBJ_LABEL, 0, 0,0);
ObjectSetText(nm, tx, fs);
ObjectSet(nm, OBJPROP_COLOR , cl);
ObjectSet(nm, OBJPROP_XDISTANCE, xd);
ObjectSet(nm, OBJPROP_YDISTANCE, yd);
ObjectSet(nm, OBJPROP_CORNER , cr);
ObjectSet(nm, OBJPROP_FONTSIZE , fs);
}
//+----------------------------------------------------------------------------+//| Автор : Ким Игорь В. aka KimIV, http://www.kimiv.ru |//+----------------------------------------------------------------------------+//| Версия : 12.10.2007 |//| Описание : Установка объекта OBJ_REGRESSION канал линейной регрессии. |//+----------------------------------------------------------------------------+//| Параметры: |//| cl - цвет линии |//| nm - наименование ( "" - время открытия текущего бара) |//| t1 - время открытия бара ( 0 - Time[10]) |//| t2 - время открытия бара ( 0 - Time[0]) |//| ry - луч (False - по умолчанию) |//| st - стиль линии ( 0 - простая линия) |//| wd - ширина линии ( 1 - по умолчанию) |//+----------------------------------------------------------------------------+void SetRegression(color cl, string nm="", datetime t1=0, datetime t2=0,
bool ry=False, int st=STYLE_SOLID, int wd=1) {
if (nm=="") nm=DoubleToStr(Time[0], 0);
if (t1<=0) t1=Time[10];
if (t2<=0) t2=Time[0];
if (ObjectFind(nm)<0) ObjectCreate(nm, OBJ_REGRESSION, 0, 0,0, 0,0);
ObjectSet(nm, OBJPROP_TIME1, t1);
ObjectSet(nm, OBJPROP_TIME2, t2);
ObjectSet(nm, OBJPROP_COLOR, cl);
ObjectSet(nm, OBJPROP_RAY , ry);
ObjectSet(nm, OBJPROP_STYLE, st);
ObjectSet(nm, OBJPROP_WIDTH, wd);
}
//+----------------------------------------------------------------------------+//| Автор : Ким Игорь В. 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);
}
//+----------------------------------------------------------------------------+//| Автор : Ким Игорь В. 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);
}
//+----------------------------------------------------------------------------+//| Автор : Ким Игорь В. aka KimIV, http://www.kimiv.ru |//+----------------------------------------------------------------------------+//| Версия : 07.10.2006 |//| Описание : Возвращает номер бара экстремума ЗигЗага по его номеру. |//+----------------------------------------------------------------------------+//| Параметры: |//| sy - наименование инструмента (NULL или "" - текущий символ) |//| tf - таймфрейм ( 0 - текущий ТФ) |//| ne - номер экстремума ( 0 - последний) |//| dp - ExtDepth |//| dv - ExtDeviation |//| bs - ExtBackstep |//+----------------------------------------------------------------------------+int GetExtremumZZBar(string sy="", int tf=0, int ne=0, int dp=12, int dv=5, int bc=3) {
if (sy=="" || sy=="0") sy=Symbol();
double zz;
int i, k=iBars(sy, tf), ke=0;
for (i=0; i<k; i++) {
zz=iCustom(sy, tf, "ZigZag", dp, dv, bc, 0, i);
if (zz!=0) {
ke++;
if (ke>ne) return(i);
}
}
Print("GetExtremumZZBar(): Экстремум ЗигЗага номер ",ne," не найден");
return(-1);
}
//+----------------------------------------------------------------------------+//| Автор : Ким Игорь В. aka KimIV, http://www.kimiv.ru |//+----------------------------------------------------------------------------+//| Версия : 07.10.2006 |//| Описание : Возвращает экстремум ЗигЗага по его номеру. |//+----------------------------------------------------------------------------+//| Параметры: |//| sy - наименование инструмента (NULL или "" - текущий символ) |//| tf - таймфрейм ( 0 - текущий ТФ) |//| ne - номер экстремума ( 0 - последний) |//| dp - ExtDepth |//| dv - ExtDeviation |//| bs - ExtBackstep |//+----------------------------------------------------------------------------+double GetExtremumZZPrice(string sy="", int tf=0, int ne=0, int dp=12, int dv=5, int bs=3) {
if (sy=="" || sy=="0") sy=Symbol();
double zz;
int i, k=iBars(sy, tf), ke=0;
for (i=1; i<k; i++) {
zz=iCustom(sy, tf, "ZigZag", dp, dv, bs, 0, i);
if (zz!=0) {
ke++;
if (ke>ne) return(zz);
}
}
Print("GetExtremumZZPrice(): Экстремум ЗигЗага номер ",ne," не найден");
return(0);
}
//+----------------------------------------------------------------------------+//| Автор : Ким Игорь В. aka KimIV, http://www.kimiv.ru |//+----------------------------------------------------------------------------+//| Версия : 13.08.2008 |//| Описание : Возвращает номер бара фрактала по его номеру. |//+----------------------------------------------------------------------------+//| Параметры: |//| sy - наименование инструмента ("" или NULL - текущий символ) |//| tf - таймфрейм ( 0 - текущий ТФ) |//| nf - номер фрактала ( 0 - последний) |//+----------------------------------------------------------------------------+int GetFractalBar(string sy="0", int tf=0, int nf=0) {
if (sy=="" || sy=="0") sy=Symbol();
double f=0;
int i, k=iBars(sy, tf), kf;
for (i=2; i<k; i++) {
f=iFractals(sy, tf, MODE_LOWER, i);
if (f!=0) {
kf++;
if (kf>nf) return(i);
}
f=iFractals(sy, tf, MODE_UPPER, i);
if (f!=0) {
kf++;
if (kf>nf) return(i);
}
}
Print("GetFractalBar(): Фрактал не найден");
return(-1);
}
//+----------------------------------------------------------------------------+//| Автор : Ким Игорь В. aka KimIV, http://www.kimiv.ru |//+----------------------------------------------------------------------------+//| Версия : 07.10.2006 |//| Описание : Возвращает ценовой уровень ближайшего нижнего фрактала |//+----------------------------------------------------------------------------+//| Параметры: |//| sy - наименование инструмента ("" или NULL - текущий символ) |//| tf - таймфрейм ( 0 - текущий таймфрейм) |//| nl - количество баров слева |//| nr - количество баров справа |//+----------------------------------------------------------------------------+double GetNearestDownFractal(string sy="0", int tf=0, int nl=2, int nr=2) {
bool f;
int fb, i, nb=-1;
if (sy=="" || sy=="0") sy=Symbol();
if (nl<1) nl=1;
if (nr<1) nr=1;
fb=nr;
while (nb<0) {
fb++;
f=True;
for (i=fb; i>fb-nr; i--) {
if (iLow(sy, tf, i)>iLow(sy, tf, i-1)) { f=False; break; }
}
if (f) {
for (i=fb; i<fb+nl; i++) {
if (iLow(sy, tf, i)>iLow(sy, tf, i+1)) { f=False; break; }
}
if (f) { nb=fb; break; }
}
}
return(iLow(sy, tf, nb));
}
//+----------------------------------------------------------------------------+//| Автор : Ким Игорь В. aka KimIV, http://www.kimiv.ru |//+----------------------------------------------------------------------------+//| Версия : 07.10.2006 |//| Описание : Возвращает ближайший верхний фрактал |//+----------------------------------------------------------------------------+//| Параметры: |//| sy - наименование инструмента (NULL - текущий символ) |//| tf - таймфрейм ( 0 - текущий таймфрейм) |//| nl - количество баров слева |//| nr - количество баров справа |//+----------------------------------------------------------------------------+double GetNearestUpFractal(string sy="0", int tf=0, int nl=2, int nr=2) {
bool f;
int fb, i, nb=-1;
if (sy=="" || sy=="0") sy=Symbol();
if (nl<1) nl=1;
if (nr<1) nr=1;
fb=nr;
while (nb<0) {
fb++;
f=True;
for (i=fb; i>fb-nr; i--) {
if (iHigh(sy, tf, i)<iHigh(sy, tf, i-1)) { f=False; break; }
}
if (f) {
for (i=fb; i<fb+nl; i++) {
if (iHigh(sy, tf, i)<iHigh(sy, tf, i+1)) { f=False; break; }
}
if (f) { nb=fb; break; }
}
}
return(iHigh(sy, tf, nb));
}
ArrayMin()関数を使用します。
この関数は、配列の 最小要素の値を返します。
ArrayAvg()関数を使用します。
この関数は、配列 要素の平均演算値を返します。
ArrayAvGeom()関数を使用します。
この関数は,配列の各項目の幾何平均を返します。
SetHLine()関数です。
この関数は、現在のチャートにOBJ_HLINE 水平線オブジェクトを設定します。
SetVLine()関数を使用します。
この関数は、現在のチャートにOBJ_VLINE オブジェクトの垂直線を設定します。
SetTLine()関数です。
この関数は、現在のチャートにOBJ_TREND トレンドラインオブジェクトを設定します。
関数 SetTLineByAngle()。
この関数は、OBJ_TRENDBYANGLE オブジェクトを現在のチャートの傾斜角度で設定します。
SetArrow()関数です。
この関数は、OBJ_ARROW オブジェクトアイコンを現在のチャートに設定します。
SetLabel()関数。
この関数は、現在のチャートにOBJ_LABEL テキストラベルオブジェクトを設定します。
CrossPointOfLines()関数です。
この関数は、2本の直線の交点の座標を計算する。 各直線は、その点座標の組で定義される。3つの配列がパラメータとして関数に渡されます。
関数 SetRegression()。
この関数は、現在のチャート上の線形回帰チャンネルのOBJ_REGRESSION オブジェクトを設定します。
EquationDirect()関数です。
直線の方程式。グラフ上の任意の2点を通る直線との交点で、横軸Xに対する 縦軸Yの 値を計算する関数です。この関数は、以下の必須パラメータを受け取る。
GetArrowInterval()関数。
この関数は、シグナル系指標、つまり明確な売買 シグナルを出す指標の開発の利便性を向上させるために書きました。このようなインジケーターのシグナルは、通常、バーのカイより上の 下向き矢印、または対応するバーの安値より下の 上向き 矢印で表示されます。アンダー」「オーバー」の値は、矢印がバーを「ひかない」ように、通常数点であった。例えば、1時間のバーだけを対象にしたシングル・タイムフレーム・インディケーターの場合は、さほど問題にはなりませんでした。それぞれの時間枠で、「アンダー」と「オーバー」の値を変えていました。しかし、マルチフレーム・インディケータでは、GetArrowInterval()関数を使用しなければなりませんでした。
関数 FindNearFractal()。
この関数は、最も近いフラクタル素片を検索し、その価格水準を返す。この関数は、以下のオプションパラメータを受け付ける。
GetExtremumZZBar()関数。
この関数は、標準カスタムジグザグインジケータの 極値を検索し、バー番号を返します。この関数は、以下のオプションパラメータを受け付ける。
GetExtremumZZZPrice()関数。
この関数は、標準カスタム ZigZag インディケータの 極値を検索し、その価格水準を返します。この関数は、以下のオプションパラメータを受け付ける。
GetNearestDownFractal()関数。
この関数は、最も近いボトムフラクタルを検索し、その価格水準を返す。この関数の特徴は、フラクタルに任意の数式を設定できることである。一般に受け入れられている標準的なフラクタル式は2-2である。左側に2本、右側に2本の小節という意味です。この機能を使えば、8-2(左が8本、右が2本)や5-3(左が5本、右が3本)など、非常にエキゾチックなフラクタル表現も可能です。この関数は、以下のオプションパラメータを受け付ける。
GetNearestUpFractal()関数。
この関数は、最も近い上方向フラクタルを検索し、その価格水準を返す。この関数の特徴は、フラクタルに任意の数式を設定できることである。一般に受け入れられている標準的なフラクタル式は2-2である。左側に2本、右側に2本の小節という意味です。この機能を使えば、8-2(左が8本、右が2本)や5-3(左が5本、右が3本)など、非常にエキゾチックなフラクタル表現も可能です。この関数は、以下のオプションパラメータを受け付ける。