Код: Выделить всё
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 можно пробовать навесить какие-то индикаторы, смотреть их пересечения и т.п.
 Изображения (1057)
 Изображения (1057) Архивы (82)
 Архивы (82) Текстовые файлы (9)
 Текстовые файлы (9) Документы (7)
 Документы (7) Скрипты Альфа-Директ 4 (30)
 Скрипты Альфа-Директ 4 (30)