Пользовательские индикаторы > CustomCandle

Дополнительные индикаторы от пользователей Альфа-Директ 4. Готовые решения от пользователей.
BugsDigger
Сообщения: 333
Зарегистрирован: 11 ноя 2018, 17:11
Благодарил (а): 21 раз
Поблагодарили: 41 раз

CustomCandle

Непрочитанное сообщение BugsDigger » 20 янв 2019, 18:37

Преобразование текущего таймфрейма к (почти) произвольному.

Можно использовать для генерации "более быстрых" псевдосвечек длинных ТФ через свечки коротких ТФ, например, получасовки каждую минуту (как на картинке). Псевдо, потому что хоть цена Close и актуальная (от последней свечи), но цена Open для приведенного примера будет от свечки получасовой давности; соответственно и цвет тоже "псевдо". Кроме того, нельзя сделать выходной ряд типа Candle, приходится вручную заводить 4 серии Open/High/Low/Close, так что на результат индикатора нельзя напустить стандартные индикаторы от стандартных свечек (м.б. это и к лучшему :) ).

Для полноты счастья добавлена серия MID=(High+Low)/2; на мой взгляд она ведет себя "красиво".

1.png


В случае, если входной ТФ>=желаемому, на выход будут просто транслироваться входные данные (бесполезно, но корректно).

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

function Initialize()
{
 IndicatorName = "CustomCandle";
 PriceStudy=false;
 // собственно свеча
 AddInput("Input", Inputs.Candle);
 AddSeries("Open",  DrawAs.Custom, Color.Green);
 AddSeries("High",  DrawAs.Custom, Color.Black);
 AddSeries("Low",   DrawAs.Custom, Color.Black);
 AddSeries("Close", DrawAs.Custom, Color.Red);
 // среднее по свече
 AddSeries("MID", DrawAs.Line, Color.Black);
 
 AddParameter("OutputTF_sec", 1800);

 AddGlobalVariable("InputTF_sec", Types.Int, 1);
 AddGlobalVariable("Period", Types.Int, 0);      // окно во входных барах
}

function Evaluate()
{
 if(CurrentIndex==0)
 {
  int tf=Input.Timeframe; 
  switch(tf)
  {
   case -1:    InputTF_sec=1; break; // секунда
   case -2:    InputTF_sec=2; break;
   case -3:    InputTF_sec=3; break;
   case -4:    InputTF_sec=4; break;
   case -5:    InputTF_sec=5; break;
   case -6:    InputTF_sec=6; break;
   case -10:   InputTF_sec=10; break;
   case -12:   InputTF_sec=12; break;
   case -15:   InputTF_sec=15; break;
   case -20:   InputTF_sec=20; break;
   case -30:   InputTF_sec=30; break;
   case 1:     InputTF_sec=60; break;
   case 2:     InputTF_sec=60*2; break;
   case 3:     InputTF_sec=60*3; break;
   case 4:     InputTF_sec=60*4; break;
   case 5:     InputTF_sec=60*5; break;
   case 6:     InputTF_sec=60*6; break;
   case 10:    InputTF_sec=60*10; break;
   case 12:    InputTF_sec=60*12; break;
   case 15:    InputTF_sec=60*15; break;
   case 20:    InputTF_sec=60*20; break;
   case 30:    InputTF_sec=60*30; break;
   case 60:    InputTF_sec=3600; break;
   case 60*2:  InputTF_sec=3600*2; break;
   case 60*3:  InputTF_sec=3600*3; break;
   case 60*4:  InputTF_sec=3600*4; break;
   case 60*6:  InputTF_sec=3600*6; break;
   case 60*8:  InputTF_sec=3600*8; break;
   case 60*12: InputTF_sec=3600*12; break;
   case 60*24: InputTF_sec=3600*24; break; // день
   default:    InputTF_sec=0; break;
  }
 
  if(InputTF_sec!=0)
  {
   Period=(int)(OutputTF_sec/InputTF_sec+0.5)-1;
   if(Period<0) Period=0;
  }
  else Period=0;
 }

 {
  int index=(CurrentIndex<Period ? 0 : Period);
 
  Open[0]=Input.Open[-index];
  double lo=Input.Low[-index], hi=Input.High[-index];
  while(--index>=0)
  {
   lo=Math.Min(lo, Input.Low[-index]);
   hi=Math.Max(hi, Input.High[-index]);
  }
  High[0]=hi;
  Low[0]=lo;
  Close[0]=Input.Close[0];
 
  // MID=(Open[0]+High[0]+Low[0]+Close[0])/4.0;
  // MID=(High[0]+Low[0]+Close[0])/3.0;
  MID=(High[0]+Low[0])/2.0;
 
  if(Close>Open)
  {
   High.DrawVertical(Close);
   Low.DrawVertical(Open);
   Open.DrawHistogram(Close);
  }
  else
  {
   if(Close==Open) Close.DrawDash(Color.Black, LineStyles.Solid, 1);
   else
   {
    High.DrawVertical(Open);
    Low.DrawVertical(Close);
    Close.DrawHistogram(Open);
   }
  } 
 }
}

Вернуться в «Пользовательские индикаторы»

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

Сейчас этот форум просматривают: Google [Bot] и 3 гостя