Author: Copyright � 2006, D&S Kiriyenko.
AMkA
Miscellaneous
Implements a curve of type %1
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 supported. Formatting help

Markdown Formatting Guide

Element Markdown Syntax
Heading # H1
## H2
### H3
Bold **bold text**
Italic *italicized text*
Link [title](https://www.example.com)
Image ![alt text](image.jpg)
Code `code`
Code Block ```
code block
```
Quote > blockquote
Unordered List - Item 1
- Item 2
Ordered List 1. First item
2. Second item
Horizontal Rule ---