コード例 #1
0
ファイル: IEnvironment.cs プロジェクト: kenaschmidt/Finance
        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);
            }
        }
コード例 #2
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);
            }
        }
コード例 #3
0
        private LiveTrade OrderToTrade(LiveOrder order)
        {
            var ret = new LiveTrade(
                order.Security,
                order.OrderDirection,
                order.OrderType,
                order.OrderSize,
                order.LimitPrice);

            return(ret);
        }
コード例 #4
0
        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);
        }
コード例 #5
0
        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));
        }
コード例 #6
0
 protected abstract TradeApprovalMessage Rule(LiveOrder order, LiveAccount account);
コード例 #7
0
 /// <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));
 }
コード例 #8
0
ファイル: CustomEvents.cs プロジェクト: kenaschmidt/Finance
 public LiveOrderEventArgs(LiveOrder order)
 {
     Order = order ?? throw new ArgumentNullException(nameof(order));
 }