Кастомный индикатор
#property indicator_separate_window #property indicator_buffers 1 #property indicator_color1 DarkOrange //---- input parameters extern int BandPeriod = 20; //---- buffers double BandBuffer[]; double UpSwingBuffer[]; double LowSwingBuffer[]; double DevBuffer[]; double LnBuffer[]; //+------------------------------------------------------------------+ //| Custom indicator initialization function | //+------------------------------------------------------------------+ int init() { string short_name; //---- 4 additional buffers are used for counting. IndicatorBuffers(5); SetIndexBuffer(1, UpSwingBuffer); SetIndexBuffer(2, DevBuffer); SetIndexBuffer(3, LnBuffer); SetIndexBuffer(4, LowSwingBuffer); //---- indicator lines SetIndexStyle(0, DRAW_LINE); SetIndexBuffer(0, BandBuffer); //---- if(BandPeriod <= 0) BandPeriod = 20; //---- SetIndexDrawBegin(0, BandPeriod); //---- name for DataWindow and indicator subwindow label short_name="Gomez Band(" + BandPeriod + ")"; IndicatorShortName(short_name); SetIndexLabel(0, short_name); //---- return(0); } //+------------------------------------------------------------------+ //| Commodity Channel Index | //+------------------------------------------------------------------+ int start() { int i, k, counted_bars = IndicatorCounted(); double sum = 0; double av_sum = 0; if(BandPeriod <= 1) return(0); if(Bars <= BandPeriod) return(0); //---- initial zero if(counted_bars < 1) { for(i = 1; i <= BandPeriod; i++) BandBuffer[Bars-i] = 0.0; for(i = 1; i <= BandPeriod; i++) DevBuffer[Bars-i] = 0.0; for(i = 1; i <= BandPeriod; i++) LnBuffer[Bars-i] = 0.0; for(i = 1; i <= BandPeriod; i++) LowSwingBuffer[Bars-i] = 0.0; for(i = 1; i <= BandPeriod; i++) UpSwingBuffer[Bars-i] = 0.0; } //---- last counted bar will be recounted int limit = Bars - counted_bars; if(counted_bars > 0) limit++; //---- natural log i = Bars - BandPeriod + 1; if(counted_bars > BandPeriod - 1) i = Bars - counted_bars - 1; while(i >= 0) { LnBuffer[i] = (Close[i]/Close[i+1]); i--; } //---- standard deviation i = Bars - BandPeriod + 1; if(counted_bars > BandPeriod - 1) i = Bars - counted_bars - 1; while(i >= 0) { av_sum = 0; sum = 0; for (k = i; k < i + BandPeriod; k++) av_sum = av_sum + LnBuffer[k]/BandPeriod; for (k = i; k < i + BandPeriod; k++) sum = sum + (LnBuffer[k] - av_sum)*(LnBuffer[k] - av_sum); DevBuffer[i] = MathSqrt(sum/(BandPeriod-1))*MathSqrt(2*BandPeriod); i--; } //---- up swing counting i = Bars - BandPeriod + 1; if(counted_bars > BandPeriod - 1) i = Bars - counted_bars - 1; while(i >= 0) { sum = 0; for (k = i; k < i + BandPeriod; k++) sum = sum + Close[k]/BandPeriod; UpSwingBuffer[i] = (1-DevBuffer[i])*Close[i]/sum; i--; } //---- low swing counting i = Bars - BandPeriod + 1; if(counted_bars > BandPeriod - 1) i = Bars - counted_bars - 1; while(i >= 0) { sum = 0; for (k = i; k < i + BandPeriod; k++) sum = sum + Close[k]/BandPeriod; LowSwingBuffer[i] = (1-DevBuffer[i])*sum/Close[i]; i--; } //---- swing distance counting i = Bars - BandPeriod + 1; if(counted_bars > BandPeriod - 1) i = Bars - counted_bars - 1; while(i >= 0) { BandBuffer[i] = UpSwingBuffer[i] - LowSwingBuffer[i]; i--; } //---- return(0); }
Помогите, пожалуйста, оптимизировать индикатор.
Очень "тяжелый", использует внешний кастомный индюк, рисует графические объекты, работает сразу с 10ю парами и 7ю таймфреймами.
Но очень нужно чтобы работал.
Платформа начинает виснуть примерно через сутки работы.
Оптимизировать индикатор можно, и нужно. Иначе его лучше выкинуть в "топку"
Есть у кого-нибудь дельные мысли?
Для начала будет достаточно отказаться от полного перерасчета индикатора на каждом тике
Перерасчет на барах не вариант совсем. А можно ли в индикаторе сделать задержку на несколько секунд, например, чтобы пересчитывался каждые 10 секунд? Sleep() ведь в индикаторах не работает.
думаю, что как-то так должно выглядеть:
extern int delay = 10; ...................... if (TimeCurrent() > last_time + delay) ........ проводим расчеты .......... last_time = TimeCurrent();
Не будет ли это забивать тред индикатора еще сильнее?
Перерасчет на барах не вариант совсем. А можно ли в индикаторе сделать задержку на несколько секунд, например, чтобы пересчитывался каждые 10 секунд? Sleep() ведь в индикаторах не работает.
думаю, что как-то так должно выглядеть:
Не будет ли это забивать тред индикатора еще сильнее?
Ответь для начала :
- зачем в индикаторе есть переменная limit?
- почему она не используется?
действительно, незачем
видимо, что-то хотел добавить и не стал.
взгляд уже замыленный, поэтому и не замечаю :)
тормозит индикатор не второй, а первый.
Тот, который квадратики рисует.
Понятно, что они связаны, но ко второму претензий не было пока.
тормозит индикатор не второй, а первый.
Тот, который квадратики рисует.
Понятно, что они связаны, но ко второму претензий не было пока.
Попробуй с этим вариантом. Но надо бы еще сделать ограничение по количеству обрабатываемых баров
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Вы принимаете политику сайта и условия использования
Помогите, пожалуйста, оптимизировать индикатор.
Очень "тяжелый", использует внешний кастомный индюк, рисует графические объекты, работает сразу с 10ю парами и 7ю таймфреймами.
Но очень нужно чтобы работал.
Платформа начинает виснуть примерно через сутки работы.