Skip to content

Commit

Permalink
add support for auto precision
Browse files Browse the repository at this point in the history
  • Loading branch information
ZENALC committed Jun 22, 2021
1 parent 233ed90 commit 47cb053
Show file tree
Hide file tree
Showing 10 changed files with 183 additions and 203 deletions.
320 changes: 140 additions & 180 deletions UI/configuration.ui

Large diffs are not rendered by default.

6 changes: 3 additions & 3 deletions algobot/algodict.py
Original file line number Diff line number Diff line change
Expand Up @@ -48,7 +48,7 @@ def get_interface_dictionary(parent, caller: int = None):
'ticker': parent.configuration.simulationTickerLineEdit,
'interval': parent.configuration.simulationIntervalComboBox,
'lowerIntervalCheck': parent.configuration.lowerIntervalSimulationCheck,
'precision': parent.configuration.simulationPrecisionSpinBox,
'precision': parent.configuration.simulationPrecisionComboBox,
}
},
LIVE: {
Expand Down Expand Up @@ -89,7 +89,7 @@ def get_interface_dictionary(parent, caller: int = None):
'ticker': parent.configuration.tickerLineEdit,
'interval': parent.configuration.intervalComboBox,
'lowerIntervalCheck': parent.configuration.lowerIntervalCheck,
'precision': parent.configuration.precisionSpinBox,
'precision': parent.configuration.precisionComboBox,
}
},
BACKTEST: {
Expand All @@ -104,7 +104,7 @@ def get_interface_dictionary(parent, caller: int = None):
'configuration': {
'mainTab': parent.configuration.backtestMainTab,
'mainConfigurationTabWidget': parent.configuration.backtestConfigurationTabWidget,
'precision': parent.configuration.backtestPrecisionSpinBox,
'precision': parent.configuration.backtestPrecisionComboBox,
'ticker': parent.configuration.backtestTickerLineEdit,
'interval': parent.configuration.backtestIntervalComboBox,
},
Expand Down
6 changes: 2 additions & 4 deletions algobot/graph_helpers.py
Original file line number Diff line number Diff line change
Expand Up @@ -172,12 +172,10 @@ def setup_average_graph_plots(gui: QMainWindow, graph: PlotWidget, trader, color
for option in trader.strategies['movingAverage'].get_params():
initialAverage, finalAverage, initialName, finalName = option.get_option_info(trader)
initialPlotDict = get_plot_dictionary(gui=gui, graph=graph, color=colors[colorCounter % len(colors)],
y=initialAverage,
name=initialName, timestamp=currentDateTimestamp)
y=initialAverage, name=initialName, timestamp=currentDateTimestamp)
secondaryPlotDict = get_plot_dictionary(gui=gui, graph=graph,
color=colors[(colorCounter + 1) % len(colors)],
y=finalAverage,
name=finalName, timestamp=currentDateTimestamp)
y=finalAverage, name=finalName, timestamp=currentDateTimestamp)
colorCounter += 2
append_plot_to_graph(gui, graph, [initialPlotDict, secondaryPlotDict])

Expand Down
10 changes: 10 additions & 0 deletions algobot/helpers.py
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
import json
import logging
import math
import os
import platform
import re
Expand All @@ -8,6 +9,7 @@
from datetime import datetime
from typing import Dict, List, Tuple, Union

from binance import Client
from dateutil import parser

from algobot.enums import BACKTEST, LIVE, OPTIMIZER, SIMULATION
Expand Down Expand Up @@ -362,6 +364,14 @@ def load_from_csv(path: str, descending: bool = True) -> list:
return data


def parse_precision(precision: str, symbol: str) -> int:
if precision == "Auto":
symbol_info = Client().get_symbol_info(symbol)
tickSize = float(symbol_info['filters'][0]['tickSize'])
precision = abs(round(math.log(tickSize, 10)))
return int(precision)


def write_json_file(filePath: str = 'secret.json', **kwargs):
"""
Writes JSON file with **kwargs provided.
Expand Down
8 changes: 8 additions & 0 deletions algobot/interface/config_utils/slot_utils.py
Original file line number Diff line number Diff line change
Expand Up @@ -138,6 +138,13 @@ def load_strategy_slots(config_obj):
tab.addTab(tabWidget, strategyName)


def load_precision_combo_boxes(config_obj):
combo_boxes = [config_obj.precisionComboBox, config_obj.simulationPrecisionComboBox,
config_obj.backtestPrecisionComboBox, config_obj.optimizerPrecisionComboBox]
precisions = ["Auto"] + [str(x) for x in range(2, 16)]
[combo_box.addItems(precisions) for combo_box in combo_boxes]


def load_interval_combo_boxes(config_obj):
"""
This function currently only handles combo boxes for backtester/optimizer interval logic. It'll update the
Expand Down Expand Up @@ -228,6 +235,7 @@ def load_slots(config_obj):
c.graphPlotSpeedSpinBox.valueChanged.connect(c.update_graph_speed)
c.enableHoverLine.stateChanged.connect(c.enable_disable_hover_line)

