[Quantproject-developers] QuantProject/b7_Scripts/ArbitrageTesting/OverReactionHypothesis/DoubleOve
Brought to you by:
glauco_1
|
From: Glauco S. <gla...@us...> - 2008-09-29 21:16:57
|
Update of /cvsroot/quantproject/QuantProject/b7_Scripts/ArbitrageTesting/OverReactionHypothesis/DoubleOverReaction_OTC In directory sc8-pr-cvs16.sourceforge.net:/tmp/cvs-serv15309/ArbitrageTesting/OverReactionHypothesis/DoubleOverReaction_OTC Modified Files: EndOfDayTimerHandlerDOR_OTC.cs RunDOR_OTC.cs Log Message: The new revision moves toward an intraday enabled framework. EndOfDayDate time has been removed, DateTime is used now. The code has been changed accordingly. Index: RunDOR_OTC.cs =================================================================== RCS file: /cvsroot/quantproject/QuantProject/b7_Scripts/ArbitrageTesting/OverReactionHypothesis/DoubleOverReaction_OTC/RunDOR_OTC.cs,v retrieving revision 1.2 retrieving revision 1.3 diff -C2 -d -r1.2 -r1.3 *** RunDOR_OTC.cs 19 Aug 2008 17:13:04 -0000 1.2 --- RunDOR_OTC.cs 29 Sep 2008 21:16:12 -0000 1.3 *************** *** 19,23 **** along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. ! */ using System; --- 19,23 ---- along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. ! */ using System; *************** *** 37,169 **** /// Script that implements the Double OverReaction Open To Close strategy: /// at each open, l long positions and s short positions will be open, ! /// buying and shorting, accordingly, the l tickers among the /// b best that more moves down (at open) and the s tickers among the w worst /// that more moves up (at open). ! /// For chosing the b best and w worst tickers just the /// previous close to close ratio is considered. ! /// The fundamental of the strategy should be the fact (to be verified ...) /// that overreactions may be followed by opposite overreactions. /// At each close, open positions are closed. /// </summary> ! [Serializable] ! public class RunDOR_OTC ! { ! private string scriptName; ! private string tickerGroupID; ! private string benchmark; ! private int numberOfEligibleTickers; ! private int numOfBestTickers; ! private int numOfWorstTickers; ! private int numOfTickersForBuying; ! private int numOfTickersForShortSelling; ! private DateTime startDate; ! private DateTime endDate; ! private double maxRunningHours; ! private DateTime startingTimeForScript; ! private Account account; ! private IHistoricalQuoteProvider historicalQuoteProvider; ! private IEndOfDayTimer endOfDayTimer; ! ! public RunDOR_OTC(string tickerGroupID, string benchmark, ! int numberOfEligibleTickers, int numOfBestTickers, ! int numOfWorstTickers, int numOfTickersForBuying, ! int numOfTickersForShortSelling, ! DateTime startDate, DateTime endDate, ! double maxRunningHours) ! { ! this.tickerGroupID = tickerGroupID; ! this.benchmark = benchmark; ! this.numberOfEligibleTickers = numberOfEligibleTickers; ! this.numOfBestTickers = numOfBestTickers; ! this.numOfWorstTickers = numOfWorstTickers; ! this.numOfTickersForBuying = numOfTickersForBuying; ! this.numOfTickersForShortSelling = numOfTickersForShortSelling; ! this.startDate = startDate; ! this.endDate = endDate; ! this.maxRunningHours = maxRunningHours; ! this.scriptName = "DoubleOverReaction_OTC"; ! this.historicalQuoteProvider = new HistoricalRawQuoteProvider(); ! this.endOfDayTimer = new IndexBasedEndOfDayTimer( ! new EndOfDayDateTime( this.startDate , ! EndOfDaySpecificTime.MarketOpen ) , this.benchmark ); ! } - public void Run() - { - this.startingTimeForScript = DateTime.Now; - this.account = new Account( "DoubleOverReaction_OTC" , this.endOfDayTimer , - new HistoricalEndOfDayDataStreamer( this.endOfDayTimer , - this.historicalQuoteProvider ) , - new HistoricalEndOfDayOrderExecutor( this.endOfDayTimer , - this.historicalQuoteProvider ) ); - EndOfDayTimerHandlerDOR_OTC endOfDayTimerHandler = - new EndOfDayTimerHandlerDOR_OTC(this.tickerGroupID, this.numberOfEligibleTickers, - this.numOfBestTickers, this.numOfWorstTickers, - this.numOfTickersForBuying, this.numOfTickersForShortSelling, - this.account, this.benchmark); - this.endOfDayTimer.MarketOpen += new MarketOpenEventHandler( - endOfDayTimerHandler.MarketOpenEventHandler ); ! this.endOfDayTimer.MarketClose += new MarketCloseEventHandler( ! endOfDayTimerHandler.MarketCloseEventHandler ); ! this.endOfDayTimer.MarketClose += new MarketCloseEventHandler( ! this.checkDateForReport); ! this.endOfDayTimer.OneHourAfterMarketClose += new OneHourAfterMarketCloseEventHandler( ! endOfDayTimerHandler.OneHourAfterMarketCloseEventHandler ); ! ! this.endOfDayTimer.Start(); ! } ! private void checkDateForReport(Object sender , EndOfDayTimingEventArgs endOfDayTimingEventArgs) ! { ! if(endOfDayTimingEventArgs.EndOfDayDateTime.DateTime>=this.endDate || ! DateTime.Now >= this.startingTimeForScript.AddHours(this.maxRunningHours)) ! //last date is reached by the timer or maxRunning hours ! //are elapsed from the time script started ! this.SaveScriptResults(); ! } ! private void checkDateForReport_createDirIfNotPresent(string dirPath) ! { ! if(!Directory.Exists(dirPath)) ! Directory.CreateDirectory(dirPath); ! } ! public void SaveScriptResults() ! { ! TimeSpan span; span = DateTime.Now.Subtract(this.startingTimeForScript); int secondsElapsed = span.Hours * 3600 + span.Minutes * 60 + span.Seconds; ! string fileName = ! "SecondsElapsed_" + secondsElapsed.ToString() + "_" + ! DateTime.Now.Hour.ToString().PadLeft(2,'0') + "_" + ! DateTime.Now.Minute.ToString().PadLeft(2,'0') + "_" + ! this.scriptName + "_From_" + this.tickerGroupID + ! "_elig_" + this.numberOfEligibleTickers + ! "_best_" + this.numOfBestTickers + ! "_worst_" + this.numOfWorstTickers + ! "_forLong_" + this.numOfTickersForBuying + ! "_forShort_" + this.numOfTickersForShortSelling; ! string dirNameWhereToSaveReports = ! System.Configuration.ConfigurationManager.AppSettings["ReportsArchive"] + ! "\\" + this.scriptName + "\\"; ! ! //default report with numIntervalDays = 1 ! AccountReport accountReport = this.account.CreateReport(fileName,1, ! this.endOfDayTimer.GetCurrentTime(), ! this.benchmark, ! new HistoricalRawQuoteProvider() ); ! // new HistoricalAdjustedQuoteProvider()); ! this.checkDateForReport_createDirIfNotPresent(dirNameWhereToSaveReports); ! ObjectArchiver.Archive(accountReport, ! dirNameWhereToSaveReports + ! fileName + ".qPr"); ! ! this.endOfDayTimer.Stop(); ! } ! } } --- 37,178 ---- /// Script that implements the Double OverReaction Open To Close strategy: /// at each open, l long positions and s short positions will be open, ! /// buying and shorting, accordingly, the l tickers among the /// b best that more moves down (at open) and the s tickers among the w worst /// that more moves up (at open). ! /// For chosing the b best and w worst tickers just the /// previous close to close ratio is considered. ! /// The fundamental of the strategy should be the fact (to be verified ...) /// that overreactions may be followed by opposite overreactions. /// At each close, open positions are closed. /// </summary> ! [Serializable] ! public class RunDOR_OTC ! { ! private string scriptName; ! private string tickerGroupID; ! private string benchmark; ! private int numberOfEligibleTickers; ! private int numOfBestTickers; ! private int numOfWorstTickers; ! private int numOfTickersForBuying; ! private int numOfTickersForShortSelling; ! private DateTime startDate; ! private DateTime endDate; ! private double maxRunningHours; ! private DateTime startingTimeForScript; ! private Account account; ! private HistoricalMarketValueProvider historicalMarketValueProvider; ! private Timer timer; + public RunDOR_OTC(string tickerGroupID, string benchmark, + int numberOfEligibleTickers, int numOfBestTickers, + int numOfWorstTickers, int numOfTickersForBuying, + int numOfTickersForShortSelling, + DateTime startDate, DateTime endDate, + double maxRunningHours) + { + this.tickerGroupID = tickerGroupID; + this.benchmark = benchmark; + this.numberOfEligibleTickers = numberOfEligibleTickers; + this.numOfBestTickers = numOfBestTickers; + this.numOfWorstTickers = numOfWorstTickers; + this.numOfTickersForBuying = numOfTickersForBuying; + this.numOfTickersForShortSelling = numOfTickersForShortSelling; + this.startDate = startDate; + this.endDate = endDate; + this.maxRunningHours = maxRunningHours; + this.scriptName = "DoubleOverReaction_OTC"; + this.historicalMarketValueProvider = new HistoricalRawQuoteProvider(); + this.timer = new IndexBasedEndOfDayTimer( + HistoricalEndOfDayTimer.GetMarketOpen( this.startDate ) , this.benchmark ); + // new EndOfDayDateTime( this.startDate , + // EndOfDaySpecificTime.MarketOpen ) , this.benchmark ); + } ! public void Run() ! { ! this.startingTimeForScript = DateTime.Now; ! this.account = new Account( "DoubleOverReaction_OTC" , this.timer , ! new HistoricalEndOfDayDataStreamer( this.timer , ! this.historicalMarketValueProvider ) , ! new HistoricalEndOfDayOrderExecutor( this.timer , ! this.historicalMarketValueProvider ) ); ! EndOfDayTimerHandlerDOR_OTC endOfDayTimerHandler = ! new EndOfDayTimerHandlerDOR_OTC(this.tickerGroupID, this.numberOfEligibleTickers, ! this.numOfBestTickers, this.numOfWorstTickers, ! this.numOfTickersForBuying, this.numOfTickersForShortSelling, ! this.account, this.benchmark); ! ! this.timer.NewDateTime += ! new NewDateTimeEventHandler( endOfDayTimerHandler.NewDateTimeEventHandler ); ! ! // this.timer.MarketOpen += new MarketOpenEventHandler( ! // endOfDayTimerHandler.MarketOpenEventHandler ); ! // ! // this.timer.MarketClose += new MarketCloseEventHandler( ! // endOfDayTimerHandler.MarketCloseEventHandler ); ! this.timer.NewDateTime += new NewDateTimeEventHandler( ! this.checkDateForReport); ! // this.timer.OneHourAfterMarketClose += new OneHourAfterMarketCloseEventHandler( ! // endOfDayTimerHandler.OneHourAfterMarketCloseEventHandler ); ! ! this.timer.Start(); ! } ! private void checkDateForReport( ! Object sender , DateTime dateTime) ! { ! if ( HistoricalEndOfDayTimer.IsMarketClose( dateTime ) ) ! { ! if( dateTime >= this.endDate || ! DateTime.Now >= this.startingTimeForScript.AddHours(this.maxRunningHours)) ! //last date is reached by the timer or maxRunning hours ! //are elapsed from the time script started ! this.SaveScriptResults(); ! } ! } ! private void checkDateForReport_createDirIfNotPresent(string dirPath) ! { ! if(!Directory.Exists(dirPath)) ! Directory.CreateDirectory(dirPath); ! } ! public void SaveScriptResults() ! { ! TimeSpan span; span = DateTime.Now.Subtract(this.startingTimeForScript); int secondsElapsed = span.Hours * 3600 + span.Minutes * 60 + span.Seconds; ! string fileName = ! "SecondsElapsed_" + secondsElapsed.ToString() + "_" + ! DateTime.Now.Hour.ToString().PadLeft(2,'0') + "_" + ! DateTime.Now.Minute.ToString().PadLeft(2,'0') + "_" + ! this.scriptName + "_From_" + this.tickerGroupID + ! "_elig_" + this.numberOfEligibleTickers + ! "_best_" + this.numOfBestTickers + ! "_worst_" + this.numOfWorstTickers + ! "_forLong_" + this.numOfTickersForBuying + ! "_forShort_" + this.numOfTickersForShortSelling; ! string dirNameWhereToSaveReports = ! System.Configuration.ConfigurationManager.AppSettings["ReportsArchive"] + ! "\\" + this.scriptName + "\\"; ! ! //default report with numIntervalDays = 1 ! AccountReport accountReport = this.account.CreateReport(fileName,1, ! this.timer.GetCurrentDateTime(), ! this.benchmark, ! new HistoricalRawQuoteProvider() ); ! // new HistoricalAdjustedQuoteProvider()); ! this.checkDateForReport_createDirIfNotPresent(dirNameWhereToSaveReports); ! ObjectArchiver.Archive(accountReport, ! dirNameWhereToSaveReports + ! fileName + ".qPr"); ! ! this.timer.Stop(); ! } ! } } Index: EndOfDayTimerHandlerDOR_OTC.cs =================================================================== RCS file: /cvsroot/quantproject/QuantProject/b7_Scripts/ArbitrageTesting/OverReactionHypothesis/DoubleOverReaction_OTC/EndOfDayTimerHandlerDOR_OTC.cs,v retrieving revision 1.4 retrieving revision 1.5 diff -C2 -d -r1.4 -r1.5 *** EndOfDayTimerHandlerDOR_OTC.cs 19 Aug 2008 17:11:27 -0000 1.4 --- EndOfDayTimerHandlerDOR_OTC.cs 29 Sep 2008 21:16:12 -0000 1.5 *************** *** 31,35 **** using QuantProject.Business.Strategies; using QuantProject.Data; ! using QuantProject.Data.DataProviders; using QuantProject.Data.Selectors; --- 31,35 ---- using QuantProject.Business.Strategies; using QuantProject.Data; ! using QuantProject.Data.DataProviders.Quotes; using QuantProject.Data.Selectors; *************** *** 82,86 **** } ! #region MarketOpenEventHandler private void addOrderForTicker(string[] tickers, --- 82,86 ---- } ! #region marketOpenEventHandler private void addOrderForTicker(string[] tickers, *************** *** 123,137 **** private double setChosenTickers_getGainOrLossFromPreviousClose(string signedTicker) { ! IndexBasedEndOfDayTimer currentTimer = (IndexBasedEndOfDayTimer)this.account.EndOfDayTimer; ! ExtendedDateTime nowAtOpen = ! new ExtendedDateTime(currentTimer.GetCurrentTime().DateTime, ! BarComponent.Open); ! ExtendedDateTime previousClose = ! new ExtendedDateTime(currentTimer.GetPreviousDateTime(), ! BarComponent.Close); double currentValueAtOpen = ! HistoricalDataProvider.GetAdjustedMarketValue(SignedTicker.GetTicker(signedTicker), nowAtOpen); double previousValueAtClose = ! HistoricalDataProvider.GetAdjustedMarketValue(SignedTicker.GetTicker(signedTicker), previousClose); return (currentValueAtOpen - previousValueAtClose) / previousValueAtClose; --- 123,143 ---- private double setChosenTickers_getGainOrLossFromPreviousClose(string signedTicker) { ! IndexBasedEndOfDayTimer currentTimer = (IndexBasedEndOfDayTimer)this.account.Timer; ! DateTime nowAtOpen = ! HistoricalEndOfDayTimer.GetMarketOpen( currentTimer.GetCurrentDateTime() ); ! // new ExtendedDateTime(currentTimer.GetCurrentTime().DateTime, ! // BarComponent.Open); ! DateTime previousClose = ! HistoricalEndOfDayTimer.GetMarketClose( currentTimer.GetPreviousDateTime() ); ! // new ExtendedDateTime(currentTimer.GetPreviousDateTime(), ! // BarComponent.Close); double currentValueAtOpen = ! HistoricalQuotesProvider.GetAdjustedMarketValue( ! SignedTicker.GetTicker(signedTicker), ! nowAtOpen , MarketStatusSwitch.Open ); double previousValueAtClose = ! HistoricalQuotesProvider.GetAdjustedMarketValue( ! SignedTicker.GetTicker(signedTicker), ! previousClose , MarketStatusSwitch.Close ); return (currentValueAtOpen - previousValueAtClose) / previousValueAtClose; *************** *** 201,206 **** /// <param name="sender"></param> /// <param name="eventArgs"></param> ! public void MarketOpenEventHandler( ! Object sender , EndOfDayTimingEventArgs endOfDayTimingEventArgs ) { if(this.orders.Count == 0 && this.account.Transactions.Count == 0) --- 207,212 ---- /// <param name="sender"></param> /// <param name="eventArgs"></param> ! private void marketOpenEventHandler( ! Object sender , DateTime dateTime ) { if(this.orders.Count == 0 && this.account.Transactions.Count == 0) *************** *** 219,223 **** #endregion ! #region MarketCloseEventHandler private void closePosition( string ticker ) --- 225,229 ---- #endregion ! #region marketCloseEventHandler private void closePosition( string ticker ) *************** *** 235,240 **** } ! public void MarketCloseEventHandler( ! Object sender , EndOfDayTimingEventArgs endOfDayTimingEventArgs ) { this.closePositions(); --- 241,246 ---- } ! public void marketCloseEventHandler( ! Object sender , DateTime dateTime ) { this.closePositions(); *************** *** 243,247 **** #endregion ! #region OneHourAfterMarketCloseEventHandler private void oneHourAfterMarketCloseEventHandler_clear() --- 249,253 ---- #endregion ! #region oneHourAfterMarketCloseEventHandler private void oneHourAfterMarketCloseEventHandler_clear() *************** *** 261,269 **** /// <param name="sender"></param> /// <param name="eventArgs"></param> ! public void OneHourAfterMarketCloseEventHandler( ! Object sender , EndOfDayTimingEventArgs endOfDayTimingEventArgs ) { this.oneHourAfterMarketCloseEventHandler_clear(); ! DateTime currentDate = endOfDayTimingEventArgs.EndOfDayDateTime.DateTime; SelectorByGroup temporizedGroup = new SelectorByGroup(this.tickerGroupID, currentDate); --- 267,275 ---- /// <param name="sender"></param> /// <param name="eventArgs"></param> ! public void oneHourAfterMarketCloseEventHandler( ! Object sender , DateTime dateTime ) { this.oneHourAfterMarketCloseEventHandler_clear(); ! DateTime currentDate = dateTime; SelectorByGroup temporizedGroup = new SelectorByGroup(this.tickerGroupID, currentDate); *************** *** 350,353 **** --- 356,371 ---- } #endregion + + public virtual void NewDateTimeEventHandler( + Object sender , DateTime dateTime ) + { + if ( HistoricalEndOfDayTimer.IsMarketOpen( dateTime ) ) + this.marketOpenEventHandler( sender , dateTime ); + if ( HistoricalEndOfDayTimer.IsMarketClose( dateTime ) ) + this.marketCloseEventHandler( sender , dateTime ); + if ( HistoricalEndOfDayTimer.IsOneHourAfterMarketClose( dateTime ) ) + this.oneHourAfterMarketCloseEventHandler( sender , dateTime ); + } + } } |