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

 
anrei2002 #:

Неактуальные стрелки сразу исчезли!!!

То что вы поймете я и не надеюсь, у меня был заказчик с похожей проблемой, я ему год не мог этот момент объяснить, там был другой индикатор, но тоже с подглядыванием. Он вроде и человек не глупый, но видимо жажда наживы реально отключает логику и мышление.. Он в итоге все понял, когда слил много денег. Левые стрелки появляются, тк в настоящем времени просто не существует баров с будущего, поэтому индикатор метает эти стрелки куда не попадя, не зная что делать.. Если его перезагрузить, то останутся только правильные стрелки, но в истории.. Я много таких повидал индикаторов 

 
MakarFX #:
Покажи то, что уже сделал.
#property description "Stochastic Oscillator"
#property strict

#property indicator_separate_window
#property indicator_minimum    0
#property indicator_maximum    100
#property indicator_buffers    2
#property indicator_color1     LightSeaGreen
#property indicator_color2     Red
#property indicator_level1     20.0
#property indicator_level2     80.0
#property indicator_levelcolor clrSilver
#property indicator_levelstyle STYLE_DOT
//--- input parameters
input int InpKPeriod=5; // K Period
input int InpDPeriod=3; // D Period
input int InpSlowing=3; // Slowing

input string PARA_Ref = "$USDX";
input string PARA = "ETHUSD";


//--- buffers
double ExtMainBuffer[];
double ExtSignalBuffer[];
double ExtHighesBuffer[];
double ExtLowesBuffer[];

double cl[];
double hi[];
double lo[];



//---
int draw_begin1=0;
int draw_begin2=0;
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit(void)
  {
   string short_name;
//--- 2 additional buffers are used for counting.
   IndicatorBuffers(4);
   SetIndexBuffer(2, ExtHighesBuffer);
   SetIndexBuffer(3, ExtLowesBuffer);
//--- indicator lines
   SetIndexStyle(0,DRAW_LINE);
   SetIndexBuffer(0, ExtMainBuffer);
   SetIndexStyle(1,DRAW_LINE);
   SetIndexBuffer(1, ExtSignalBuffer);
//--- name for DataWindow and indicator subwindow label
   short_name="Stochastic_Mult_1("+IntegerToString(InpKPeriod)+","+IntegerToString(InpDPeriod)+","+IntegerToString(InpSlowing)+")";
   IndicatorShortName(short_name);
   SetIndexLabel(0,short_name);
   SetIndexLabel(1,"Signal");
//---
   draw_begin1=InpKPeriod+InpSlowing;
   draw_begin2=draw_begin1+InpDPeriod;
   SetIndexDrawBegin(0,draw_begin1);
   SetIndexDrawBegin(1,draw_begin2);
//--- initialization done
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Stochastic oscillator                                            |
//+------------------------------------------------------------------+
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    i,k,pos,n;
   

//--- check for bars count
   if(rates_total<=InpKPeriod+InpDPeriod+InpSlowing)
      return(0);
//--- counting from 0 to rates_total
   ArraySetAsSeries(ExtMainBuffer,false);
   ArraySetAsSeries(ExtSignalBuffer,false);
   ArraySetAsSeries(ExtHighesBuffer,false);
   ArraySetAsSeries(ExtLowesBuffer,false);
   ArraySetAsSeries(low,false);
   ArraySetAsSeries(high,false);
   ArraySetAsSeries(close,false);
   

//---
   pos=InpKPeriod-1;
   if(pos+1<prev_calculated)
      pos=prev_calculated-2;
   else
     {
      for(i=0; i<pos; i++)
        {
         ExtLowesBuffer[i]=0.0;
         ExtHighesBuffer[i]=0.0;
        }
     }
//--- calculate HighesBuffer[] and ExtHighesBuffer[]
   for(i=pos; i<rates_total && !IsStopped(); i++)
     {
      double dmin=1000000.0;
      double dmax=-1000000.0;
      for(k=i-InpKPeriod+1; k<=i; k++)
        {
        n = i-k;
         if(dmin>iLow(PARA,0,n)* iLow(PARA_Ref,0,n))        // original: if(dmin>low[k])
            dmin=iLow(PARA,0,n)* iLow(PARA_Ref,0,n);        // original: dmin=low[k];
         if(dmax<iHigh(PARA,0,n)* iHigh(PARA_Ref,0,n))      // original: if(dmax<high[k])
            dmax=iHigh(PARA,0,n)* iHigh(PARA_Ref,0,n);      // original: dmax=high[k];

        }
      ExtLowesBuffer[i]=dmin;
      ExtHighesBuffer[i]=dmax;
     }
//--- %K line
   pos=InpKPeriod-1+InpSlowing-1;
   if(pos+1<prev_calculated)
      pos=prev_calculated-2;
   else
     {
      for(i=0; i<pos; i++)
         ExtMainBuffer[i]=0.0;
     }
//--- main cycle
   for(i=pos; i<rates_total && !IsStopped(); i++)
     {
      double sumlow=0.0;
      double sumhigh=0.0;
      for(k=(i-InpSlowing+1); k<=i; k++)
        {
        n = i-k;
         sumlow +=((iClose(PARA,0,n) * iClose(PARA_Ref,0,n))-ExtLowesBuffer[k]);             // original:   sumlow +=(close[k]-ExtLowesBuffer[k]);
         sumhigh+=(ExtHighesBuffer[k]-ExtLowesBuffer[k]);
        }
      if(sumhigh==0.0)
         ExtMainBuffer[i]=100.0;
      else
         ExtMainBuffer[i]=sumlow/sumhigh*100.0;
     }
//--- signal
   pos=InpDPeriod-1;
   if(pos+1<prev_calculated)
      pos=prev_calculated-2;
   else
     {
      for(i=0; i<pos; i++)
         ExtSignalBuffer[i]=0.0;
     }
   for(i=pos; i<rates_total && !IsStopped(); i++)
     {
      double sum=0.0;
      for(k=0; k<InpDPeriod; k++)
         sum+=ExtMainBuffer[i-k];
      ExtSignalBuffer[i]=sum/InpDPeriod;
     }
//--- OnCalculate done. Return new prev_calculated.
   return(rates_total);
  }
