Стандартный ADX

 
Всем привет.

В МТ4 есть стандартный ADX в котором можно менять цены Close, Open, Low, High и т.д. (7 штук).

Подскажите, что нужно вставить в нижеприведенный код, чтобы изменять входные параметры?

//+------------------------------------------------------------------+ //| ADX.mq4 | //| Copyright © 2004, MetaQuotes Software Corp. | //| https://www.metaquotes.net// | //+------------------------------------------------------------------+ #property copyright "Copyright © 2004, MetaQuotes Software Corp." #property link "https://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); } //+------------------------------------------------------------------+
 
А в ответ - тишина :)....
 
HELP!!!
 

Дайте оригинальный код ADX

 

double iADX( string symbol, int timeframe, int period, int applied_price, int mode, int shift)
Расчет Average Directional Movement Index.

Параметры:

symbol - Символьное имя инструмента, на данных которого будет вычисляться индикатор. NULL означает текущий символ.
timeframe - Период. Может быть одним из периодов графика. 0 означает период текущего графика.
period - Период усреднения для вычисления индекса.
applied_price - Используемая цена. Может быть любой из ценовых констант.
mode - Индекс линии индикатора. Может быть любым из перечисленных идентификаторов линии индикаторов.
shift - Индекс получаемого значения из индикаторного буфера (сдвиг относительно текущего бара на указанное количество периодов назад).


Весь Ваш код умещается в 1 строке стандартной функции расчета. В ней можно менять все параметры и не ломать голову. Нет никакой необходимости изобретать колесо.
 

Если хотите поэкспериментировать то можете умножить, например, каждый буфер на какой-нибудь коэффициент и вставить нижнюю строку

extern double K1DI = 2.7; //ВЫСОТА ПО ВЕРТИКАЛИ
//---- input parameters
extern int ADXPeriod=14;
вот сюда

extern double K1D1 = 2.7;

добавить настройку

extern int MODE1 = 1;//0-MODE_SMA, 1 - MODE_EMA, 2-MODE_SMMA 3-MODE_LWMA,

.........

.........

а ниже умножение
PlusDiBuffer[i]=OnArray(PlusSdiBuffer,Bars,ADXPeriod,0,MODE1,i) * K1DI = 2.7; //ВЫСОТА ПО ВЕРТИИКАЛИ;

можно убрать MathAbs или 100
получи
тся

else TempBuffer[i]=100*((PlusDiBuffer[i]-MinusDiBuffer[i])/div);

или заменить 100 в нижнем выражении например на 44 ...

else { PlusSdiBuffer[i]=44.0*pdm/tr; MinusSdiBuffer[i]=44.0*mdm/tr; }

или обозначить как это сделано в самом верху
много можно наваять

поэкспериментируйте

но помните - счастье не в коде

 
да.....какие примитивы.ведь просят код.
 
lawer611:
да.....какие примитивы.ведь просят код.

Какой "недогадливый", да еще и воинствующий. Тоже с халявой пролетели ? Не понимаете, поясню: Здесь помогут бесплатно. Но помощь - это когда Вы что-то делаете сами и не получается. То, что нужно топикстартеру называется сделаете за меня - выхода три :

1. Начать делать самому - там достаточно прочитать учебник и написать. Описать конкретно, что делал и что не получается.

2. Обратиться в платную часть и заказать.

3. Ждать альтруиста, который еще не устал поощрять халявное отношение.

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