Пересчёт баров в истории на каждом тике - страница 2

 
Vitaly Muzichenko:

Не нужно ничего чистить.


Скиньте код расчётной части индикатора.

===

Хотя, мне почему-то кажется, что вы хотите от индикатора чего-то лишнего, раз нужен полный пересчет на каждом баре

нужно

зачем получать историю заново, если перерасчет индюка это тоже самое
 
Renat Akhtyamov:

нужно

зачем получать историю заново, если перерасчет индюка это тоже самое

Вот и у меня вопрос: "Зачем получать историю заново"

 
#property indicator_chart_window
//+------------------------------------------------------+
int LastTik,NewTik,MAslow,MAfast;
bool buy=true,sell=true;
double PriceBuy=0,PriceSell=0,SignalPips=0;
datetime tPriceBuy=0,tPriceSell=0;
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
void init(){
   EventSetTimer(1);}
//+------------------------------------------------------------------+
//| Custom imitation tick                                            |
//+------------------------------------------------------------------+
void OnTimer(){
   Signals();}
//+------------------------------------------------------------------+
//| Custom deinitialization function                                 |
//+------------------------------------------------------------------+
void deinit(){
   EventKillTimer();}
//+------------------------------------------------------------------+
//| 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[]) {
   Signals();   
return(rates_total);}
//+------------------------------------------------------+
//|                                                      |
//+------------------------------------------------------+
void Signals(){  
//=========================|
// Перебор параметров 
//  на каждом тике
   if(LastTik!=NewTik)
      {
      MAslow-=5;
      LastTik=NewTik;
      } 
      NewTik++;
   if(NewTik>=10)NewTik=0;

   if(MAslow<=0) MAslow=100;
      MAfast = MAslow+5;
//=========================|
   int i=0, bars=Bars-1, limit=bars-IndicatorCounted();
   int ProfitB=0,ProfitS=0;

   if(limit<bars){
      if(limit<1) return; 
        i=limit;   
   } else i=bars; 

   while(i >= 0){
//================================================================|  
     double  MAs=iMA(Symbol(),0,MAslow,0,MODE_EMA,PRICE_OPEN,i+1);
     double  MAf=iMA(Symbol(),0,MAfast,2,MODE_EMA,PRICE_CLOSE,i+1);
      
      if(MAs>MAf && buy) {PriceBuy=Open[i]; tPriceBuy=Time[i]; sell=true; buy=false;}
      if(MAs<MAf && sell) {PriceSell=Open[i]; tPriceSell=Time[i]; buy=true; sell=false;}

      if(PriceBuy!=0.0 && PriceSell!=0.0 && tPriceBuy!=0 && tPriceSell!=0)
        {
         double pips=MathAbs((PriceBuy-PriceSell)/Point); 
        
         if(SignalPips!=pips)
           {
            if(tPriceSell>tPriceBuy && PriceSell>PriceBuy) ProfitB++;
            if(tPriceBuy>tPriceSell && PriceSell>PriceBuy) ProfitS++;
            SignalPips=pips;
           }
        }
 i--;}
 Print("Параметр = "+MAslow+" / Прибыльных buy = "+ProfitB+" / Прибыльных sell = "+ProfitS);
}
 
forex2030:

Смысл индикатора не понятен для меня. От слова "совсем"

 
Vitaly Muzichenko:

Смысл индикатора не понятен для меня. От слова "совсем"

Получаем сигнал от пересечения 2-х МА
По истории например было 500 пересечений
Далее идёт сортировка прибыльных пересечений для buy и для sell
На каждом тике меняем значение параметра МА
Итог: при первом старте получаем например 150 прибыльных пересечений для buy и 200 для sell
далее на новом тике поменялся параметр МА
вот на этом месте и не может решиться вопрос, т.к. по умолчанию как сейчас есть, результаты на новом тике =0
а если я вместо return добавлю limit=bars; то работает как надо, расчёт идёт верно согласно новому значению параметра, но виснет и в итоге ошибка out of memory

 
forex2030:

Получаем сигнал от пересечения 2-х МА
По истории например было 500 пересечений
Далее идёт сортировка прибыльных пересечений для buy и для sell
На каждом тике меняем значение параметра МА
Итог: при первом старте получаем например 150 прибыльных пересечений для buy и 200 для sell
далее на новом тике поменялся параметр МА
вот на этом месте и не может решиться вопрос, т.к. по умолчанию как сейчас есть, результаты на новом тике =0
а если я вместо return добавлю limit=bars; то работает как надо, расчёт идёт верно согласно новому значению параметра, но виснет и в итоге ошибка out of memory