load_precision_combo_boxes(c)
load_interval_combo_boxes(c) # Primarily used for backtester/optimizer interval changer logic.
load_loss_slots(c) # These slots are based on the ordering.
load_take_profit_slots(c)
Expand Down
20 changes: 10 additions & 10 deletions algobot/interface/config_utils/user_config_utils.py
Original file line number Diff line number Diff line change
Expand Up @@ -108,7 +108,7 @@ def save_backtest_settings(config_obj):
'ticker': config_obj.backtestTickerLineEdit.text(),
'interval': config_obj.backtestIntervalComboBox.currentIndex(),
'startingBalance': config_obj.backtestStartingBalanceSpinBox.value(),
'precision': config_obj.backtestPrecisionSpinBox.value(),
'precision': config_obj.backtestPrecisionComboBox.currentIndex(),
'marginTrading': config_obj.backtestMarginTradingCheckBox.isChecked(),
}

Expand All @@ -125,7 +125,7 @@ def save_optimizer_settings(config_obj):
'strategyIntervalStart': config_obj.optimizerStrategyIntervalCombobox.currentIndex(),
'strategyIntervalEnd': config_obj.optimizerStrategyIntervalEndCombobox.currentIndex(),
'startingBalance': config_obj.optimizerStartingBalanceSpinBox.value(),
'precision': config_obj.optimizerPrecisionSpinBox.value(),
'precision': config_obj.optimizerPrecisionComboBox.currentIndex(),
'drawdownPercentage': config_obj.drawdownPercentageSpinBox.value(),
'marginTrading': config_obj.optimizerMarginTradingCheckBox.isChecked()
}
Expand All @@ -140,7 +140,7 @@ def save_live_settings(config_obj):
'type': LIVE,
'ticker': config_obj.tickerLineEdit.text(),
'interval': config_obj.intervalComboBox.currentIndex(),
'precision': config_obj.precisionSpinBox.value(),
'precision': config_obj.precisionComboBox.currentIndex(),
'usRegion': config_obj.usRegionRadio.isChecked(),
'otherRegion': config_obj.otherRegionRadio.isChecked(),
'isolatedMargin': config_obj.isolatedMarginAccountRadio.isChecked(),
Expand All @@ -159,7 +159,7 @@ def save_simulation_settings(config_obj):
'ticker': config_obj.simulationTickerLineEdit.text(),
'interval': config_obj.simulationIntervalComboBox.currentIndex(),
'startingBalance': config_obj.simulationStartingBalanceSpinBox.value(),
'precision': config_obj.simulationPrecisionSpinBox.value(),
'precision': config_obj.simulationPrecisionComboBox.currentIndex(),
'lowerInterval': config_obj.lowerIntervalSimulationCheck.isChecked(),
}

Expand Down Expand Up @@ -203,7 +203,7 @@ def load_live_settings(config_obj, config):
"""
config_obj.tickerLineEdit.setText(str(config['ticker']))
config_obj.intervalComboBox.setCurrentIndex(config['interval'])
config_obj.precisionSpinBox.setValue(config['precision'])
config_obj.precisionComboBox.setCurrentIndex(config['precision'])
config_obj.usRegionRadio.setChecked(config['usRegion'])
config_obj.otherRegionRadio.setChecked(config['otherRegion'])
config_obj.isolatedMarginAccountRadio.setChecked(config['isolatedMargin'])
Expand All @@ -220,7 +220,7 @@ def load_simulation_settings(config_obj, config):
config_obj.simulationTickerLineEdit.setText(str(config['ticker']))
config_obj.simulationIntervalComboBox.setCurrentIndex(config['interval'])
config_obj.simulationStartingBalanceSpinBox.setValue(config['startingBalance'])
config_obj.simulationPrecisionSpinBox.setValue(config['precision'])
config_obj.simulationPrecisionComboBox.setCurrentIndex(config['precision'])
config_obj.lowerIntervalSimulationCheck.setChecked(config['lowerInterval'])


Expand All @@ -233,7 +233,7 @@ def load_backtest_settings(config_obj, config):
config_obj.backtestTickerLineEdit.setText(str(config['ticker']))
config_obj.backtestIntervalComboBox.setCurrentIndex(config['interval'])
config_obj.backtestStartingBalanceSpinBox.setValue(config['startingBalance'])
config_obj.backtestPrecisionSpinBox.setValue(config['precision'])
config_obj.backtestPrecisionComboBox.setCurrentIndex(config['precision'])
config_obj.backtestMarginTradingCheckBox.setChecked(config['marginTrading'])


Expand All @@ -248,7 +248,7 @@ def load_optimizer_settings(config_obj, config):
config_obj.optimizerStrategyIntervalCombobox.setCurrentIndex(config['strategyIntervalStart'])
config_obj.optimizerStrategyIntervalEndCombobox.setCurrentIndex(config['strategyIntervalEnd'])
config_obj.optimizerStartingBalanceSpinBox.setValue(config['startingBalance'])
config_obj.optimizerPrecisionSpinBox.setValue(config['precision'])
config_obj.optimizerPrecisionComboBox.setCurrentIndex(config['precision'])
config_obj.drawdownPercentageSpinBox.setValue(config['drawdownPercentage'])


Expand All @@ -270,7 +270,7 @@ def copy_settings_to_simulation(config_obj):
"""
config_obj.simulationIntervalComboBox.setCurrentIndex(config_obj.intervalComboBox.currentIndex())
config_obj.simulationTickerLineEdit.setText(config_obj.tickerLineEdit.text())
config_obj.simulationPrecisionSpinBox.setValue(config_obj.precisionSpinBox.value())
config_obj.simulationPrecisionComboBox.setCurrentIndex(config_obj.precisionComboBox.currentIndex())


