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

Artyom Trishkin
Модератор
82732
Rustam Bikbulatov:

Привет. Подскажи почему он не видит ima=iMA(NULL,60,24,0,1,0,k). Через коммент показывает намного выше котировку чем сама линия. Из-за этого минималька и максималька вообще не вычисляет

Используйте не числа, а идентификаторы из перечислений. Намного же понятнее:

for(i=pos; i<rates_total && !IsStopped(); i++)
     {
      double dmin= DBL_MAX;
      double dmax=-DBL_MAX;
      for(k=i-InpKPeriod+1; k<=i; k++)
        {double ima=iMA(NULL,PERIOD_M1,60,0,MODE_EMA,PRICE_CLOSE,k);
         if(ima<dmin)  dmin=ima;
         if(ima>dmax)  dmax=ima;
         Comment("pos="+(string)pos+", k="+(string)k+", iMA="+DoubleToString(ima,Digits()));
        }
      ExtLowesBuffer[i]=dmin;
      ExtHighesBuffer[i]=dmax;
     }

Сразу видно что вы спрашиваете у iMA(). Например:

у вас iMA(NULL,60,24,0,1,0,k)

и так iMA(NULL,PERIOD_H1,24,0,MODE_EMA,PRICE_CLOSE,k)

Что наглядней?

Вы берёте данные МАшки с часового графика. Если программа работает на на часовом графике, то какие данные вы ожидаете получить и увидеть?

Rustam Bikbulatov
247
Artyom Trishkin:

Используйте не числа, а идентификаторы из перечислений. Намного же понятнее:

Сразу видно что вы спрашиваете у iMA(). Например:

у вас iMA(NULL,60,24,0,1,0,k)

и так iMA(NULL,PERIOD_H1,24,0,MODE_EMA,PRICE_CLOSE,k)

Что наглядней?

Вы берёте данные МАшки с часового графика. Если программа работает на на часовом графике, то какие данные вы ожидаете получить и увидеть?

Я ставлю вот это на минутный график
   for(i=pos; i<rates_total && !IsStopped(); i++)
     {
      double dmin=1000000.0;
      double dmax=-1000000.0;
      for(k=i-InpKPeriod+1; k<=i; k++)
        {double ima=iMA(Symbol(),1,60,0,1,0,k);
         if(dmin>ima)  dmin=ima;
         if(dmax<ima)  dmax=ima;
         Comment(dmax);
        }
      ExtLowesBuffer[i]=dmin;
      ExtHighesBuffer[i]=dmax;
     }

Ничего не выходит с k

Maxim Kuznetsov
18957
Rustam Bikbulatov:

Это нечаенно поставил. Ничего не меняет это. Сама суть что показывает неправильно с k!

хоть и полусоный и глаз замылен, но у вас совершенно очевидно не с той стороны берутся значения МА :-) помимо путаницы с таймфреймами

   // основной цикл
   // перебираем бары от последнего нерасчитанного к актуальному
   // (просто пример - поэтому инициализация и заполнение буферов пропущенны!!)
   for(int bar=prev_calculated;bar<rates_total && !IsStopped();bar++) {
      // bar использовать для обращения к массивам, i - к таймсериям
      int i=rates_total-bar-1;
      // считаем min,max от некой MA за DEPTH баров
      double min=DBL_MAX;
      double max=DBL_MIN;
      if (bar<DEPTH) {
         // данных ещё недостаточно
         continue;
      }
      for(int t=0;t<DEPTH;t++) {
         double ma=iMA(_Symbol,_Period,MA_PERIOD,0,MA_METHOD,MA_PRICE,i+t); // берём значение MA (! как в таймсериях 0-последнее)
         if (ma>0) {
            if (min<ma) min=ma;
            if (max>ma) max=ma;
         }
      }
      if (min!=DBL_MAX && max!=DBL_MIN) {
         // что-то делаем с полученными максимум/минимум MA
      }
   }
Rustam Bikbulatov
247
Maxim Kuznetsov:

хоть и полусоный и глаз замылен, но у вас совершенно очевидно не с той стороны берутся значения МА :-) помимо путаницы с таймфреймами


Интересная задумка. Попробую. Если что это обычный индикатор стохастик. Мысль появилась брать на экстремумы баров за какой либо период а экстремумы линии МА. Это в строке 100-113. Думаю этим улучшит индикатор

//+------------------------------------------------------------------+
///+------------------------------------------------------------------+
//|                                                   Stochastic.mq4 |
//|                   Copyright 2005-2014, MetaQuotes Software Corp. |
//|                                              http://www.mql4.com |
//+------------------------------------------------------------------+
#property copyright   "2005-2014, MetaQuotes Software Corp."
#property link        "http://www.mql4.com"
#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=60; // K Period
input int InpDPeriod=60; // D Period
input int InpSlowing=1; // Slowing
//--- buffers
double ExtMainBuffer[];
double ExtSignalBuffer[];
double ExtHighesBuffer[];
double ExtLowesBuffer[];
//---
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="Sto("+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;
//--- 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++)
        {double ima=iMA(Symbol(),1,60,0,1,0,k);
         if(dmin>ima)  dmin=ima;
         if(dmax<ima)  dmax=ima;
         Comment(ima);
        }
      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++)
        {
         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);
  }
//+------------------------------------------------------------------+
Valerius
68
Valerius  

Добрый день всем!

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

И так каждый день.

Nauris Zukas
3600
Valerius:

Добрый день всем!

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

И так каждый день.

Если есть исходник, то в коде убрать input (или extern) и менять параметры через код.

Artyom Trishkin
Модератор
82732
Valerius:

Добрый день всем!

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

И так каждый день.

В сервисдеск написать с предоставлением как можно большей информации по проблеме.

Valerius
68
Valerius  
Nauris Zukas:

Если есть исходник, то в коде убрать input (или extern) и менять параметры через код.


Это не серьёзно... Зачем они (input и extern) тогда нужны....

Valerius
68
Valerius  
Artyom Trishkin:

В сервисдеск написать с предоставлением как можно большей информации по проблеме.


А не подскажите ссылочку?

Artyom Trishkin
Модератор
82732
Valerius:

А не подскажите ссылочку?

А загляните в свой профиль... Там много чего интересного.