Список форумов AmiSite.ru AmiSite.ru
Форум по Ами
 FAQ  •  Поиск  •  Пользователи  •  Группы   •  Регистрация  •  Профиль  •  Войти и проверить личные сообщения  •  Вход
 зиг заг Следующая тема
Предыдущая тема
Начать новую тему  Ответить на тему
Автор Сообщение
aztec



Зарегистрирован: 08.07.2010
Сообщения: 24

СообщениеДобавлено: Пт Авг 20, 2010 12:56 am Ответить с цитатой Вернуться к началу

000 писал(а):

Непонял.. Sad

мдя, все уже придумано до меня
CROSS Surprised Idea
засел учить функции наизусть )). Спасибо.
Посмотреть профиль Отправить личное сообщение
aztec



Зарегистрирован: 08.07.2010
Сообщения: 24

СообщениеДобавлено: Пн Авг 23, 2010 1:13 am Ответить с цитатой Вернуться к началу

пост обновлен, update в конце.

----------------------------------------------
Олег, добрый день.
нужен твой совет, подскажи плиз , кое что я сделал но надо пнуть в прав.направлении т.к. я что то не улавливаю философию - как считается код в Ами, особенно если есть и массивы и циклы и нек.функции просят константы.

На базе твоего кода делаю аналог zigzaga из МаркетДельты.

Там можно задавать
1. реверс в абсолютных ед.,
2 выводить рост\снижение между экстрем. в % и абс.вел.
3. строить между экстремумами. горизонт. линии на заданном удалении от последнего экст., длиной от экст.до экст.причем хочу еще сделать то, чего нет в МД - чтобы этот уровень рисовался и на недостроенном пока плече - т.е. в динамике между последним зафиксированным экстр. и экстрем. знач. swingline после этого

1. сделал просто - заменил в твоем коде ввод реверса в % - на абс. значения, убрал деление на 100 и заменил в коде умножение [i] -того элемента на сам реверс. вообщем тут все норм.

2.обсчет роста\снижения сделал так-
вариант А.
Код:
 


//  считаем  размах между hi - lo
rangeH = Null;
rangeL = Null;

Cond_hi = Null;
Cond_lo = Null;
Cond_lo[0]=1;
Cond_hi[0]=1;

dist = 0.1*revers;                  // смещение надписи от графика

for( i = 1; i < BarCount-1; i++ )
 {
  Cond_hi [i] =  SwingLine [i-1] < SwingLine [i] AND SwingLine [i] > SwingLine [i+1];
  Cond_lo [i] = SwingLine [i-1] > SwingLine [i] AND SwingLine [i] < SwingLine [i+1];
 
  if( Cond_hi [i] )
 
  {
  rangeH [i] = H [i] - LastValue(ValueWhen(Cond_lo, L, 1));
  PlotText( "" + rangeH [i] , i, H[ i ]+dist, 16,7 );               
  }
 
  if( Cond_lo [i] )
  {
  rangeL [i] = LastValue(ValueWhen(Cond_hi, H, 1)) - L [i];
  PlotText( "" + rangeL [i], i, L[ i ]-1.5*dist, 16,7 );
  }
 }


- работает норм., но в нем загляд. в будущее что не хорошо как я понимаю, - к тому же из за этого нельзя поставить в цикле BarCount только BarCount-1 иначе на некоторых барах при прогоне BarReplay дает Ошибку - выход из диапазона. Не знаю есть ли разница что перебор не до последнего бара, на что это влияет в принципе?
Может быть есть смысл заменить подглядывание на след.код. Наверно этот вариант получше...
Код:

//  считаем  размах между hi - lo
rangeH = Null;   
rangeL = Null;

Cond_hi = Null;
Cond_lo = Null;
Cond_lo[1]=1;
Cond_hi[1]=1;

dist = 0.1*revers;                  // смещение надписи от графика

for( i = 2; i < BarCount; i++ )
 {
  Cond_hi [i] =  SwingLine [i] < SwingLine [i-1] AND SwingLine [i-1] > SwingLine [i-2];
  Cond_lo [i] = SwingLine [i] > SwingLine [i-1] AND SwingLine [i-1] < SwingLine [i-2];
 
  if( Cond_hi [i] )
 
  {
  rangeH [i] = H [i-1] - LastValue(ValueWhen(Cond_lo, Ref(L,-1), 1));
  PlotText( "" + rangeH [i] , i-1, H[ i-1 ]+dist, 16,7 );               
  }
 
  if( Cond_lo [i] )
  {
  rangeL [i] = LastValue(ValueWhen(Cond_hi, Ref(H,-1), 1)) - L [i-1];
  PlotText( "" + rangeL [i], i-1, L[ i-1 ]-1.5*dist, 16,7 );
  }
 }




