AffineTransformR2

Author: � xp3rienced
Miscellaneous
Implements a curve of type %1
0 Views
0 Downloads
0 Favorites
AffineTransformR2
// +——————————————————————————————————————————————————————————————————————————————————————————————+
// ¦     Affine Transform                                                     AffineTransform.mq4 ¦
// ¦  Èíäèêàòîð âûïîëíÿåò àôôèííîå ïðåîáðàçîâàíèå âðåìåííîãî ðÿäà öåíîâûõ äàííûõ (ïî öåíàì,       ¦
// ¦ óêàçàííûì â ïàðàìåòðå Applied_Price), èñïîëüçóÿ óãîë íàêëîíà òðåíäîâîé ëèíèè.                ¦
// ¦  Ïîðÿäîê èñïîëüçîâàíèÿ:                                                                      ¦
// ¦   •ñîçäàòü òðåíäîâóþ ëèíèþ, ïðèñâîèòü åå îáúåêòó èìÿ;                                        ¦
// ¦   •ïðèñîåäèíèòü èíäèêàòîð ê ãðàôèêó, óêàçàâ èìÿ òðåíäîâîé ëèíèè â ïàðàìåòðå Trendline_Name;  ¦
// ¦   •âûáðàòü öåíîâóþ êîíñòàíòó â ïàðàìåòðå Applied_Price (èëè óñòàíîâèòü åå =7 äëÿ ðàñ÷åòà ïî  ¦
// ¦    äâóõ ëèíèé ïî ýêñòðåìóìàì áàðîâ).                                                         ¦
// ¦  Çàìå÷àíèå: ïðè èçìåíåíèè óãëà òðåíäîâîé ëèíèè, èíäèêàòîð ïåðåñ÷èòûâàåò âñå ïîêàçàíèÿ.       ¦
// ¦  Âûðàæàþ áëàãîäàðíîñòü àâòîðó èäåè, ïîëîæåííîé â îñíîâàíèå èíäèêàòîðà: Ëèõîâèäîâó Â.Í.       ¦
// ¦  Ññûëêà íà èíäèêàòîð â MQL4 Code Base: http://codebase.mql4.com/ru/6280                      ¦
// ¦  Îãðîìíàÿ ïðîñüáà ðàñïðîñòðàíÿòü èíäèêàòîð òîëüêî â èñõîäíèêå (.mq4), è íå èçìåíÿòü òåêñò    ¦
// ¦ ýòîãî çàãîëîâêà.                                                                             ¦
// ¦----------------------------------------------------------------------------------------------¦
// ¦     [release 2] 10.12.2009                                                                   ¦
// ¦ (+)Îãðàíè÷åíèå áàðîâ èíäèêàòîðà, èõ ÷èñëî çàäàåòñÿ ïàðàìåòðîì MaxBars. Äîï. çíà÷åíèÿ:        ¦
// ¦     0: îòêëþ÷èòü;                                                                            ¦
// ¦    -1: îãðàíè÷åíèå ïî ïåðâîé òî÷êå òðåíäîâîé ëèíèè.                                          ¦
// ¦ (+)Ðåæèì äâóõ ëèíèé ïî ýêñòðåìóìàì áàðîâ. Äëÿ âêëþ÷åíèÿ, óêàæèòå ïàðàìåòð Applied_Price = 7. ¦
// ¦    Â ýòîì ðåæèìå, èíäèêàòîð ñòðîèò äâå ëèíèè: îäíó ïî ìàêñèìóìàì öåíû, à âòîðóþ ïî           ¦
// ¦    ìèíèìóìàì. Ïðåäíàçíà÷åí äëÿ áîëåå òî÷íîãî îïðåäåëåíèÿ óðîâíåé ñîïðîòèâëåíèÿ/ïîääåðæêè.    ¦
// ¦ (+)Öâåò ëèíèé èíäèêàòîðà òåïåðü ñîîòâåòñòâóåò öâåòó òðåíäîâîé ëèíèè, ê êîòîðîé îí ïðèâÿçàí.  ¦
// ¦     [release 1] 06.12.2009                                                                   ¦
// ¦ (•)Ïåðâûé ðåëèç. Ïðåäëîæåíèÿ ïî óëó÷øåíèÿì ïðèâåòñòâóþòñÿ.  _________________________________¦
// ¦                                                            | © xp3rienced, Ekaterinburg 2009 ¦
// +——————————————————————————————————————————————————————————————————————————————————————————————+
#property copyright "© xp3rienced"
#property link      "no4ta[at]inbox.ru"

