Проблема в том, что не знаю как можно запомнить нужный мне минимум. Красные точки должны быть под предыдущим минимумом (указано стрелками), т.е. под минимумом, который ниже предыдущего и ниже последующего. На деле получается, что точка рисуется при формировании последнего минимума, как и должно быть, но получается нарисовать её только под самым последним минимумом, а не предыдущим.
Подскажите, пожалуйста, в как решить эту задачу.
Заранее спасибо.
График:
Код:
Код: Выделить всё
function Initialize()
{
IndicatorName = "LW";
PriceStudy = true;
AddInput("Input", Inputs.Candle);
AddSeries("Line", DrawAs.Line, Color.Black);
AddSeries("MMin", DrawAs.Custom, Color.Red);
AddSeries("MMax", DrawAs.Custom, Color.Green);
//Переменные для постройки КРАТКОСРОЧНЫХ минимумов и максимумов
AddGlobalVariable("LMinNo", Types.Int, 0); //Номер свечи краткосрочного минимума [CurrentIndex]
AddGlobalVariable("LMaxNo", Types.Int, 0); //Номер свечи краткосрочного максимума [CurrentIndex]
AddGlobalVariable("X", Types.Int, 0); //Направление движения (значения 1 или -1)
AddGlobalVariable("LM", Types.Double, 0); //Запомненный минимум свечи ([M]emory)
AddGlobalVariable("HM", Types.Double, 0); //Запомненные максимум свечи ([M]emory)
//Переменные для постройки СРЕДНЕСРОЧНЫХ минимумов и максимумов
AddGlobalVariable("MLM", Types.Double, 0); //Запомненный среднесрочный минимум ([M]emory)
AddGlobalVariable("MHM", Types.Double, 0); //Запомненные среднесрочный максимум ([M]emory)
AddGlobalVariable("MLL", Types.Double, 0); //Последний среднесрочный минимум ([L]ast)
AddGlobalVariable("MHL", Types.Double, 0); //Последний среднесрочный максимум ([L]ast)
AddGlobalVariable("MXL", Types.Int, 0); //Направление движения среднесрочного минимума (значения 0 или -1)
AddGlobalVariable("MXH", Types.Int, 0); //Направление движения среднесрочного максимума (значения 0 или 1)
AddGlobalVariable("MMinNo", Types.Int, 0); //Номер свечи среднесрочного минимума [CurrentIndex]
AddGlobalVariable("MMaxNo", Types.Int, 0); //Номер свечи среднесрочного максимума [CurrentIndex]
}
function Evaluate()
{
var H = Input.High[0];
var L = Input.Low[0];
if (CurrentIndex < 2)
{
LM = Input.Low[0];
HM = Input.High[0];
MLM = Input.Low[0];
MHM = Input.High[0];
}
else
{
if (L < LM && H > HM) //Ищем внешнюю свечу
{
LM = Input.Low[0];
HM = Input.High[0];
LMaxNo = CurrentIndex;
LMinNo = CurrentIndex;
}
if (L >= LM && H > HM) //Ищем повышающуюся свечу
{
if (X <= 0) //Если предыдущая свеча НЕ повышающаяся
{
X = 1;
MLL = LM;
LMaxNo = CurrentIndex;
Line[LMinNo - CurrentIndex] = LM;
MMinNo = LMinNo - CurrentIndex;
//Определение среднесрочного минимума
//------------------------------------------------------------------------------------------
if (MLL < MLM) //Если текущий минимум ниже предыдущего
{
MXL = -1;
MLM = LM; //Запоминаем цену последнего краткосрочного минимума
}
if (MLL > MLM) //Если текущий минимум выше предыдущего
{
if (MXL == -1) //Если предыдущий минимум был ниже предыдущего
{
MMin[MMinNo] = MLM; //Рисуем точку на графике
MXL = 0;
MLM = LM; //Запоминаем цену последнего краткосрочного минимума
}
MLM = LM; //Запоминаем цену последнего краткосрочного минимума
}
//------------------------------------------------------------------------------------------
LM = Input.Low[0];
HM = Input.High[0];
}
LM = Input.Low[0];
HM = Input.High[0];
LMaxNo = CurrentIndex;
}
if (L < LM && H <= HM) //Ищем понижающуюся свечу
{
if (X >= 0) //Если предыдущая свеча НЕ понижающаяся
{
X = -1;
MHL = HM;
LMinNo = CurrentIndex;
Line[LMaxNo - CurrentIndex] = HM;
//Определение среднесрочного максимума
//------------------------------------------------------------------------------------------
//------------------------------------------------------------------------------------------
LM = Input.Low[0];
HM = Input.High[0];
}
LM = Input.Low[0];
HM = Input.High[0];
LMinNo = CurrentIndex;
}
}
//MMax.DrawCircle();
MMin.DrawCircle();
}