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



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

СообщениеДобавлено: Чт Дек 07, 2017 9:53 pm Ответить с цитатой Вернуться к началу

Мне не нравится функция зигзаг встроенная в ами по причине того что не по Хай Лоу построена плюс перерисовывает бывает. Хочется что то понятное и что я могу отредактировать если работа не устраивает.
Попытка сделать с помощью массивов и BarIndex(), HighestSince и подобных функций не удалась по причине некоторых затыков.
Фактически нужны только два последних экстремума (пик и впадина соответственно). Экстремумы ищутся с конца графика, то есть с самых свежих данных.
Алгоритм простой. Смог реализовать в mql5, так как там работа идет с каждым баром по очереди. В ами столкнулся с тем что не могу реализовать некоторые места кода связаные с работой с текущим баром.
Вот недоделанный код:
Код:
// попытка создать аналог зигзага по хай лоу

delta_proc=Optimize("ZigZag change amount", 0.28, 0.01, 4, 0.01);

delta_l = L * delta_proc/100;
delta_h = H * delta_proc/100;

i = BarIndex(); // номер текущего бара (считается от начала котировок)
n = BarCount-1-i; // номер текущего бара (считается с конца котировок, в стиле метатрейдер, 0 это текущий бар, 1 это прошлый и тд.)

por_p = Ref(L, -n) + delta_l; // пик должен быть больше por_p который считается от последнего (текущего) бара
por_d = Ref(H, -n) - delta_h;

p1 = HighestSince(H > por_p, H, 1); // уровень пика
max1_bars = HighestSinceBars (H > por_p, H, 1); // как давно был этот пик
ur_p1 = p1 - delta_l; // уровень подтвержденного пика

d1 = LowestSince(L < por_d, L, 1); // уровень дна
min1_bars = LowestSinceBars(L < por_d, L, 1);
ur_d1 = d1 + delta_h; // уровень подтвержденного дна

first_d = IIf(min1_bars < max1_bars, True, False); // последний дно
first_p = IIf(min1_bars > max1_bars, True, False); // последний пик

us_d = H > ur_d1 AND L < ur_d1; // условие подтвержденного дна
us_p = H > ur_p1 AND L < ur_p1; // условие подтвержденного пика

BuyPrice = ur_d1;
Buy = first_d AND us_d;
SellPrice = ur_p1;
Sell = first_p AND us_p;

ShortPrice = ur_p1;
Short = first_p AND us_p;
CoverPrice = ur_d1;
Cover = first_d AND us_d;


в частности не получается вот этот участок.

Код:
i = BarIndex(); // номер текущего бара (считается от начала котировок)
n = BarCount-1-i; // номер текущего бара (считается с конца котировок, в стиле метатрейдер, 0 это текущий бар, 1 это прошлый и тд.)

por_p = Ref(L, -n) + delta_l; // пик должен быть больше por_p который считается от последнего (текущего) бара
por_d = Ref(H, -n) - delta_h;


Мне необходимо найти ближайший подтвержденный экстремум (пик или впадина). Но для этого мне надо как то зафиксировать уровень por_p (для пика) расчитанный от текущего бара чтобы сравнивать все предыдущие бары на предмет пересечения.
Для поиска подтвержденного пика, пример на mql:
Код:
//+------------------------------------------------------------------+
//| Определяет ближайший пик на указанном интервале, который         |
//| располагается выше цены price1 на расстоянии > размах перепада   |
//+------------------------------------------------------------------+
int maximum1(int a,int b)
  {
   double High[],Low[];
   ArraySetAsSeries(Low,true);
   ArraySetAsSeries(High,true);
   int copied4=CopyLow(Symbol(),0,0,bars+2,Low);
   int copied5=CopyHigh(Symbol(),0,0,bars+2,High);

   int i,e;
   e=bars;
//--- значение цены, выше которой должен располагаться пик уже с добавлением размаха перепада
   double pr1= NormalizeDouble( Low[0]+(Low[0] * delta_proc/100), Digits());
   for(i=a;i<=b;i++) // поиск пика в окне заданном параметрами a и b
     {
      if (Low[i]<Low[a])
      {
       a = i;        //переопределение уровня от которого считается pr1, то есть ищем хай больший чем low[0]
       pr1 = Low[i]+(Low[i] * delta_proc/100); // новое значение порога цены для поиска вершины
      }
      //--- определяется ближайший пик, после которого начинается падение цены
      if(High[i]>pr1 && High[i]>High[i+1] && i !=0)
        {
         e=i;
         break;
        }
     }
//---
   return(e);
  }
 

то есть для поиска подтвержденной вершины берем Low текущего бара, прибавляем к нему процент от цены и получаем уровень Por_p, далее смотрим когда было пробитие этого уровня и сколько баров назад это произошло. Фактически должно выполниться условие
Код:
H > por_p

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


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

СообщениеДобавлено: Пт Дек 08, 2017 9:45 pm Ответить с цитатой Вернуться к началу

На форуме полно всяких зигзагов. Я легко напишу еще один, но я так и не смог понять что именно требуется. Sad

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



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

СообщениеДобавлено: Пт Дек 08, 2017 10:16 pm Ответить с цитатой Вернуться к началу

000 писал(а):
На форуме полно всяких зигзагов. Я легко напишу еще один, но я так и не смог понять что именно требуется. Sad

необходимо написать зигзаг по хай лоу, экстремумы ищутся с конца графика, то есть с самых свежих данных. Если реально сделать через массивы то через масивы (для скорости оптимизации), если нет то тогда через for . Экстремумы должны быть подтвержденные, то есть пик или впадина считаются зафиксированными если с момента пика цена упала на процент зигзага. При появлении подтвержденной вершины открывается сделка short. При появлении подтвержденной впадины Short закрывается и открывается Buy. Закрытие Buy при появлении подтвержденной вершины.
Посмотреть профиль Отправить личное сообщение
iddqd



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

СообщениеДобавлено: Пт Дек 08, 2017 10:27 pm Ответить с цитатой Вернуться к началу

Я попробовал через массивы , но у меня не выходит. Постоянно на какие то грабли натыкаюсь связанные фиксацией уровня (расчитанного от текущего бара) для последующего сравнения-поиска события когда какой либо из предыдущих баров пересекает этот уровень.
Посмотреть профиль Отправить личное сообщение
iddqd



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

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

Основная проблема в этом (пример для поиска подтвержденной вершины, причем поиск идет от текущего момента в прошлое, то есть с конца графика):
1. delta_proc - это процент зигзага
есть текущий бар c данными High и Low.
2.
Код:
delta_l = L * delta_proc/100;

Это процент изменения цены переведенный в абсолютные единицы, посчитанный соответственно для Low.
3. Это порог цены выше которой должен подняться High (ищем это событие от текущего момента в прошлое)
Код:
por_p = L + delta_l;

4. Ищем это событие
Код:
p1 = HighestSince(H > por_p, H, 1);
max1_bars = HighestSinceBars (H > por_p, H, 1);


Именно в третьем и четвертом пункте у меня засада.
В таком виде как сейчас написано работать не будет, так как для каждого предыдущего бара будет свой уровень por_p, а мне нужно сравнить High предыдущих баров с уровнем por_p расчитанным по данным текущего бара.
Как мне реализовать поиск (пункт 4) High > por_p, причем por_p рассчитан по данным последнего (текущего) бара.

Вот эта конструкция тоже не работает. бьет ошибку.
Код:
i = BarIndex(); // номер текущего бара (считается от начала котировок)
por_p = L + delta_l; // пик должен быть больше por_p который считается от последнего (текущего) бара
p1 = HighestSince(H > por_p[i], H, 1);


Вообщем мозг сломался на хз какой попытке.
Посмотреть профиль Отправить личное сообщение
000
Site Admin


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

СообщениеДобавлено: Вс Дек 10, 2017 12:49 pm Ответить с цитатой Вернуться к началу