выглядит это так (скрин)

Вариант B
попытался сделать без цикла, не обошлось.
можно ли вывод тоже в массив засунуть или и так сойдет ?))
Код:

////////код ставит на график  разницу (range)  между последовательными экстремумами

  Cond_hi = Ref(SwingLine, -1) < SwingLine AND SwingLine > Ref(SwingLine, 1);
  Cond_Lo = Ref(SwingLine, -1) > SwingLine AND SwingLine < Ref(SwingLine, 1);
 
  Cond_HL = Cond_hi OR Cond_lo;
 
range = IIf(Cond_HL, abs(swingline - ValueWhen(Cond_HL,swingline,2)), 0 );// считаем range

for( i = 1; i < BarCount; i++ )
{
   if (Cond_HL[i]==1)  PlotText(""+ range [i], i+3, swingline [i], colorBlack);
}


3. пока думаю, вроде не особенно сложно - но вопрос по какому пути пойти - может попробовать включить расчет этих уровней в твой код в цикл по аналогии с Rev, или отдельно проще будет, но опять же в цикле явно - не замедлиться ли существенно работа из-за еще одного доп.цикла.

ps еще вопрос общего плана - а можно ли какой то общеупотребительной процедурой/кодом ограничивать обсчет своего (как заведомо неоптимального) индикатора видимой частью . Что-нибудь типа этого и дальше как то считать только между этими барами:
FirstVisibleBar = Status( "FirstVisibleBar" );
Lastvisiblebar = Status( "LastVisibleBar" );
или косяков не оберешься ?
Спасибо.
---------------------------------------
upd 24/08
вообщем сделал по варианту B + 3ю задачу вывода гориз.линий решил массивами без циклов. но только пока для готовых экстремумов. обсчет последнего несформированного плеча зигзага пока в работе

update 24авг 20.25мск.

все сделал, все работает, но тормозит здорово хотя ни одного вложенного цикла в цикле; всего 1 индикатор этот но котировок 450 тыс (минутки за 2.5 года) , вообщем надо или облегчать код убирая просчет далеких экстремумов (сделаю так ) или ограничивать обсчет видимой частью графика +- необходимые данные. но как это сделать понятия не имею пока..
Посмотреть профиль Отправить личное сообщение
000
Site Admin


Зарегистрирован: 10.12.2007
Сообщения: 9106

СообщениеДобавлено: Вт Авг 24, 2010 11:38 pm Ответить с цитатой Вернуться к началу

Да в общем нормально написано. Плохо только, что еще один цикл. Лучше конечно засунуть это в уже существующий.

PlotText надо выводить именно в цикле потому, что PlotText массив выводить не умеет. Так, что там все нормально.

На счет видимой части. Если в коде нет SetBarsRequired, то AFL и сам считает не все бары а только видимые с некоторым запасом.

_________________
ceterum censeo carthaginem esse delendam
Удачи. Олег.
Посмотреть профиль Отправить личное сообщение Посетить сайт автора
aztec



Зарегистрирован: 08.07.2010
Сообщения: 24

СообщениеДобавлено: Сб Авг 28, 2010 2:03 am Ответить с цитатой Вернуться к началу

Олег, подбрось мысль пожалуйста - как исхитриться в след. задачке - весь моск уже сломал что то никак не выходит, valuewhen не пойму как прикрутить.

есть 2 массива, как получить из них arr3 (без цикла )


000001000000000010000000 arr1
001000000100010000000100 arr2
001000111100010001111100 arr3

если на словах - смотрим arr1 и после 1 заменяем значением "1" нули в arr2 до ближайшей единицы в arr2.
спасибо. буду еще сам думать ) но пока увы Confused
Посмотреть профиль Отправить личное сообщение
000
Site Admin


Зарегистрирован: 10.12.2007
Сообщения: 9106

СообщениеДобавлено: Сб Авг 28, 2010 8:08 am Ответить с цитатой Вернуться к началу

Объясни получше алгоритм построения arr3 из arr1 и arr2. Я что то не понял... Sad

_________________
ceterum censeo carthaginem esse delendam
Удачи. Олег.
Посмотреть профиль Отправить личное сообщение Посетить сайт автора
aztec



Зарегистрирован: 08.07.2010
Сообщения: 24

СообщениеДобавлено: Вс Авг 29, 2010 11:48 am Ответить с цитатой Вернуться к началу

000 писал(а):
Объясни получше алгоритм построения arr3 из arr1 и arr2. Я что то не понял... Sad

задача - убрать линии ПОСЛЕ точек пересечения. инвертирую arr3 и умножу на Line.

upd. 14.07мск. Cделал, одной строкой. чего вечером мудрил а... все просто, много встроенных функций
Олег, извини за беспокойство, вечером реально сидел часа 2 недогонял как, а тут что то покопался в функциях и ...опс. Idea
Посмотреть профиль Отправить личное сообщение
000
Site Admin


Зарегистрирован: 10.12.2007
Сообщения: 9106

СообщениеДобавлено: Вс Авг 29, 2010 2:04 pm Ответить с цитатой Вернуться к началу

Хорошо. А вообще это всегда так бывает Smile

_________________
ceterum censeo carthaginem esse delendam
Удачи. Олег.
Посмотреть профиль Отправить личное сообщение Посетить сайт автора
Nayati



Зарегистрирован: 27.05.2016
Сообщения: 22
Откуда: Ростов-на-Дону

СообщениеДобавлено: Вт Апр 30, 2019 8:45 pm Ответить с цитатой Вернуться к началу

Насколько я понял стандартный загзаг рисует только по одному массиву. Внимание вопрос! Можно ли написать Зигзаг который рисует как полагается по хаям и лоям и БЕЗ использавания циклов? Не важно что он будет перерисовываться в последней ноге , главное чтоб относительно быстро считал и как нужно по двум массивам
Посмотреть профиль Отправить личное сообщение
000
Site Admin


Зарегистрирован: 10.12.2007
Сообщения: 9106

СообщениеДобавлено: Вт Апр 30, 2019 9:30 pm Ответить с цитатой Вернуться к началу

Я пока такого не видел.

_________________
ceterum censeo carthaginem esse delendam
Удачи. Олег.
Посмотреть профиль Отправить личное сообщение Посетить сайт автора
Nayati



Зарегистрирован: 27.05.2016
Сообщения: 22
Откуда: Ростов-на-Дону

СообщениеДобавлено: Ср Май 01, 2019 9:41 pm Ответить с цитатой Вернуться к началу

000 писал(а):
Я пока такого не видел.

Пытаюсь обхитрить дефолтный зигзаг подсовывая ему цену которая предполагаемо повлияет на его значение. Однако проблему вызывают наружние бары. Не могу понять как без циклов узнать какой бар из предыдущих не находится внутри диапазона текущего. ValueWhen and BarsSinse смотрят на условие одного индекса заданных массивов. Вот не пойму, если это вообще возможно в AFL, как проверить условие(образно) например
BarsSinse(H > H[текущего])
Код моего изобретения, вдруг кому нужно)
Код:

ZigPrice = Null;
Out = H > Ref(H,-1) AND L < Ref(L,-1);
In = H <= Ref(H,-1) AND L >= Ref(L,-1);
Up = H > Ref(H,-1) AND L >= Ref(L,-1);
Down = H <= Ref(H,-1) AND L < Ref(L,-1);

///////////////
ZigPrice = IIf(Up, H , ZigPrice);//только вверх
ZigPrice = IIf(Down, L , ZigPrice);//только вниз
ZigPrice = IIf(In,(H+l)/2,ZigPrice);//внутренний бар
//ZigPrice = IIf(Out, , ); //наружний????????
//////////////
Plot(IsNull(ZigPrice),"",colorYellow ,styleHistogram | styleOwnScale);

ZigPrice = IIf(IsNull(ZigPrice),(H+L)/2,ZigPrice);
ZigLine = Zig(ZigPrice,0.05);
Plot(ZigLine,"",colorWhite );

Посмотреть профиль Отправить личное сообщение
Показать сообщения:      
Начать новую тему  Ответить на тему


 Перейти:   



Следующая тема
Предыдущая тема
Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете голосовать в опросах
Вы не можете вкладывать файлы
Вы не можете скачивать файлы


Powered by phpBB © 2001, 2002 phpBB Group :: FI Theme :: Часовой пояс: GMT + 3

File Attachment © by Meik Sievertsen