#define PRICE_HIGHLOW 7

#property indicator_separate_window
#property indicator_buffers 2
#property indicator_color1 Green
#property indicator_color2 Green
#property indicator_width1 1
#property indicator_width2 1

//====[ ïàðàìåòðû èíäèêàòîðà ]====
extern string Trendline_Name = "A_Line";    // Èìÿ îáúåêòà (òðåíäîâîé ëèíèè)
extern int Applied_Price = PRICE_CLOSE;     // Öåíîâûå äàííûå, ïî êîòîðûì ñòðîèòñÿ ëèíèÿ èíäèêàòîðà. Çíà÷åíèÿ:
// Close = 0; Open = 1; High = 2; Low = 3; Median = 4; Typical = 5; Weighted = 6; HighLow = 7
extern int MaxBars = 500;                   // Îãðàíè÷åíèå áàðîâ èíäèêàòîðà. 0 = îòêëþ÷èòü; -1 = îãðàíè÷åíî ïåðâîé òî÷êîé òðåíäîâîé ëèíèè

//====[ áóôåðû èíäèêàòîðà ]====
double At_High[];
double At_Low[];

//====[ ãëîáàëüíûå ïåðåìåííûå èíäèêàòîðà ]====
double LineAngleTg;                         // Òàíãåíñ óãëà íàêëîíà òðåíäîâîé ëèíèè
double LinePrice1, LinePrice2;              // Öåíîâûå êîîðäèíàòû òî÷åê òðåíäîâîé ëèíèè
datetime LineTime1, LineTime2;              // Âðåìåííûå êîîðäèíàòû òî÷åê òðåíäîâîé ëèíèè
int Shift1, Shift2;                         // Áàðíîå ñìåùåíèå òî÷åê òðåíäîâîé ëèíèè
int Multiplier;                             // Ìíîæèòåëü, ïðèìåíÿåìûé ê öåíå (äëÿ óìåíüøåíèÿ ïîãðåøíîñòè)
bool NeedUpdate;

//+------------------------------------------------------------------+
//|                 Ôóíêöèÿ èíèöèàëèçàöèè èíäèêàòîðà                 |
//+------------------------------------------------------------------+
int init()
{
//----
  if((Applied_Price < 0) || (Applied_Price > 7)) Applied_Price = PRICE_CLOSE;
//---- íàçíà÷åíèå èíäåêñîâ áóôåðàì
  SetIndexBuffer(0, At_High);
  SetIndexBuffer(1, At_Low);
//---- óñòàíîâêè îòðèñîâêè
  color c = GetTrendLineColor();
  SetIndexStyle(0, DRAW_LINE, EMPTY, EMPTY, c);
  SetIndexStyle(1, DRAW_LINE, EMPTY, EMPTY, c);
//---- èìÿ äëÿ Îêíà Äàííûõ, è íàäïèñè ïîäîêíà èíäèêàòîðà
  IndicatorShortName(StringConcatenate("Affine Transform(", PriceConstToStr(Applied_Price), ")"));
  string label1 = PriceConstToStr(Applied_Price);
  string label2 = label1;
  if(Applied_Price == 7)
  {
    label1 = "High";
    label2 = "Low";
  }
  SetIndexLabel(0, label1);
  SetIndexLabel(1, label2);
//----
  NeedUpdate = true;
  Multiplier = MathPow(10, Digits);
//---- èíèöèàëèçàöèÿ çàâåðøåíà
  return(0);
}

//+------------------------------------------------------------------+
//|                Ôóíêöèÿ äåèíèöèàëèçàöèè èíäèêàòîðà                |
//+------------------------------------------------------------------+
int deinit()
{
//----
  
//----
  return(0);
}

