double Price_start=iOpen(0,PERIOD_D1,0);и переменную нужно инициализировать только один раз (не понимаю откуда у вас ещё и int взялось?)
Вы можете взглянуть на этот код. Индикатор не реагирует на 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.
и переменную нужно инициализировать только один раз (не понимаю откуда у вас ещё и int взялось?)
Инициализировать-то можно больше чем один раз, но это уже будут разные переменные с одинаковыми названиями и
разными областями видимости. Если ошибаюсь, профессионалы исправят. Я так, любитель от сохи.
Я все сделал, но индикатор перерисовывает предыдущие дни относительно нового значения 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--; } }
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Вы принимаете политику сайта и условия использования
Это код простого мувинга
Я хочу в него добавить переменную 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