Получение нулевого значения от ObjectGetValueByTime () в индикаторе.

Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий
jaffer wilson
2448
jaffer wilson  

Я попробовал следующий индикатор прилагается. Я использовал OBJ_REGRESSION:

Получил следующее выходное изображение:

Я получаю нули все время. Что я могу сделать, чтобы получить значения?

Файлы:
Ihor Herasko
21104
Ihor Herasko  
Я же ответил Вам в другой теме. Зачем похожий вопрос задавать в новой теме? Может Вы не знаете, как рассчитать угол для прямой, проведенной по двум точкам? Ну так и скажите, набросаю код, там дела на 5 минут.
jaffer wilson
2448
jaffer wilson  
Ihor herasko :

Ну, я не читал вопрос. В скрипте все работало нормально. Как я вам там ответил. Но на этот раз мой запрос связан с индикатором. Я не могу получить значения из графика.

Ihor Herasko
21104
Ihor Herasko  
jaffer wilson:

Ну, я не читал вопрос. В скрипте все работало нормально. Как я вам там ответил. Но на этот раз мой запрос связан с индикатором. Я не могу получить значения из графика.

Еще раз: угла у такого типа объектов нет. Нужно рассчитывать угол по двум точкам прямой. Чуть позже выложу код, он простой.

jaffer wilson
2448
jaffer wilson  
Ihor herasko :


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

Ihor Herasko
21104
Ihor Herasko  
jaffer wilson:

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

Без разницы, где ее применять:

#property  strict

#define PI    3.14

void OnStart()
{
   string sObjectName = "My regression channel";
   
   if (ObjectFind(0, sObjectName) < 0)
   {
      Alert("Object ", sObjectName, " is not found!");
      return;
   }

   // Getting the coordinates of line points
   double fYLeft = ObjectGetDouble(0, sObjectName, OBJPROP_PRICE, 0);
   double fYRight = ObjectGetDouble(0, sObjectName, OBJPROP_PRICE, 1);
   datetime dtXLeft = datetime(ObjectGetInteger(0, sObjectName, OBJPROP_TIME, 0));
   datetime dtXRight = datetime(ObjectGetInteger(0, sObjectName, OBJPROP_TIME, 1));
   
   // If the points are confused than swap its
   if (dtXLeft > dtXRight)
   {
      SwapValues(dtXLeft, dtXRight);
      SwapValues(fYLeft, fYRight);      
   }
   
   // Getting bar indexes
   int nXLeft = iBarShift(NULL, PERIOD_CURRENT, dtXLeft);
   int nXRight = iBarShift(NULL, PERIOD_CURRENT, dtXRight);
   
   // Calculating the K and B coefficients
   double fKCoef = 0.0;
   double fBCoef = CalculateBAndKByLine(nXLeft, fYLeft / Point(), nXRight, fYRight / Point(), fKCoef);
   
   if (fBCoef == DBL_MAX)
   {
      Alert("Line is vertical");
      return;
   }
      
   Alert("Angle of line is ", DoubleToString(atan(fKCoef) * 180 / PI, 2), " degrees");
}

double CalculateBAndKByLine(const int nXLeft, const double fYLeft, const int nXRight, const double fYRight, double &fKCoef)
{
   if (nXLeft == nXRight)
      return DBL_MAX;
      
   fKCoef = (fYRight - fYLeft) / (nXRight - nXLeft);
   return fYLeft - fKCoef * nXLeft;
}

template<typename T>
void SwapValues(T &tFirst, T &tSecond)
{
   T tTemp = tFirst;
   tFirst = tSecond;
   tSecond = tTemp;
}
Для восходящей линии угол будет отрицательный, для нисходящей - положительный.
jaffer wilson
2448
jaffer wilson  
Ihor Herasko :

Без разницы, где ее применять:

Для восходящей линии угол будет отрицательный, для нисходящей - положительный.

С сожалением сообщаю вам, что вышеуказанный код не работает в индикаторе.

Я приложил файл. Вы можете проверить это.

Файлы:
Ihor Herasko
21104
Ihor Herasko  
jaffer wilson:

С сожалением сообщаю вам, что вышеуказанный код не работает в индикаторе.

Я приложил файл. Вы можете проверить это.

Конечно не работает! Ведь Вы создаете объект с нулевыми ценами, и сразу же считываете с него значения. Там, конечно же, нули. Вы терминалу не отдавали управление для пересчета. Считывая нули, получаете 0 при расчетах.

Отредактируйте вот эту часть кода:

   ResetLastError();

   RegressionCreate(0,"Regress",0,time[rates_total-1]-(10*60),time[rates_total-1]);
   string sObjectName="Regress";

Так делать нельзя. Нужно:

   string sObjectName="Regress";
   if (!RegressionCreate(0,sObjectName,0,time[rates_total-1]-(10*60),time[rates_total-1]))
      return 0;
      
   ChartRedraw();
jaffer wilson
2448
jaffer wilson  
Ihor Herasko :

Конечно не работает! Ведь Вы создаете объект с нулевыми ценами, и сразу же считываете с него значения. Там, конечно же, нули. Вы терминалу не отдавали управление для пересчета. Считывая нули, получаете 0 при расчетах.

Отредактируйте вот эту часть кода:

Так делать нельзя. Нужно:

Я пытался использовать тот же способ. Но все же я получаю нули. Просмотрите прикрепленный файл.

Почему я не могу прочитать значения из объекта регрессии?

Файлы:
Ihor Herasko
21104
Ihor Herasko  
jaffer wilson:

Я пытался использовать тот же способ. Но все же я получаю нули. Просмотрите прикрепленный файл.

Почему я не могу прочитать значения из объекта регрессии?

Потому что создаете объект, тогда, когда он уже существует. А делать это нужно только тогда, когда объекта нет:

   if (ObjectFind(chart_ID, name) < 0)
      if(!ObjectCreate(chart_ID,name,OBJ_REGRESSION,sub_window,time1,0,time2,0))
        {
         Print(__FUNCTION__,
               ": failed to create linear regression channel! Error code = ",GetLastError());
         return(false);
        }
jaffer wilson
2448
jaffer wilson  
Ihor Herasko :

Потому что создаете объект, тогда, когда он уже существует. А делать это нужно только тогда, когда объекта нет:

Так что мне нужно удалить объект, а затем создать новый?

12
Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий