очевидно, что каждый тик делаете полный перерасчёт всей истории. Конечно это тормозит терминал.
// типичный цикл внутри OnCalculate
for(int bar=prev_calculated>0?prev_calculated-1:prev_calculated; bar<rates_total;bar++) {
// prev_calculated-1 нужен чтобы перерассчитать только-что закрытый бар. Там high/low/close/volume отличаются(могут) от прежних
int shift = rates_total - bar - 1;
/// тут рассчёт
// [bar] - при обращении к массивам как к массивам; [shift] для тайм-серий
}
return rates_total; // считаем только по барам
очевидно, что каждый тик делаете полный перерасчёт всей истории. Конечно это тормозит терминал.
Не рисует в таком виде как вы предложили
Я сделал немного по другому, рисует по истории как надо, в тестере летит уверенно, но начинает рисовать только с нового бара при старте, а надо сразу с текущего бара
//+------------------------------------------------------------------+ //| 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[]) { // Проверка наличия данных if(rates_total<=0) return(0); if(prev_calculated!=0){ // Если не первый запуск if(rates_total>prev_calculated){ // Если образовалась новая свеча // Инициализируем индикаторные буферы начальными значениями const int n=rates_total-1; // Обнуляемый индекс массива HIb[n] = EMPTY_VALUE; OPb[n] = EMPTY_VALUE; LOs[n] = EMPTY_VALUE; OPs[n] = EMPTY_VALUE; } else return(prev_calculated); // Если не образовалась - выходим } else { // Если первый запуск // Инициализируем индикаторные буферы начальными значениями ArrayInitialize(HIb,EMPTY_VALUE); ArrayInitialize(OPb,EMPTY_VALUE); ArrayInitialize(LOs,EMPTY_VALUE); ArrayInitialize(OPs,EMPTY_VALUE); } int i=rates_total-1;// Индекс первого не посчитанного while(i>=0){ //-----+ //-----+ //-----+ //-----+ i--; }
На текущем баре при старте
На новом баре после старта
for(i=Bars-1; i>=0; i--)
{
// такое чем не устраивает?
}
// такое чем не устраивает?
Так терминал тоже грузит и не тянет в тестере
Не рисует в таком виде как вы предложили
Я сделал немного по другому, рисует по истории как надо, в тестере летит уверенно, но начинает рисовать только с нового бара при старте, а надо сразу с текущего бара
На текущем баре при старте
На новом баре после старта
Опять из клуба телепатов похоже. Так как кода нет, то только догадки.
Похоже на то что прорисовка идет на каждом новом баре, вот и не рисуется на текущем при старте. А отрисовывает когда появится новый бар.
Как вариант. Перенести отрисовку в отдельную функцию и вызывать ее при старте и в дальнейшем при появлении новых баров.
P.S. И на сомом деле. Зачем прогоняться по всей истории постоянно. Это нужно только при старте. Потом по ходу работы просматривайте только то что интересует на данном этапе.
Стесняюсь спросить, а за каким таким ..., Вы на каждом тике всю историю, от начала времен, по отрисовке прямоугольников обсчитываете? Они ведь никуда уже не денутся)))
Сделал прорисовку зон не по всей истории, теперь работает в тестере быстро и рисует с текущего бара
int CountBars=1500; CountBars = MathMin(Bars-1,CountBars); int i,limit,counted_bars=IndicatorCounted(); if (counted_bars<0) return; if (counted_bars>0) counted_bars--; limit = CountBars; if (limit<1) limit=10; for(i=limit-1; i>=0; i--) { //------ //------ //------ //------ }
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Вы принимаете политику сайта и условия использования
Подскажите чем заменить оператор while
Рисую зоны графическими объектами от фракталов и всё правильно строится по истории (от одного фрактала до другого) если
но сильно тормозит терминал, зависает жутко