def setUpClass(self): Logger.pushLogData("unitTesting", __name__) forceWorkingDirectory() pyswing.globals.potentialRuleMatches = None pyswing.globals.equityCount = None pyswing.database.overrideDatabase("output/TestStrategy.db") pyswing.constants.pySwingStartDate = datetime.datetime(2015, 1, 1) deleteFile(pyswing.database.pySwingDatabase) copyFile(pyswing.database.pySwingTestDatabase, pyswing.database.pySwingDatabase) twoRuleStrategy = Strategy("Rule Equities Indicator_BB20 abs(t1.Close - t2.upperband) < abs(t1.Close - t2.middleband)", "Rule Equities abs(Close - High) * 2 < abs(Close - Low)", "Exit TrailingStop3.0 RiskRatio2", "Buy") twoRuleStrategy.evaluateTwoRuleStrategy() threeRuleStrategy = Strategy("Rule Equities Indicator_BB20 abs(t1.Close - t2.upperband) < abs(t1.Close - t2.middleband)", "Rule Equities abs(Close - High) * 2 < abs(Close - Low)", "Exit TrailingStop3.0 RiskRatio2", "Buy", "Rule Indicator_RSI RSI > 20") threeRuleStrategy.evaluateThreeRuleStrategy() historicTrades = Strategy("Rule Equities Indicator_BB20 abs(t1.Close - t2.upperband) < abs(t1.Close - t2.middleband)", "Rule Equities abs(Close - High) * 2 < abs(Close - Low)", "Exit TrailingStop3.0 RiskRatio2", "Buy", "Rule Indicator_RSI RSI > 20") historicTrades.generateHistoricTrades()
def evaluateTwoRuleStrategies(argv): """ Evaluate Two-Rule Strategies. :param argv: Command Line Parameters. -n = Name -m = Minimum Matches Per Day -s = Strategy Name Example: python -m pyswing.EvaluateTwoRuleStrategies -n asx -m 0.1 -s v4.0 """ Logger.log(logging.INFO, "Log Script Call", {"scope":__name__, "arguments":" ".join(argv)}) Logger.pushLogData("script", __name__) marketName = "" minimumMatchesPerDay = None try: shortOptions = "n:m:s:dh" longOptions = ["marketName=", "matches=", "strategy=", "debug", "help"] opts, __ = getopt.getopt(argv, shortOptions, longOptions) except getopt.GetoptError as e: Logger.log(logging.ERROR, "Error Reading Options", {"scope": __name__, "exception": str(e)}) usage() sys.exit(2) for opt, arg in opts: if opt in ("-d", "--debug"): Logger().setLevel(logging.DEBUG) elif opt in ("-h", "--help"): print("?") usage() sys.exit() elif opt in ("-n", "--marketName"): marketName = arg elif opt in ("-m", "--matches"): minimumMatchesPerDay = arg elif opt in ("-s", "--strategy"): pyswing.constants.pySwingStrategy = arg if marketName != "" and minimumMatchesPerDay and pyswing.constants.pySwingStrategy: pyswing.database.initialiseDatabase(marketName) Logger.log(logging.INFO, "Evaluate Two-Rule Strategies", {"scope":__name__, "market":marketName, "matches":minimumMatchesPerDay, "strategy":pyswing.constants.pySwingStrategy}) strategies = getTwoRuleStrategies(minimumMatchesPerDay) exits = getExitStrategies() inverseStrategies = set() for rules in strategies: if rules not in inverseStrategies: for exit in exits: buyStrategy = Strategy(rules[0], rules[1], exit, 'Buy') buyStrategy.evaluateTwoRuleStrategy() sellStrategy = Strategy(rules[0], rules[1], exit, 'Sell') sellStrategy.evaluateTwoRuleStrategy() inverseStrategies.add((rules[1], rules[0])) TeamCity.setBuildResultText("Evaluated Two-Rule Strategies") else: Logger.log(logging.ERROR, "Missing Options", {"scope": __name__, "options": str(argv)}) usage() sys.exit(2)
def test_analyseStrategy(self): strategy = Strategy('Rule Indicator_RSI RSI > 20', 'Rule Indicator_RSI RSI > 20', 'Exit TrailingStop3.0 RiskRatio2', 'Buy', 'Rule Indicator_RSI RSI > 20') strategy.meanResultPerTrade = 1.0 strategy.medianResultPerTrade = 1.0 strategy.totalProfit = 1.0 strategy.numberOfTrades = 1.0 strategy.sharpeRatio = 1.0 strategy.maximumDrawdown = 1.0 data = strategy.askHorse('2015-05-25 00:00:00') self.assertTrue(data) self.assertEqual(len(strategy.tradeDetails), 3) strategy = Strategy('Rule Equities abs(Close - High) * 10 < abs(Close - Low)', 'Rule Equities abs(Close - High) * 10 < abs(Close - Low)', 'Exit TrailingStop3.0 RiskRatio2', 'Buy', 'Rule Equities abs(Close - High) * 10 < abs(Close - Low)') strategy.meanResultPerTrade = 1.0 strategy.medianResultPerTrade = 1.0 strategy.totalProfit = 1.0 strategy.numberOfTrades = 1.0 strategy.sharpeRatio = 1.0 strategy.maximumDrawdown = 1.0 moreData = strategy.askHorse('2015-05-26 00:00:00') self.assertFalse(moreData) self.assertEqual(len(strategy.tradeDetails), 0)
def evaluateThreeRuleStrategies(argv): """ Evaluate Three-Rule Strategies. :param argv: Command Line Parameters. -n = Name -N = Number of Two-Rule Strategies to Work Through -s = Strategy Name -t = Minimum Number of Trades Example: python -m pyswing.EvaluateThreeRuleStrategies -n asx -N 10 -s v4.0 -t 400 """ Logger.log(logging.INFO, "Log Script Call", {"scope":__name__, "arguments":" ".join(argv)}) Logger.pushLogData("script", __name__) marketName = "" numberOfStrategies = "" numberOfTrades = "" try: shortOptions = "n:N:s:t:dh" longOptions = ["marketName=","number=", "strategy=", "trades=", "debug", "help"] opts, __ = getopt.getopt(argv, shortOptions, longOptions) except getopt.GetoptError as e: Logger.log(logging.ERROR, "Error Reading Options", {"scope": __name__, "exception": str(e)}) usage() sys.exit(2) for opt, arg in opts: if opt in ("-d", "--debug"): Logger().setLevel(logging.DEBUG) elif opt in ("-h", "--help"): print("?") usage() sys.exit() elif opt in ("-n", "--marketName"): marketName = arg elif opt in ("-N", "--number"): numberOfStrategies = int(arg) elif opt in ("-s", "--strategy"): pyswing.constants.pySwingStrategy = arg elif opt in ("-t", "--trades"): numberOfTrades = arg if marketName != "" and numberOfTrades != "" and numberOfStrategies > 0 and pyswing.constants.pySwingStrategy: pyswing.database.initialiseDatabase(marketName) Logger.log(logging.INFO, "Evaluate Three-Rule Strategies", {"scope":__name__, "market":marketName, "number":str(numberOfStrategies), "strategy":pyswing.constants.pySwingStrategy}) rules = getRules() strategiesEvaluated = 0 while strategiesEvaluated < numberOfStrategies: rule1, rule2, exit, type = getBestUnprocessedTwoRuleStrategy(numberOfTrades) for rule3 in rules: strategy = Strategy(rule1, rule2, exit, type, rule3) strategy.evaluateThreeRuleStrategy() markTwoRuleStrategyAsProcessed(rule1, rule2, type) strategiesEvaluated += 1 deleteEmptyThreeRuleStrategies() TeamCity.setBuildResultText("Evaluated Three-Rule Strategies") else: Logger.log(logging.ERROR, "Missing Options", {"scope": __name__, "options": str(argv)}) usage() sys.exit(2)
def test_analyseStrategy(self): strategy = Strategy('Rule Indicator_RSI RSI > 20', 'Rule Indicator_RSI RSI > 20', 'Exit TrailingStop3.0 RiskRatio2', 'Buy', 'Rule Indicator_RSI RSI > 20') strategy.meanResultPerTrade = 1.0 strategy.medianResultPerTrade = 1.0 strategy.totalProfit = 1.0 strategy.numberOfTrades = 1.0 strategy.sharpeRatio = 1.0 strategy.maximumDrawdown = 1.0 data = strategy.askHorse('2015-05-25 00:00:00') self.assertTrue(data) self.assertEqual(len(strategy.tradeDetails), 3) strategy = Strategy( 'Rule Equities abs(Close - High) * 10 < abs(Close - Low)', 'Rule Equities abs(Close - High) * 10 < abs(Close - Low)', 'Exit TrailingStop3.0 RiskRatio2', 'Buy', 'Rule Equities abs(Close - High) * 10 < abs(Close - Low)') strategy.meanResultPerTrade = 1.0 strategy.medianResultPerTrade = 1.0 strategy.totalProfit = 1.0 strategy.numberOfTrades = 1.0 strategy.sharpeRatio = 1.0 strategy.maximumDrawdown = 1.0 moreData = strategy.askHorse('2015-05-26 00:00:00') self.assertFalse(moreData) self.assertEqual(len(strategy.tradeDetails), 0)
def setUpClass(self): Logger.pushLogData("unitTesting", __name__) forceWorkingDirectory() pyswing.globals.potentialRuleMatches = None pyswing.globals.equityCount = None pyswing.database.overrideDatabase("output/TestStrategy.db") pyswing.constants.pySwingStartDate = datetime.datetime(2015, 1, 1) deleteFile(pyswing.database.pySwingDatabase) copyFile(pyswing.database.pySwingTestDatabase, pyswing.database.pySwingDatabase) twoRuleStrategy = Strategy( "Rule Equities Indicator_BB20 abs(t1.Close - t2.upperband) < abs(t1.Close - t2.middleband)", "Rule Equities abs(Close - High) * 2 < abs(Close - Low)", "Exit TrailingStop3.0 RiskRatio2", "Buy") twoRuleStrategy.evaluateTwoRuleStrategy() threeRuleStrategy = Strategy( "Rule Equities Indicator_BB20 abs(t1.Close - t2.upperband) < abs(t1.Close - t2.middleband)", "Rule Equities abs(Close - High) * 2 < abs(Close - Low)", "Exit TrailingStop3.0 RiskRatio2", "Buy", "Rule Indicator_RSI RSI > 20") threeRuleStrategy.evaluateThreeRuleStrategy() historicTrades = Strategy( "Rule Equities Indicator_BB20 abs(t1.Close - t2.upperband) < abs(t1.Close - t2.middleband)", "Rule Equities abs(Close - High) * 2 < abs(Close - Low)", "Exit TrailingStop3.0 RiskRatio2", "Buy", "Rule Indicator_RSI RSI > 20") historicTrades.generateHistoricTrades()