Miscellaneous
0
Views
0
Downloads
0
Favorites
AMkA
//+------------------------------------------------------------------+
//| AMkA.mq4 |
//| Copyright © 2006, D&S kiriyenko. |
//| http://groups.google.com/group/expert-developing |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2006, D&S Kiriyenko."
#property link "http://groups.google.com/group/expert-developing"
//----
#property indicator_chart_window
#property indicator_buffers 3
#property indicator_color1 Green
#property indicator_width1 1
#property indicator_color2 Red
#property indicator_width2 2
#property indicator_color3 Blue
#property indicator_width3 2
//+------------------------------------------------------------------+
//| ìàêðîîïðåäåëåíèÿ |
//+------------------------------------------------------------------+
//---- ñòðîêîâûå êîíñòàíòû
#define INDICATOR_SHORT_NAME "AMkA"
#define MAIN "AMkA line"
#define UP "UpTrend point"
#define DOWN "DownTrend point"
//+------------------------------------------------------------------+
//| âíåøíèå ïåðåìåííûå |
//+------------------------------------------------------------------+
//---- ïåðèîäû
extern int periodAMA = 9; //ïåðèîä ðàñ÷¸òà ê-òà ýôôåêòèâíîñòè
extern double nfast = 2; //ïåðèîä EMA äëÿ ýôôåêòèâíîãî ðûíêà
extern double nslow = 30; //ïåðèîä EMA äëÿ íåýôôåêòèâíîãî ðûíêà
//---- ðàñ÷¸ò ñãëàæèâàþùåé êîíñòàíòû
extern double Pow = 2.0; //ñòåïåíü ýôôåêòèâíîñòè
//---- ôèëüòð ñèãíàëîâ
extern double dK = 1.0; //êîýôôèöèåíò äëÿ ôèëüòðà
extern bool use_stdev = true; //èñïîëüçîâàòü ñòàíäàðòíîå îòêëîíåíèå
//---- ïðèìåíÿòü ê öåíå
extern int app_price = 5; //ïî óìîë÷àíèþ - ê òèïè÷åñêîé
//+------------------------------------------------------------------+
//| ãëîáàëüíûå ïåðåìåííûå |
//+------------------------------------------------------------------+
//---- áóôåðû
double kAMAbuffer[];
double kAMAupsig[];
double kAMAdownsig[];
//---- ñãëàæèâàþùèå êîýôôèöèåíòû
double slowSC, fastSC;
//---- ïðèðàùåíèÿ èíäèêàòîðà
double ddAMA[];
//+------------------------------------------------------------------+
//| Âñòàâêà çíà÷åíèÿ â ìàññèâ ïðèðàùåíèé |
//+------------------------------------------------------------------+
bool InsertDif(double a)
{
//---- ïðîâåðêà, çàïîëíåí ëè ìàññèâ
for(int i = 0; i < periodAMA; i++) //äëÿ âñåõ ýëåìåíòîâ ìàññèâà
if(ddAMA[i] == 0) //åñëè ýëåìåíò ðàâåí íóëþ
{
ddAMA[i] = a; //ñîõðàíÿåì çíà÷åíèå â ýòîò ýëåìåíò
return (true); //è óäà÷íî çàâåðøàåìñÿ
}
//---- ìàññèâ óæå çàïîëíåí, íóæíî âñòàâëÿòü ýëåìåíò ñ êîíöà
for(i = 0; i < periodAMA-1; i++) //âñå ýëåìåíòû ìàññèâà, êðîìå ïîñëåäíåãî
ddAMA[i] = ddAMA[i+1]; //ñäâèãàåì âëåâî íà îäíó ïîçèöèþ
ddAMA[periodAMA-1] = a; //è çàïèñûâàåì çíà÷åíèå â ñàìóþ ïðàâóþ ïîçèöèþ
return (true); //ïîñëå ÷åãî óäà÷íî çàâåðøàåìñÿ
}
//+------------------------------------------------------------------+
//| Çàïðîñ öåíû áàðà |
//+------------------------------------------------------------------+
double Price(int i, int app = PRICE_TYPICAL)
{
switch(app)
{
case PRICE_CLOSE: return(Close[i]); break;
case PRICE_OPEN: return(Open[i]); break;
case PRICE_HIGH: return(High[i]); break;
case PRICE_LOW: return(Low[i]); break;
case PRICE_MEDIAN: return((High[i] + Low[i])/2); break;
case PRICE_TYPICAL: return((High[i] + Low[i] + Close[i])/3); break;
case PRICE_WEIGHTED: return((High[i] + Low[i] + Close[i]*2)/4); break;
}
}
//+------------------------------------------------------------------+
//| Èíèöèàëèçàöèÿ |
//+------------------------------------------------------------------+
int init()
{
//---- ãëàâíàÿ ëèíèÿ
SetIndexBuffer(0, kAMAbuffer);
SetIndexStyle(0, DRAW_LINE, 0, 2);
SetIndexLabel(0, MAIN);
SetIndexEmptyValue(0, 0.0);
//---- ïîäòâåðæäåíèå âîñõîäÿùåãî òðåíäà
SetIndexBuffer(1, kAMAupsig);
SetIndexStyle(1, DRAW_ARROW);
SetIndexArrow(1, 159);
SetIndexLabel(1, UP);
SetIndexEmptyValue(1, 0.0);
//---- ïîäòâåðæäåíèå íèñõîäÿùåãî òðåíäà
SetIndexBuffer(2, kAMAdownsig);
SetIndexStyle(2, DRAW_ARROW);
SetIndexArrow(2, 159);
SetIndexLabel(2, DOWN);
SetIndexEmptyValue(2, 0.0);
//---- íàñòðîéêè èíäèêàòîðà
IndicatorDigits(4);
string name = StringConcatenate(INDICATOR_SHORT_NAME,
" (", periodAMA, "/", nfast, "/", nslow, ")");
IndicatorShortName(name);
//---- ðàñ÷¸ò ê-òîâ
slowSC = (2.0 / (nslow + 1)); //ìåäëåííûé ê-ò ñãëàæèâàíèÿ
fastSC = (2.0 / (nfast + 1)); //áûñòðûé ê-ò ñãëàæèâàíèÿ
//---- ïîäãîòîâêà ìàññèâà
ArrayResize(ddAMA, periodAMA);
ArrayInitialize(ddAMA, 0.);
//---- ãîòîâî
return(0);
}
//+------------------------------------------------------------------+
//| Äåèíèöèàëèçàöèÿ |
//+------------------------------------------------------------------+
int deinit()
{
return(0);
}
//+------------------------------------------------------------------+
//| Èòåðàöèîííàÿ ôóíêöèÿ |
//+------------------------------------------------------------------+
int start()
{
//---- îïòèìèçàöèÿ ïðîèçâîäèòåëüíîñòè
if(Bars <= periodAMA + 2)
return (0); //åñëè áàðîâ íà ãðàôèêå ñëèøêîì ìàëî, âûõîäèì
//---- îïòèìèçàöèÿ êîäà èíäèêàòîðà
int counted_bars = IndicatorCounted(); //÷èñëî áàðîâ, íå èçìåí¸ííûõ ñ ïîñëåäíåãî âûçîâà
if(counted_bars < 0)
return (0); //çàùèùàåìñÿ îò îøèáîê
else
if(counted_bars > 0)
counted_bars--; //ïîñëåäíèé ïîñ÷èòàííûé áàð áóäåò ïåðåñ÷èòàí
int pos = Bars - periodAMA - 2; //ïîçèöèþ â íà÷àëî îòñ÷¸òà
if(counted_bars > 0)
pos = Bars - counted_bars; //èëè îïðåäåëÿåì ïîçèöèþ
//---- ïîäãîòîâêà ïåðåìåííûõ
double AMA0 = Price(pos+1, app_price); //ïðåäûäóùåå ÀÌÀ íå ðàñ÷èòûâàëîñü
if(kAMAbuffer[pos+1] > 0)
AMA0 = kAMAbuffer[pos+1]; //èëè ðàñ÷èòûâàëîñü
if(AMA0 == 0)
Print(Bars - pos);
//---- ðàñ÷¸ò èíäèêàòîðà
while(pos >= 0)
{
//---- ðàñ÷¸ò ñèãíàëà
double signal = MathAbs(Price(pos, app_price) - Price(pos + periodAMA, app_price));
//---- ðàñ÷¸ò øóìà
double noise = 0.000000001;
for(int i = 0; i < periodAMA; i++)
{
noise = noise + MathAbs(Price(pos+i, app_price) - Price(pos + i + 1, app_price));
}
//---- ðàñ÷¸ò êîýôôèöèåíòà ñãëàæèâàíèÿ
double ER = signal / noise; //êîýôôèöèåíò ýôôåêòèâíîñòè
double SSC = ER*(fastSC - slowSC) + slowSC; //êîýôôèöèåíò ñãëàæèâàíèÿ
//---- ðàñ÷¸ò ãëàâíîé ëèíèè
double AMA = AMA0 + (MathPow(SSC, Pow)*(Price(pos, app_price) - AMA0)); //ðàñ÷¸ò
AMA = NormalizeDouble(AMA, Digits);
kAMAbuffer[pos] = AMA; //âûâîä
//---- ðàñ÷¸ò ôèëüòðàöèè òðåíäà
double ddK = (AMA - AMA0) / Point; //ðàçíîñòü
if(use_stdev)
{
InsertDif(ddK); //íàêàïëèâàåì ïðèðàùåíèå
if(pos < Bars - 2*(periodAMA + 2)) //åñëè áàðîâ íàêîïèëîñü äîñòàòî÷íî
{
//---- ðàñ÷¸ò ñðåäíåãî àðèôìåòè÷åñêîãî
double SMAdif = 0; //âíà÷àëå ðàâíî íóëþ
for(i = 0; i < periodAMA; i++)
{
SMAdif += ddAMA[i]; //ïîñëåäîâàòåëüíî ñóììèðóåì
}
SMAdif /= periodAMA; //è äåëèì íà êîëè÷åñòâî
//---- ðàñ÷¸ò ñòàíäàðòíîãî îòêëîíåíèÿ
double StDev = 0; //âíà÷àëå ðàâíî íóëþ
for(i = 0; i < periodAMA; i++)
{
StDev += MathPow(ddAMA[i] - SMAdif, 2); //ñóììèðóåì êâàäðàòû îòêëîíåíèé
}
StDev = MathSqrt(StDev)/periodAMA; //èçâëåêàåì êîðåíü è äåëèì íà êîëè÷åñòâî
//---- ðàñ÷¸ò ôèëüòðà
double Filter = dK*StDev;
}
else
Filter = 100000;
}
else
Filter = dK;
//---- îáðàáîòêà çíà÷åíèé
double var1 = 0, var2 = 0;
if(ddK > Filter)
var1 = AMA; //åñòü âîñõîäÿùèé òðåíä
if(ddK < -Filter)
var2 = AMA; //åñòü íèñõîäÿùèé òðåíä
kAMAupsig[pos] = var1; //íåò âîñõîäÿùåãî òðåíäà
kAMAdownsig[pos] = var2; // íåò íèñõîäÿùåãî òðåíäà
//---- ïåðåõîä ê êîíöó öèêëà
AMA0 = AMA; //ñîõðàíÿåì ïðåäûäóùåå çíà÷åíèå AMA
pos--; //ïåðåõîäèì ê ñäåäóþùåìó áàðó
}
//---- çàâåðøåíèå ðàáîòû
return(0); //ãîòîâî
}
//+------------------------------------------------------------------+
Comments
Markdown Formatting Guide
# H1
## H2
### H3
**bold text**
*italicized text*
[title](https://www.example.com)

`code`
```
code block
```
> blockquote
- Item 1
- Item 2
1. First item
2. Second item
---