/// <summary> /// Basic settings for the strategy. /// </summary> private void SetDefaultWorkings() { m_EntryLongNode = new TradingNode("Enter Long Node"); m_EntryShortNode = new TradingNode("Enter Short Node"); m_FadeLongNode = new TradingNode("Fade Long Node"); m_FadeShortNode = new TradingNode("Fade Short Node"); m_EntryLongNode.WorkingEnterQty = m_EntryQty; m_EntryShortNode.WorkingEnterQty = m_EntryQty; m_FadeLongNode.WorkingEnterQty = m_FadeQty; m_FadeShortNode.WorkingEnterQty = m_FadeQty; m_EntryLongNode.IsEnterEnable = true; m_EntryShortNode.IsEnterEnable = true; m_FadeLongNode.IsEnterEnable = true; m_FadeShortNode.IsEnterEnable = true; m_EntryLongNode.TradeLevel = 0; m_EntryShortNode.TradeLevel = 0; m_FadeLongNode.TradeLevel = 1; m_FadeShortNode.TradeLevel = 1; m_EntryLongNode.TradeSide = TradeSide.Buy; m_EntryShortNode.TradeSide = TradeSide.Sell; m_FadeLongNode.TradeSide = TradeSide.Buy; m_FadeShortNode.TradeSide = TradeSide.Sell; this.TryAddTradingNode(m_EntryLongNode); this.TryAddTradingNode(m_EntryShortNode); this.TryAddTradingNode(m_FadeLongNode); this.TryAddTradingNode(m_FadeShortNode); }
public override void AddSubElement(IStringifiable subElement) { base.AddSubElement(subElement); Type elementType = subElement.GetType(); if (elementType == typeof(TradingNode)) { TradingNode tradingNode = (TradingNode)subElement; if (tradingNode.TradeLevel == 0) { switch (tradingNode.TradeSide) { case TradeSide.Unknown: break; case TradeSide.Buy: m_EntryLongNode = tradingNode; break; case TradeSide.Sell: m_EntryShortNode = tradingNode; break; } } if (tradingNode.TradeLevel == 1) { switch (tradingNode.TradeSide) { case TradeSide.Unknown: break; case TradeSide.Buy: m_FadeLongNode = tradingNode; break; case TradeSide.Sell: m_FadeShortNode = tradingNode; break; } } } if (elementType == typeof(KeltnerTradingVariables)) { KeltnerTradingVariables = (KeltnerTradingVariables)subElement; m_EntryQty = KeltnerTradingVariables.EntryQty; m_FadeQty = KeltnerTradingVariables.FadeQty; m_EntryWidth = KeltnerTradingVariables.EntryWidth; m_FadeWidth = KeltnerTradingVariables.FadeWidth; m_PukeWidth = KeltnerTradingVariables.PukeWidth; m_EMALength = KeltnerTradingVariables.EMALength; m_ATRLength = KeltnerTradingVariables.ATRLength; m_MOMLength = KeltnerTradingVariables.MomentumLength; m_MomentumEntry = KeltnerTradingVariables.MomentumEntryValue; m_MomentumPuke = KeltnerTradingVariables.MomentumPukeValue; } }
// // /// <summary> /// Adjust the trading variables for each level based on the correct position. /// </summary> /// <param name="correctPosition"></param> public void AdjustTradingNodes(int correctPosition) { SetDefaultWorkings(); TradingNode tradingNode = null; var workingNodes = correctPosition > 0 ? m_WorkingBuyNodes : m_WorkingSellNodes; correctPosition = Math.Abs(correctPosition); int level = 0; // Allocate the working quantities for trading levels from lower level to upper level. while (correctPosition > 0 && level < workingNodes.Count) { tradingNode = workingNodes[level]; if (tradingNode.TradeLevel == level) { if (correctPosition <= m_EntryQty) { tradingNode.WorkingEnterQty = m_EntryQty - correctPosition; tradingNode.WorkingExitQty = correctPosition; correctPosition = 0; } else { tradingNode.WorkingEnterQty = 0; tradingNode.WorkingExitQty = m_EntryQty; correctPosition = correctPosition - m_EntryQty; } } else if (tradingNode.TradeLevel == level) { if (correctPosition <= m_FadeQty) { tradingNode.WorkingEnterQty = m_FadeQty - correctPosition; tradingNode.WorkingExitQty = correctPosition; correctPosition = 0; } else { tradingNode.WorkingEnterQty = 0; tradingNode.WorkingExitQty = m_FadeQty; correctPosition = correctPosition - m_FadeQty; } } level++; } }