Нужно перенести код индикатора iVAR в советник, чтобы не использовать функцию iCustom. Индикатор через неё вызывается аж 8 раз, это замедляет процесс оптимизации.
Прошу помочь, за ранее спасибо!
Я попытался написать индикаторную функцию в советнике, но не получилось.
Переместить этот код в советник
extern int n = 5; extern int nBars = 1000; //---- буфер индикатора int tf; double ibuffer[]; //---- void init(){ tf=PERIOD_CURRENT; SetIndexBuffer(0,ibuffer); SetIndexStyle(0,DRAW_NONE); return;} //---- void start(){ //=========== ЭМУЛЯЦИЯ ИНДИКАТОРНЫХ БУФЕРОВ ============| if(ArraySize(ibuffer)<Bars){ ArraySetAsSeries(ibuffer,false); ArrayResize(ibuffer,iBars(Symbol(),tf)); ArraySetAsSeries(ibuffer,true);} int bars = iBars(Symbol(),tf); if (bars < n) return; int i, j, k, nTotal; int ihigh, ilow, nInterval; double Delta, Xс, Yс, Sx, Sy, Sxx, Sxy; //---- последний посчитанный бар будет пересчитан static int nCountedBars; nCountedBars=bars-1; if(nCountedBars<0) return; if(nCountedBars>0) nCountedBars--; if (nBars>0) nTotal = MathMin(nBars,MathMin(bars-nCountedBars,bars-1)); else nTotal = MathMin(bars-nCountedBars,bars-1); //---- основной цикл индикатора for(j=nTotal; j>=0; j--) { Sx = 0; Sy = 0; Sxx = 0; Sxy = 0; for(i=0; i<=n; i++) { nInterval = MathPow(2,n-i); //---- суммируем разницы максимальной и минимальной цен на интервале for(Delta=0, k=0; k<MathPow(2,i); k++) { ihigh = iHighest(Symbol(),0,MODE_HIGH,nInterval,nInterval*k+j); ilow = iLowest(Symbol(),0,MODE_LOW,nInterval,nInterval*k+j); Delta += High[ihigh]-Low[ilow]; } //---- вычисляем координаты вариации в двойном логарифмическом масштабе Xс = (n-i)*MathLog(2.0); Yс = MathLog(Delta); //---- накапливаем данные для нахождения коэффициентов линии регрессии с помощью МНК Sx += Xс; Sy += Yс; Sxx += Xс*Xс; Sxy += Xс*Yс; } //---- вычисляем индекс вариации (коэффициент наклона линии регрессии) ibuffer[j] = -(Sx*Sy-(n+1)*Sxy)/(Sx*Sx-(n+1)*Sxx); } return;}
Переместить этот код в советник
for(Delta=0, k=0; k<MathPow(2,i); k++) { ihigh = iHighest(Symbol(),0,MODE_HIGH,nInterval,nInterval*k+j); ilow = iLowest(Symbol(),0,MODE_LOW,nInterval,nInterval*k+j); Delta += High[ihigh]-Low[ilow]; }Спасибо, но в этом участке кода точно не нужно менять символ и таймфрейм?
но в этом участке кода точно не нужно менять символ и таймфрейм?
Зачем там менять?
Код по умолчанию использует текущий символ и тф на графике куда брошен советник.
Зачем там менять?
Код по умолчанию использует текущий символ и тф на графике куда брошен советник.
Если оформить как процедуру и считывать данные с других тайфреймов? Он будет считать в данном случае только с текущего. Моя идея была оформить как функцию, которая будет работать по аналогу, как iCustom, только заточенная для данного индикатора с возможностью считывать данные с любого тайфрейма и смещением на 1 - 2 и тд баров назад, если к примеру нужно будет замерить разность между значениями индикатора. В этом был смысл темы. ))
Если оформить как процедуру и считывать данные с других тайфреймов? Он будет считать в данном случае только с текущего. Моя идея была оформить как функцию, которая будет работать по аналогу, как iCustom, только заточенная для данного индикатора с возможностью считывать данные с любого тайфрейма и смещением на 1 - 2 и тд баров назад, если к примеру нужно будет замерить разность между значениями индикатора. В этом был смысл темы. ))
Ну тогда так можно поправить
extern int TF = 0; //если (=0) текущий тф //---- ihigh = iHighest(Symbol(),TF,MODE_HIGH,nInterval,nInterval*k+j); ilow = iLowest(Symbol(),TF,MODE_LOW,nInterval,nInterval*k+j); Delta += iHigh(Symbol(),TF,ihigh)-iLow(Symbol(),TF,ilow);
Ну тогда так можно поправить
Спасибо.
Ну тогда так можно поправить
А как можно реализовать смещение на 1 - 2 бара к примеру назад? Чтобы замерить разницу значений индикатора?
А как можно реализовать смещение на 1 - 2 бара к примеру назад? Чтобы замерить разницу значений индикатора?
В конце добавить получаемое значение буфера и определить на каком баре получать сигнал
extern int Bar = 0; //если (=0) текущий бар, если (=1) предыдущий бар double buf=0.0; //===================================================================| //---- вычисляем индекс вариации (коэффициент наклона линии регрессии) ibuffer[j] = -(Sx*Sy-(n+1)*Sxy)/(Sx*Sx-(n+1)*Sxx); buf = ibuffer[j+Bar]; } //Получаем сигнал от buf на указанном баре
В конце добавить получаемое значение буфера и определить на каком баре получать сигнал
Спасибо, по коду и точности переноса все ок... Значения совпадают индикатора с тем что в советнике, но скорость работы и оптимизации еще меньше стала, чем была ((( с чем это может быть связано?
но скорость работы и оптимизации еще меньше стала, чем была ((( с чем это может быть связано?
Я не проверял этот код, на скорость работы влияет цикл баров в истории
тут надо разбираться
if (nBars>0) nTotal = MathMin(nBars,MathMin(bars-nCountedBars,bars-1)); else nTotal = MathMin(bars-nCountedBars,bars-1); //---- основной цикл индикатора for(j=nTotal; j>=0; j--) { for(i=0; i<=n; i++) {
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Вы принимаете политику сайта и условия использования
Доброго времени суток!
Нужно перенести код индикатора iVAR в советник, чтобы не использовать функцию iCustom. Индикатор через неё вызывается аж 8 раз, это замедляет процесс оптимизации.
Прошу помочь, за ранее спасибо!
Я попытался написать индикаторную функцию в советнике, но не получилось. Выкладываю код индикаторной функции:
Сам индикатор:
И тест, который не проходит не совпадают значения в буферах:
Прошу помочь, не могу найти свою ошибку.