Значения трендовых линий при оптимизации ?

 

Известна первая точка по фракталам
Известна вторая точка по вершинам high-low
На графике рисуются трендовые линии по точкам
Как получить цены трендовых линий на текущем баре при оптимизации ?

При визуализации цены линий на текущем баре определяются по имени:

double up[],lo[];

int init() {
   IndicatorBuffers(2);      
   SetIndexBuffer(0,up);
   SetIndexBuffer(1,lo);
return(0);}

int start() {     
   DrawTrends();     
   for(int i=0; i<50; i++) {
      up[i] = ObjectGetValueByShift("FrUp",i);
      lo[i] = ObjectGetValueByShift("FrDn",i);}           
return(0);}


 
Natalya Dzerzhinskaya:

Как получить цены трендовых линий на текущем баре при оптимизации ?

Рассчитать по уравнению прямой:

Y = k*X + B

Индексацию баров в уравнении оставить такой, какая она есть (правый по графику бар - 0, слева от него 1 и т. д.) Тогда ценовое значение линии на нулевом баре - коэффициент B.

 
Ihor Herasko:

Рассчитать по уровню прямой

А значение символов можно узнать, чтобы правильно понять что вы имеете ввиду ? (Y,k,X,B)

Лучше конечно бы примером подсказать))

цена нижнего фрактала 0.11111
цена low 0.22222
цена на текущем баре 0.?????

 
Natalya Dzerzhinskaya:

А значение символов можно узнать, чтобы правильно понять что вы имеете ввиду ? (Y,k,X,B)

Лучше конечно бы примером подсказать))

цена нижнего фрактала 0.11111
цена low 0.22222
цена на текущем баре 0.?????

X и Y - это координаты каждой из точек в декартовой плоскости. На графике это, соответственно, индексы баров и цена. Для каждой из точек Вам должны быть известны эти величины. К примеру, для нижней трендовой, показанной на рисунке, показаны две опорные точки. У точки 1 индекс бара 6 (т. е. Х = 6), а у точки 2 - 2 (т. е. Х = 2). Если у точки 1 цена 0.1111, то получаем такое уравнение:

0.11111 = k * 6 + B

Соответственно, для точки 2 получаем уравнение:

0.22222 = k * 2 + B

Решаем систему уравнений и получаем из нее:

k = -0,0277775
B = 0,277775

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

Y = 0,0277775 * 0 + 0,277775 = 0,277775  // Для нулевого бара
Y = 0,0277775 * 1 + 0,277775 = 0,3055525  // Для первого бара
 

Ну а функция для расчета коэффициентов k и В по двум точкам одной прямой такая:

double CalculateBAndKByLine(int x1, double y1, int x2, double y2, double &kKoef)
{
   if (x1 == x2)
      return DBL_MAX;
      
   kKoef = (y2 - y1) / (x2 - x1);
   return y1 - kKoef * x1;
}

Функция возвращает значение коэффициента В, а через аргумент kKoef - значение k.

x1, y1 - индекс бара и цена первой известной точки

x2, y2 - индекс бара и цена второй известной точки

 
Ihor Herasko:

У меня немного по другому сложилось и цена идёт строго по линии
так мне понятней, но пока что это вроде бардак))

double Lo;
bool lo=true;
datetime tLo;

int start() {

int k = 0, bar = 0;
double NewPrice = 0.0;

if(lo){Lo=iLow(NULL,0,1);tLo=iTime(NULL,0,1);lo=false;}
if(!FRdn && Lo>Low[1]) lo=true; //если фрактал не менялся, а цена была ниже линии, то перерисуем линию
bar = iBarShift(NULL,0,tLo,true);

if (bar==1) k=4;
if (bar==2) k=8;
if (bar==3) k=12;
if (bar==4) k=16;
if (bar==5) k=20;
if (bar==6) k=24;
if (bar==7) k=28; //и т.д.

if (FrDn < Lo && bar>0) NewPrice = ((FrDn * k)/100000/*для 5-ти знаков*/)+Lo //линия вверх
if (FrDn > Lo && bar>0) NewPrice = ((FrDn * k)/100000/*для 5-ти знаков*/)-Lo //линия вниз

Отмеченное надо как-то компактно сформировать))

 

Вам нужно вычислить номер бара по времени (iTime,iBarShift)

Ну и затем запросить значение объекта на этом баре

Однако и в тестере текущий бар будет равен нулю.

 
Natalya Dzerzhinskaya:

У меня немного по другому сложилось и цена идёт строго по линии
так мне понятней, но пока что это вроде бардак))

Отмеченное надо как-то компактно сформировать))

Нет, у меня ерунда какая то получается, новые значения по формуле не совпадают со значениями полученными по имени.


 

Вот Ваши значения, равносильны и для тестера в том числе:

      ObjectGetValueByShift("FrUp",0);
      ObjectGetValueByShift("FrDn",0);
 
Renat Akhtyamov:

Вот Ваши значения:

Это понятно, но проблема при оптимизации их не видно, т.к. графические объекты там не строятся.

 
Natalya Dzerzhinskaya:

Это понятно, но проблема при оптимизации их не видно, т.к. графические объекты там не строятся.

Построение графических объектов необходимо перенести в OnTick()

у меня строятся