public static void StrategyUpdateTickets(StrategyBase strategy, SpreadTraderWindow stw, Queue <SingleSpread> spreads, double displayedprice, string strratio, LegEntryType leg1entrytype, LegEntryType leg2entrytype, object ieh) { List <SpreadOrderTicket> ticketstoremove = new List <SpreadOrderTicket>(); lock (stw.tickets) { if (stw.tickets.Count > 0) { foreach (SpreadOrderTicket ticket in stw.tickets) { if (ticket.EntryConditionSatisfied(displayedprice)) { Guid newguid = Guid.NewGuid(); ticket.Guid = newguid; ticketstoremove.Add(ticket); ClickhandlerArgs A = new ClickhandlerArgs(ticket.ClickedButton, ticket.Units, newguid); Zweistein.SpreadTraderWindow.StrategyHandleClickedButton(strategy, A, spreads, strratio, leg1entrytype, leg2entrytype, ieh); // clickcustomhandler(A); } } } } if (ticketstoremove.Count > 0) { foreach (SpreadOrderTicket t in ticketstoremove) { stw.Dispatcher.Invoke(new Action(() => stw.DeleteTicket(t))); } } }
public static void StrategyHandleClickedButton(StrategyBase strategy, ClickhandlerArgs cha, Queue <SingleSpread> spreads, string strratio, LegEntryType leg1entrytype, LegEntryType leg2entrytype, object ieh) { int _units = cha.Units; // bool b= mut.WaitOne(new TimeSpan(0,0,3)); // if (b == false) throw new TimeoutException("clickcustomhandler mutex timeout"); switch (cha.ClickedButton) { case ClickedButton.Close: lock (spreads){ foreach (SingleSpread spread in spreads) { spread.Exit(LegExitType.Market, LegExitType.Market); } } break; case ClickedButton.Reverse: lock (spreads){ foreach (SingleSpread s in spreads) { s.Reverse(); } } break; case ClickedButton.GoLong: lock (spreads){ foreach (SingleSpread s in spreads) { if (s.MarketPosition != MarketPosition.Long) { Zweistein.NinjaTraderLog.Process("GoLong: already Short", "", LogLevel.Error, LogCategories.User); if (strategy.TraceOrders) { strategy.Print("GoLong: already Short"); } return; } } //strategy.Account.Currency SingleSpread spread = new SingleSpread(MarketPosition.Long, _units, strratio, strategy); spread.Entry(leg1entrytype, leg2entrytype); IExitHandling eh = ieh as IExitHandling; spread.setIExitHandling(eh); if (cha.Guid != null) { spread.Guid = cha.Guid; } spreads.Enqueue(spread); } break; case ClickedButton.GoShort: lock (spreads){ foreach (SingleSpread s in spreads) { if (s.MarketPosition != MarketPosition.Short) { Zweistein.NinjaTraderLog.Process("GoShort: already Long", "", LogLevel.Error, LogCategories.User); if (strategy.TraceOrders) { strategy.Print("GoShort: already Long"); } return; } } SingleSpread spread = new SingleSpread(MarketPosition.Short, _units, strratio, strategy); spread.Entry(leg1entrytype, leg2entrytype); IExitHandling eh = ieh as IExitHandling; spread.setIExitHandling(eh); if (cha.Guid != null) { spread.Guid = cha.Guid; } spreads.Enqueue(spread); } break; } }
public void Entry(LegEntryType et1, LegEntryType et2) { if (entry[0].Order != null || entry[1].Order != null) { return; } if (exit[0].Order != null || exit[1].Order != null) { return; } if (mleg1 == MarketPosition.Flat) { return; } double limitleg1 = 0; double limitleg2 = 0; if (et1 == LegEntryType.Market) { limitleg1 = 0; } if (et2 == LegEntryType.Market) { limitleg2 = 0; } OrderAction[] o = { OrderAction.Buy, OrderAction.SellShort }; string[] o_name = { "Buy_X", "SellShort_Y" }; if (mleg1 == MarketPosition.Long) { if (et1 == LegEntryType.JoinBidOrAsk) { limitleg1 = strategybase.GetCurrentBid(0); } if (et2 == LegEntryType.JoinBidOrAsk) { limitleg2 = strategybase.GetCurrentAsk(1); } } if (mleg1 == MarketPosition.Short) { o = new OrderAction[] { OrderAction.SellShort, OrderAction.Buy }; o_name = new String[] { "SellShort_X", "Buy_Y" }; if (et1 == LegEntryType.JoinBidOrAsk) { limitleg1 = strategybase.GetCurrentAsk(0); } if (et2 == LegEntryType.JoinBidOrAsk) { limitleg2 = strategybase.GetCurrentBid(1); } } if (strategybase.TraceOrders) { strategybase.Print(strategybase.Time[0].ToString() + " Entry:" + strategybase.Instruments[0].FullName + " " + o_name[0] + "; " + strategybase.Instruments[1].FullName + " " + o_name[1]); } if (lots1 != 0) { entry[0].Order = strategybase.SubmitOrderUnmanaged(0, o[0], (limitleg1 == 0) ? OrderType.Market : OrderType.Limit, lots1, limitleg1, 0, "", o_name[0]); } if (lots2 != 0) { entry[1].Order = strategybase.SubmitOrderUnmanaged(1, o[1], (limitleg2 == 0) ? OrderType.Market : OrderType.Limit, lots2, limitleg2, 0, "", o_name[1]); } }