Можно использовать для генерации "более быстрых" псевдосвечек длинных ТФ через свечки коротких ТФ, например, получасовки каждую минуту (как на картинке). Псевдо, потому что хоть цены Low-High-Close и актуальнst (от последней свечи), но цена Open для приведенного примера будет от свечки получасовой давности; соответственно и цвет тоже "псевдо". Кроме того, нельзя сделать выходной ряд типа Candle, приходится вручную заводить 4 серии Open/High/Low/Close, так что на результат индикатора нельзя напустить стандартные индикаторы от стандартных свечек (м.б. это и к лучшему ).
Для полноты счастья добавлена серия MID=(High+Low)/2; на мой взгляд она ведет себя "красиво".
В случае, если входной ТФ>=желаемому, на выход будут просто транслироваться входные данные (бесполезно, но корректно).
Код: Выделить всё
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; // день; на самом деле это неправильно (в "дне" не 24 рабочих часа)
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);
}
}
}
}