Да, при доступе к МА на каждом тике это имеет место быть.

Решения проблемы не вижу, может кто другой подскажет. 

 

Избавится от пересчета всей МА в каждом тике. Вычесть из суммы расчета МА выбывающее значение, а в каждом тике прибавлять только значение из тика и делить на период.

Как-то так, с разновидностями МА чуть больше математики)

 
Vitaly Muzichenko:

Да, при доступе к МА на каждом тике это имеет место быть.

Решения проблемы не вижу, может кто другой подскажет. 

Мне бы в этом месте разобраться, тут кроется решение

   int i=0, bars=Bars-1, limit=bars-IndicatorCounted();

   if(limit<bars){
      if(limit<1) return; 
        i=limit;   
   } else i=bars; 

   while(i >= 0)
     {

Вот если я делаю грубо по барам, то тоже работает, результаты получаю на каждом тике, но виснет 

for(i=Bars-1; i>=0; i--)
   {
 
forex2030:

Мне бы в этом месте разобраться бы, тут кроется решение

Вот если я делаю грубо по барам, то тоже работает, результаты получаю на каждом тике, но виснет 

У вас while(i >= 0) крутит на каждом тике огромное число итераций, ровно столько, сколько баров. Это и приводит к зависанию. Тики идут практически постоянно, цикл не останавливается.

Так что в том месте где вы хотите разобраться, можно сделать расчёт или на новом баре один раз, или ... но не на каждом тике крутить цикл безостановочно 

 
forex2030:

Получаем сигнал от пересечения 2-х МА
По истории например было 500 пересечений
Далее идёт сортировка прибыльных пересечений для buy и для sell
На каждом тике меняем значение параметра МА
Итог: при первом старте получаем например 150 прибыльных пересечений для buy и 200 для sell
далее на новом тике поменялся параметр МА
вот на этом месте и не может решиться вопрос, т.к. по умолчанию как сейчас есть, результаты на новом тике =0
а если я вместо return добавлю limit=bars; то работает как надо, расчёт идёт верно согласно новому значению параметра, но виснет и в итоге ошибка out of memory

не понимаю - в чем проблема?
Все работает на каждом тике, ничего не виснет.

#property strict
#property indicator_chart_window
//+------------------------------------------------------+
int LastTik,NewTik,MAslow,MAfast;
bool buy=true,sell=true;
double PriceBuy=0,PriceSell=0,SignalPips=0;
datetime tPriceBuy=0,tPriceSell=0;
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
void OnInit()
  {
  }
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[])
  {
   Signals();
   return(rates_total);
  }

//+------------------------------------------------------+

void Signals()
  {
//=========================|
// Перебор параметров
//  на каждом тике
   if(LastTik!=NewTik)
     {
      MAslow-=5;
      LastTik=NewTik;
     }
   NewTik++;
   if(NewTik>=10)
      NewTik=0;

   if(MAslow<=0)
      MAslow=100;
   MAfast = MAslow+5;
//=========================|
   int i=Bars-1;
   int ProfitB=0,ProfitS=0;
   while(i >= 0)
     {
      //================================================================|
      double  MAs=iMA(Symbol(),0,MAslow,0,MODE_EMA,PRICE_OPEN,i+1);
      double  MAf=iMA(Symbol(),0,MAfast,2,MODE_EMA,PRICE_CLOSE,i+1);

      if(MAs>MAf && buy)
        {
         PriceBuy=Open[i];
         tPriceBuy=Time[i];
         sell=true;
         buy=false;
        }
      if(MAs<MAf && sell)
        {
         PriceSell=Open[i];
         tPriceSell=Time[i];
         buy=true;
         sell=false; 
        }

      if(PriceBuy!=0.0 && PriceSell!=0.0 && tPriceBuy!=0 && tPriceSell!=0)
        {
         double pips=MathAbs((PriceBuy-PriceSell)/Point);

         if(SignalPips!=pips)
           {
            if(tPriceSell>tPriceBuy && PriceSell>PriceBuy)
               ProfitB++;
            if(tPriceBuy>tPriceSell && PriceSell>PriceBuy)
               ProfitS++;
            SignalPips=pips;
           }
        }
      i--;
     }
   Print("Параметр = "+(string)MAslow+" / Прибыльных buy = "+(string)ProfitB+" / Прибыльных sell = "+(string)ProfitS);
  }
//+------------------------------------------------------------------+


Причина обращения: