//
        // *****************************************
        // ****         Setup Begin()           ****
        // *****************************************
        /// <summary>
        /// This is called after all Engines have been created, and added to the master
        /// list inside the Strategy (IEngineContainer).
        /// As a convenience, the PricingEngine class locates useful Engines and keeps
        /// pointers to them.
        /// </summary>
        /// <param name="myEngineHub"></param>
        /// <param name="engineContainer"></param>
        public override void SetupBegin(IEngineHub myEngineHub, IEngineContainer engineContainer)
        {
            base.SetupBegin(myEngineHub, engineContainer);

            // Locate engines we need.
            m_MarketSubscribers = new List <IMarketSubscriber>();
            foreach (IEngine iEngine in engineContainer.GetEngines())
            {
                if (iEngine is ZGraphEngine)
                {
                    m_GraphEngine = (ZGraphEngine)iEngine;                  // PricingEngines also plot a lot.
                }
                else if (iEngine is IMarketSubscriber)
                {
                    m_MarketSubscribers.Add((IMarketSubscriber)iEngine);
                }
            }

            //
            // Subscribe to Pricing instruments.
            //
            List <InstrumentName> instruments = new List <InstrumentName>();

            foreach (PriceLeg leg in m_Legs)                                // Subscribe to each "PricingLeg" object.
            {
                instruments.Add(leg.InstrumentName);
            }
            this.ParentStrategy.StrategyHub.SubscribeToMarketInstruments(instruments, this.ParentStrategy);
        }//SetupBegin()
Beispiel #2
0
        //
        //
        public override void SetupBegin(IEngineHub myEngineHub, IEngineContainer engineContainer)
        {
            base.SetupBegin(myEngineHub, engineContainer);
            foreach (IEngine ieng in engineContainer.GetEngines())
            { // Find order Engine
                if (ieng is IOrderEngine)
                {
                    this.m_IOrderEngine = (IOrderEngine)ieng;                                             // find our order engine
                }
            }
            if (m_IOrderEngine is SingleLegExecutor)
            { // if this is a single leg order engine
                m_SingleLegExecutor = (SingleLegExecutor)m_IOrderEngine;
                this.m_Leg          = m_SingleLegExecutor.m_PriceLeg;
                m_MaxPossibleWorkingQuoteQtyPerLot += (int)(Math.Abs(m_Leg.Weight) * 2);            // leg ratios * 2 (each side)
            }
            // If we subscribe to order book creation, we can be sure to get all the info for all fills and submissions
            // this only works if create order books after setup beging.
            m_IOrderEngine.GetExecutionListener().OrderBookCreated += new EventHandler(ExecutionListener_OrderBookCreated);

            if (m_Hub is ExecutionHub)
            {                                                                    // set up ITimer to work
                ((ExecutionHub)m_Hub).SubscribeToTimer((ITimerSubscriber)m_ExecutionContainer.m_ExecutionListener);
                m_ExecutionContainer.m_ExecutionListener.SubscribeToTimer(this); // subscrie to updates
            }
        }
Beispiel #3
0
        /// <summary>
        /// This is a convenient overload for the Guis.  They will have a container that
        /// is one-to-one with the engines they are interested in getting parameters for.
        /// </summary>
        /// <param name="engineHubName">StrategyHub of engines with desired parameters</param>
        /// <param name="container">a container that has engineId's that match those you are interested in.</param>
        /// <returns></returns>
        public static List <EngineEventArgs> RequestAllParameters(string engineHubName, IEngineContainer container)
        {
            List <EngineEventArgs> requestList = new List <EngineEventArgs>();
            List <IEngine>         engines     = container.GetEngines();

            foreach (IEngine engine in engines)
            {
                requestList.Add(RequestAllParameters(engineHubName, container.EngineContainerID, engine.EngineID));
            }
            return(requestList);
        }
Beispiel #4
0
 //
 public override void SetupBegin(IEngineHub myEngineHub, IEngineContainer engineContainer)
 {
     base.SetupBegin(myEngineHub, engineContainer);
     m_Log = ((ExecutionHub)myEngineHub).Log;
     foreach (IEngine iEng in engineContainer.GetEngines())
     {// find our needed engine pointers
         if (iEng is ExecutionEngines.OrderEngines.Spreader)
         {
             m_Quoter = (ExecutionEngines.OrderEngines.Spreader)iEng;
         }
     }
 }
Beispiel #5
0
 //
 public override void SetupBegin(IEngineHub myEngineHub, IEngineContainer engineContainer)
 {
     base.SetupBegin(myEngineHub, engineContainer);
     foreach (IEngine eng in engineContainer.GetEngines())
     {
         if (eng is IOrderEngine)
         {   // find our orer engine and our execution listner
             m_ExecutionListener = ((IOrderEngine)eng).GetExecutionListener();
             continue;
         }
     }
 }
        }//SetupInitialize()

        //
        //
        //
        //
        // ************************************************
        // ****             SetupBegin()               ****
        // ************************************************
        /// <summary>
        /// </summary>
        public override void SetupBegin(IEngineHub myEngineHub, IEngineContainer engineContainer)
        {
            //
            // Master Remote-Engines must send requests to ExecutionHub now.
            //
            if (m_IsSubEngine == false)
            {
                // Count number of (master) remote engines found in this strategy.
                // Master remote engines are those connected directly to the Strategy,
                // without being held by another engine.
                // Only masters broadcast their xml to the ExecutionHub, and other sub-engine
                // engines are included as subelements of their master's broadcast.
                // (If each remote engine broadcasted separately, the ExecHub would have to know how
                // to put them all back together again... that is, who owned whom.)
                int remoteMasterEngineCount = 0;
                foreach (IEngine iEng in engineContainer.GetEngines())
                {
                    if (iEng is ExecutionController && ((ExecutionController)iEng).m_IsSubEngine == false)
                    {
                        remoteMasterEngineCount++;
                    }
                    //if (iEng is RemoteEngine)           // now count all remote engines
                    //    remoteMasterEngineCount++;
                }

                //
                // Create my engine creation request
                //
                Dictionary <Type, string[]> rules = new Dictionary <Type, string[]>();
                rules.Add(this.GetType(), new string[] { "GetClassName", string.Empty, string.Empty });
                string xmlString = Stringifiable.Stringify(this, rules);

                EngineEventArgs e = new EngineEventArgs();
                e.MsgType           = EngineEventArgs.EventType.NewEngine;
                e.Status            = EngineEventArgs.EventStatus.Request;
                e.EngineID          = m_EngineID;
                e.EngineContainerID = m_EngineContainerId;
                e.DataObjectList    = new List <object>();
                e.DataObjectList.Add(xmlString);                          // 0 - engine specs
                e.DataObjectList.Add(m_LocalEngineHubName);               // 1 - engine hub name
                e.DataObjectList.Add(remoteMasterEngineCount.ToString()); // 2 - number of engines remote hub should expect from this EngineContainer
                // Send request to remote.
                if (m_RemoteEngineHub != null && m_RemoteEngineHub.HubEventEnqueue(e))
                {
                    Log.NewEntry(LogLevel.Minor, "SetupBegin: Remote-{0} sent creation request to remote.", m_RemoteEngineClassName);
                }
                else
                {
                    Log.NewEntry(LogLevel.Minor, "SetupBegin: Remote-{0} failed to send creation request to remote.", m_RemoteEngineClassName);
                }
            } // master remote-engine sends request.
        }     //SetupBegin()
        }// SetupInitialize()

        //
        // *************************************************************
        // ****                    Setup Begin()                   ****
        // *************************************************************
        public override void SetupBegin(IEngineHub myEngineHub, IEngineContainer engineContainer)
        {
            base.SetupBegin(myEngineHub, engineContainer);
            foreach (IEngine iEng in engineContainer.GetEngines())
            {
                if (iEng is Risk.RiskManager)
                {
                    m_RiskManager = (Risk.RiskManager)iEng;
                }
            }
            if (m_RiskManager == null)
            {
                throw new NotImplementedException("All Strategies Must Have a Risk Manager, Please Add One To Your User Config");
            }
        }//SetupBegin().
 //
 //
 public override void SetupBegin(IEngineHub myEngineHub, IEngineContainer engineContainer)
 {
     base.SetupBegin(myEngineHub, engineContainer);
     foreach (IEngine ieng in engineContainer.GetEngines())
     { // Find Pricing Engine
         if (ieng is PricingEngine)
         {
             PricingEngine priceEngine = (PricingEngine)ieng;
             this.m_Leg = priceEngine.m_Legs[0];                                                 // keep pointer to legs.
             m_MaxPossibleWorkingQuoteQtyPerLot += (int)(Math.Abs(m_Leg.Weight) * 2);            // leg ratios * 2 (each side)
         }
         else if (ieng is OrderEngine)
         {
             this.m_OrderEngine = (OrderEngine)ieng;                                             // find our order engine
         }
     }
     ((StrategyHub)myEngineHub).SubscribeToTimer((Strategy)engineContainer, this);           // get periodic updates from ITimer.
 }
        }// SetupInitialize()

        //
        // *************************************************************
        // ****                    Setup Begin()                    ****
        // *************************************************************
        public override void SetupBegin(IEngineHub myEngineHub, IEngineContainer engineContainer)
        {
            base.SetupBegin(myEngineHub, engineContainer);

            //
            // Subscribe to events
            //
            m_ExecutionListener.InstrumentFound += new EventHandler(ExecutionListener_InstrumentsFound);

            foreach (IEngine iEng in engineContainer.GetEngines())
            {
                if (iEng is ExecutionEngines.Risk.RiskManager)
                {
                    m_RiskManager = (ExecutionEngines.Risk.RiskManager)iEng;
                }
            }
            if (m_RiskManager == null)
            {
                throw new NotImplementedException("All Strategies Must Have a Risk Manager, Please Add One To Your User Config - Must be UV.Execution.Risk.RiskManager type");
            }
        }//SetupBegin().
Beispiel #10
0
        //
        public override void SetupBegin(IEngineHub myEngineHub, IEngineContainer engineContainer)
        {
            base.SetupBegin(myEngineHub, engineContainer);
            m_Log = ((ExecutionHub)myEngineHub).Log;
            foreach (IEngine iEng in engineContainer.GetEngines())
            {// find our needed engine pointers
                if (iEng is ExecutionEngines.OrderEngines.Spreader)
                {
                    m_Spreader = (ExecutionEngines.OrderEngines.Spreader)iEng;
                }
            }

            if (m_Spreader == null)
            {
                throw new Exception("Hedger Couldn't Find Quoter");
            }

            m_OrderBook                = m_Spreader.m_ExecutionListener.CreateOrderBook(m_SpreaderLeg.m_PriceLeg.InstrumentName, m_SpreaderLeg.DefaultAccount); // create new order book for this leg's hedge fulls
            m_InternalLegId            = m_Spreader.m_SpreaderLegs.IndexOf(m_SpreaderLeg);                                                                      // set our internal id.
            m_Spreader.MarketsReadied += new EventHandler(Quoter_MarketsReadied);                                                                               // we will Finish our set up once we get this call.
            m_HedgeRuleManager         = m_SpreaderLeg.m_HedgeRuleManager;
        }
Beispiel #11
0
        //
        // *****************************************
        // ****         Setup Begin()           ****
        // *****************************************
        /// <summary>
        /// This is called after all Engines have been created, and added to the master
        /// list inside the Strategy (IEngineContainer).
        /// As a convenience, the PricingEngine class locates useful Engines and keeps
        /// pointers to them.
        /// </summary>
        /// <param name="myEngineHub"></param>
        /// <param name="engineContainer"></param>
        public override void SetupBegin(IEngineHub myEngineHub, IEngineContainer engineContainer)
        {
            base.SetupBegin(myEngineHub, engineContainer);

            //
            // Subscribe to economic numbers of legs.
            //
            List <InstrumentName> instruments = new List <InstrumentName>();

            foreach (IEngine iEngine in engineContainer.GetEngines())
            {
                if (iEngine is PricingEngine)
                {
                    PricingEngine pricingEngine = (PricingEngine)iEngine;
                    foreach (Lib.MarketHubs.PriceLeg leg in pricingEngine.m_Legs)
                    {
                        if (!instruments.Contains(leg.InstrumentName))
                        {
                            instruments.Add(leg.InstrumentName);
                        }
                    }
                }
            }
            //QueryBase query = null;
            //this.ParentStrategy.StrategyHub.RequestQuery(query, this.QueryResponseHandler, this.ParentStrategy);

            //
            // Subscribe to start/end trading times
            //
            // If StartTime=EndTime => strategy never shuts off.
            if (ParentStrategy.QueryItem != null && ParentStrategy.StrategyHub.m_Alarm != null &&
                ParentStrategy.QueryItem.StartTime.CompareTo(ParentStrategy.QueryItem.EndTime) != 0)
            {
                Random            random       = new Random();
                StrategyQueryItem strategyItem = ParentStrategy.QueryItem;
                Alarm             alarm        = ParentStrategy.StrategyHub.m_Alarm;

                // Collect today's time/date
                DateTime today = ParentStrategy.StrategyHub.GetLocalTime().Date;       // collect nearest day
                DateTime day   = today;
                if (day.CompareTo(strategyItem.StartDate) < 0)
                {
                    day = strategyItem.StartDate;
                }
                AlarmEventArg eventArg;                                         // my callback event arg.
                while (day.CompareTo(strategyItem.EndDate) <= 0)                // Loop thru each day and set start/end alarms.
                {
                    // Create start event.
                    DateTime dt = day.Add(strategyItem.StartTime);
                    eventArg       = new AlarmEventArg();
                    eventArg.State = StrategyState.Normal;
                    double secs = m_StartTimeSeconds + m_StartTimeSeconds * (0.01 * random.Next(0, m_RandomSlopPercent[0]));
                    eventArg.TimeStemp = dt.AddSeconds(secs);                   // start at start time or after.
                    alarm.Set(dt, this.AlarmEventHandler, eventArg);

                    // Create stop event.
                    dt = day.Add(strategyItem.EndTime);                         // exit time (or earlier)
                    double lastSecs = double.MaxValue;
                    for (int i = 0; i < m_ExitTimeSeconds.Length; ++i)
                    {
                        if (m_ExitTimeSeconds[i] != double.NaN)
                        {
                            StrategyState state = (StrategyState)(i + (int)StrategyState.ExitOnly);
                            eventArg       = new AlarmEventArg();
                            eventArg.State = state;
                            secs           = m_ExitTimeSeconds[i] + m_ExitTimeSeconds[i] * (0.01 * random.Next(0, m_RandomSlopPercent[i]));
                            secs           = Math.Max(0, Math.Min(secs, lastSecs)); // don't allow this exit level to be earlier than previous one.
                            lastSecs       = secs - 1.0;                            // therefore, states padding is strictly decreasing in seconds!
                            DateTime dt2 = dt.AddSeconds(-secs);
                            alarm.Set(dt, this.AlarmEventHandler, eventArg);
                        }
                    }

                    // Increment day
                    day = day.AddDays(1.0).Date;                                // increment until past endDate or ...
                    if (day.DayOfWeek == DayOfWeek.Saturday && day != today)    // ... its Saturday (but continue if today is Sat.).
                    {
                        break;
                    }
                } //wend day
            }
        }         //SetupBegin()