Прошу совета опытных кодеров

 

Прошу прощения, если такая тема уже есть.

Занялся MQL4 недавно, поэтому не могу решить такую проблему:

Хочу, чтобы ндикатор рисовал на чарте экспоненциальную МАшку по Typical Price. Никак не могу заставить ее рисоваться, как буд то ее и нету. В исходнике МАшек с сайта  mql4.com приведен код ЕМА только по цене закрытия. Пытался подставить формулу Typical Price - безрезультатно.

Господа коллеги, помогите решить проблему.

 
daem0n >>:

Прошу прощения, если такая тема уже есть.

Занялся MQL4 недавно, поэтому не могу решить такую проблему:

Хочу, чтобы ндикатор рисовал на чарте экспоненциальную МАшку по Typical Price. Никак не могу заставить ее рисоваться, как буд то ее и нету. В исходнике МАшек с сайта mql4.com приведен код ЕМА только по цене закрытия. Пытался подставить формулу Typical Price - безрезультатно.

Господа коллеги, помогите решить проблему.

https://docs.mql4.com/ru/indicators/iMA

без кода трудно что-нить еще посоветовать)

 
daem0n писал(а) >>

Прошу прощения, если такая тема уже есть.

Занялся MQL4 недавно, поэтому не могу решить такую проблему:

Хочу, чтобы ндикатор рисовал на чарте экспоненциальную МАшку по Typical Price. Никак не могу заставить ее рисоваться, как буд то ее и нету. В исходнике МАшек с сайта mql4.com приведен код ЕМА только по цене закрытия. Пытался подставить формулу Typical Price - безрезультатно.

Господа коллеги, помогите решить проблему.

Если вы используете пример iMA(..) то там нужно запускать заполнение массива через цикл..

 

Доброго времени суток. Благодарю за участие. Вот участок кода из моего первого индикатора, он рисует две SMA, одну по закрытию, другую по открытию. Причем рисует нормально

for(iCycle=1;iCycle<iPeriod;iCycle++,iPos--)
{
dSumHi+=High[iPos];
dSumLo+=Low[iPos];
}
while(iPos>=0)
{
dSumHi+=High[iPos];
dSumLo+=Low[iPos];
bufHi[iPos]=dSumHi/iPeriod;
bufLo[iPos]=dSumLo/iPeriod;
dSumHi-=High[iPos+iPeriod-1];
dSumLo-=Low[iPos+iPeriod-1];
iPos--;
}
if(iCountedBars<1)
for(iCycle=1;iCycle<iPeriod;iCycle++)
{
bufHi[Bars-iCycle]=0;
bufLo[Bars-iCycle]=0;
}

как видно я не использую iMA.

вот участок кода из исходника МАшек с этого сайта, конкретно участок отвечающий за ЕМА:

void ema()
{
double pr=2.0/(MA_Period+1);
int pos=Bars-2;
if(ExtCountedBars>2) pos=Bars-ExtCountedBars-1;
//---- main calculation loop
while(pos>=0)
{
if(pos==Bars-2) ExtMapBuffer[pos+1]=Close[pos+1];
ExtMapBuffer[pos]=Close[pos]*pr+ExtMapBuffer[pos+1]*(1-pr);
pos--;
}

В моем коде по первому посту практически то же самое, только я пытался вместо цен закрытия подставить формулу вычисления Typical Price

 
daem0n >>:

Доброго времени суток. Благодарю за участие. Вот участок кода из моего первого индикатора, он рисует две SMA, одну по закрытию, другую по открытию. Причем рисует нормально

Доброго. по High и Low наверное. вычисления оптимизированны, но врядли существенно быстрее встроенной функции.

daem0n >>:

как видно я не использую iMA.

зря таки не используете :)

daem0n >>:

В моем коде по первому посту практически то же самое, только я пытался вместо цен закрытия подставить формулу вычисления Typical Price

хз, по исходнику фсё рисуецо

//+------------------------------------------------------------------+
//|                     Typical Price Exponential Moving Average.mq4 |
//+------------------------------------------------------------------+
#property indicator_chart_window
#property indicator_buffers 1
#property indicator_color1 Red
//---- indicator parameters
extern int MA_Period=14;
extern int MA_Shift=0;
//---- indicator buffers
double ExtMapBuffer[];
//----
int ExtCountedBars=0;
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int init()
  {
//---- drawing settings
   SetIndexStyle(0,DRAW_LINE);
   SetIndexShift(0,MA_Shift);
   IndicatorDigits(Digits);
   if(MA_Period<1) MA_Period=1;
//---- indicator short name
   string short_name="EMA("+MA_Period+")";
   IndicatorShortName(short_name);
//---- indicator buffers mapping
   SetIndexBuffer(0,ExtMapBuffer);
//---- initialization done
   return(0);
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int start()
  {
   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--;
//+------------------------------------------------------------------+
//| Exponential Moving Average                                       |
//+------------------------------------------------------------------+
   double pr=2.0/(MA_Period+1);
   int    pos=Bars-2;
   if(ExtCountedBars>2) pos=Bars-ExtCountedBars-1;
   if(pos==Bars-2) ExtMapBuffer[pos+1]=(Close[pos+1]+High[pos+1]+Low[pos+1])/3.0;
//---- main calculation loop
   while(pos>=0)
     {
      ExtMapBuffer[pos]=pr*(Close[pos]+High[pos]+Low[pos])/3.0+ExtMapBuffer[pos+1]*(1-pr);
      pos--;
     }
//---- done
   return(0);
  }
//+------------------------------------------------------------------+



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