def copy_settings_to_backtest(config_obj):
Expand All @@ -280,7 +280,7 @@ def copy_settings_to_backtest(config_obj):
"""
config_obj.backtestIntervalComboBox.setCurrentIndex(config_obj.intervalComboBox.currentIndex())
config_obj.backtestTickerLineEdit.setText(config_obj.tickerLineEdit.text())
config_obj.backtestPrecisionSpinBox.setValue(config_obj.precisionSpinBox.value())
config_obj.backtestPrecisionComboBox.setCurrentIndex(config_obj.precisionComboBox.currentIndex())


def copy_strategy_settings(config_obj, fromCaller: int, toCaller: int, strategyName: str):
Expand Down
6 changes: 4 additions & 2 deletions algobot/threads/backtestThread.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@
from PyQt5.QtCore import QObject, QRunnable, pyqtSignal, pyqtSlot

from algobot.enums import BACKTEST
from algobot.helpers import parse_precision
from algobot.interface.config_utils.calendar_utils import get_calendar_dates
from algobot.interface.config_utils.strategy_utils import get_strategies
from algobot.traders.backtester import Backtester
Expand Down Expand Up @@ -38,14 +39,15 @@ def get_configuration_details_to_setup_backtest(self) -> Dict[str, Any]:
"""
config = self.gui.configuration
startDate, endDate = get_calendar_dates(config_obj=config)
symbol = config.optimizer_backtest_dict[BACKTEST]['dataType']

return {
'startingBalance': config.backtestStartingBalanceSpinBox.value(),
'data': config.optimizer_backtest_dict[BACKTEST]['data'],
'startDate': startDate,
'endDate': endDate,
'symbol': config.optimizer_backtest_dict[BACKTEST]['dataType'],
'precision': config.backtestPrecisionSpinBox.value(),
'symbol': symbol,
'precision': parse_precision(config.backtestPrecisionComboBox.currentText(), symbol),
'outputTrades': config.backtestOutputTradesCheckBox.isChecked(),
'marginEnabled': config.backtestMarginTradingCheckBox.isChecked(),
'strategies': get_strategies(config, BACKTEST),
Expand Down
2 changes: 1 addition & 1 deletion algobot/threads/botThread.py
Original file line number Diff line number Diff line change
Expand Up @@ -111,7 +111,7 @@ def create_trader(self, caller):
gui = self.gui
configDict = gui.interfaceDictionary[caller]['configuration']
symbol = configDict['ticker'].text()
precision = configDict['precision'].value()
precision = helpers.parse_precision(configDict['precision'].currentText(), symbol)
prettyInterval = configDict['interval'].currentText()
interval = helpers.convert_long_interval(prettyInterval)

Expand Down
6 changes: 4 additions & 2 deletions algobot/threads/optimizerThread.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
from PyQt5.QtCore import QObject, QRunnable, pyqtSignal, pyqtSlot

from algobot.enums import OPTIMIZER
from algobot.helpers import parse_precision
from algobot.interface.config_utils.calendar_utils import get_calendar_dates
from algobot.traders.backtester import Backtester

Expand Down Expand Up @@ -32,14 +33,15 @@ def get_configuration_details(self) -> Dict[str, Any]:
"""
config = self.gui.configuration
startDate, endDate = get_calendar_dates(config_obj=config, caller=OPTIMIZER)
symbol = config.optimizer_backtest_dict[OPTIMIZER]['dataType']

return {
'startingBalance': config.optimizerStartingBalanceSpinBox.value(),
'data': config.optimizer_backtest_dict[OPTIMIZER]['data'],
'startDate': startDate,
'endDate': endDate,
'symbol': config.optimizer_backtest_dict[OPTIMIZER]['dataType'],
'precision': config.optimizerPrecisionSpinBox.value(),
'symbol': symbol,
'precision': parse_precision(config.optimizerPrecisionComboBox.currentText(), symbol),
'marginEnabled': config.optimizerMarginTradingCheckBox.isChecked(),
'strategies': [],
'strategyInterval': config.optimizerStrategyIntervalCombobox.currentText(),
Expand Down
2 changes: 1 addition & 1 deletion version.txt
Original file line number Diff line number Diff line change
@@ -1 +1 @@
1.16
1.17

0 comments on commit 47cb053

Please sign in to comment.