Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?
16.03.2025, 15:26:27
Начало Помощь Поиск Войти Регистрация
Новости: ООО «Скрин маркет системз», правообладатель программы «Система брокерского обслуживания «TRANSAQ» официально заявляет, что не ведет никакой деятельности в мессенджерах или социальных сетях. 
Подробности на нашем сайте  WWW.TRANSAQ.RU.

Transaq  |  СБО "Transaq"  |  Подсистема ATF  |  Topic: Вопрос по zigzag « предыдущая тема следующая тема »
Страниц: [1] Печать
Автор Тема: Вопрос по zigzag  (Прочитано 4255 раз)
makeev
Jr. Member
**
Сообщений: 85



Просмотр профиля Email
« : 30.07.2010, 07:28:41 »

Функция Zig Zag при расчете обычно имеет 3 настраиваемых параметра это:
1.   DATA ARRAY (close, open, high,low)
2.    MINIMUM CHANGE (0……………10)
3.   DIFF_ METHOD (% или $)
однако индикатор написанный на языке ATF (см.ниже) специалистами TRANSAQ имеет только один настраиваемый параметр - MINIMUM CHANGE.  Подскажите, пожалуйста, как добавить в этот код 2 остальных параметра или точнее куда их туда воткнуть ???

#samewindow
#line 0 solid red
extern rate = 1;
var trend = 1;
var last;
var last_n;
var last_extr;
var last_extr_n = 0;
var r;


function init() {
   last = close;
   line[0] = close;
   last_extr = close;
   last_extr_n = 0;
   last_n = 0;
   r = rate / 100;
}


function getCandleLag(var n, var curr)
{
   return -(curr - n);
}


function approxLinear(var x1, var y1, var x2, var y2)
{
   var n = x2 - x1;
   if (!n) {
      line[0][getCandleLag(x1, noCandle())] = y1;
      return;
   }
   var k = (y2 - y1) / n;
   var i = 0;
   while (i <= n) {
      line[0][getCandleLag(x1 + i, noCandle())] = y1 + k*i;
      i += 1;
   }
}


function findMax(var from, var to)
{
   var m = high[getCandleLag(from, noCandle())];
   var n = from;
   var i = from + 1;
   while (i <= to) {
      var x = high[getCandleLag(from, noCandle())];
      if (x > m) {
         m = x;
         n = i;
      }
      i += 1;
   }
   return n;
}


function findMin(var from, var to)
{
   var m = low[getCandleLag(from, noCandle())];
   var n = from;
   var i = from + 1;
   while (i <= to) {
      var x = low[getCandleLag(from, noCandle())];
      if (x < m) {
         m = x;
         n = i;
      }
      i += 1;
   }
   return n;
}



function calc()
{
   if (trend == 1) {
      if (close > last_extr) {
         last_extr = high;
         last_extr_n = noCandle();
         approxLinear(last_n, last, noCandle(), high);
      }
      else {
         approxLinear(last_extr_n, last_extr, noCandle(), low);
      }
   }
   if (trend == -1) {
      if (close < last_extr) {
         last_extr = low;
         last_extr_n = noCandle();
         approxLinear(last_n, last, noCandle(), low);
      }
      else {
         approxLinear(last_extr_n, last_extr, noCandle(), high);
      }
   }

   if (abs(close - last_extr) / last_extr > r) {
      var old_n = last_n;
      var old = last;
      last_n = last_extr_n;
      last = last_extr;
      if (trend > 0) {
         trend = -1;
         last_extr_n = findMin(last_n, noCandle());
         last_extr = low[getCandleLag(last_extr_n, noCandle())];
      }
      else {
         trend = 1;
         last_extr_n = findMax(last_n, noCandle());
         last_extr = high[getCandleLag(last_extr_n, noCandle())];
      }
      approxLinear(old_n, old, last_n, last);
      approxLinear(last_n, last, noCandle(), close);
   }
}
Записан
Heller
Разработчики
Hero Member
*****
Сообщений: 1277


Просмотр профиля Email
« Ответ #1 : 11.08.2010, 16:23:06 »

Насчет изменения единиц измерения. В приведенном коде изменение считается в процентах, и за "переворот" отвечает следующая строчка:

abs(close - last_extr) / last_extr > r

Чтобы считать все в абсолютных величинах, а не в процентах, надо заменить ее на

abs(close - last_extr) > r

Что касается DATA ARRAY, то я не очень понимаю как надо вести рассчеты в остальных случаях. Можно например везде где используюся low и high заменить соответствующие ключевые слова на close, high, low или open. Наверное должно получиться как раз желаемое, но при этом надо понимать, что такой индикатор уже использует не все данные, а только часть из них, и алгоритм получается несколько другим. В варианте, опубликованном у нас на сайте, используется максимальная информация о движении цены (то есть максимум определяется по high, минимум по low, текущая по close).
Записан
Страниц: [1] Печать 
Transaq  |  СБО "Transaq"  |  Подсистема ATF  |  Topic: Вопрос по zigzag « предыдущая тема следующая тема »
Перейти в:  


Войти

Powered by MySQL Powered by PHP Powered by SMF 2.0.10 | SMF © 2006-2008, Simple Machines LLC Valid XHTML 1.0! Valid CSS!