Выявления диагонали движущего объекта по спирали, симметрии взаимно вложенных фаз и т.п. - страница 2

 
Maxim Kuznetsov #:

от MA-шек можно (и нужно) получать менее запаздывающие вещи. Ближе к теме ТС, делал себе индикатор считающий из толпы МА-шек кол-во взаимных пересечений вверх/вниз. Получается показатель линейности движения, актуальный и не опаздывающий. 

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

 
Nikolai Semko #:

Да, Михаил, тяжело устанавливаются новые нейронные связи в мозгу. Понимаю хорошо. Но это важно для эволюции. ))
Важно понимать, в какой системе координат вычислются коэф. a,b,c.

Можно их рассчитывать в барах и цене, можно во времени и в цене, а можно в пикселях. Главное не забывать о пересчете в нужную систему координат.

Если есть пиксельные координаты, а нужно получить время или бар и цену, то есть соответствующие функции (в iCanvas):

а если, наоборот необходимо получить пиксельные координаты из цены, времени и номера бара, то есть функции:

Канвас рисует в пикселях. Поэтому, пожалуй, разумнее имеющиеся точки каждый раз пересчитывать в пиксельные координаты. Для пиксельных координат расчитывать a, b, c, а потом сразу строить в пикселей без перевода в другую систему координат.
Можно посчитать конечно коэффициенты a, b, c для баров и цене, но тогда придется при рисовании каждый раз преобразовывать координаты в пиксельные на каждом шаге. 

Для демонстрации 2 простых скрипта. Один рисует параболический канал по 4м точкам (два экстремума вверху, а два внизу), а другой параболу по 3м точкам.

Сначала задаем точки в коордитатах бар-цена, а потом их переводим в пиксельные координаты. После этого получаем коэф. a,b,c

ЗЫ С Максимом согласен. Рыбы здесь нет. Ибо что можно получить от запаздывающих машек кроме как еще более запаздывающий сурогат. 
Но для красоты, я бы тебе порекомендовал реализовать подобную горизонтальную гистограмму, только вместо накапливания цены на предыдущих барах, нужно накапливать машки по текущему бару. Думаю это будет более наглядно. Причем каждую горизонтальную линию этой гистограммы можно окрашивать в два цвета (например сначала зеленый (наклон машек вверх), а потом красный (наклон машек вниз) 
что-то типа такого 

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

Благодарю Николай за очередное объяснение!) Благодарю за терпение!

Это правильная логика будет? если задача узнать цену канала на первом баре[0], при условии что в координатах расчёта канала ( Canvas.X((datetime)bar1)) задано время.

   for(double x = x1; x < W.Width; x++)
      if(Canvas.TimePos(x)==nb.m_time) // nb.m_time - время первого бара
        {
         double Pr= Canvas.Price(pre_y);
        }
 double pre_y = a*x1*x1+b*x1+c;
// рисуем две параболы
   for(double x = x1+step; x < W.Width; x+=step)
     {
      double y = a*x*x+b*x+c;
      Canvas.LineD(x-step, pre_y,x,y,clorUpper);
      Canvas.LineD(x-step, pre_y+h,x,y+h,clorLower);
      pre_y = y;
    
     
      if(Canvas.TimePos(x)==nb.m_time)
        {
     //    double bar= Canvas.Bar(x);// Canvas.Bar(x);
         double Pr= Canvas.Price(pre_y);
        }

    }  
     
 
Mikhail Toptunov #:

Благодарю Николай за очередное объяснение!) Благодарю за терпение!

Это правильная логика будет? если задача узнать цену канала на первом баре[0], при условии что в координатах расчёта канала ( Canvas.X((datetime)bar1)) задано время.

for(double x = x1; x < W.Width; x++)
      if(Canvas.TimePos(x)==nb.m_time) // nb.m_time - время первого бара
        {
         double Pr= Canvas.Price(pre_y);
        }

это слишком сложно и убийственно в плане производительности.
все намного проще. Время самого нового бара (нулевого бара) - это iTime(_Symbol,_Period,0)
чтобы получить номер бара по времени, то для этого есть функция iBarShift()

Документация по MQL5: Доступ к таймсериям и индикаторам / iBarShift
Документация по MQL5: Доступ к таймсериям и индикаторам / iBarShift
  • www.mql5.com
iBarShift - Доступ к таймсериям и индикаторам - Справочник MQL5 - Справочник по языку алгоритмического/автоматического трейдинга для MetaTrader 5
 
Nikolai Semko #:

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

можно и так :-)

нам же не важен художественный вид интерполяции/экстраполяции. вообще говоря плевать где конкретно оно проходит и как выглядит, важно с минимальным лагом и хорошей надёжностью определять разворот.

 
Nikolai Semko #:

это слишком сложно и убийственно в плане производительности.
все намного проще. Время самого нового бара (нулевого бара) - это iTime(_Symbol,_Period,0)
чтобы получить номер бара по времени, то для этого есть функция iBarShift()

Обращение к классу чтобы узнать время - это убийство производительности? 

Просто расчёт у меня  по всем ТФ, пришлось создавать класс где хранятся данные по всем ТФ.


А вообще вот , что получилось.

 CNewBar* nb = list_new_bar.At(0); - убийство производительности
   int b0= Canvas.X(iTime(nb.m_symbol,nb.m_timeframe,0));     // текущее время

   double a0=(((double)x2*x2-x4*x4)*(x1-x3)-((double)x1*x1-x3*x3)*(x2-x4));
   if(a0==0)
      return;
   double a=((y2-y4)*(x1-x3)-(y1-y3)*(x2-x4))/a0;
   double b=(y2-y4-a*(x2*x2-x4*x4))/(x2-x4);
   double  c=y1-a*x1*x1-b*x1;
   double  c1=y2-a*x2*x2-b*x2;
   double  h=c1-c;

   double step = 10;
   double pre_y = a*x1*x1+b*x1+c;
// рисуем две параболы
   for(double x = x1+step; x < W.Width; x+=step)
     {
      double y = a*x*x+b*x+c;
      Canvas.LineD(x-step, pre_y,x,y,clorUpper);
      Canvas.LineD(x-step, pre_y+h,x,y+h,clorLower);
      pre_y = y;

      if(x-step/2<=b0 && x+step/2>=b0)// ищем последний бар в координатах
        {
         ParCoo[count].UP= Canvas.Price(pre_y);
         ParCoo[count].DW= Canvas.Price(pre_y+h);
        }
     }
// рисует линии соединяющие 4 точки
   Canvas.LineD(x1,y1,x2,y2,clorZig);//0xCC98FB98
   Canvas.LineD(x2,y2,x3,y3,clorZig);
   Canvas.LineD(x3,y3,x4,y4,clorZig);
//---
 
картинку покажите плиз
 

Renat Akhtyamov #:
картинку покажите плиз

Картинку Канала?

 
Mikhail Toptunov #:

Картинку Канала?

А что это дает? Практический смысл и логика? Подгонка? 
 
spiderman8811 #:
А что это дает? Практический смысл и логика? Подгонка? 

Сигнал для входа в рынок. 

Интересно сколько должно быть в стратегии успешных позиций , чтобы перекрыть убыток?)

Это даёт параметры которые используются для построения Мани-менеджмента, по делу как я понял всё упирается в него)

А канал , да меняется от длины графика. Не совсем понимаю пока от чего это зависит. Хотелось бы понять где параметр который отвечает за его текущую динамичность.
 
Mikhail Toptunov #:

Картинку Канала?

симпатично

если не перерисовывает, то сигнал опережающий

Причина обращения: