Автор |
Сообщение |
Griff
Зарегистрирован: 20.03.2008
Сообщения: 56
|
На графике рисуются зеленые и синие точки, зеленая точка говорит о сформировавшемся краткосрочном максимуме, синяя, наоборот, о краткосрочном минимуме.
Дело в том, что точки по факту рисуются в тот момент, когда уже точно ясно, что это или минимум или максимум, т.е. сегодня, показывает что вчера или несколько дней назад был этот самым минимум или максимум.
Как сделать так точка рисовалась на месте этого минимума или максимума (как показано на рисунке), а не постфактум?
И как можно объединить эти точки линией, минуя промежуточные значения без точек?
Код:
-------------------------------------------------
YH = High [0];
YL = Low [0];
LM [0] = 0;
LM_i [0] = 0;
for( i = 1; i < BarCount; i++ )
{
if ( YL <= Low [i] AND YH >= High [i] ) {LM [i] = LM [i - 1];}
else
{
if ( YL <= Low [i] AND YH < High [i] ) {LM [i] = 1;} ;
if ( YL > Low [i] AND YH >= High [i] ) {LM [i] = -1;} ;
if ( YL > Low [i] AND YH < High [i] ) {LM [i] = LM [i - 1];} ;
YH = High [i];
YL = Low [i];
}
if ( LM [i] * LM [i - 1] == -1 ) {LM_i [i] = 1;} ;
}
PlotShapes( IIf( LM_i == 1, shapeSmallCircle, shapeNone ), IIf( Ref( LM, -1) == 1, colorGreen, colorBlue ));
-------------------------------------------------
Ссылка на рисунок:
http://dl.filehoster.ru/files/e2ad275be697cd9886e0fb68b206107068a32469fc0663/Clip_17.jpg |
|
|
Посмотреть профиль Отправить личное сообщение |
|
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 = 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);
}
}
}
Plot(C, "", colorBlack, styleBar);
PlotShapes((Hi>0)*shapeSmallDownTriangle, colorGreen, 0, H);
PlotShapes((Lo>0)*shapeSmallUpTriangle, colorRed, 0, L);
Plot(Line, "", colorRed);
|
|
_________________ ceterum censeo carthaginem esse delendam
Удачи. Олег. |
|
Посмотреть профиль Отправить личное сообщение Посетить сайт автора |
|
Griff
Зарегистрирован: 20.03.2008
Сообщения: 56
|
000 писал(а): |
Так пойдет?
|
Да, то что нужно...
Теперь осталось разобраться в коде и написать среднесрочные минимумы и максимумы.
Олег, огромнейшее спасибо |
|
|
Посмотреть профиль Отправить личное сообщение |
|
000
Site Admin
Зарегистрирован: 10.12.2007
Сообщения: 9106
|
Будут вопросы - спрашивай. |
_________________ ceterum censeo carthaginem esse delendam
Удачи. Олег. |
|
Посмотреть профиль Отправить личное сообщение Посетить сайт автора |
|
Сергей
Зарегистрирован: 16.03.2008
Сообщения: 168
|
Всем привет, а какой смысл в этом индикаторе? На графике все красиво, но реально сигналы появляются два бара назад. |
|
|
Посмотреть профиль Отправить личное сообщение |
|
Griff
Зарегистрирован: 20.03.2008
Сообщения: 56
|
На самом деле никаких сигналов на этом индикаторе нет, на базе краткосрочных минимумов и максимумов (зеленый треугольник это максимум, красный - минимум) строятся среднесрочные минимумы и максимумы... подробнее об этом можно почитать в книге Ларри Вильямса "Долгосрочные секреты краткосрочной торговли". |
|
|
Посмотреть профиль Отправить личное сообщение |
|
Griff
Зарегистрирован: 20.03.2008
Сообщения: 56
|
Вопрос уже касается среднесрочных максимумов.
Код: |
Lm = Hi > 0; //берется из кода краткосрочных мин и макс
Q [0] = 0;
j = 2;
for( i = 100; i < BarCount; i++)
{
if(Lm [i] == 1 AND Lm [i - j] == 1)
{
if(H[i] > H[i - j])
{Q[i] = 1;}
else
{Q[i] = 2;}
}
else
{Q[i] = 3;} // при этом условии должен запускаться цикл типа j++, и пока не будет найден день-N (который в прошлом был краткосрочным максимумом) не должен срабатывать цикл i++
}
Plot( Q, "Q", colorBlue, styleHistogram);
|
Если я правильно понимаю, то логически это должно быть так:
если сегодня краткосрочный максимум, то мы должны узнать какой был предыдущий краткосрочный максимум (а он был N-дней назад) и если сегодня максимальная цена больше, чем у предыдущего максимума тогда Q сегодня = 1, если нет, то Q сегодня = 2...
Как найти этот день-N? Как запустить цикл?
Мои попытки сделать этот цикл пока не принесли положительного результата, а может я вообще не с той стороны копаю? |
|
|
Посмотреть профиль Отправить личное сообщение |
|
000
Site Admin
Зарегистрирован: 10.12.2007
Сообщения: 9106
|
Может лучше алгоритм опишешь по русски? А то прошлый код пришлось слишком много времени потратить пока в алгоритм въехал. |
_________________ ceterum censeo carthaginem esse delendam
Удачи. Олег. |
|
Посмотреть профиль Отправить личное сообщение Посетить сайт автора |
|
Griff
Зарегистрирован: 20.03.2008
Сообщения: 56
|
Среднесрочный максимум - это краткосрочный максимум, с более низкими краткосрочными максимумами по обеим сторонам, соответственно среднесрочный минимум - это краткосрочный минимум с более высокими краткосрочными минимумами по обеим сторонам. |
|
|
Посмотреть профиль Отправить личное сообщение |
|
000
Site Admin
Зарегистрирован: 10.12.2007
Сообщения: 9106
|
В AFL многие вещи проще писать не используя циклы. Практически все можно написать без них. Конечно это требует некоторого навыка...
В данном случае.
Код: |
HiSr = Hi > 0 & ValueWhen(Hi > 0, H, 2) < H & ValueWhen(Hi>0, H, 0) < H;
|
Расшифрую. Если имеется пик (Hi > 0 ) и предыдущая вершина ниже чем текущая (ValueWhen(Hi > 0, H, 2) //двойка потому, что если единица, то он видит ту вершину на которой находится) и следующая вершина ниже чем текущая (ValueWhen(Hi>0, H, 0) ) значит это и есть среднесрочный максимум. |
_________________ ceterum censeo carthaginem esse delendam
Удачи. Олег. |
|
Посмотреть профиль Отправить личное сообщение Посетить сайт автора |
|
Griff
Зарегистрирован: 20.03.2008
Сообщения: 56
|
Вот со знанием языка есть определенные трудности, не говоря уже про навыки... спасибо за помощь |
|
|
Посмотреть профиль Отправить личное сообщение |
|
Griff
Зарегистрирован: 20.03.2008
Сообщения: 56
|
Помогите разобраться со среднесрочными минимумами и максимумами, считает все нормально, а вот с рисованием линии есть проблема.
Код: |
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;
mup = ExRem(mup, mdw);
mdw = ExRem(mdw, mup);
mswing = Flip(mup, mdw);
x = 0;
x0 = 0;
y = 0;
y0 = 0;
MHi = 0;
MLo = 0;
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;
}
for( i = 1; i < BarCount; i++ )
{
if(mswing[i] == 1)
{
if(mup[i] == 1)
{
MLo[x] = y;
y0 = y;
x0 = x;
y = H[i];
x = i;
mswingline(x0, x, y0, y);
}
else if(H[i] > y)
{
y = H[i];
x = i;
mswingline(x0, x, y0, y);
}
}
else
{
if(mdw[i] == 1)
{
MHi[x] = y;
y0 = y;
x0 = x;
y = L[i];
x = i;
mswingline(x0, x, y0, y);
}
else if(L[i] < y)
{
y = L[i];
x = i;
mswingline(x0, x, y0, y);
}
}
}
|
Проблема, как я считаю в этом месте (так как конечной точной ориентирования является максимум цены дня, а не среднесрочный максимум):
Код: |
else if(H[i] > y)
y = H[i];
x = i;
mswingline(x0, x, y0, y);
|
и сооветственно тут:
Код: |
else if(L[i] < y)
y = L[i];
x = 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;
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]) // реверс
{
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
mswingline(x0, x, y0, y);
}
}
else if(mup[i]) // реверс
{
mswingline(x0, x, y0, y); // рисуем новую линию свинга
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);
|
Вроде работает, только вот код очень плохой. Два полных цикла не считая функций swingline. Уже ощутимо притормаживает... |
_________________ ceterum censeo carthaginem esse delendam
Удачи. Олег. |
|
Посмотреть профиль Отправить личное сообщение Посетить сайт автора |
|
Griff
Зарегистрирован: 20.03.2008
Сообщения: 56
|
Спасибо, все отлично. Есть конечно определенные нюансы, когда например среднесрочный минимум оказывается выше среднесрочного максимума , но уже вопрос не по коду, с точки зрения программирования все рисуется правильно.
P.S. Никаких тормозов не заметил, что я делаю не так?
Еще вопрос в догонку:
От куда взялся mup1?
если я правильно понимаю, то в начале еще не хватает, чего-то подобного, или нет?
|
|
|
Посмотреть профиль Отправить личное сообщение |
|
000
Site Admin
Зарегистрирован: 10.12.2007
Сообщения: 9106
|
Цитата: |
Еще вопрос в догонку:
От куда взялся mup1?
|
В первом цикле роль mup1 mdw1 выполняет y. Наверное и во вотой раз можно было их не вводить. Наверное просто было немного другое настроение когда писАл |
_________________ ceterum censeo carthaginem esse delendam
Удачи. Олег. |
|
Посмотреть профиль Отправить личное сообщение Посетить сайт автора |
|
|
|
Следующая тема
Предыдущая тема
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете голосовать в опросах Вы не можете вкладывать файлы Вы не можете скачивать файлы
|
|