Оптимизировать индикатор.
При возможности лучше расчеты перенести в советник
Спасибо, Vinin, я бы хотел расчеты индикатора перенести в советник.
Как я понимаю это можно сделать пользуясь массивами,
т.е. подсчитать один раз индикатор, а как сделать так, что-бы не пересчитывался весь на каждом тике ?
может есть где почитать про перенесение индикатора в советник с улучшением скорости ?
Спасибо, Vinin, я бы хотел расчеты индикатора перенести в советник.
Как я понимаю это можно сделать пользуясь массивами,
т.е. подсчитать один раз индикатор, а как сделать так, что-бы не пересчитывался весь на каждом тике ?
может есть где почитать про перенесение индикатора в советник с улучшением скорости ?
int start() { int counted_bars=IndicatorCounted(); int limit; int i; //---- if (bars == 0) limit = Bars; else limit = bars; if(counted_bars>0) counted_bars--; limit=Bars-counted_bars; for(i= limit; i >= 0; i--) { double bb_top = iCustom(NULL,0,"Bands",BandsPeriod,0, BandsDeviations, Bands_ma_mode, 1, i); double bb_low = iCustom(NULL,0,"Bands",BandsPeriod,0, BandsDeviations, Bands_ma_mode, 2, i); if (bb_top != 0) BB[i] = -(bb_low/bb_top - 1); MA_bb[i] =iMAOnArray(BB,0,ma_per,0,MODE_EMA,i); Buf_6[i] =iMAOnArray(BB,0,ma_per2,0,MODE_EMA,i); } return(0); }
Про индикатор Bands забыли.
Похоже Вам пора переводить индикаторы в новый формат. Будут быстрее работать.
Этот индикатор не совсем корректно построен.
Надо переделывать.
Но было бы лучше из двух индикаторов сделать один с максимальным быстродействием
мне нужно понять сам принцип включения индикатора в код советника
я сделал так, через глобальные static массивы :
static double BB[]; static double MA_bb[], Ma_bb_plus[]; ....... void calc_ind(int TF) { int BandsPeriod=24; double BandsDeviations=2.0; int ma_per = 10; int ma_per2 = 5; int Bands_ma_mode=MODE_EMA; int bars = 300; int to_calc = 0; int limit; int i; //---- if (BB[1] != 0 ) to_calc = 2; else to_calc = bars; for(i= to_calc; i >= 0; i--) // for(i=limit - 1; i>=0; i --) { double bb_top = iCustom(NULL,TF,"Bands",BandsPeriod,0, BandsDeviations, Bands_ma_mode, 1, i); double bb_low = iCustom(NULL,TF,"Bands",BandsPeriod,0, BandsDeviations, Bands_ma_mode, 2, i); if (bb_top != 0) BB[i] = -(bb_low/bb_top - 1); MA_bb[i] =iMAOnArray(BB,0,ma_per,0,MODE_EMA,i); Ma_bb_plus[i] =iMAOnArray(BB,0,ma_per2,0,MODE_EMA,i); } }
в результате ничего не считает, или не сохраняет или ... что не правильно ?
есть-ли где нибудь, пример вставки кода индикатора в советник, уже все обыскал, помогите
мне нужно понять сам принцип включения индикатора в код советника
я сделал так, через глобальные static массивы :
в результате ничего не считает, или не сохраняет или ... что не правильно ?
есть-ли где нибудь, пример вставки кода индикатора в советник, уже все обыскал, помогите
Этот вариант индикатора будет работать быстрее
//+------------------------------------------------------------------+ //| Mr_Goods.mq4 | //| Copyright 2015, Vinin | //| http://vinin.ucoz.ru | //+------------------------------------------------------------------+ #property copyright "Copyright 2015, Vinin" #property link "http://vinin.ucoz.ru" #property version "1.00" #property strict #property indicator_separate_window #property indicator_buffers 3 #property indicator_plots 3 //--- plot BB #property indicator_label1 "BB" #property indicator_type1 DRAW_LINE #property indicator_color1 clrRed #property indicator_style1 STYLE_SOLID #property indicator_width1 1 //--- plot MA_bb #property indicator_label1 "MA_bb" #property indicator_type1 DRAW_LINE #property indicator_color1 clrRed #property indicator_style1 STYLE_SOLID #property indicator_width1 1 //--- plot Buf_6 #property indicator_label1 "Buf_6" #property indicator_type1 DRAW_LINE #property indicator_color1 clrRed #property indicator_style1 STYLE_SOLID #property indicator_width1 1 //--- input parameters input int BandsPeriod=14; input int Bands_ma_mode=0; input int BandsDeviations=1; input int ma_per=14; input int ma_per2=14; //--- indicator buffers double BB[]; double MA_bb[],Buf_6[]; //+------------------------------------------------------------------+ //| Custom indicator initialization function | //+------------------------------------------------------------------+ int OnInit() { //--- indicator buffers mapping SetIndexBuffer(0,BB); SetIndexBuffer(1,MA_bb); SetIndexBuffer(2,Buf_6); //--- return(INIT_SUCCEEDED); } //+------------------------------------------------------------------+ //| Custom indicator iteration function | //+------------------------------------------------------------------+ int OnCalculate(const int rates_total, const int prev_calculated, const datetime &time[], const double &open[], const double &high[], const double &low[], const double &close[], const long &tick_volume[], const long &volume[], const int &spread[]) { //--- int limit1=rates_total-prev_calculated; int limit2=limit1; if(limit1>1) { limit1=rates_total-BandsPeriod-1; limit2=limit1-MathMax(ma_per, ma_per2); } for(int i=limit1; i>=0; i--) { double bb_top = iCustom(NULL,0,"Bands",BandsPeriod,0, BandsDeviations, Bands_ma_mode, 1, i); double bb_low = iCustom(NULL,0,"Bands",BandsPeriod,0, BandsDeviations, Bands_ma_mode, 2, i); BB[i]=0; if(bb_top!=0) BB[i]=1.0-bb_low/bb_top; } for(int i=limit2;i>=0;i--) { MA_bb[i] =iMAOnArray(BB,0,ma_per,0,MODE_EMA,i); Buf_6[i] =iMAOnArray(BB,0,ma_per2,0,MODE_EMA,i); } //--- return value of prev_calculated for next call return(rates_total); } //+------------------------------------------------------------------+
Но нужно еще второй оптимизировать или объединить два в одном (и это будет лучше)
Спасибо! классный код, надеюсь действительно будет быстрее работать.
скажите, как можно включить этот код в советник и обращаться к нему не через iCustom, а внутри самого советника, как к данным например, что-бы не было отдельного индикатора, что-бы он входил уже в систему как функция и с ним можно было бы работать ?
Спасибо! классный код, надеюсь действительно будет быстрее работать.
скажите, как можно включить этот код в советник и обращаться к нему не через iCustom, а внутри самого советника, как к данным например, что-бы не было отдельного индикатора, что-бы он входил уже в систему как функция и с ним можно было бы работать ?
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Вы принимаете политику сайта и условия использования
У меня индикатор очень сильно затратный в общете(забирает много ресурсов процессоров), Тестирование занимает много времени, надо как-то оптимизировать работу.
Есть-ли какие-то пути ускорения расчетов ?
То что уже применил: расчет не на каждом тике, а только на новой свечке, стратегия это позволяет делать. Всеравно время тестирования на 4 годах TF 30мин занимает более часа
Что делать ?