public decimal CommissionCharged(LiveOrder order) { try { var perShare = .005m; if (ApiTrading) { perShare = .0075m; } var ret = perShare * Math.Abs(order.OrderSize); // Minimum of $1.00 per trade ret = Math.Max(ret, 1.00m); // Maximum of .5% of trade value ret = Math.Min(ret, Math.Abs(.005m * order.TotalMoney)); return(-ret); } catch (Exception ex) { Console.WriteLine($"EXCEPTION:{GetCurrentMethod()} {ex.Message}"); return(0); } }
public (LiveTrade trade, LiveTrade stopTrade)? ApproveOrder(LiveOrder order, LiveOrder stopOrder) { var account = LiveTradingManager.Instance.ActiveAccount; if (LiveRiskManager.Instance.ApproveOrder(order, stopOrder, account)) { var approvedTrade = OrderToTrade(order); approvedTrade.ApprovalCode = ApprovalCode(this.Offset++); PendingApprovalCodes.Add(approvedTrade.ApprovalCode); if (stopOrder != null) { var approvedStop = OrderToTrade(stopOrder); approvedStop.ApprovalCode = ApprovalCode(this.Offset++); PendingApprovalCodes.Add(approvedStop.ApprovalCode); return(approvedTrade, approvedStop); } return(approvedTrade, null); } else { return(null); } }
private LiveTrade OrderToTrade(LiveOrder order) { var ret = new LiveTrade( order.Security, order.OrderDirection, order.OrderType, order.OrderSize, order.LimitPrice); return(ret); }
public bool ApproveOrder(LiveOrder order, LiveOrder stopOrder, LiveAccount account) { List <TradeApprovalMessage> ruleResults = new List <TradeApprovalMessage>(); foreach (var rule in TradeApprovalRulePipeline) { ruleResults.Add(rule.Run(order, account)); } if (!ruleResults.TrueForAll(x => x.Result == LiveTradeApprovalMessageType.Passed || x.Result == LiveTradeApprovalMessageType.Warning)) { // Write fails to log ruleResults.Where(x => x.Result == LiveTradeApprovalMessageType.Failed) .ToList() .ForEach(x => Log(new LogMessage("Risk Mgr", $"{order} {x}", LogMessageType.TradingError))); return(false); } foreach (var result in ruleResults.Where(x => x.Result == LiveTradeApprovalMessageType.Warning)) { Log(new LogMessage("Risk Mgr", $"{order} {result}", LogMessageType.TradeWarning)); } Log(new LogMessage("Risk Mgr", $"{order} APPROVED", LogMessageType.TradingNotification)); // Check stop order params // ... if (stopOrder != null) { // return false if invalid } return(true); }
protected override TradeApprovalMessage Rule(LiveOrder order, LiveAccount account) { if (order.OrderSize <= 0) { return(new TradeApprovalMessage(0, Name, LiveTradeApprovalMessageType.Failed, "Order Size Invalid")); } if (order.LimitPrice <= 0) { return(new TradeApprovalMessage(0, Name, LiveTradeApprovalMessageType.Failed, "Order Price Invalid")); } if (order.OrderDirection == TradeActionBuySell.None) { return(new TradeApprovalMessage(0, Name, LiveTradeApprovalMessageType.Failed, "Order Direction Not Set")); } if (order.Security == null) { return(new TradeApprovalMessage(0, Name, LiveTradeApprovalMessageType.Failed, "Security Not Specified")); } return(new TradeApprovalMessage(0, Name, LiveTradeApprovalMessageType.Passed)); }
protected abstract TradeApprovalMessage Rule(LiveOrder order, LiveAccount account);
/// <summary> /// Executes rule on trade and returns a true/false pass /// </summary> /// <param name="trade"></param> /// <param name="portfolio"></param> /// <param name="AsOf"></param> /// <returns></returns> public TradeApprovalMessage Run(LiveOrder order, LiveAccount account) { return(Rule(order, account)); }
public LiveOrderEventArgs(LiveOrder order) { Order = order ?? throw new ArgumentNullException(nameof(order)); }