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

[Удален]  

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

Занялся 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);
  }
//+------------------------------------------------------------------+