Код: Выделить всё
function Initialize()
{
IndicatorName = "Sentiment";
PriceStudy=false;
AddInput("Input", Inputs.Candle);
AddSeries("Ask", DrawAs.Line, Color.Green);
AddSeries("Bid", DrawAs.Line, Color.Red);
AddLevel(50.0, Color.Black, "Ask");
AddParameter("Period", 0); // 0: от начала дня; >0: бегущее окно, но в пределах дня
AddParameter("Relative", 0); // 0: ask/bid абсолютные; 1: в процентах к общему объему
AddGlobalVariable("AskCum", Types.Double, 0.0);
AddGlobalVariable("BidCum", Types.Double, 0.0);
AddGlobalVariable("VolCum", Types.Double, 0.0);
AddGlobalVariable("DayIndex", Types.Int, 0);
}
function Evaluate()
{
if(BarDate(0)>BarDate(1) || CurrentIndex==0)
{
AskCum=0.0;
BidCum=0.0;
VolCum=0.0;
DayIndex=CurrentIndex;
}
AskCum+=Input.VolumeAsk[0];
BidCum+=Input.VolumeBid[0];
if(Period>0 && DayIndex+Period<=CurrentIndex)
{
AskCum-=Input.VolumeAsk[-Period];
BidCum-=Input.VolumeBid[-Period];
}
if(Relative!=0)
{
VolCum+=Input.Volume[0];
if(Period>0 && DayIndex+Period<=CurrentIndex) VolCum-=Input.Volume[-Period];
if(VolCum>0)
{
Ask=AskCum/VolCum*100.0;
Bid=BidCum/VolCum*100.0;
}
else { Ask=0; Bid=0; }
}
else { Ask=AskCum; Bid=BidCum; }
}
Также можно попробовать задать уровень (>50%), при пробое которого вверх настроение можно считать достаточно определенным.
Ну и на кривые Ask и Bid можно пробовать навесить какие-то индикаторы, смотреть их пересечения и т.п.