Quark, а зачем у тебя в цикле While каждый раз идет объявление переменных dClose, dLow и так далее?
void Noc()
{
int nPos = Bars - nExtCountedBars;
while(nPos >= 0)
{
double dClose = Close[nPos];
double dLow = Low[ArrayMinimum(Low, nClvPeriod, nPos)];
double dHigh = High[ArrayMaximum(High, nClvPeriod, nPos)];
arrExtMapBuffer[nPos] = (((dClose - dLow) - (dHigh - dClose))
/ (dHigh - dLow)) / 2 + 0.5;
nPos--;
}
if(nClvMa > 1)
Ema(arrExtMapBuffer);
}
Quark, а зачем у тебя в цикле While каждый раз идет объявление переменных dClose, dLow и так далее?
- Согласен. Исправлю. Но на проблему это влиять не должно - в лучшем случае на быстродействие.
- Согласен. Исправлю. Но на проблему это влиять не должно - в лучшем случае на быстродействие.
в индикаторе 2 входящих переменных:
extern int nClvPeriod = 27; extern int nClvMa = 7;
а из эксперта вызывается 4, причём 2 из них - другого типа =)
iCustom(NULL, 0, "_Noc_Ind", false, 27, 0.017, 7, 0, 1);
т.е. надо так:
iCustom(NULL, 0, "_Noc_Ind", 27, 7, 0, 1);
Действительно, несовпадение количества и типа параметров. Я и не посмотрел.
Ура! Спасибо большое.
Вы упускаете торговые возможности:
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Регистрация
Вход
Вы принимаете политику сайта и условия использования
Если у вас нет учетной записи, зарегистрируйтесь
Сам по себе, индикатор работает прекрасно. Однако при вызове его из эксперта, возникают проблемы. А именно, когда я вызываю из кода эксперта:
Получаю вывод что-то вроде 0.5049, 0.505, в то время, как в окне индикатора последнее значение находится в районе 0.9.
Подскажите, пожалуйста, где ошибка.
Индикатор:
#property copyright "Copyright Quark" #property link "" #property indicator_separate_window #property indicator_buffers 1 #property indicator_color1 Red #property indicator_minimum 0 #property indicator_maximum 1 // indicator parameters extern int nClvPeriod = 27; extern int nClvMa = 7; int nDrawBeginBar; // indicator buffers double arrExtMapBuffer[]; int nExtCountedBars = 0; //////////////////////// int init() { string strIndicatorShortName; // drawing settings SetIndexStyle(0, DRAW_LINE); SetIndexShift(0, 0); IndicatorDigits(4); nDrawBeginBar = MathMax(nClvPeriod, nClvMa); SetIndexDrawBegin(0, nDrawBeginBar); strIndicatorShortName = "Noc(" + nClvPeriod + ", " + nClvMa + ")"; IndicatorShortName(strIndicatorShortName); // indicator buffers mapping SetIndexBuffer(0, arrExtMapBuffer); return(0); } /////////////////////////// int start() { if(Bars <= nDrawBeginBar) return(0); nExtCountedBars = IndicatorCounted(); if(nExtCountedBars < 0) return(-1); // last counted bar will be recounted if(nExtCountedBars > 0) nExtCountedBars--; Noc(); return(0); } /////////////////// // For the selected period: // CLV = ((Close - Low) - (High - Close)) / (High - Low) void Noc() { int nPos = Bars - nExtCountedBars; while(nPos >= 0) { double dClose = Close[nPos]; double dLow = Low[ArrayMinimum(Low, nClvPeriod, nPos)]; double dHigh = High[ArrayMaximum(High, nClvPeriod, nPos)]; arrExtMapBuffer[nPos] = (((dClose - dLow) - (dHigh - dClose)) / (dHigh - dLow)) / 2 + 0.5; nPos--; } if(nClvMa > 1) Ema(arrExtMapBuffer); } /////////////////// void Ema(double& arr[]) { double dPr = 2.0 / (nClvMa + 1); int nPos = Bars - nExtCountedBars; while(nPos >= 0) { if(nPos == Bars - 2) arrExtMapBuffer[nPos + 1] = arr[nPos + 1]; arrExtMapBuffer[nPos] = arr[nPos] * dPr + arrExtMapBuffer[nPos + 1] * (1 - dPr); nPos--; } }