Общие вопросы по разработке > Неуловимый минимум или как запомнить свечу

Общие вопросы по разработке в Альфа-Директ 4. Обсуждение разработки пользовательских индикаторов, стратегий.
Дмитрий
Сообщения: 3
Зарегистрирован: 08 апр 2017, 09:17

Неуловимый минимум или как запомнить свечу

Непрочитанное сообщение Дмитрий » 08 апр 2017, 09:51

Здравствуйте.

Проблема в том, что не знаю как можно запомнить нужный мне минимум. Красные точки должны быть под предыдущим минимумом (указано стрелками), т.е. под минимумом, который ниже предыдущего и ниже последующего. На деле получается, что точка рисуется при формировании последнего минимума, как и должно быть, но получается нарисовать её только под самым последним минимумом, а не предыдущим.

Подскажите, пожалуйста, в как решить эту задачу.
Заранее спасибо.

График:
Изображение

Код:

Код: Выделить всё

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();
}

Аватара пользователя
evge
Администратор
Сообщения: 1652
Зарегистрирован: 04 фев 2016, 09:46
Откуда: Млечный путь, планета Земля
Благодарил (а): 64 раза
Поблагодарили: 303 раза
Контактная информация:

Re: Неуловимый минимум или как запомнить свечу

Непрочитанное сообщение evge » 08 апр 2017, 10:37

LM-01.png
LM-01.png (35.36 КБ) 4354 просмотра


ну это если перенести строку

Код: Выделить всё

                     LMaxNo = CurrentIndex;
                     Line[LMinNo - CurrentIndex] = LM;
                     MMinNo = LMinNo - CurrentIndex;
// вот сюда
                     MMin[MMinNo] = LM; //Рисуем точку на графике


а здесь убрать

Код: Выделить всё

                              if (MXL == -1) //Если предыдущий минимум был ниже предыдущего
                                 {
                                    //MMin[MMinNo] = MLM; //Рисуем точку на графике
                                    MXL = 0;
                                    MLM = LM; //Запоминаем цену последнего краткосрочного минимума
                                 }
никогда такого не было и вот опять

Дмитрий
Сообщения: 3
Зарегистрирован: 08 апр 2017, 09:17

Re: Неуловимый минимум или как запомнить свечу

Непрочитанное сообщение Дмитрий » 08 апр 2017, 11:24

Ошибку понял, невнимательно посмотрел. Почистил сообщение от мусора.

А вот такой график пытаюсь получить:
Изображение

Дмитрий
Сообщения: 3
Зарегистрирован: 08 апр 2017, 09:17

Re: Неуловимый минимум или как запомнить свечу

Непрочитанное сообщение Дмитрий » 10 апр 2017, 11:26

Решение оказалось на поверхности.

Сюда добавляем строчку:

Код: Выделить всё

if (MLL < MLM) //Если текущий минимум ниже предыдущего


Код: Выделить всё

MMinNo = LMinNo;


И меняем вывод точки на графике:

Код: Выделить всё

MMin[MMinNo - CurrentIndex] = MLM; //Рисуем точку на графике


Вернуться в «Общие вопросы по разработке»

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и 7 гостей