//+------------------------------------------------------------------+
 
его как бы можно исправить не теряя логики, но стрелку он будет рисовать на 8мом баре, или даже на 9ом(но без перерисовок и без левых сигналов). Вам он нужен будет такой?  То есть новая и самая свежая стрелка будет на 9 баре. И опоздание открытия будет тоже 9 баров, оно вам надо? 
 
Nikolay Ivanov #:

То что вы поймете я и не надеюсь, у меня был заказчик с похожей проблемой, я ему год не мог этот момент объяснить, там был другой индикатор, но тоже с подглядыванием. Он вроде и человек не глупый, но видимо жажда наживы реально отключает логику и мышление.. Он в итоге все понял, когда слил много денег. Левые стрелки появляются, тк в настоящем времени просто не существует баров с будущего, поэтому индикатор метает эти стрелки куда не попадя, не зная что делать.. Если его перезагрузить, то останутся только правильные стрелки, но в истории.. Я много таких повидал индикаторов 

Я не программист,но все равно не понимаю,почему нельзя скорректировать стрелку с появлением новой свечи?

В мире полно индикаторов с перерисовкой и у всех это прекрасно работает! Стрелка движется вместе с заданным пересечением  и никаких метаний не происходит.

У всех у них стоит один и тот-же код...

Файлы:
02.png  15 kb
 
asdkika1 #:

Лучше напиши, что ты хочешь сделать...по пунктам

 
anrei2002 #:

Я не программист,но все равно не понимаю,почему нельзя скорректировать стрелку с появлением новой свечи?

В мире полно индикаторов с перерисовкой и у всех это прекрасно работает! Стрелка движется вместе с заданным пересечением  и никаких метаний не происходит.

У всех у них стоит один и тот-же код...

 Обычная перерисовка это когда сам сигнальный бар(на котором стрелка)участвует в расчетах на появление сигнала и может иметь индекс 0.. ТО есть текущий бар.. Он перерисовывается каждый тик и соответственно сигнал тоже может перерисовываться.. 

Но у вас помимо 0 бара, используется -1 -2 -3 -4 -5 -6 -7.. откуда возьмется минус 8ой бар??? Даже 0ой бар использовать - это уже дурной тон.. а бары с минусовыми индексами недопустимо просто.. 

Я выше написал как исправить.. Он будет работает верно, если дождаться когда справа от сигнала будет 8 баров, тогда все будет ок, не считает что опоздание стрелки всегда будет на 9 баров, вам такое надо? 

 
MakarFX #:

Лучше напиши, что ты хочешь сделать...по пунктам

рассчёт Стохастика от умножения двух пар.
Просто взял стандартный индикатор Стохастика и поменял 
вводные данные (строчки отмечены).  
OnCalculate никогда не использовал - видимо здесь собака зарыта.
не работает - не пойму почему.
Надеялся, что не прийдётся весь индикатор самому 
перекраивать - ведь всё одлжно быть очень просто.
 
Nikolay Ivanov #:

 Обычная перерисовка это когда сам сигнальный бар(на котором стрелка)участвует в расчетах на появление сигнала и может иметь индекс 0.. ТО есть текущий бар.. Он перерисовывается каждый тик и соответственно сигнал тоже может перерисовываться.. 

Но у вас помимо 0 бара, используется -1 -2 -3 -4 -5 -6 -7.. откуда возьмется минус 8ой бар??? Даже 0ой бар использовать - это уже дурной тон.. а бары с минусовыми индексами недопустимо просто.. 

Я выше написал как исправить.. Он будет работает верно, если дождаться когда справа от сигнала будет 8 баров, тогда все будет ок, не считает что опоздание стрелки всегда будет на 9 баров, вам такое надо? 

Вот пример еще одного такого-же индикатора!

У него помимо стрелок на графике,есть еще кружки в месте пересечения линий в подвале.

И кружки в отличие от стрелок идут строго за пересечением линий! Никаких лишних кружков нет.

Почему со стрелками не так???

Файлы:
03.png  98 kb
EATA__Alert.mq4  20 kb
 
anrei2002 #:

Вот пример еще одного такого-же индикатора!

У него помимо стрелок на графике,есть еще кружки в месте пересечения линий в подвале.

И кружки в отличие от стрелок идут строго за пересечением линий! Никаких лишних кружков нет.

Почему со стрелками не так???

 запустите в тестере этот индикатор и понаблюдайте за линиями и за кружками в визуализации на ускоренной скорости.. Если даже после этого будет не понятно, то уже не знаю как еще проще объяснить... 

 
asdkika1 #:
рассчёт Стохастика от умножения двух пар.
Просто взял стандартный индикатор Стохастика и поменял 
вводные данные (строчки отмечены).  
OnCalculate никогда не использовал - видимо здесь собака зарыта.
не работает - не пойму почему.
Надеялся, что не прийдётся весь индикатор самому 
перекраивать - ведь всё одлжно быть очень просто.

Умножения чего??? Open? Close? Stoch?

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