Автор |
Сообщение |
aztec
Зарегистрирован: 08.07.2010
Сообщения: 24
|
000 писал(а): |
Непонял..
|
мдя, все уже придумано до меня
CROSS
засел учить функции наизусть )). Спасибо. |
|
|
Посмотреть профиль Отправить личное сообщение |
![](images/spacer.gif) |
aztec
Зарегистрирован: 08.07.2010
Сообщения: 24
|
пост обновлен, 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 года) , вообщем надо или облегчать код убирая просчет далеких экстремумов (сделаю так ) или ограничивать обсчет видимой частью графика +- необходимые данные. но как это сделать понятия не имею пока.. |
|
|
Посмотреть профиль Отправить личное сообщение |
![](images/spacer.gif) |
000
Site Admin
![](images/avatars/183029264847fb5337d4ea4.gif)
Зарегистрирован: 10.12.2007
Сообщения: 9106
|
Да в общем нормально написано. Плохо только, что еще один цикл. Лучше конечно засунуть это в уже существующий.
PlotText надо выводить именно в цикле потому, что PlotText массив выводить не умеет. Так, что там все нормально.
На счет видимой части. Если в коде нет SetBarsRequired, то AFL и сам считает не все бары а только видимые с некоторым запасом. |
_________________ ceterum censeo carthaginem esse delendam
Удачи. Олег. |
|
Посмотреть профиль Отправить личное сообщение Посетить сайт автора |
![](images/spacer.gif) |
aztec
Зарегистрирован: 08.07.2010
Сообщения: 24
|
Олег, подбрось мысль пожалуйста - как исхитриться в след. задачке - весь моск уже сломал что то никак не выходит, valuewhen не пойму как прикрутить.
есть 2 массива, как получить из них arr3 (без цикла )
000001000000000010000000 arr1
001000000100010000000100 arr2
001000111100010001111100 arr3
если на словах - смотрим arr1 и после 1 заменяем значением "1" нули в arr2 до ближайшей единицы в arr2.
спасибо. буду еще сам думать ) но пока увы ![Confused](images/smiles/icon_confused.gif) |
|
|
Посмотреть профиль Отправить личное сообщение |
![](images/spacer.gif) |
000
Site Admin
![](images/avatars/183029264847fb5337d4ea4.gif)
Зарегистрирован: 10.12.2007
Сообщения: 9106
|
Объясни получше алгоритм построения arr3 из arr1 и arr2. Я что то не понял... ![Sad](images/smiles/icon_sad.gif) |
_________________ ceterum censeo carthaginem esse delendam
Удачи. Олег. |
|
Посмотреть профиль Отправить личное сообщение Посетить сайт автора |
![](images/spacer.gif) |
aztec
Зарегистрирован: 08.07.2010
Сообщения: 24
|
000 писал(а): |
Объясни получше алгоритм построения arr3 из arr1 и arr2. Я что то не понял... ![Sad](images/smiles/icon_sad.gif) |
задача - убрать линии ПОСЛЕ точек пересечения. инвертирую arr3 и умножу на Line.
upd. 14.07мск. Cделал, одной строкой. чего вечером мудрил а... все просто, много встроенных функций
Олег, извини за беспокойство, вечером реально сидел часа 2 недогонял как, а тут что то покопался в функциях и ...опс. ![Idea](images/smiles/icon_idea.gif) |
|
|
Посмотреть профиль Отправить личное сообщение |
![](images/spacer.gif) |
000
Site Admin
![](images/avatars/183029264847fb5337d4ea4.gif)
Зарегистрирован: 10.12.2007
Сообщения: 9106
|
Хорошо. А вообще это всегда так бывает ![Smile](images/smiles/icon_smile.gif) |
_________________ ceterum censeo carthaginem esse delendam
Удачи. Олег. |
|
Посмотреть профиль Отправить личное сообщение Посетить сайт автора |
![](images/spacer.gif) |
Nayati
![](images/avatars/5269177555af5ae4db34b7.jpg)
Зарегистрирован: 27.05.2016
Сообщения: 22
Откуда: Ростов-на-Дону
|
Насколько я понял стандартный загзаг рисует только по одному массиву. Внимание вопрос! Можно ли написать Зигзаг который рисует как полагается по хаям и лоям и БЕЗ использавания циклов? Не важно что он будет перерисовываться в последней ноге , главное чтоб относительно быстро считал и как нужно по двум массивам |
|
|
Посмотреть профиль Отправить личное сообщение |
![](images/spacer.gif) |
000
Site Admin
![](images/avatars/183029264847fb5337d4ea4.gif)
Зарегистрирован: 10.12.2007
Сообщения: 9106
|
Я пока такого не видел. |
_________________ ceterum censeo carthaginem esse delendam
Удачи. Олег. |
|
Посмотреть профиль Отправить личное сообщение Посетить сайт автора |
![](images/spacer.gif) |
Nayati
![](images/avatars/5269177555af5ae4db34b7.jpg)
Зарегистрирован: 27.05.2016
Сообщения: 22
Откуда: Ростов-на-Дону
|
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 );
|
|
|
|
Посмотреть профиль Отправить личное сообщение |
![](images/spacer.gif) |
|
|
Следующая тема
Предыдущая тема
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете голосовать в опросах Вы не можете вкладывать файлы Вы не можете скачивать файлы
|
|