SysKreator а Вы не сделаете ради примера индикатор:
Индикатор "Индекс положительного объема" (PVI) изменяется по периодам, в которых значение объема увеличилось по сравнению с предыдущим периодом. В связи с тем, что рост цен чаще всего связан с увеличением объемов, то PVI будет обычно изменяться в направлении повышательного тренда:

Описание:
Click to reveal..
Индикатор "Индекс положительного объема" (PVI) изменяется по периодам, в которых значение объема увеличилось по сравнению с предыдущим периодом. В связи с тем, что рост цен чаще всего связан с увеличением объемов, то PVI будет обычно изменяться в направлении повышательного тренда.

Начальное значение PVI:

PVI0 = 1.

Если объем текущего периода больше объема предыдущего, то

PVIi = PVIi-1 + (PVIi-1 * (Pi - Pi-1) / Pi-1),

где Pi - цена текущего периода,
Pi-1 - цена предыдущего периода.

Если объем текущего периода меньше объема предыдущего, значение PVI текущего периода принимают равным значению PVI для предыдущего периода:

PVIi = PVIi-1.


Объясню почему прошу. Там используется предыдущее значение индикатора в самом индикаторе, т.е. PVI=PVI[i-1]

Никак не могу справиться. Делаю вот так:
Click to reveal..
Code:
using System.Collections.Generic;
using TSLab.Script;
using TSLab.Script.Handlers;
using TSLab.DataSource;
using TSLab.Script.Helpers;

namespace PositiveVolumeIndex
{
	public class PVI : IBar2DoubleHandler, IContextUses
	{
		[HandlerParameter]
		public int Period { get; set; }
		
		public IList<double> Execute(ISecurity source)
		{
		   
			var vom = Context.GetData("Highest", new[] { Period.ToString() },
		                               () => Series.Highest(source.Volumes, Period));
			var vol = source.Volumes;
		    var closes = source.ClosePrices;
		  
		    
		    	    IList<double> p_r = new List<double>(closes.Count);
		    double pvi=1;
		      p_r.Add(0);
		    
		    for (int i = 0; i < closes.Count; i++)
		    {
		    	if(vol[i]>vol[i-1])
		    	{
		    		pvi = pvi[i-1] + (pvi[i-1] * (closes[i] - closes[i-1]) / closes[i-1]);
		        }
		    	else
		    	{
		    		pvi =pvi[i-1];
		    	}
		        p_r.Add(pvi);
		    }
		    return p_r;
		}
		
		public IContext Context { get; set; }
	}
} 


Но компилятор на меня ругается:
Невозможно применить индексирование через [] к выражению типа "double" (CS0021)


Отредактировано 777 (Fri Jul 23 2010 12:38 PM)
_________________________
«Существует 3 типа лжи: ложь, наглая ложь и статистика»
Дизраэли.