Зигзаг можно написать только циклом.

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


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

СообщениеДобавлено: Вс Дек 10, 2017 1:44 pm Ответить с цитатой Вернуться к началу

Типа как то так
Код:

rev = 10; // % реверс
dir = 0; // направление
Up = Dp = UA = DA = 0;

for(i = BarCount - 1; i > 1; i--)
{
   if(i == BarCount - 1)
   {
      hh = H[i];
      ll = L[i];
   }
   else if(dir == 0)
   {
      if(H[i]*(1-rev/100) > ll)
      {
         dir = 1;
         hh = H[i];
         Up = i;
      }
      else if(L[i]*(1+rev/100) < hh)
      {
         dir = -1;
         ll = L[i];
         Dp = i;
      }
   }
   else if(dir == 1)
   {
      if(H[i] > hh)
      {
         hh = H[i];
         Up = i;
      }
      else if(L[i]*(1+rev/100) < hh)
      {
         dir = -1;
         ll = L[i];
         UA[Up] = H[Up];
      }
   }
   else if(dir == -1)
   {
      if(L[i] < ll)
      {
         ll = L[i];
         Dp = i;
      }
      else if(H[i]*(1-rev/100) > ll)
      {
         dir = 1;
         hh = H[i];
         DA[Dp] = L[Dp];
      }
   }
}

Plot(C, "", colorBlack, styleCandle);
PlotShapes(IIf(UA, shapeUpTriangle, shapeNone), colorRed, 0, H, 12);
PlotShapes(IIf(DA, shapeDownTriangle, shapeNone), colorRed, 0, L, 12);

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



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

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

000 писал(а):
Типа как то так

Спасибо огромое Олег, пошел разбираться что и как
Посмотреть профиль Отправить личное сообщение
home30



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

СообщениеДобавлено: Пн Май 21, 2018 10:06 pm Ответить с цитатой Вернуться к началу

И снова здравствуйте. Как запомнить самое нижнее лоу из всех свечей, пока цена находилась над параболиком ? А когда цена перешла под параболик, то использовать это значение как BuyLevel. Пишу так:

Код:

L_long = LowestSince( Cross(O,parab), L ) ;
L_long = ValueWhen( Cross(O,parab), L_long);

В итоге рисует только лоу первой свечи после Cross(O,Parab). Что я делаю не так ?
Посмотреть профиль Отправить личное сообщение
000
Site Admin


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

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

Код:

qqq = LowestSince( Cross( O, SAR( 0.02, 0.2 )), L, 1 );
www = ValueWhen(Ref(Cross( SAR( 0.02, 0.2 ), O ), 1), qqq);

Plot(qqq, "111", colorRed);
Plot(IIf(O > SAR( 0.02, 0.2 ), qqq, www), "111", colorBlue);

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



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

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

Вопрос вроде банальный, но сейчас я никак не допру как это описать. Нужен ценовой канал который вычисляет цену хая(лоя) , который был вершиной (низиной) с периодом в N баров до него.Т.е. не просто канал, а типа фрактал соего рода.
Посмотреть профиль Отправить личное сообщение
000
Site Admin


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

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

Типа H==HHV( H, period )

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



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

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

000 писал(а):
Типа H==HHV( H, period )

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



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

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

000 писал(а):
Типа H==HHV( H, period )

Как я заметил это либо неосушествимо на этом языке , что маловероятно.Либо вы не поняли что я хотел сказать . Это вроде простой ценовой канал , только вершину вычисляет как следствие образования текущего хая , т.е. вершина это следствие что это вершина N хаев на пероде предшедствующем ей. Вершина в этой конструкции это та цена которую можно видеть как максимальная цена периода до этой цены.
Посмотреть профиль Отправить личное сообщение
000
Site Admin


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

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

Ну попробуй так, чтобы я понял. С картинками чтоли... Laughing

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


 Перейти:   



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


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

File Attachment © by Meik Sievertsen