Любые вопросы новичков по MQL4 и MQL5, помощь и обсуждение по алгоритмам и кодам - страница 372

 
PokrovMT5:

Максим, добрый день! Спасибо за вариант, мой такой же почти, он тоже рабочий , но мне Alekseu Fedotov  предложил иной я про него и написал , что есть мысль как поправить его? 



если перерисовка не сильно колышет (например это визуальный индикатор или вы так или иначе будете пересчитывать, как сейчас) - возвращайте из функции OnCalculate место с которого надо всё перерасчитать, в вашем случае - бар начала предыдущего часа.

return rates_total-iBarShift(_Symbol,_Period,time[0]-TimeMinute(time[0])*60-TimeSeconds(time[0])-1 ); // примерно так, написано "с руки и не проверялось", для демонстрации подхода.

 
MakarFXЯ сделал, но это не решает вопрос для
// #property  copyright "Copyright © 2005, Yura Prokofiev"
// #property  link      "Yura.prokofiev@gmail.com"
#property  strict
#property  indicator_separate_window
#property  indicator_buffers 3
 
extern int      Barrs  = 10;     // Баров для расчета
extern string   simvol = "EURGBP";
double Buf_0[], Buf_1[], Buf_2[];

void OnInit()
{
   SetIndexStyle(0,DRAW_NONE);
   SetIndexStyle(1,DRAW_HISTOGRAM,STYLE_SOLID,2,Yellow);
   SetIndexStyle(2,DRAW_HISTOGRAM,STYLE_SOLID,2,Red);
   IndicatorDigits((int)SymbolInfoInteger(simvol,SYMBOL_DIGITS));

   SetIndexBuffer(0,Buf_0);
   SetIndexBuffer(1,Buf_1);
   SetIndexBuffer(2,Buf_2);

   IndicatorShortName("Fisher "+simvol);
   SetIndexLabel(1,NULL);
   SetIndexLabel(2,NULL);
}

int start()
{
   int    i, limit, counted_bars=IndicatorCounted();
   double prev,current;
   double Value=0, Value1=0, Value2=0, Fish=0, Fish1=0, Fish2=0;
   double price, MinL=0, MaxH=0;

   if(counted_bars>0) counted_bars--;
   limit=Bars-counted_bars;

   for(i=0; i<limit; i++)
   {
      MaxH = iHigh(simvol,   0, iHighest(simvol,  0, MODE_HIGH,Barrs,i));
      MinL = iLow (simvol,   0, iLowest (simvol,  0, MODE_LOW, Barrs,i));
      price = (iHigh(simvol, 0, i) + iLow(simvol, 0, i))/2;
      if(MaxH != MinL)
      Value = 0.33*2*((price-MinL)/(MaxH-MinL)-0.5) + 0.67*Value1;     
      Value=MathMin(MathMax(Value,-0.999),0.999); 
      Buf_0[i]=0.5*MathLog((1+Value)/(1-Value))+0.5*Fish1;
      Value1=Value;
      Fish1=Buf_0[i];
   }
   bool up=true;
   for(i=limit-2; i>=0; i--)
   {
      current=Buf_0[i];
      prev=Buf_0[i+1];
      if(((current<0)&&(prev>0))||(current<0))   up= false;    
      if(((current>0)&&(prev<0))||(current>0))   up= true;
      Buf_1[i]=0;  Buf_2[i]=0;
      if(!up) Buf_2[i]=current;
      else    Buf_1[i]=current;
   }
   return 0;
}

  Внизу старый, сверху новый

Используется таймфрейм графика, на котором индикатор - нули стоят

 
YarTrade:

Подскажите пожалуйста как обнулить буфер с появлением нового бара, но чтобы предыдущие данные не стирались, а отображались на графике. У меня почему-то не получается обнулить буфер, и с появлением нового бара, на старые накопленные данные накладываются новые. Что я не верно описал в коде? Спасибо за пояснения.

С появлением нового бара терминал к буферам добавляет новые нулевые элементы. В строках 3 ... 6 как раз и происходит их обнуление. Остальное все сохраняется
 
STARIJ:
С появлением нового бара терминал к буферам добавляет новые нулевые элементы. В строках 3 ... 6 как раз и происходит их обнуление. Остальное все сохраняется

Почему тогда столбики гистограммы с появлением нового бара имеют сразу рост предыдущего столбика и растут далее, а последующий имеет в момент появление последующего бара, рост предыдущего?

 
YarTrade:

Почему тогда столбики гистограммы с появлением нового бара имеют сразу рост предыдущего столбика и растут далее, а последующий имеет в момент появление последующего бара, рост предыдущего?

у Вас стоит суммирование
V2 = V1 + V2;
 
Приветствую всех,не могу разобраться сам, какой-то прямо полтергейст,хотя может и невнимательность
int ticket_order=0;
void OnTick()
{
  if(OrdersTotal()==0)
   {
    // километр кода
    ticket_order=OrderSend(Symbol(),up_down,lots,Ask,3,0,0);
    }
    if(OrdersTotal()==1)
   {
     OrderSelect(ticket_order,SELECT_BY_TICKET);
     bool Ans=OrderModify(ticket_order,Price,SL,TP,0);
    }
}
     
   
В такой связке в тестере стратегий вылетает еррор неправильный тикет(OrderModify()),причем на n-ом ордере,не на первом и не на втором, я уж и не знаю на что грешить, может в OrderModify(),или OrderSelect тикет передается по ссылке и там как-то меняется?
 
ijonhson: вылетает еррор неправильный тикет(OrderModify())
Было аналогичное. Переставьте местами первый и второй условный операторы вместе с потрохами - может помочь.
 
STARIJ:

Внизу старый, сверху новый

Используется таймфрейм графика, на котором индикатор - нули стоят

Спасибо ОГРОМНОЕ. Это я и хотел.
 
ijonhson:
Приветствую всех,не могу разобраться сам,

Так легче найдете ошибку :

if ( OrderSelect(ticket_order,SELECT_BY_TICKET) )
  if ( OrderModify(ticket_order,Price,SL,TP,0) ) {}
Но по моему до OrderSelect() должно быть tiket_order=(правильной_тикет)
 
ijonhson:
Приветствую всех,не могу разобраться сам, какой-то прямо полтергейст,хотя может и невнимательностьВ такой связке в тестере стратегий вылетает еррор неправильный тикет(OrderModify()),причем на n-ом ордере,не на первом и не на втором, я уж и не знаю на что грешить, может в OrderModify(),или OrderSelect тикет передается по ссылке и там как-то меняется?
Вы ордер выбираете по тикету, а затем, после километра кода, пытаетесь его модифицировать. Но он в это время может быть уже закрытым.
Причина обращения: