namespace spr1
{
public class spreadkR : ISecurityInputs, ISecurityReturns, ITwoSourcesHandler, IStreamHandler
{
[HandlerParameter(true, "", NotOptimized = true)]
public double k1 { get; set; }
[HandlerParameter(true, "", NotOptimized = true)]
public double k2 { get; set; }
public ISecurity Execute(ISecurity source1, ISecurity source2)
{
var Bars = new List<Bar>(source1.Bars.Count);
var C1 = source1.ClosePrices;
var H1 = source1.HighPrices;
var L1 = source1.LowPrices;
var O1 = source1.OpenPrices;
var C2 = source2.ClosePrices;
var H2 = source2.HighPrices;
var L2 = source2.LowPrices;
var O2 = source2.OpenPrices;
IList<Bar> NC = new List<Bar>(Bars.Count);
IList<double> op = new List<double>(C1.Count);
IList<double> hi = new List<double>(C1.Count);
IList<double> lo = new List<double>(C1.Count);
IList<double> cl = new List<double>(C1.Count);
double Open,High,Low,Close,L,H;
for(int i=0; i<C1.Count; i++)
{
Open=k1*O1[i]-k2*O2[i];
Close=k1*C1[i]-k2*C2[i];
L = k1*L1[i]-k2*L2[i];
H = k1*H1[i]-k2*H2[i];
Low = Math.Min(Math.Min(L,H),Math.Min(Open,Close));
High= Math.Max(Math.Max(L,H),Math.Max(Open,Close));
op.Add(Open);
hi.Add(High);
lo.Add(Low);
cl.Add(Close);
}
int j=0;
foreach(var bar in source1.Bars)
{
var hav = new Bar(bar.Color, bar.Date,
op[j],
hi[j],
lo[j],
cl[j],
bar.Volume);
NC.Add(hav);
j++;
}
return source1.CloneAndReplaceBars(NC);
}
public IContext Context { get; set; }
}
}