//+------------------------------------------------------------------+
//|                   Ôóíêöèÿ èòåðàöèè èíäèêàòîðà                    |
//+------------------------------------------------------------------+
int start()
{
  int limit = Bars - IndicatorCounted();
  if(limit < Bars) limit++;
//---- âû÷èñëåíèå òàíãåíñà óãëà íàêëîíà, è åñëè îí èçìåíèëñÿ - ïîëíàÿ ïåðåðèñîâêà
  CalcAngleTg();
  if(NeedUpdate)
  {
    limit = Bars - 1;
    NeedUpdate = false;
  }
//---- îãðàíè÷åíèå áàðîâ ðàñ÷åòà, åñëè òðåáóåòñÿ
  if((MaxBars > 0) && (MaxBars < limit)) limit = MaxBars;
  if(MaxBars == -1) limit = Shift1;
//---- âûïîëíåíèå àôôèííîãî ïðåîáðàçîâàíèÿ
  if(Applied_Price == 7)
  {
//---- ðåæèì ïîñòðîåíèÿ äâóõ ëèíèé ïî ýêñòðåìóìàì áàðîâ
    for(int i=0; i<limit; i++)
    {
      At_High[i] = CoordTransform(PRICE_HIGH, i);
      At_Low[i] = CoordTransform(PRICE_LOW, i);
    }
    return(0);
  }
//---- ðåæèì ïîñòðîåíèÿ îäíîé ëèíèè, ïî îäíîìó öåíîâîìó ðÿäó
  for(i=0; i<limit; i++)
  {
    At_High[i] = CoordTransform(Applied_Price, i);
    At_Low[i] = At_High[i];
  }
//----
  return(0);
}
//+------------------------------------------------------------------+

void CalcAngleTg()
{
  if(ObjectFind(Trendline_Name) == -1) return;
//----
  double tg;
//----
  LinePrice1 = ObjectGet(Trendline_Name, OBJPROP_PRICE1);
  LinePrice2 = ObjectGet(Trendline_Name, OBJPROP_PRICE2);
  LineTime1 = ObjectGet(Trendline_Name, OBJPROP_TIME1);
  LineTime2 = ObjectGet(Trendline_Name, OBJPROP_TIME2);
//----
  Shift1 = iBarShift(NULL, 0, LineTime1, true);
  Shift2 = iBarShift(NULL, 0, LineTime2, true);
//----
  tg = (LinePrice2 - LinePrice1) * Multiplier / (GetShift(Shift2) - GetShift(Shift1));
  if(tg != LineAngleTg) NeedUpdate = true;
  LineAngleTg = tg;
//----
  //Print("tg(angle) = ", LineAngleTg);
}

double CoordTransform(int price, int shift)
{
  return((GetPrice(price, shift) - LinePrice1) * Multiplier - (GetShift(shift) - GetShift(Shift1)) * LineAngleTg);
}

double GetPrice(int price_const, int shift)
{
  switch(price_const)
  {
    case PRICE_CLOSE: return(Close[shift]);
    case PRICE_OPEN: return(Open[shift]);
    case PRICE_HIGH: return(High[shift]);
    case PRICE_LOW: return(Low[shift]);
    case PRICE_MEDIAN: return((High[shift] + Low[shift]) / 2);
    case PRICE_TYPICAL: return((High[shift] + Low[shift] + Close[shift]) / 3);
    case PRICE_WEIGHTED: return((High[shift] + Low[shift] + Close[shift]*2) / 4);
  }
}

int GetShift(int index)
{
  return(Bars-1 - index);
}

color GetTrendLineColor()
{
  return(ObjectGet(Trendline_Name, OBJPROP_COLOR));
}

string PriceConstToStr(int price_const)
{
  switch(price_const)
  {
    case PRICE_CLOSE: return("Close");
    case PRICE_OPEN: return("Open");
    case PRICE_HIGH: return("High");
    case PRICE_LOW: return("Low");
    case PRICE_MEDIAN: return("Median price");
    case PRICE_TYPICAL: return("Typical price");
    case PRICE_WEIGHTED: return("Weighted price");
    case PRICE_HIGHLOW: return("HighLow");
  }
}
//+------------------------------------------------------------------+

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 ---