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