Нужна помощь знатоков

 

Это код простого мувинга

Я хочу в него добавить переменную Price_start ; //--- (Первое значение текущего дня)

Подскажите, пожалуйста, код.


#property indicator_separate_window
#property indicator_buffers 1
#property indicator_color1 Red
//---- indicator parameters
extern int MA_Period=13;
extern int MA_Shift=0;
extern int MA_Method=0;
//---- indicator buffers
double Price_start ; //--- (Первое значение текущего дня)
double ExtMapBuffer[];
//----
int ExtCountedBars=0;
//+------------------------------------------------------------------+
//| Custom indicator initialization function |
//+------------------------------------------------------------------+
int init()
{
int Price_start=(Первое значение текущего дня);
//----
int draw_begin;
string short_name;
//---- drawing settings
SetIndexStyle(0,DRAW_LINE);
SetIndexShift(0,MA_Shift);
IndicatorDigits(MarketInfo(Symbol(),MODE_DIGITS));
if(MA_Period<2) MA_Period=13;
draw_begin=MA_Period-1;
//---- indicator short name




 
double Price_start=iOpen(0,PERIOD_D1,0);
и переменную нужно инициализировать только один раз (не понимаю откуда у вас ещё и int взялось?)
 
WWer >>:

Спасибо, сейчас попробую.

 
WWer писал(а)

Вы можете взглянуть на этот код. Индикатор не реагирует на Price_start

#property indicator_level1     0.0
#property indicator_levelcolor Silver
#property indicator_levelwidth 0
#property indicator_levelstyle STYLE_DASH

#property indicator_separate_window
#property indicator_buffers 1
#property indicator_color1 Red
//---- input parameters
extern string    Symb="GBPJPY";
extern int       MA_Period=7;
extern int       MA_Shift=0;
extern double    Price_plus = 0.0;
//---- buffers
double Price_start;
double ExtMapBuffer[];
//----
int MA_Method=0;
int ExtCountedBars=0;
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int init()
  {
//---- indicators
   SetIndexStyle(0,DRAW_LINE);
   SetIndexBuffer(0,ExtMapBuffer);
   int    draw_begin;
   string short_name;
//---- drawing settings
   SetIndexStyle(0,DRAW_LINE);
   SetIndexShift(0,MA_Shift);
   IndicatorDigits(MarketInfo(Symb,MODE_DIGITS));
   if(MA_Period<2) MA_Period=13;
   draw_begin=MA_Period-1;
//---- indicator short name
   switch(MA_Method)
     {
      case 1 : short_name="SMA(";
     }
   IndicatorShortName(Symb+" "+short_name+MA_Period+")");
   SetIndexDrawBegin(0,draw_begin);
//---- indicator buffers mapping
   SetIndexBuffer(0,ExtMapBuffer);
//---- initialization done
   return(0);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int start()
  {
   double Price_start=iOpen(0,PERIOD_D1,0);
//----
   if(Bars<=MA_Period) return(0);
   ExtCountedBars=IndicatorCounted();
//---- check for possible errors
   if (ExtCountedBars<0) return(-1);
//---- last counted bar will be recounted
   if (ExtCountedBars>0) ExtCountedBars--;
//----
   switch(MA_Method)
     {
      case 0 : sma();  break;
     }
//---- done
   return(0);
  }
//+------------------------------------------------------------------+
//| Simple Moving Average                                            |
//+------------------------------------------------------------------+
void sma()
  {
   double sum=0;
   int    i,pos=Bars-ExtCountedBars-1;
//---- initial accumulation
   if(pos<MA_Period) pos=MA_Period;
   for(i=1;i<MA_Period;i++,pos--)
      sum+=iClose(Symb,0,pos)-Price_start;
//---- main calculation loop
   while(pos>=0)
     {
      sum+=iClose(Symb,0,pos)-Price_start;
      ExtMapBuffer[pos]=sum/MA_Period;
	   sum-=iClose(Symb,0,pos+MA_Period-1)-Price_start;
 	   pos--;
     }
  }
 

Я хочу, что бы мувинг отображался таким образом


Каждый день начинал с нулевой отметки

Пожалуйста помогите!!!

 

У Вас две переменных под одним именем double Price_start.

Первая глобальная, она объявлена в начале.

Вторая такая же объявлена в главной функции start() - она не зависит от глобальной.

А вот в пользовательской функции sma() Вы работаете с глобальной переменной переменной Price_start, которая не получила никакого значения

в функции start(), т.к. в ней была объявлена.

Совет: уберите объявление переменной Price_start в функции start() и её областью видимости станут все функции программы.

А пока что одноимённая переменная объявленная в start() - это совершенно другая пересенная чем объявленная выше.

//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int start()
  {
   double Price_start=iOpen(0,PERIOD_D1,0);
//----
Уберите отсюда double.
 

Мне кажется, Вы не совсем внимательно прочитали совет WWer'a.

Вы объявили две разные переменных с одинаковым именем Price_start: одну глобальную, которая доступна изо всех функций, вторую локальную

в функции Start, она доступна только в пределах этой функции, ей Вы и присваиваете значение Open(...) внутри той же функции Start.

А в функции sma() Вы вызываете глобальную переменную, которая объявлена, но не получила значения, следовательно равна нулю.

Так и работает Ваш код, две переменных существуют в параллельных пространствах.

Советую удалить объявление Price_start из функции Start.

 
Александр, клянусь, не списывал!
 
WWer писал(а) >>
и переменную нужно инициализировать только один раз (не понимаю откуда у вас ещё и int взялось?)

Инициализировать-то можно больше чем один раз, но это уже будут разные переменные с одинаковыми названиями и

разными областями видимости. Если ошибаюсь, профессионалы исправят. Я так, любитель от сохи.

 
granit77 писал(а) >>
Александр, клянусь, не списывал!

По времени видно, Виктор :)

Разность в секундах.

 
goldtrader >>:

У Вас две переменных под одним именем double Price_start.


Уберите отсюда double.

Я все сделал, но индикатор перерисовывает предыдущие дни относительно нового значения Price_start,

Т.е. только новый день начинается с нуля.

Подскажите, как сделать, чтоб каждый день с нуля, как на рисунке више.



#property indicator_level1     0.0
#property indicator_levelcolor Silver
#property indicator_levelwidth 0
#property indicator_levelstyle STYLE_DASH

#property indicator_separate_window
#property indicator_buffers 1
#property indicator_color1 Red
//---- input parameters
extern string    Symb="GBPJPY";
extern int       MA_Period=7;
extern int       MA_Shift=0;
//---- buffers
double Price_start;
double ExtMapBuffer[];
//----
int MA_Method=0;
int ExtCountedBars=0;
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int init()
  {
//---- indicators
   SetIndexStyle(0,DRAW_LINE);
   SetIndexBuffer(0,ExtMapBuffer);
   int    draw_begin;
   string short_name;
//---- drawing settings
   SetIndexStyle(0,DRAW_LINE);
   SetIndexShift(0,MA_Shift);
   IndicatorDigits(MarketInfo(Symb,MODE_DIGITS));
   if(MA_Period<2) MA_Period=13;
   draw_begin=MA_Period-1;
//---- indicator short name
   switch(MA_Method)
     {
      case 1 : short_name="SMA(";
     }
   IndicatorShortName(Symb+" "+short_name+MA_Period+")");
   SetIndexDrawBegin(0,draw_begin);
//---- indicator buffers mapping
   SetIndexBuffer(0,ExtMapBuffer);
//---- initialization done
   return(0);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int start()
  {
   Price_start=iOpen(Symb,PERIOD_D1,0);
//----
   if(Bars<=MA_Period) return(0);
   ExtCountedBars=IndicatorCounted();
//---- check for possible errors
   if (ExtCountedBars<0) return(-1);
//---- last counted bar will be recounted
   if (ExtCountedBars>0) ExtCountedBars--;
//----
   switch(MA_Method)
     {
      case 0 : sma();  break;
     }
//---- done
   return(0);
  }
//+------------------------------------------------------------------+
//| Simple Moving Average                                            |
//+------------------------------------------------------------------+
void sma()
  {
   double sum=0;
   int    i,pos=Bars-ExtCountedBars-1;
//---- initial accumulation
   if(pos<MA_Period) pos=MA_Period;
   for(i=1;i<MA_Period;i++,pos--)
      sum+=iClose(Symb,0,pos)-Price_start;
//---- main calculation loop
   while(pos>=0)
     {
      sum+=iClose(Symb,0,pos)-Price_start;
      ExtMapBuffer[pos]=sum/MA_Period;
	   sum-=iClose(Symb,0,pos+MA_Period-1)-Price_start;
 	   pos--;
     }
  }
Причина обращения: