Код: Выделить всё
function Initialize()
{
IndicatorName = "StrategyRayDemo";
PriceStudy = true;
AddInput("Input", Inputs.Candle, 1, true, "");
AddSeries("ExtH", DrawAs.Custom, Color.Green);
AddSeries("ExtL", DrawAs.Custom, Color.Red);
AddSeries("HH", DrawAs.Custom, Color.Red);
AddSeries("LL", DrawAs.Custom, Color.Green);
AddParameter("Period", 10, 1);
AddParameter("History", 4, 1);
AddGlobalVariable("H", Types.IntList);
AddGlobalVariable("L", Types.IntList);
}
function Evaluate()
{
// evge 12.02.2022 https://alfadirect4.ru
var I = Input;
// проверяем экстремум ли это
bool isH = true, isL = true;
for (int x = 1; x <= Period; x++)
{
if (I.High[Period + x] > I.High[Period] || I.High[Period - x] > I.High[Period]) isH = false;
if (I.Low[Period + x] < I.Low[Period] || I.Low[Period - x] < I.Low[Period]) isL = false;
}
// Сохраним индекс экстремума в List
if (isH)
{
H.Add(CurrentIndex - Period);
ExtH[Period] = I.High[Period];
}
if (isL)
{
L.Add(CurrentIndex - Period);
ExtL[Period] = I.Low[Period];
}
// Храним только кол-во не более History последних экстремумов
if (H.Count() > History) H.RemoveAt(0);
if (L.Count() > History) L.RemoveAt(0);
///////////////////
// строим RAYs
//по нисходящим High экстремумам
if (H.Count() >= 2)
{
// смещение баров экстремумов
int I0 = 0;
int I1 = 0;
for (int x = H.Count() - 1; x >= 1; x--)
{
I0 = CurrentIndex - H[x];
I1 = CurrentIndex - H[x-1];
if (I.High[I0] < I.High[I1]) break;
}
// экстремумы High нисходящие
if (I.High[I0] < I.High[I1])
{
DateTime dt1 = BarDate(I0).Add(BarTime(I0));
long bt1 = DataPoint.SecondsFromDateTime(dt1);
DateTime dt2 = BarDate(I1).Add(BarTime(I1));
long bt2 = DataPoint.SecondsFromDateTime(dt2);
var TrendLine = StrategyRay(I, bt1, I.High[I0], bt2, I.High[I1]);
//HH[0] = TrendLine[0];
//Дорисовываем (перерисовываем) по экстремумам
for (int x = 0; x <= I0; x++)
HH[x] = TrendLine[x];
}
}
//по восходящим Low экстремумам
if (L.Count() >= 2)
{
// смещение баров экстремумов
int I0 = 0;
int I1 = 0;
for (int x = L.Count() - 1; x >= 1; x--)
{
I0 = CurrentIndex - L[x];
I1 = CurrentIndex - L[x-1];
if (I.Low[I0] > I.Low[I1]) break;
}
// экстремумы Low восходящие
if (I.Low[I0] > I.Low[I1])
{
DateTime dt1 = BarDate(I0).Add(BarTime(I0));
long bt1 = DataPoint.SecondsFromDateTime(dt1);
DateTime dt2 = BarDate(I1).Add(BarTime(I1));
long bt2 = DataPoint.SecondsFromDateTime(dt2);
var TrendLine = StrategyRay(I, bt1, I.Low[I0], bt2, I.Low[I1]);
//LL[0] = TrendLine[0];
//Дорисовываем (перерисовываем) по экстремумам
for (int x = 0; x <= I0; x++)
LL[x] = TrendLine[x];
}
}
// Отрисовка лучей
HH.DrawCircle();
LL.DrawCircle();
// Отрисовка заданных экстремумов
ExtH.DrawArrowDown();
ExtL.DrawArrowUp();
}
если убрать циклическую отрисовку, а оставить только на текущем баре
Код: Выделить всё
//HH[0] = TrendLine[0];
//Дорисовываем (перерисовываем) по экстремумам
for (int x = 0; x <= I0; x++)
HH[x] = TrendLine[x];
заменив на
Код: Выделить всё
HH[0] = TrendLine[0];
//Дорисовываем (перерисовываем) по экстремумам
//for (int x = 0; x <= I0; x++)
//HH[x] = TrendLine[x];
и аналогично проделав с Low экстремумами, то отрисовка будет от момента обнаружения экстремума (точнее, отрисовка будет одинаково начата, но не будет дорисовки до значений до второй точки от бара обнаружения) и далее
на скрине ниже оба варианта, но второй с увеличенным размером кружков (Circle) в настройках индикатора