Ïûòàþñü ðåàëèçîâàòü ôóíêöèþ ïîëó÷åíèÿ ìàêñèìàëüíîé äåëüòû çà N-áàðîâ. Êòî-íèòü ïîäîáíîå ïèñàë?
Íà äàííûé ìîìåíò, íàïèñàí òàêîé èíäèêàòîð:
PHP êîä:
#property strict
#property indicator_chart_window // Èíäèêàòîð âûâîäèòñÿ â îêíå ãðàôèêà
#property indicator_buffers 2 // Èñïîëüçóåòñÿ 2 áóôåðà èíäèêàòîðà
//#property indicator_color1 clrBlack // Öâåò îòîáðàæåíèÿ äàííûõ 1-ãî áóôåðà
//#property indicator_width1 1 // Òîëùèíà ëèíèé 1-ãî áóôåðà
//#property indicator_color2 clrRed // Öâåò îòîáðàæåíèÿ äàííûõ 2-ãî áóôåðà
//#property indicator_width2 1 // Òîëùèíà ëèíèé 2-ãî áóôåðà
input int countCamparedBars = 3; // Êîëè÷åñòâî îáú¸ìà îïðåäåë¸ííîãî ïðèçíàêà â ïîñëåäîâàòåëüíîñòè
double MaxPositiveDelta[]; // Áóôåð ìàêñèìàëüíûõ çíà÷åíèé ïîëîæèòåëüíîé äåëüòû çà N-áàðîâ
double MaxNegativeDelta[]; // Áóôåð ìàêñèìàëüíûõ çíà÷åíèé îòðèöàòåëüíîé äåëüòû çà N-áàðîâ
// ======================================================== Ôàéëû âêëþ÷åíèÿ ===========================================================+
#include <HOZ_Code\Classes\GetIndicatorsData\ClusterDelta.mqh>
//+---------------------------------------------------------------------------------------------------------------------------------------+
//| Custom indicator initialization function |
//+---------------------------------------------------------------------------------------------------------------------------------------+
int OnInit()
{
IndicatorBuffers(2);
// Ñâÿçûâàíèå 1-ãî áóôôåðà ñ ñîîòâåòñòâóþùèì ìàññèâîì è îïðåäåëåíèå åãî ñâîéñòâ
SetIndexBuffer (0, MaxPositiveDelta);
SetIndexStyle (0, DRAW_ARROW, 0, 3, clrBlack);
SetIndexArrow (0, 241);
// Ñâÿçûâàíèå 2-ãî áóôôåðà ñ ñîîòâåòñòâóþùèì ìàññèâîì è îïðåäåëåíèå åãî ñâîéñòâ
SetIndexBuffer (1, MaxNegativeDelta);
SetIndexStyle (1, DRAW_ARROW, 0, 3, clrRed);
SetIndexArrow (1, 242);
//---
return (INIT_SUCCEEDED);
}
//+---------------------------------------------------------------------------------------------------------------------------------------+
//| Ïåðå÷èñëåíèå òèïîâ âîçìîæíûõ äåëüò |
//+---------------------------------------------------------------------------------------------------------------------------------------+
enum ENUM_DELTATYPE
{
MAX_POSITIVE_SEQUENCE,
MAX_NEGATIVE_SEQUENCE,
NONE
};
//+---------------------------------------------------------------------------------------------------------------------------------------+
//| Îïðåäåëåíèå çíà÷åíèå ïîëîæèòåëüíîé äåëüòû ClusterDelta_Delta |
//+---------------------------------------------------------------------------------------------------------------------------------------+
int ExistencePositiveSequence (int fi_Index, int fi_CountCamparedBars)
{
int cx = 0;
if (ClusterDelta::PositiveDelta (fi_Index) > ClusterDelta::PositiveDelta (fi_Index + 1))
{
cx++;
while (ClusterDelta::PositiveDelta (fi_Index) > ClusterDelta::PositiveDelta (fi_Index + cx + 1))
{
cx++;
if (cx >= fi_CountCamparedBars) return (MAX_POSITIVE_SEQUENCE);
}
}
else if (ClusterDelta::PositiveDelta (fi_Index) < ClusterDelta::PositiveDelta (fi_Index + 1))
{
cx++;
while (ClusterDelta::PositiveDelta (fi_Index) < ClusterDelta::PositiveDelta (fi_Index + cx + 1))
{
cx++;
if (cx >= fi_CountCamparedBars) return (MAX_NEGATIVE_SEQUENCE);
}
}
return (NONE);
}
//+---------------------------------------------------------------------------------------------------------------------------------------+
//| Custom indicator iteration function |
//+---------------------------------------------------------------------------------------------------------------------------------------+
int OnCalculate (const int rates_total,
const int prev_calculated,
const datetime &time[],
const double &open[],
const double &high[],
const double &low[],
const double &close[],
const long &tick_volume[],
const long &volume[],
const int &spread[])
{
//---
int limit = rates_total - prev_calculated;
while ( (rates_total - limit ) < countCamparedBars + 1)
{
limit--;
}
for (int i = limit; i >= 0; i--)
{
if (ExistencePositiveSequence (i, countCamparedBars) == MAX_POSITIVE_SEQUENCE)
{
MaxPositiveDelta[i] = High[i];
}
else if (ExistencePositiveSequence (i, countCamparedBars) == MAX_NEGATIVE_SEQUENCE)
{
MaxNegativeDelta[i] = Low[i];
}
}
//--- return value of prev_calculated for next call
return (rates_total);
}
Ôóíêöèè ClusterDelta::PositiveDelta (fi_Index) è ClusterDelta::NegativeDelta (fi_Index) ïîëó÷àþòñÿ èç êëàññà âåðíî (ïðîâåðèë íà ðåàëå).
Ýòîò èíäþê íå êîððåêòíî ïîêàçûâàåò äàííûå (ðèñóåò ñòðåëêè â ìåñòàõ, ãäå äîëæåí áûòü ñàìûé áîëüøàÿ äåëüòà çà countCamparedBars - áàðîâ.
Ïðîñüá ïîäåëèòñÿ îïûòîì â ýòîì ïëàíå, à òî óæå çàìó÷àëñÿ. Èíäþêè êóïèë è ïðîäëåâàþ ðåãóëÿðíî, à âîïðîñ íå ðåøàåò óæå íåäåëþ.
Ìíå íå ïðèíöèïèàëüíî ðåàëèçàöèÿ êàê ó ìåíÿ, ãëàâíîå êîððåêòíîå ðåøåíèå. Õîòÿ èíäþê òî íå áîëüøîé. Òîò êòî ïîíèìàåò, ñìîæåò è ó ìåíÿ íàéòè îøèáêó.