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



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

СообщениеДобавлено: Пт Мар 21, 2008 11:51 am Ответить с цитатой Вернуться к началу

На графике рисуются зеленые и синие точки, зеленая точка говорит о сформировавшемся краткосрочном максимуме, синяя, наоборот, о краткосрочном минимуме.
Дело в том, что точки по факту рисуются в тот момент, когда уже точно ясно, что это или минимум или максимум, т.е. сегодня, показывает что вчера или несколько дней назад был этот самым минимум или максимум.

Как сделать так точка рисовалась на месте этого минимума или максимума (как показано на рисунке), а не постфактум? Shocked

И как можно объединить эти точки линией, минуя промежуточные значения без точек?

Код:
-------------------------------------------------
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
Сообщения: 8507

СообщениеДобавлено: Сб Мар 22, 2008 5:53 pm Ответить с цитатой Вернуться к началу

Так пойдет?
Код:



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

СообщениеДобавлено: Сб Мар 22, 2008 7:17 pm Ответить с цитатой Вернуться к началу

000 писал(а):
Так пойдет?


Да, то что нужно...

Теперь осталось разобраться в коде и написать среднесрочные минимумы и максимумы.

Олег, огромнейшее спасибо Smile
Посмотреть профиль Отправить личное сообщение
000
Site Admin


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

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

Будут вопросы - спрашивай.

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



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

СообщениеДобавлено: Вс Мар 23, 2008 2:31 pm Ответить с цитатой Вернуться к началу

Всем привет, а какой смысл в этом индикаторе? На графике все красиво, но реально сигналы появляются два бара назад.
Посмотреть профиль Отправить личное сообщение
Griff



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

СообщениеДобавлено: Пн Мар 24, 2008 12:15 pm Ответить с цитатой Вернуться к началу

На самом деле никаких сигналов на этом индикаторе нет, на базе краткосрочных минимумов и максимумов (зеленый треугольник это максимум, красный - минимум) строятся среднесрочные минимумы и максимумы... подробнее об этом можно почитать в книге Ларри Вильямса "Долгосрочные секреты краткосрочной торговли".
Посмотреть профиль Отправить личное сообщение
Griff



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

СообщениеДобавлено: Ср Мар 26, 2008 11:09 am Ответить с цитатой Вернуться к началу

Вопрос уже касается среднесрочных максимумов.

Код:

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? Как запустить цикл?

Мои попытки сделать этот цикл пока не принесли положительного результата, а может я вообще не с той стороны копаю? Smile
Посмотреть профиль Отправить личное сообщение
000
Site Admin


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

СообщениеДобавлено: Ср Мар 26, 2008 3:18 pm Ответить с цитатой Вернуться к началу

Может лучше алгоритм опишешь по русски? А то прошлый код пришлось слишком много времени потратить пока в алгоритм въехал.

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



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

СообщениеДобавлено: Ср Мар 26, 2008 3:36 pm Ответить с цитатой Вернуться к началу

Среднесрочный максимум - это краткосрочный максимум, с более низкими краткосрочными максимумами по обеим сторонам, соответственно среднесрочный минимум - это краткосрочный минимум с более высокими краткосрочными минимумами по обеим сторонам.
Посмотреть профиль Отправить личное сообщение
000
Site Admin


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

СообщениеДобавлено: Ср Мар 26, 2008 11:45 pm Ответить с цитатой Вернуться к началу

В AFL многие вещи проще писать не используя циклы. Практически все можно написать без них. Конечно это требует некоторого навыка... Smile
В данном случае.
Код:

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) ) значит это и есть среднесрочный максимум. Smile

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



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

СообщениеДобавлено: Чт Мар 27, 2008 7:59 am Ответить с цитатой Вернуться к началу

Вот со знанием языка есть определенные трудности, не говоря уже про навыки... спасибо за помощь Smile
Посмотреть профиль Отправить личное сообщение
Griff



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

СообщениеДобавлено: Пн Мар 31, 2008 11:00 am Ответить с цитатой Вернуться к началу

Помогите разобраться со среднесрочными минимумами и максимумами, считает все нормально, а вот с рисованием линии есть проблема. Shocked

Код:

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);


Для большей ясности рисунок:
Image
Посмотреть профиль Отправить личное сообщение
000
Site Admin


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

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

Получилось так.
Код:

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

СообщениеДобавлено: Ср Апр 02, 2008 5:47 am Ответить с цитатой Вернуться к началу

Спасибо, все отлично. Есть конечно определенные нюансы, когда например среднесрочный минимум оказывается выше среднесрочного максимума Shocked, но уже вопрос не по коду, с точки зрения программирования все рисуется правильно.

P.S. Никаких тормозов не заметил, что я делаю не так? Smile

Еще вопрос в догонку:
От куда взялся mup1?

Код:

if(H[i] > mup1)


если я правильно понимаю, то в начале еще не хватает, чего-то подобного, или нет?

Код:

mup1 = 0;
mdw1 = 0;
Посмотреть профиль Отправить личное сообщение
000
Site Admin


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

СообщениеДобавлено: Ср Апр 02, 2008 8:06 am Ответить с цитатой Вернуться к началу

Цитата:

Еще вопрос в догонку:
От куда взялся mup1?

В первом цикле роль mup1 mdw1 выполняет y. Наверное и во вотой раз можно было их не вводить. Наверное просто было немного другое настроение когда писАл Smile

_________________
ceterum censeo carthaginem esse delendam
Удачи. Олег.
Посмотреть профиль Отправить личное сообщение Посетить сайт автора
Показать сообщения:      
Начать новую тему  Ответить на тему


 Перейти:   



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


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

File Attachment © by Meik Sievertsen