tested my smartquant code
Inserted Code
using System; using System.Drawing; using OpenQuant.API; using OpenQuant.API.Indicators; public class MyStrategy : Strategy { [Parameter("High")] public double High; [Parameter("Low")] public double Low; [Parameter("Close positions on strategy stop")] public bool CloseOnStop; private double slippageAdjust = 1; private double Range = 10; private double delta = 10; private int ocaCount = 0; private double High_dyn = 0; private double Low_dyn = 0; private int nTrade = 0; private double tickSize = 0.01; private double profitmultiply = 1; private double filledprice = 0; private int Qty = 1; private int longshortdecimals = 1; private int rangedecimals = 5; private int qtydecimals = 1; private int slippagedecimals = 1; private int smadecimals = 30; private double sma1length = 100; private int longshort = 1; private bool getDecimals = false; private int[] Lotfactor; private double[] TPfactor; Order order1; Order order2; Order limitOrder; Order stopOrder; private bool started; public override void OnStrategyStart() { Lotfactor = new int[24]; Lotfactor[0] = 1; Lotfactor[1] = 1; Lotfactor[2] = 2; Lotfactor[3] = 3; Lotfactor[4] = 4; Lotfactor[5] = 6; Lotfactor[6] = 8; Lotfactor[7] = 11; Lotfactor[8] = 15; Lotfactor[9] = 20; Lotfactor[10] = 27; Lotfactor[11] = 36; Lotfactor[12] = 47; Lotfactor[13] = 62; Lotfactor[14] = 80; Lotfactor[15] = 102; Lotfactor[16] = 130; Lotfactor[17] = 165; Lotfactor[18] = 208; Lotfactor[19] = 263; Lotfactor[20] = 331; Lotfactor[21] = 416; Lotfactor[22] = 522; Lotfactor[23] = 655; TPfactor = new double[24]; TPfactor[0] = 1.0; TPfactor[1] = 2.0; TPfactor[2] = 2.0; TPfactor[3] = 2.0; TPfactor[4] = 2.5; TPfactor[5] = 2.5; TPfactor[6] = 3.0; TPfactor[7] = 3.0; TPfactor[8] = 3.0; TPfactor[9] = 3.0; TPfactor[10] = 3.0; TPfactor[11] = 3.0; TPfactor[12] = 3.5; TPfactor[13] = 3.5; TPfactor[14] = 3.5; TPfactor[15] = 3.5; TPfactor[16] = 3.5; TPfactor[17] = 3.5; TPfactor[18] = 4.0; TPfactor[19] = 4.0; TPfactor[20] = 4.0; TPfactor[21] = 4.0; TPfactor[22] = 4.0; TPfactor[23] = 4.0; if (Instrument.TickSize != 0) tickSize = Instrument.TickSize; getDecimals = int.TryParse(Instrument.Description.Substring(0,1), out longshortdecimals); if (getDecimals) { longshort = longshortdecimals; // 1 is long, 0 is short } getDecimals = int.TryParse(Instrument.Description.Substring(2,2), out rangedecimals); if (getDecimals) { Range = tickSize*rangedecimals; } High_dyn = High; Low_dyn = Low; High_dyn = Math.Round(High_dyn/tickSize) * tickSize; Low_dyn = Math.Round(Low_dyn/tickSize) * tickSize; Range = High_dyn - Low_dyn; Range = Math.Round(Range/tickSize) * tickSize; delta = profitmultiply*Range; delta = Math.Round(delta/tickSize) * tickSize; getDecimals = int.TryParse(Instrument.Description.Substring(5,5), out qtydecimals); if (getDecimals) { Qty = qtydecimals; } getDecimals = int.TryParse(Instrument.Description.Substring(11,1), out slippagedecimals); if (getDecimals) { slippageAdjust = slippagedecimals; } getDecimals = int.TryParse(Instrument.Description.Substring(13,3), out smadecimals); if (getDecimals) { sma1length = smadecimals; } started = false; } public override void OnStrategyStop() { if (CloseOnStop) { if (HasPosition) { if (Position.Side == PositionSide.Long) MarketOrder(OrderSide.Sell, Position.Qty).Send(); else MarketOrder(OrderSide.Buy, Position.Qty).Send(); } } } public override void OnBar(Bar bar) { if (!HasPosition && !started) { started = true; nTrade = 0; order1 = StopOrder(OrderSide.Buy, Qty*Lotfactor[nTrade], High_dyn); order2 = StopOrder(OrderSide.Sell, Qty*Lotfactor[nTrade], Low_dyn); ocaCount++; string id = Clock.Now.Ticks.ToString(); order1.OCAGroup = id + ": " + Instrument.Symbol + " " + ocaCount; order2.OCAGroup = id + ": " + Instrument.Symbol + " " + ocaCount; order1.Send(); order2.Send(); } } public override void OnPositionChanged() { if (HasPosition) { if (nTrade == 0) { if (order1.AvgPrice > order2.AvgPrice) { filledprice = order1.AvgPrice; if (filledprice > High_dyn) { High_dyn = filledprice; } } else { filledprice = order2.AvgPrice; if (filledprice < Low_dyn) { Low_dyn = filledprice; } } } else { if (limitOrder.AvgPrice > stopOrder.AvgPrice) { filledprice = limitOrder.AvgPrice; if (filledprice > High_dyn) { High_dyn = filledprice; } if (filledprice < Low_dyn) { Low_dyn = filledprice; } } else { filledprice = stopOrder.AvgPrice; if (filledprice > High_dyn) { High_dyn = filledprice; } if (filledprice < Low_dyn) { Low_dyn = filledprice; } } } High_dyn = Math.Round(High_dyn/tickSize) * tickSize; Low_dyn = Math.Round(Low_dyn/tickSize) * tickSize; Range = High_dyn - Low_dyn; Range = Math.Round(Range/tickSize) * tickSize; delta = TPfactor[nTrade]*Range; delta = Math.Round(delta/tickSize) * tickSize; filledprice = Math.Round(filledprice/tickSize) * tickSize; nTrade++; Console.WriteLine("{0} nTrade: {1} Qty: {2} filledprice = {3} High: {4} Low: {5} Range: {6} delta: {7} Qty: {8}", DateTime.Now, nTrade, Qty*Lotfactor[nTrade], filledprice, High_dyn, Low_dyn, Range, delta, Position.Qty); if (Position.Side == PositionSide.Long) { ocaCount++; limitOrder = LimitOrder(OrderSide.Sell, Position.Qty, High_dyn + delta); stopOrder = StopOrder (OrderSide.Sell, Position.Qty + (Qty*Lotfactor[nTrade]), Low_dyn); string id = Clock.Now.Ticks.ToString(); limitOrder.OCAGroup = id + ": " + Instrument.Symbol + " " + ocaCount; stopOrder.OCAGroup = id + ": " + Instrument.Symbol + " " + ocaCount; limitOrder.Send(); stopOrder.Send(); } else { ocaCount++; stopOrder = StopOrder (OrderSide.Buy, Position.Qty + (Qty*Lotfactor[nTrade]), High_dyn); limitOrder = LimitOrder(OrderSide.Buy, Position.Qty, Low_dyn - delta); string id = Clock.Now.Ticks.ToString(); limitOrder.OCAGroup = id + ": " + Instrument.Symbol + " " + ocaCount; stopOrder.OCAGroup = id + ": " + Instrument.Symbol + " " + ocaCount; limitOrder.Send(); stopOrder.Send(); } } else { /* if (limitOrder.AvgPrice > stopOrder.AvgPrice) filledprice = limitOrder.AvgPrice; else filledprice = stopOrder.AvgPrice; filledprice = Math.Round(filledprice/tickSize) * tickSize; Console.WriteLine("{0} nTrade: {1} Qty = {2} filledprice = {3} High: {4} Low: {5} Range: {6} delta: {7} STOP", DateTime.Now, nTrade, Qty*Lotfactor[nTrade], filledprice, High_dyn, Low_dyn, Range, delta, Position.Qty); */ } } }