Полезные функции от KimIV - страница 46

 
SK. писал (а) >>

Я вот об этом. Нужно же принять во внимание существующие ограничения, кот., вообще говоря, всё время меняются.

Есть ли какая-то функция, анализирующая всевозможные ограничения?

То же при модификации.

--

(у меня получилось 16 функций - по 3 на каждый отл. ордер (OP,SL,TP) и по 2 на каждый рыночный (SL,TP),

и потом ещё несколько анализирующих сочетания разрешений).

да, у меня тоже отдельная функция на установку ордера, проверяющая все возможные ограничения и отдельная (частично похожая на первую) на модификацию. код приводить не буду - там столько "левых" наворотов, нужных только мне одному, что - ой. :-) но вообще - без такой в советниках, торгующих на реале - сложно. :-)

 
Shu писал (а) >>

да, у меня тоже отдельная функция на установку ордера, проверяющая все возможные ограничения и отдельная (частично похожая на первую) на модификацию. код приводить не буду - там столько "левых" наворотов, нужных только мне одному, что - ой. :-) но вообще - без такой в советниках, торгующих на реале - сложно. :-)

Вообще-то, я хотел проверить себя - всё ли я учёл. В ряде случаев, если проверки не делать, можно напороться на серию отказов (иногда с переспективой получить запрет на работу советников).

Кратко перечислю свои проверки.

1. StopLevel. Например, при модификации SL BuyStop.

Нужна не просто проверка дистанции. Нужно анализировать текущее положение по StopLevel и направление движения стоп-приказа.

Если SL находится за пределами коридора StopLevel, то придвинуть можно вплотную или отодвинуть неограниченно.

Если SL находится в коридоре, то движение вверх отклоняется. Движение вниз принимается, но с учётом StopLevel: если дистанция модификации в пределах коридора дистанции указана 3 п, а коридор 30п, то фактически принимаемое к исполнению значение определяется границей коридора StopLevel.

2. FreezeLevel.

3. Отношение StopLevel и TICKSIZE. Заказ может быть за пределами всех коридоров, но не кратен TICKSIZE - тогда хана. Нужно округлить в сторону направления модифи. Критично для "невалют".

4. Лоты. Минлот +/- миншаглота. Принять во внимание, что частичное и встречное закрытие ограничено минлотом тоже (хотя на мой взгляд это нелогично, но так есть).

После персональных проверок приказ выдаётся в свет, если каждая проверка окончилась позитивно (без запрета).

 

Полностью опубликованные библиотеки функций:

b-Graphics.rar - работа с графическими объектами.

b-Indicators.rar - работа с индикаторами.

 

Функция 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);
}
 

Пример использования функции ArrayLR().

Отметим ценовые уровни линейной регрессии для 30-ти предыдущих баров.

#define r 30
double x[r], y[];
for (int i=0; i<r; i++) x[i]=Close[i+1];
ArrayLR(x, y);
for (i=0; i<r; i++) SetArrow(170, Red, "arr"+i, Time[i+1], y[i]);

P.S. Во вложении скрипт для тестирования функции ArrayLR().

Файлы:
 
KimIV писал (а) >>

Полностью опубликованные библиотеки функций:

b-Graphics.rar - работа с графическими объектами.

b-Indicators.rar - работа с индикаторами.

Оч. здорово! Благодарю!

 
Parabellum писал (а) >>

Игорь, есть хороший индикатор, который может объединять несколько свечей в одну. Но он работает только на часовом графике. Можно ли сделать его универсальным?

Спасибо.

?

 
Parabellum писал (а) >>

?

ооо... извините...

Такой индикатор уже написан, не помню, кем и не помню, где видел... Я думал, Вы сами найдёте или кто-то ссылку даст...

 

В функции ArrayLR() есть не точность работы.

1. Не учитывает временное расположение баров. При пропуске баров работает некорректно.

2. Используемый алгоритм вычисления коэффициентов имеет недостаток в виде накопления ошибки округления, см. 'Помогите написать линейную регрессию' (самый низ страницы Rosh подтвердил этот подводный камень)

3. Предлагаю алгоритм без этих недостатков

4. Если перед вызовом заменить X[i]=Time[i+1]; на X[i]=i+1; алгоритм аналогичен, но без накопления ошибки.

5. Бары пропускаются не только в выходные :-(((

Вот мой вариант

//+----------------------------------------------------------------------------+
//|  Автор    : Сергей Привалов aka Prival,  Skype: privalov-sv                |
//+----------------------------------------------------------------------------+
//|  Версия   : 10.09.2008                                                     |
//|  Описание : Формирует массив значений линейной регрессии y(x)=A*x+B.       |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    X    - массив значений числового ряда, ось X                            |
//|    Y    - массив значений числового ряда, ось Y                            |
//+----------------------------------------------------------------------------+

void Array_LR(double &X[], double& Y[])
{
      double mo_X = 0, mo_Y = 0, var_0 = 0, var_1 = 0;
      int    i,N=ArraySize(X);
      double A,B;
     
      if(N>1)  {
         for ( i = 0; i < N; i ++ ) {
            mo_X +=X[i];
          mo_Y +=Y[i];
      }
      mo_X /=N;
      mo_Y /=N;
        
      for ( i = 0; i < N; i ++ )   {
         var_0 +=(X[i]-mo_X)*(Y[i]-mo_Y);
         var_1 +=(X[i]-mo_X)*(X[i]-mo_X);
      }
      // значение коэффициента A
      if(var_1!=0)   A = var_0 / var_1; else A=0;
      // значение коэффициента B
      B = mo_Y - A * mo_X;
      ArrayResize(Y, N);
     for (i=0; i<N; i++) Y[i]=A*X[i]+B;
    } else Print("ArrayLR(): Недостаточное количество элементов ряда! n=", N);
    
}

вот рисунок

Пример работы

#define r 280
void start() {
  double X[r], Y[r];
  for (int i=0; i<r; i++)  {
    Y[i]=Close[i+1];
    X[i]=Time[i+1];
  }
   Array_LR(X, Y);
  for (i=0; i<r; i++) {SetArrow(170, Blue, "arr"+i, X[i], Y[i])}

скрипт для проверки прилагаю

Файлы:
 
Prival писал (а) >>
Вот мой вариант

ок, Серёжа! Пусть будет два варианта этой функции.

Мой вариант хорош тем, что он один в один совпадает со встроенным графическим объектом OBJ_REGRESSION. Если кому-то понадобится брать цены с этого объекта, то моя функция поможет в этом, а твоя - увы... Но её можно будет применять для чего-то другого... Спасибо!