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