Автор |
Сообщение |
Griff
Зарегистрирован: 20.03.2008
Сообщения: 56
|
Олег, подскажи пожалуйста, как сделать так, чтобы линия mLine рисовалась не постоянно, а по факту, когда уже явно появился среднесрочный максимум или минимум (т.е. когда на графике есть все три необходимых краткосрочных максимума или минимума) |
|
|
Посмотреть профиль Отправить личное сообщение |
|
000
Site Admin
Зарегистрирован: 10.12.2007
Сообщения: 9106
|
Вроде так
Код: |
SetBarsRequired(1000000, 0);
up = L > Ref(L, -1) & H >= Ref(H, -1);
dw = L <= Ref(L, -1) & H < Ref(H, -1);
up = ExRem(up, dw);
dw = ExRem(dw, up);
swing = Flip(up, dw);
x = 0;
x0 = 0;
y = 0;
y0 = 0;
Hi = 0;
Lo = 0;
Line = Null;
function swingline(x0, x, y0, y)
{
m = (y-y0)/(x-x0);
for(j = x0; j <= x; j++)
{
Line[j] = y0 + (j-x0)*m;
}
return Line;
}
for( i = 1; i < BarCount; i++ )
{
if(swing[i] == 1)
{
if(up[i] == 1)
{
Lo[x] = y;
y0 = y;
x0 = x;
y = H[i];
x = i;
swingline(x0, x, y0, y);
}
else if(H[i] > y)
{
y = H[i];
x = i;
swingline(x0, x, y0, y);
}
}
else
{
if(dw[i] == 1)
{
Hi[x] = y;
y0 = y;
x0 = x;
y = L[i];
x = i;
swingline(x0, x, y0, y);
}
else if(L[i] < y)
{
y = L[i];
x = i;
swingline(x0, x, y0, y);
}
}
}
Hm = Hi > 0;
Lm = Lo > 0;
mup = Hm & ValueWhen(Hm, H, 2) < H & ValueWhen(Hm, H, 0) < H;
mdw = Lm & ValueWhen(Lm, L, 2) > L & ValueWhen(Lm, L, 0) > L;
mswing = 1; // принимаем начальное значение 1 (просто так)
mLine = Null;
mup1 = 0;
function mswingline(x0, x, y0, y)
{
m = (y-y0)/(x-x0);
for(j = x0; j <= x; j++)
{
mLine[j] = y0 + (j-x0)*m;
}
return mLine;
}
x = 0;
x0 = 0;
y = 0;
y0 = 0;
for( i = 1; i < BarCount; i++ )
{
if(mswing == 1)
{
if(mup[i]) // проверяем только бары на которых среднесрочн. максимум
{
if(H[i] > mup1) // ищем самый высокий mup (если их несколько подряд)
{
x = i;
y = H[i];
mup1 = H[i]; // запоминаем новое значение mup
}
}
else if(mdw[i]) // реверс
{
mswingline(x0, x, y0, y); // рисуем новую линию свинга
mswing = 0;
mdw1 = L[i]; // запоминаем значение для последующего сравнения и поиска минимального
x0 = x;
y0 = y;
x = i;
y = L[i];
}
}
else
{
if(mdw[i]) // проверяем только бары на которых среднесрочн. мин.
{
if(L[i] < mdw1)
{
x = i;
y = L[i];
mdw1 = L[i]; // запоминаем новое значение mdw
}
}
else if(mup[i]) // реверс
{
mswingline(x0, x, y0, y); // рисуем новую линию свинга
mswing = 1;
mup1 = H[i]; // запоминаем значение для последующего сравнения и поиска максимального
x0 = x;
y0 = y;
x = i;
y = H[i];
}
}
}
Plot(C, "", colorBlack, styleBar);
PlotShapes((Hi>0)*shapeSmallDownTriangle, colorGreen, 0, H);
PlotShapes((Lo>0)*shapeSmallUpTriangle, colorRed, 0, L);
Plot(mup, "", colorGreen, styleHistogram|styleOwnScale);
Plot(mdw, "", colorRed, styleHistogram|styleOwnScale);
Plot(Line, "", colorRed);
Plot(mLine, "", colorBlue);
|
Исправил еще парочку мелких косяков |
_________________ ceterum censeo carthaginem esse delendam
Удачи. Олег. |
|
Посмотреть профиль Отправить личное сообщение Посетить сайт автора |
|
Griff
Зарегистрирован: 20.03.2008
Сообщения: 56
|
Немного не так.
У самого мысли вертятся, но что-то пока ни одна не подошла.
Ниже вторая часть кода с небольшими исправлениями:
Код: |
Hm = Hi > 0;
Lm = Lo > 0;
mup1 = 0;
mdw1 = 0;
mup = Hm & ValueWhen(Hm, H, 2) <= H & ValueWhen(Hm, H, 0) <= H;
mdw = Lm & ValueWhen(Lm, L, 2) >= L & ValueWhen(Lm, L, 0) >= L;
mswing = 1; // принимаем начальное значение 1 (просто так)
mLine = Null;
function mswingline(x0, x, y0, y)
{
m = (y-y0)/(x-x0);
for(j = x0; j <= x; j++)
{
mLine[j] = y0 + (j-x0)*m;
}
return mLine;
}
x = 0;
x0 = 0;
y = 0;
y0 = 0;
for( i = 1; i < BarCount; i++ )
{
if(mswing == 1)
{
if(mup[i]) // проверяем только бары на которых среднесрочн. максимум
{
if(H[i] > mup1) // ищем самый высокий mup (если их несколько подряд)
{
x = i;
y = H[i];
mup1 = H[i]; // запоминаем новое значение mup
}
}
else if(mdw[i]) // реверс
{
if(L[i] > mup1) // если минимум становится больше максимума
{
}
else
{
mswingline(x0, x, y0, y);
mswing = 0;
mdw1 = L[i]; // запоминаем значение для последующего сравнения и поиска минимального
x0 = x;
y0 = y;
x = i;
y = L[i];
mswingline(x0, x, y0, y);
}
}
}
else
{
if(mdw[i]) // проверяем только бары на которых среднесрочн. мин.
{
if(L[i] < mdw1)
{
x = i;
y = L[i];
mdw1 = L[i]; // запоминаем новое значение mdw
}
}
else if(mup[i]) // реверс
{
if(H[i] < mdw[i])
{
}
else
{
mswingline(x0, x, y0, y);
mswing = 1;
mup1 = H[i]; // запоминаем значение для последующего сравнения и поиска максимального
x0 = x;
y0 = y;
x = i;
y = H[i];
mswingline(x0, x, y0, y);
}
}
}
}
|
в итоге пытаюсь получить, что-то вроде этого:
==========================================
на правой стороне графика красная линия (среднесрочный линия) должна была остановиться на среднесрочной впадине, так как среднесрочной вершины еще нет
==========================================
теперь на правой стороне графика уже видно, что есть среднесрочная вершина... это стало понятно когда справа появился среднесрочный максимум
==========================================
Т.е. следующие телодвижение со стороны линии должно будет произойти или при большей среднесрочной вершине, или при среднесрочной впадине. |
|
|
Посмотреть профиль Отправить личное сообщение |
|
000
Site Admin
Зарегистрирован: 10.12.2007
Сообщения: 9106
|
Код: |
SetBarsRequired(1000000, 0);
up = L > Ref(L, -1) & H >= Ref(H, -1);
dw = L <= Ref(L, -1) & H < Ref(H, -1);
up = ExRem(up, dw);
dw = ExRem(dw, up);
swing = Flip(up, dw);
x = 0;
x0 = 0;
y = 0;
y0 = 0;
Hi = 0;
Lo = 0;
Line = Null;
function swingline(x0, x, y0, y)
{
m = (y-y0)/(x-x0);
for(j = x0; j <= x; j++)
{
Line[j] = y0 + (j-x0)*m;
}
return Line;
}
for( i = 1; i < BarCount; i++ )
{
if(swing[i] == 1)
{
if(up[i] == 1)
{
Lo[x] = y;
y0 = y;
x0 = x;
y = H[i];
x = i;
swingline(x0, x, y0, y);
}
else if(H[i] > y)
{
y = H[i];
x = i;
swingline(x0, x, y0, y);
}
}
else
{
if(dw[i] == 1)
{
Hi[x] = y;
y0 = y;
x0 = x;
y = L[i];
x = i;
swingline(x0, x, y0, y);
}
else if(L[i] < y)
{
y = L[i];
x = i;
swingline(x0, x, y0, y);
}
}
}
Hm = Hi > 0;
Lm = Lo > 0;
mup = Hm & ValueWhen(Hm, H, 2) < H & ValueWhen(Hm, H, 0) < H;
mdw = Lm & ValueWhen(Lm, L, 2) > L & ValueWhen(Lm, L, 0) > L;
mswing = 1; // принимаем начальное значение 1 (просто так)
mLine = Null;
function mswingline(x0, x, y0, y)
{
m = (y-y0)/(x-x0);
for(j = x0; j <= x; j++)
{
mLine[j] = y0 + (j-x0)*m;
}
return mLine;
}
x = 0;
x0 = 0;
y = 0;
y0 = 0;
mup1 = 0;
for( i = 1; i < BarCount; i++ )
{
if(mswing == 1)
{
if(mup[i]) // проверяем только бары на которых среднесрочн. максимум
{
if(H[i] > mup1) // ищем самый высокий mup (если их несколько подряд)
{
x = i;
y = H[i];
mup1 = H[i]; // запоминаем новое значение mup
mswingline(x0, x, y0, y);
}
}
else if(mdw[i]) // реверс
{
mswing = 0;
mdw1 = L[i]; // запоминаем значение для последующего сравнения и поиска минимального
x0 = x;
y0 = y;
x = i;
y = L[i];
mswingline(x0, x, y0, y); // рисуем новую линию свинга
}
}
else
{
if(mdw[i]) // проверяем только бары на которых среднесрочн. мин.
{
if(L[i] < mdw1)
{
x = i;
y = L[i];
mdw1 = L[i]; // запоминаем новое значение mdw
mswingline(x0, x, y0, y);
}
}
else if(mup[i]) // реверс
{
mswing = 1;
mup1 = H[i]; // запоминаем значение для последующего сравнения и поиска максимального
x0 = x;
y0 = y;
x = i;
y = H[i];
mswingline(x0, x, y0, y); // рисуем новую линию свинга
}
}
}
Plot(C, "", colorBlack, styleBar);
PlotShapes((Hi>0)*shapeSmallDownTriangle, colorGreen, 0, H);
PlotShapes((Lo>0)*shapeSmallUpTriangle, colorRed, 0, L);
Plot(mup, "", colorGreen, styleHistogram|styleOwnScale);
Plot(mdw, "", colorRed, styleHistogram|styleOwnScale);
Plot(Line, "", colorRed);
Plot(mLine, "", colorBlue);
|
|
_________________ ceterum censeo carthaginem esse delendam
Удачи. Олег. |
|
Посмотреть профиль Отправить личное сообщение Посетить сайт автора |
|
Griff
Зарегистрирован: 20.03.2008
Сообщения: 56
|
Воо, просто отлично, огромное спасибо. Оказывается самое большое зло скрывалось в поставленных мной знаками равно, по причине периодических возникновений двойных вершин и впадин
Код: |
mup = Hm & ValueWhen(Hm, H, 2) <= H & ValueWhen(Hm, H, 0) <= H;
mdw = Lm & ValueWhen(Lm, L, 2) >= L & ValueWhen(Lm, L, 0) >= L;
|
Говори адрес, куда посылать коньяк |
|
|
Посмотреть профиль Отправить личное сообщение |
|
SERGEY V.
Зарегистрирован: 24.04.2008
Сообщения: 84
Откуда: Новосибирск
|
Есть одна просьба по Ларри Вилльямсу, напишите, пожалуйста, код для Ами его индикатора «Кумулятивное накопление/распределение Уильямса» (Williams' Accumulation/ Distribution, Williams' A/D). Самому пока сложно, с Ами познакомился недели три назад, могу пока только что-нибудь совсем простое написать.
Вычисление (из справки Квика):
CumWADn = CumWadn-1 + WADn,
где
WADn = PRICEn - TL, если PRICEn > PRICEn-1,
WADn = PRICEn - TH, если PRICEn < PRICEn-1,
WADn = 0, если PRICEn = PRICEn-1,
TH = max(PRICEn-1, HIGHn) - истинный диапазон пиков,
TL = min(PRICEn-1, LOWn) – истинный диапазон донышек,
PRICEn – цена закрытия в n-ом интервале,
HIGH – максимальное значение цены в n-ом интервале,
LOW – минимальное значение цены в n-ом интервале.
Заранее большое спасибо! |
|
|
Посмотреть профиль Отправить личное сообщение |
|
000
Site Admin
Зарегистрирован: 10.12.2007
Сообщения: 9106
|
Вроде так
Код: |
TH = Max(H, Ref(C, -1));
TL = Min(L, Ref(C, -1));
WAD =
IIf(C > Ref(C, -1), C - TL,
IIf(C < Ref(C, -1), C - TH, 0));
CumWAD = Cum(WAD);
Plot(CumWAD, "", colorRed);
|
|
_________________ ceterum censeo carthaginem esse delendam
Удачи. Олег. |
|
Посмотреть профиль Отправить личное сообщение Посетить сайт автора |
|
SERGEY V.
Зарегистрирован: 24.04.2008
Сообщения: 84
Откуда: Новосибирск
|
000 писал(а): |
Вроде так
Код: |
TH = Max(H, Ref(C, -1));
TL = Min(L, Ref(C, -1));
WAD =
IIf(C > Ref(C, -1), C - TL,
IIf(C < Ref(C, -1), C - TH, 0));
CumWAD = Cum(WAD);
Plot(CumWAD, "", colorRed);
|
|
Олег (000), спасибо! |
|
|
Посмотреть профиль Отправить личное сообщение |
|
pims
Гость
|
Добрый день!
понравился индикатор Л.Вильямса пользуюсь аналогичным но руками и в экселе, тут набрел на этот прекрасный сайт
и форум, много интересного, ну и захотелось немного автоматизировать и обленгчить себе работу.Если можно
просьба доработать его под мои условия, только не знаю - что проще доработать или написать новый))) сам не
могу этого сделать, просьба- помогите с этим пожалуйста!
1. Убрать вертикальные линии, уменьшить размер треугольников обозначающих хай-лоу свинга,
до минимального значения или просто обозначать точкой, установить на нулевом баре обозначение
хай лоу при соблюдении условия, пусть отображаемый значек двигается при изменении х-л бара.
2.Данный индикатор отображает не все экстримумы цены, необходимо, что б рисовались свинги,
даже если цена бара привышает предыдущий хотя бы на 1п. Внешний бар тоже необходимо учитывать,
Экстремумы цены(свинги) могут быть на разных концах внешнего бара,Внутренний бар по отношению
к предыдущему - не учитываем. т.е нужно отобразить все колебания цены, это необходимо для
расчета точек-о них ниже. Для примера прикрепил файл со скринами, как примерно это должно
выглядеть
При смещении времени открытия\закрытия дня подробнее тут- http://amisite.ru/phpBB2/viewtopic.php?t=94
с пятницы на понедельник получается два дневных бара с одной датой пятницы, необходимо в коде эти бары
как то обьеденить если возможно, чтоб считывались хай-лоу как с одного, но чтоб это не мешало
работе индикатора с нормальным графиком.
3.произвести расчет дополнительных точек и нанесения их на график цены, начинаем расчет с нулевого бара,
отдельно для хай и лоу сыинга. для хай- берем значения цены нулевого бара( если соблюдено условие для хай
и появился значек) плюс ценовое значение 1 свинга плюс ценовое значение 2 свинга и делим на три, т.е
вычисляем среднюю цену и наносим это значение на вертикальный уровень нулевого бара, при изменении
цены в процессе торгов расчетное значение тоже меняется. Аналогично считается среднее ценовое значение
свингов лоу и наносится на вертикальный уровень нулевого бара, Отображать символами типа кружок, ромб,
квадрат размер необходимо минимально возможный, но чтоб при наложении значка на тело бара можно было
его наблюдать |
|
|
|
|
000
Site Admin
Зарегистрирован: 10.12.2007
Сообщения: 9106
|
Цитата: |
установить на нулевом баре обозначение
хай лоу при соблюдении условия, пусть отображаемый значек двигается при изменении х-л бара. |
Не понял. Напиши плиз подробнее.
Цитата: |
2.Данный индикатор отображает не все экстримумы цены, необходимо, что б рисовались свинги,
даже если цена бара привышает предыдущий хотя бы на 1п |
Тоже не понятно. Вроде должны рисоваться все при условии, что свинг бар определяется вот такими условиями
up = L > Ref(L, -1) & H >= Ref(H, -1); // лоу выше предыдущего и хай выше или равен предыдущему
dw = L <= Ref(L, -1) & H < Ref(H, -1); // хай ниже предыдущего и лоу ниже или равен предыдущему.
Цитата: |
Внешний бар тоже необходимо учитывать |
Свинги по внешнему бару встроим в уже существующие или сделать их отдельно?
Цитата: |
3.произвести расчет дополнительных точек и нанесения их на график цены, начинаем расчет с нулевого бара,
отдельно для хай и лоу сыинга. для хай- берем значения цены нулевого бара( если соблюдено условие для хай
и появился значек) плюс ценовое значение 1 свинга плюс ценовое значение 2 свинга и делим на три, т.е
вычисляем среднюю цену и наносим это значение на вертикальный уровень нулевого бара, при изменении
цены в процессе торгов расчетное значение тоже меняется. Аналогично считается среднее ценовое значение
свингов лоу и наносится на вертикальный уровень нулевого бара, Отображать символами типа кружок, ромб,
квадрат размер необходимо минимально возможный, но чтоб при наложении значка на тело бара можно было
его наблюдать |
Нулевой бар это последний (текущий) на графике? |
_________________ ceterum censeo carthaginem esse delendam
Удачи. Олег. |
|
Посмотреть профиль Отправить личное сообщение Посетить сайт автора |
|
pims
Гость
|
000 писал(а): |
Цитата: |
установить на нулевом баре обозначение
хай лоу при соблюдении условия, пусть отображаемый значек двигается при изменении х-л бара. |
Не понял. Напиши плиз подробнее. |
чтоб значек находился на текущем(нулевом) баре , даже если свинг не завершен, т.е окончательный максимум еще не определился
000 писал(а): |
Цитата: |
2.Данный индикатор отображает не все экстримумы цены, необходимо, что б рисовались свинги,
даже если цена бара привышает предыдущий хотя бы на 1п |
Тоже не понятно. Вроде должны рисоваться все при условии, что свинг бар определяется вот такими условиями
up = L > Ref(L, -1) & H >= Ref(H, -1); // лоу выше предыдущего и хай выше или равен предыдущему
dw = L <= Ref(L, -1) & H < Ref(H, -1); // хай ниже предыдущего и лоу ниже или равен предыдущему. |
свинг в верх определяется -лоу выше предыдущего или равен предыдущему и хай выше предыдущего
свинг в низ определяется -хай ниже предыдущего или равен предыдущемуи и лоу ниже предыдущего.
Внешний бар тоже необходимо учитывать
000 писал(а): |
Свинги по внешнему бару встроим в уже существующие или сделать их отдельно? |
Немного не допонял вопроса( скорее всего в существующий, отдельно не нужно
000 писал(а): |
Цитата: |
3.произвести расчет дополнительных точек и нанесения их на график цены, начинаем расчет с нулевого бара,
отдельно для хай и лоу сыинга. для хай- берем значения цены нулевого бара( если соблюдено условие для хай
и появился значек) плюс ценовое значение 1 свинга плюс ценовое значение 2 свинга и делим на три, т.е
вычисляем среднюю цену и наносим это значение на вертикальный уровень нулевого бара, при изменении
цены в процессе торгов расчетное значение тоже меняется. Аналогично считается среднее ценовое значение
свингов лоу и наносится на вертикальный уровень нулевого бара, Отображать символами типа кружок, ромб,
квадрат размер необходимо минимально возможный, но чтоб при наложении значка на тело бара можно было
его наблюдать |
Нулевой бар это последний (текущий) на графике? |
да, текущий |
|
|
|
|
Naumov
Зарегистрирован: 25.12.2009
Сообщения: 9
Откуда: Volgograd
|
Олег, добрый день.
Возвращаясь к уже решенной задаче. Помоги, пожалуйста, разобраться с тем, каким образом удалось реализовать следующее требование:
Griff писал(а): |
...
Дело в том, что точки по факту рисуются в тот момент, когда уже точно ясно, что это или минимум или максимум, т.е. сегодня, показывает что вчера или несколько дней назад был этот самым минимум или максимум.
Как сделать так точка рисовалась на месте этого минимума или максимума (как показано на рисунке), а не постфактум?
... |
Потратил ни один день, и никак не могу понять, как удалось избежать запаздывания в один бар при построении экстремумов (да и всей в целом) свинговой линии.
Заранее спасибо. |
_________________ "Когда эту задачу решат, она будет считаться простой." GE. |
|
Посмотреть профиль Отправить личное сообщение |
|
000
Site Admin
Зарегистрирован: 10.12.2007
Сообщения: 9106
|
Если я правильно помню, то там в цикле просматриваются бары с условиями
Код: |
up = L > Ref(L, -1) & H >= Ref(H, -1);
dw = L <= Ref(L, -1) & H < Ref(H, -1); |
нийден первый up смотрим дальше если опять up, то переносим условия на него, смотрим дальше если опять up, то опять переносим условия...
Вот как то так. |
_________________ ceterum censeo carthaginem esse delendam
Удачи. Олег. |
|
Посмотреть профиль Отправить личное сообщение Посетить сайт автора |
|
Naumov
Зарегистрирован: 25.12.2009
Сообщения: 9
Откуда: Volgograd
|
Олег, спасибо.
Буду копать в этом направлении. |
_________________ "Когда эту задачу решат, она будет считаться простой." GE. |
|
Посмотреть профиль Отправить личное сообщение |
|
DMITRY
Зарегистрирован: 18.09.2009
Сообщения: 179
|
Привет Олег, во избежание ошибок решил все-таки тоже уточнить один момент, интересует вопрос подглядывания при прокрутке функции (не только этой темы) типа реалтайм на ценовой истории. Я правильно понимаю что если график открыт в любом месте ценовой истории, ф-ция строится строго на основе данных последнего бара видимого на экране, без подглядывания в будующее, все что находится дальше Ами полностью игнорирует, или все же необходимо во избежание подглядывания вводить какие-то параметры? |
|
|
Посмотреть профиль Отправить личное сообщение |
|
|
|
Следующая тема
Предыдущая тема
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете голосовать в опросах Вы не можете вкладывать файлы Вы не можете скачивать файлы
|
|