2022-03-20 10:09:33 +01:00
from pathlib import Path
from typing import Union
import json
2023-09-24 12:33:43 +02:00
from datetime import datetime , date , timedelta
2022-07-23 15:27:46 +02:00
import re
2022-03-20 10:09:33 +01:00
2022-06-26 17:32:41 +02:00
import pandas as pd
2025-06-15 12:17:00 +02:00
from common . model_store import *
2025-04-17 14:21:17 +01:00
from common . types import AccountBalances , MT5AccountInfo
2022-03-20 10:09:33 +01:00
PACKAGE_ROOT = Path ( __file__ ) . parent . parent
#PACKAGE_PARENT = '..'
#SCRIPT_DIR = os.path.dirname(os.path.realpath(os.path.join(os.getcwd(), os.path.expanduser(__file__))))
#sys.path.append(os.path.normpath(os.path.join(SCRIPT_DIR, PACKAGE_PARENT)))
#PACKAGE_ROOT = os.path.dirname(os.path.abspath(__file__))
class App :
""" Globally visible variables. """
# System
loop = None # asyncio main loop
sched = None # Scheduler
analyzer = None # Store and analyze data
#
# State of the server (updated after each interval)
#
# State 0 or None or empty means ok. String and other non empty objects mean error
error_status = 0 # Networks, connections, exceptions etc. what does not allow us to work at all
server_status = 0 # If server allow us to trade (maintenance, down etc.)
account_status = 0 # If account allows us to trade (funds, suspended etc.)
trade_state_status = 0 # Something wrong with our trading logic (wrong use, inconsistent state etc. what we cannot recover)
2023-12-09 19:59:29 +01:00
df = None # Data from the latest analysis
2023-09-24 12:33:43 +02:00
2024-06-22 09:58:08 +02:00
# Trade simulator
2022-04-10 19:38:53 +02:00
transaction = None
2024-06-22 09:58:08 +02:00
# Trade binance
2022-03-20 10:09:33 +01:00
status = None # BOUGHT, SOLD, BUYING, SELLING
order = None # Latest or current order
order_time = None # Order submission time
2025-04-17 07:49:08 +01:00
# Account Info
2022-03-20 10:09:33 +01:00
# Available assets for trade
# Can be set by the sync/recover function or updated by the trading algorithm
2025-04-17 07:39:05 +01:00
# base_quantity = "0.04108219" # BTC owned (on account, already bought, available for trade)
# quote_quantity = "1000.0" # USDT owned (on account, available for trade)
2025-04-17 07:49:08 +01:00
account_info : Union [ AccountBalances , MT5AccountInfo ] = AccountBalances ( )
2022-03-20 10:09:33 +01:00
#
# Trader. Status data retrieved from the server. Below are examples only.
#
system_status = { " status " : 0 , " msg " : " normal " } # 0: normal,1:system maintenance
2022-04-18 13:25:25 +02:00
symbol_info = { }
2025-04-17 20:32:26 +01:00
# account_info = {}
2022-03-20 10:09:33 +01:00
2025-06-15 12:17:00 +02:00
model_store : ModelStore = None
2022-03-20 10:09:33 +01:00
#
# Constant configuration parameters
#
config = {
2025-04-17 20:32:26 +01:00
# Venue
" venue " : " " ,
2022-03-20 10:09:33 +01:00
# Binance
" api_key " : " " ,
" api_secret " : " " ,
2025-04-17 07:39:05 +01:00
# MetaTrader5
" mt5_account_id " : " " ,
" mt5_password " : " " ,
" mt5_server " : " " ,
2022-03-20 10:09:33 +01:00
# Telegram
" telegram_bot_token " : " " , # Source address of messages
" telegram_chat_id " : " " , # Destination address of messages
2022-07-17 10:21:42 +02:00
#
2023-10-01 20:51:09 +02:00
# Conventions for the file and column names
2022-07-17 10:21:42 +02:00
#
2024-03-16 11:42:24 +01:00
" merge_file_name " : " data.csv " ,
2024-03-16 12:31:14 +01:00
" feature_file_name " : " features.csv " ,
2024-03-16 13:08:25 +01:00
" matrix_file_name " : " matrix.csv " ,
2024-03-16 13:46:08 +01:00
" predict_file_name " : " predictions.csv " , # predict, predict-rolling
2024-03-16 14:06:50 +01:00
" signal_file_name " : " signals.csv " ,
2022-08-07 14:04:47 +02:00
" signal_models_file_name " : " signal_models " ,
2022-07-17 10:21:42 +02:00
2023-03-11 10:05:43 +01:00
" model_folder " : " MODELS " ,
2022-07-17 10:21:42 +02:00
" time_column " : " timestamp " ,
2022-04-17 19:55:22 +02:00
# File locations
2022-07-23 15:27:46 +02:00
" data_folder " : " C:/DATA_ITB " , # Location for all source and generated data/models
2022-07-17 10:21:42 +02:00
# ==============================================
# === DOWNLOADER, MERGER and (online) READER ===
2022-04-17 19:55:22 +02:00
# Symbol determines sub-folder and used in other identifiers
2025-04-17 07:39:05 +01:00
" symbol " : " BTCUSDT " , # BTCUSDT ETHUSDT ^gspc EURUSD
2022-04-15 21:45:46 +02:00
2024-05-11 15:43:40 +02:00
# This parameter determines time raster (granularity) for the data
2024-05-12 19:17:10 +02:00
# It is pandas frequency
2024-05-11 15:43:40 +02:00
" freq " : " 1min " ,
2022-04-17 19:55:22 +02:00
2022-07-23 15:27:46 +02:00
# This list is used for downloading and then merging data
# "folder" is symbol name for downloading. prefix will be added column names during merge
2023-10-01 20:51:09 +02:00
" data_sources " : [ ] ,
2022-04-17 19:55:22 +02:00
2022-04-15 11:46:19 +02:00
# ==========================
2022-04-02 11:50:07 +02:00
# === FEATURE GENERATION ===
2022-03-20 10:09:33 +01:00
2022-04-19 19:05:39 +02:00
# What columns to pass to which feature generator and how to prefix its derived features
2022-07-17 10:21:42 +02:00
# Each executes one feature generation function applied to columns with the specified prefix
2023-10-01 20:51:09 +02:00
" feature_sets " : [ ] ,
2022-04-02 11:50:07 +02:00
2022-04-19 19:05:39 +02:00
# ========================
# === LABEL GENERATION ===
2023-10-01 20:51:09 +02:00
" label_sets " : [ ] ,
2022-04-19 19:05:39 +02:00
# ===========================
# === MODEL TRAIN/PREDICT ===
2022-07-17 10:21:42 +02:00
# predict off-line and on-line
2022-04-19 19:05:39 +02:00
2023-08-11 20:26:56 +02:00
" label_horizon " : 0 , # This number of tail rows will be excluded from model training
" train_length " : 0 , # train set maximum size. algorithms may decrease this length
2022-04-16 20:30:34 +02:00
2023-08-11 20:26:56 +02:00
# List all features to be used for training/prediction by selecting them from the result of feature generation
# The list of features can be found in the output of the feature generation (but not all must be used)
# Currently the same feature set for all algorithms
" train_features " : [ ] ,
# Labels to be used for training/prediction by all algorithms
# List of available labels can be found in the output of the label generation (but not all must be used)
" labels " : [ ] ,
2022-03-20 10:09:33 +01:00
2023-08-11 20:26:56 +02:00
# Algorithms and their configurations to be used for training/prediction
" algorithms " : [ ] ,
2022-08-20 11:26:28 +02:00
2023-08-11 20:26:56 +02:00
# ===========================
2022-07-17 10:21:42 +02:00
# ONLINE (PREDICTION) PARAMETERS
# Minimum history length required to compute derived features
2023-08-11 20:26:56 +02:00
" features_horizon " : 10 ,
2022-07-17 10:21:42 +02:00
2023-12-09 19:59:29 +01:00
# ===============
# === SIGNALS ===
2022-03-25 22:49:33 +01:00
2023-12-09 19:59:29 +01:00
" signal_sets " : [ ] ,
# =====================
# === NOTIFICATIONS ===
" score_notification_model " : { } ,
" diagram_notification_model " : { } ,
2022-03-25 22:49:33 +01:00
2024-06-22 09:58:08 +02:00
# ===============
# === TRADING ===
" trade_model " : {
2022-03-20 10:09:33 +01:00
" no_trades_only_data_processing " : False , # in market or out of market processing is excluded (all below parameters ignored)
" test_order_before_submit " : False , # Send test submit to the server as part of validation
" simulate_order_execution " : False , # Instead of real orders, simulate their execution (immediate buy/sell market orders and use high price of klines for limit orders)
" percentage_used_for_trade " : 99 , # in % to the available USDT quantity, that is, we will derive how much BTC to buy using this percentage
2024-06-22 09:58:08 +02:00
" limit_price_adjustment " : 0.005 , # Limit price of orders will be better than the latest close price (0 means no change, positive - better for us, negative - worse for us)
2022-03-20 10:09:33 +01:00
} ,
2025-04-17 17:36:48 +02:00
" simulate_model " : { } ,
2024-06-22 09:58:08 +02:00
# =====================
# === BINANCE TRADER ===
" base_asset " : " " , # BTC ETH
" quote_asset " : " " ,
2022-04-15 11:46:19 +02:00
# ==================
2022-03-20 10:09:33 +01:00
# === COLLECTORS ===
" collector " : {
" folder " : " DATA " ,
" flush_period " : 300 , # seconds
" depth " : {
" folder " : " DEPTH " ,
" symbols " : [ " BTCUSDT " , " ETHBTC " , " ETHUSDT " , " IOTAUSDT " , " IOTABTC " , " IOTAETH " ] ,
" limit " : 100 , # Legal values (depth): '5, 10, 20, 50, 100, 500, 1000, 5000' <100 weight=1
2024-05-11 15:43:40 +02:00
" freq " : " 1min " , # Pandas frequency
2022-03-20 10:09:33 +01:00
} ,
" stream " : {
" folder " : " STREAM " ,
# Stream formats:
# For kline channel: <symbol>@kline_<interval>, Event type: "e": "kline", Symbol: "s": "BNBBTC"
# For depth channel: <symbol>@depth<levels>[@100ms], Event type: NO, Symbol: NO
# btcusdt@ticker
" channels " : [ " kline_1m " , " depth20 " ] , # kline_1m, depth20, depth5
" symbols " : [ " BTCUSDT " , " ETHBTC " , " ETHUSDT " , " IOTAUSDT " , " IOTABTC " , " IOTAETH " ] ,
# "BTCUSDT", "ETHBTC", "ETHUSDT", "IOTAUSDT", "IOTABTC", "IOTAETH"
}
} ,
}
def data_provider_problems_exist ( ) :
if App . error_status != 0 :
return True
if App . server_status != 0 :
return True
return False
def problems_exist ( ) :
if App . error_status != 0 :
return True
if App . server_status != 0 :
return True
if App . account_status != 0 :
return True
if App . trade_state_status != 0 :
return True
return False
def load_config ( config_file ) :
if config_file :
config_file_path = PACKAGE_ROOT / config_file
2022-07-23 15:27:46 +02:00
with open ( config_file_path , encoding = ' utf-8 ' ) as json_file :
#conf_str = json.load(json_file)
conf_str = json_file . read ( )
# Remove everything starting with // and till the line end
conf_str = re . sub ( r " //.*$ " , " " , conf_str , flags = re . M )
conf_json = json . loads ( conf_str )
App . config . update ( conf_json )
2022-03-20 10:09:33 +01:00
if __name__ == " __main__ " :
pass