- Помощь в кодировании
- Помогите с индикатором АМА
- Спрашивайте!
Приведите коды реализаций индюкатора в Метасе и МТ4. В противном случае - пустой базар.
Коды можно вставлять через кнопу SRC в шапке окна текста сообщения.
Вот она (продолжите стрелку; работает, только если это сообщение - последнее):
//+------------------------------------------------------------------+ //| ADX.mq4 | //| Copyright © 2004, MetaQuotes Software Corp. | //| http://www.metaquotes.net/ | //+------------------------------------------------------------------+ #property copyright "Copyright © 2004, MetaQuotes Software Corp." #property link "http://www.metaquotes.net/" #property indicator_separate_window #property indicator_buffers 3 #property indicator_color1 LightSeaGreen #property indicator_color2 YellowGreen #property indicator_color3 Wheat //---- input parameters extern int ADXPeriod=14; //---- buffers double ADXBuffer[]; double PlusDiBuffer[]; double MinusDiBuffer[]; double PlusSdiBuffer[]; double MinusSdiBuffer[]; double TempBuffer[]; //+------------------------------------------------------------------+ //| Custom indicator initialization function | //+------------------------------------------------------------------+ int init() { //---- 3 additional buffers are used for counting. IndicatorBuffers(6); //---- indicator buffers SetIndexBuffer(0,ADXBuffer); SetIndexBuffer(1,PlusDiBuffer); SetIndexBuffer(2,MinusDiBuffer); SetIndexBuffer(3,PlusSdiBuffer); SetIndexBuffer(4,MinusSdiBuffer); SetIndexBuffer(5,TempBuffer); //---- name for DataWindow and indicator subwindow label IndicatorShortName("ADX("+ADXPeriod+")"); SetIndexLabel(0,"ADX"); SetIndexLabel(1,"+DI"); SetIndexLabel(2,"-DI"); //---- SetIndexDrawBegin(0,ADXPeriod); SetIndexDrawBegin(1,ADXPeriod); SetIndexDrawBegin(2,ADXPeriod); //---- return(0); } //+------------------------------------------------------------------+ //| Average Directional Movement Index | //+------------------------------------------------------------------+ int start() { double pdm,mdm,tr; double price_high,price_low; int starti,i,counted_bars=IndicatorCounted(); //---- i=Bars-2; PlusSdiBuffer[i+1]=0; MinusSdiBuffer[i+1]=0; if(counted_bars>=i) i=Bars-counted_bars-1; starti=i; //---- while(i>=0) { price_low=Low[i]; price_high=High[i]; //---- pdm=price_high-High[i+1]; mdm=Low[i+1]-price_low; if(pdm<0) pdm=0; // +DM if(mdm<0) mdm=0; // -DM if(pdm==mdm) { pdm=0; mdm=0; } else if(pdm<mdm) pdm=0; else if(mdm<pdm) mdm=0; //---- вычисляем истинный интервал double num1=MathAbs(price_high-price_low); double num2=MathAbs(price_high-Close[i+1]); double num3=MathAbs(price_low-Close[i+1]); tr=MathMax(num1,num2); tr=MathMax(tr,num3); //---- counting plus/minus direction if(tr==0) { PlusSdiBuffer[i]=0; MinusSdiBuffer[i]=0; } else { PlusSdiBuffer[i]=100.0*pdm/tr; MinusSdiBuffer[i]=100.0*mdm/tr; } //---- i--; } //---- last counted bar will be recounted if(counted_bars>0) counted_bars--; int limit=Bars-counted_bars; //---- apply EMA to +DI for(i=0; i<=limit; i++) PlusDiBuffer[i]=iMAOnArray(PlusSdiBuffer,Bars,ADXPeriod,0,MODE_EMA,i); //---- apply EMA to -DI for(i=0; i<=limit; i++) MinusDiBuffer[i]=iMAOnArray(MinusSdiBuffer,Bars,ADXPeriod,0,MODE_EMA,i); //---- Directional Movement (DX) i=Bars-2; TempBuffer[i+1]=0; i=starti; while(i>=0) { double div=MathAbs(PlusDiBuffer[i]+MinusDiBuffer[i]); if(div==0.00) TempBuffer[i]=0; else TempBuffer[i]=100*(MathAbs(PlusDiBuffer[i]-MinusDiBuffer[i])/div); i--; } //---- ADX is exponential moving average on DX for(i=0; i<limit; i++) ADXBuffer[i]=iMAOnArray(TempBuffer,Bars,ADXPeriod,0,MODE_EMA,i); //---- return(0); } //+------------------------------------------------------------------+
По Метастоку нашла вот что. Но не знаю насколько это соответствует тому что к меня в терминале. Так как у меня инбикатор не АДХ, а отдельно Di- и DI+. Стараюсь найти еще ин-фу. Может Вы знаете как можно код индикатора в Метастоке посмотреть?
MetaStock -> Tools -> Indicator Builder -> New -> copy & paste complete formulae between "---8<---" lines. =================== ADX/PDI/MDI - True =================== ---8<------------------------------------ { True ADX/PDI/MDI v2.0 Incorporating automatic Support/Resistance. MetaStock's native ADX plots erratic ADX values as periods are increased. e.g., compare this formula (50pds) to MS's ADX(50). Copyright © 2003-2008 Jose Silva. For personal use only. http://www.metastocktools.com } { User inputs } pds:=Input("ADX periods",1,100,14); plot:=Input("plot: [1]ADX, [2]PDI, [3]MDI, [4]All",1,4,1); { Variables } Lo1:=Ref(L,-1); Hi1:=Ref(H,-1); { Plus Directional Movement (PDI) } condUp:=H>Hi1 AND L>=Lo1 OR H>Hi1 AND L<Lo1 AND H-Hi1>Lo1-L; PlusDM:=Wilders(condUp*(H-Hi1),pds)/ATR(pds) *100; { Minus Directional Movement (MDI) } condDw:=H<=Hi1 AND L<Lo1 OR H>Hi1 AND L<Lo1 AND H-Hi1<Lo1-L; MinusDM:=Wilders(condDw*(Lo1-L),pds)/ATR(pds) *100; { True Average Directional Movement (ADX) } DMdiff:=Abs(PlusDM-MinusDM); DMsum:=Max(PlusDM+MinusDM,.000001); ADXtrue:=100*Wilders(DMdiff/DMsum,pds); { Final plot } x:=If(plot=2,PlusDM,If(plot=3,MinusDM,ADXtrue)); { Automatic OverBought/Sold historical levels } avg:=Cum(x)/Cum(IsDefined(x)); pk:=Ref(x,-1)=HHV(x,3) AND Ref(x,-1)>avg; pk1:=ValueWhen(1,pk,Ref(x,-1))*pk; oBought:=Cum(pk1)/Cum(pk); tr:=Ref(x,-1)=LLV(x,3) AND Ref(x,-1)<avg; tr1:=ValueWhen(1,tr,Ref(x,-1))*tr; oSold:=Cum(tr1)/Cum(tr); { Plot in own window } oBought;oSold; If(plot=4,PlusDM,x); If(plot=4,MinusDM,x); If(plot=4,ADXtrue,x) ---8<------------------------------------ http://www.metastocktools.com
Тут, вероятно, все дело в сглаживании, которое якобы должно быть от Уайлдерса. Там ведь Rosh что-то выложил, проверьте.
Я в этих алгебрах не силен. Ждите спеца, разбирающегося в языке Метасов. Или пытайтесь самостоятельно, подключив индюкатор Rosh'a и варьируя параметры.
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Вы принимаете политику сайта и условия использования