Ну, я не читал вопрос. В скрипте все работало нормально. Как я вам там ответил. Но на этот раз мой запрос связан с индикатором. Я не могу получить значения из графика.
Ну, я не читал вопрос. В скрипте все работало нормально. Как я вам там ответил. Но на этот раз мой запрос связан с индикатором. Я не могу получить значения из графика.
Еще раз: угла у такого типа объектов нет. Нужно рассчитывать угол по двум точкам прямой. Чуть позже выложу код, он простой.
Благодарю. Но формула работает в скрипте, а не в индикаторе. Смотрите, я получаю нули каждый раз.
Благодарю. Но формула работает в скрипте, а не в индикаторе. Смотрите, я получаю нули каждый раз.
Без разницы, где ее применять:
#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; }Для восходящей линии угол будет отрицательный, для нисходящей - положительный.
Без разницы, где ее применять:
Для восходящей линии угол будет отрицательный, для нисходящей - положительный.С сожалением сообщаю вам, что вышеуказанный код не работает в индикаторе.
Я приложил файл. Вы можете проверить это.
С сожалением сообщаю вам, что вышеуказанный код не работает в индикаторе.
Я приложил файл. Вы можете проверить это.
Конечно не работает! Ведь Вы создаете объект с нулевыми ценами, и сразу же считываете с него значения. Там, конечно же, нули. Вы терминалу не отдавали управление для пересчета. Считывая нули, получаете 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();
Конечно не работает! Ведь Вы создаете объект с нулевыми ценами, и сразу же считываете с него значения. Там, конечно же, нули. Вы терминалу не отдавали управление для пересчета. Считывая нули, получаете 0 при расчетах.
Отредактируйте вот эту часть кода:
Так делать нельзя. Нужно:
Я пытался использовать тот же способ. Но все же я получаю нули. Просмотрите прикрепленный файл.
Почему я не могу прочитать значения из объекта регрессии?
Я пытался использовать тот же способ. Но все же я получаю нули. Просмотрите прикрепленный файл.
Почему я не могу прочитать значения из объекта регрессии?
Потому что создаете объект, тогда, когда он уже существует. А делать это нужно только тогда, когда объекта нет:
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); }
Потому что создаете объект, тогда, когда он уже существует. А делать это нужно только тогда, когда объекта нет:
Так что мне нужно удалить объект, а затем создать новый?
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Вы принимаете политику сайта и условия использования
Я попробовал следующий индикатор прилагается. Я использовал OBJ_REGRESSION: