' + str_row + '
' + str_row + '
diff --git a/v2realbot/ENTRY_backtest_strategyVykladaci.py b/v2realbot/ENTRY_backtest_strategyVykladaci.py
index b7f4097..c120908 100644
--- a/v2realbot/ENTRY_backtest_strategyVykladaci.py
+++ b/v2realbot/ENTRY_backtest_strategyVykladaci.py
@@ -4,7 +4,7 @@ from v2realbot.strategy.base import StrategyState
from v2realbot.strategy.StrategyOrderLimitVykladaci import StrategyOrderLimitVykladaci
from v2realbot.enums.enums import RecordType, StartBarAlign, Mode, Account, OrderSide
from v2realbot.indicators.indicators import ema
-from v2realbot.utils.utils import ltp, isrising, isfalling,trunc,AttributeDict, zoneNY, price2dec, dict_replace_value, print
+from v2realbot.utils.utils import ltp, isrising, isfalling,trunc,AttributeDict, zoneNY, price2dec, dict_replace_value, print, safe_get
from datetime import datetime
from icecream import install, ic
#from rich import print
@@ -51,6 +51,7 @@ stratvars = AttributeDict(maxpozic = 400,
slope_lookback = 300,
lookback_offset = 20,
minimum_slope = -0.05,
+ first_buy_market = False
)
##toto rozparsovat a strategii spustit stejne jako v main
toml_string = """
@@ -129,7 +130,12 @@ def next(data, state: StrategyState):
price = last_price
state.ilog(e="BUY Vykladame", msg="first price"+str(price) + "pozic:"+str(vykladka), curve=curve, ema=state.indicators.ema[-1], trend=state.vars.Trend, price=price, vykladka=vykladka)
##prvni se vyklada na aktualni cenu, další jdou podle krivky, nula v krivce zvyšuje množství pro následující iteraci
- state.buy_l(price=price, size=qty)
+
+ ##VAR - na zaklade conf. muzeme jako prvni posilat MARKET
+ if safe_get(state.vars, "first_buy_market") == True:
+ state.buy(size=qty)
+ else:
+ state.buy_l(price=price, size=qty)
print("prvni limitka na aktuální cenu. Další podle křivky", price, qty)
for i in range(0,vykladka-1):
price = price2dec(float(price - curve[i]))
diff --git a/v2realbot/__pycache__/config.cpython-310.pyc b/v2realbot/__pycache__/config.cpython-310.pyc
index 8a758b4..330c508 100644
Binary files a/v2realbot/__pycache__/config.cpython-310.pyc and b/v2realbot/__pycache__/config.cpython-310.pyc differ
diff --git a/v2realbot/backtesting/__pycache__/backtester.cpython-310.pyc b/v2realbot/backtesting/__pycache__/backtester.cpython-310.pyc
index 7a34232..d6e5ed3 100644
Binary files a/v2realbot/backtesting/__pycache__/backtester.cpython-310.pyc and b/v2realbot/backtesting/__pycache__/backtester.cpython-310.pyc differ
diff --git a/v2realbot/backtesting/backtester.py b/v2realbot/backtesting/backtester.py
index 0339a75..2fcbbb2 100644
--- a/v2realbot/backtesting/backtester.py
+++ b/v2realbot/backtesting/backtester.py
@@ -43,8 +43,8 @@ from v2realbot.common.model import TradeUpdate, Order
#from rich import print
import threading
import asyncio
-from v2realbot.config import BT_DELAYS, DATA_DIR, FILL_CONDITION_BUY_LIMIT, FILL_CONDITION_SELL_LIMIT, FILL_LOG_SURROUNDING_TRADES, FILL_CONS_TRADES_REQUIRED
-from v2realbot.utils.utils import AttributeDict, ltp, zoneNY, trunc, count_decimals,print
+from v2realbot.config import BT_DELAYS, DATA_DIR, BT_FILL_CONDITION_BUY_LIMIT, BT_FILL_CONDITION_SELL_LIMIT, BT_FILL_LOG_SURROUNDING_TRADES, BT_FILL_CONS_TRADES_REQUIRED
+from v2realbot.utils.utils import AttributeDict, ltp, zoneNY, trunc, count_decimals, print
from v2realbot.utils.tlog import tlog
from v2realbot.enums.enums import FillCondition
from datetime import datetime, timedelta
@@ -194,7 +194,7 @@ class Backtester:
#TEST zkusime to nemazat, jak ovlivni performance
#Mazeme, jinak je to hruza
#nechavame na konci trady, které muzeme potrebovat pro consekutivni pravidlo
- del self.btdata[0:index_end-2-FILL_CONS_TRADES_REQUIRED]
+ del self.btdata[0:index_end-2-BT_FILL_CONS_TRADES_REQUIRED]
#ic("after delete",len(self.btdata[0:index_end]))
if changes: return 1
@@ -235,9 +235,9 @@ class Backtester:
#NASTVENI PODMINEK PLNENI
fast_fill_condition = i[1] <= o.limit_price
slow_fill_condition = i[1] < o.limit_price
- if FILL_CONDITION_BUY_LIMIT == FillCondition.FAST:
+ if BT_FILL_CONDITION_BUY_LIMIT == FillCondition.FAST:
fill_condition = fast_fill_condition
- elif FILL_CONDITION_BUY_LIMIT == FillCondition.SLOW:
+ elif BT_FILL_CONDITION_BUY_LIMIT == FillCondition.SLOW:
fill_condition = slow_fill_condition
else:
print("unknow fill condition")
@@ -245,17 +245,17 @@ class Backtester:
if float(i[0]) > float(order_min_fill_time+BT_DELAYS.limit_order_offset) and fill_condition:
consec_cnt += 1
- if consec_cnt == FILL_CONS_TRADES_REQUIRED:
+ if consec_cnt == BT_FILL_CONS_TRADES_REQUIRED:
#(1679081919.381649, 27.88)
ic(i)
fill_time = i[0]
fill_price = i[1]
print("FILL LIMIT BUY at", fill_time, datetime.fromtimestamp(fill_time).astimezone(zoneNY), "at",i[1])
- if FILL_LOG_SURROUNDING_TRADES != 0:
+ if BT_FILL_LOG_SURROUNDING_TRADES != 0:
#TODO loguru
- print("FILL SURR TRADES: before",work_range[index-FILL_LOG_SURROUNDING_TRADES:index])
- print("FILL SURR TRADES: fill and after",work_range[index:index+FILL_LOG_SURROUNDING_TRADES])
+ print("FILL SURR TRADES: before",work_range[index-BT_FILL_LOG_SURROUNDING_TRADES:index])
+ print("FILL SURR TRADES: fill and after",work_range[index:index+BT_FILL_LOG_SURROUNDING_TRADES])
break
else:
consec_cnt = 0
@@ -266,9 +266,9 @@ class Backtester:
#NASTVENI PODMINEK PLNENI
fast_fill_condition = i[1] >= o.limit_price
slow_fill_condition = i[1] > o.limit_price
- if FILL_CONDITION_SELL_LIMIT == FillCondition.FAST:
+ if BT_FILL_CONDITION_SELL_LIMIT == FillCondition.FAST:
fill_condition = fast_fill_condition
- elif FILL_CONDITION_SELL_LIMIT == FillCondition.SLOW:
+ elif BT_FILL_CONDITION_SELL_LIMIT == FillCondition.SLOW:
fill_condition = slow_fill_condition
else:
print("unknown fill condition")
@@ -276,16 +276,16 @@ class Backtester:
if float(i[0]) > float(order_min_fill_time+BT_DELAYS.limit_order_offset) and fill_condition:
consec_cnt += 1
- if consec_cnt == FILL_CONS_TRADES_REQUIRED:
+ if consec_cnt == BT_FILL_CONS_TRADES_REQUIRED:
#(1679081919.381649, 27.88)
ic(i)
fill_time = i[0]
fill_price = i[1]
print("FILL LIMIT SELL at", fill_time, datetime.fromtimestamp(fill_time).astimezone(zoneNY), "at",i[1])
- if FILL_LOG_SURROUNDING_TRADES != 0:
+ if BT_FILL_LOG_SURROUNDING_TRADES != 0:
#TODO loguru
- print("FILL SELL SURR TRADES: before",work_range[index-FILL_LOG_SURROUNDING_TRADES:index])
- print("FILL SELL SURR TRADES: fill and after",work_range[index:index+FILL_LOG_SURROUNDING_TRADES])
+ print("FILL SELL SURR TRADES: before",work_range[index-BT_FILL_LOG_SURROUNDING_TRADES:index])
+ print("FILL SELL SURR TRADES: fill and after",work_range[index:index+BT_FILL_LOG_SURROUNDING_TRADES])
break
else:
consec_cnt = 0
diff --git a/v2realbot/config.py b/v2realbot/config.py
index 514b929..6c44083 100644
--- a/v2realbot/config.py
+++ b/v2realbot/config.py
@@ -3,21 +3,21 @@ from v2realbot.enums.enums import Mode, Account, FillCondition
from appdirs import user_data_dir
-#how many consecutive trades with the fill price are necessary for LIMIT fill to happen()
+#how many consecutive trades with the fill price are necessary for LIMIT fill to happen in backtesting
#0 - optimistic, every knot high will fill the order
#N - N consecutive trades required
#not impl.yet
#minimum is 1
-FILL_CONS_TRADES_REQUIRED = 2
-#during trade execution logs X-surrounding trades of the one that triggers the fill
-FILL_LOG_SURROUNDING_TRADES = 10
-#fill condition for limit order
+BT_FILL_CONS_TRADES_REQUIRED = 2
+#during bt trade execution logs X-surrounding trades of the one that triggers the fill
+BT_FILL_LOG_SURROUNDING_TRADES = 10
+#fill condition for limit order in bt
# fast - price has to be equal or bigger <=
# slow - price has to be bigger <
-FILL_CONDITION_BUY_LIMIT = FillCondition.FAST
-FILL_CONDITION_SELL_LIMIT = FillCondition.FAST
+BT_FILL_CONDITION_BUY_LIMIT = FillCondition.FAST
+BT_FILL_CONDITION_SELL_LIMIT = FillCondition.FAST
#no print in console
-QUIET_MODE = False
+QUIET_MODE = True
#backend counter of api requests
COUNT_API_REQUESTS = False
#stratvars that cannot be changed in gui
diff --git a/v2realbot/controller/services.py b/v2realbot/controller/services.py
index 0b26b50..8e48204 100644
--- a/v2realbot/controller/services.py
+++ b/v2realbot/controller/services.py
@@ -222,12 +222,13 @@ def save_history(id: UUID, st: object, runner: Runner, reason: str = None):
#zkousime precist profit z objektu
try:
profit = st.state.profit
+ trade_count = len(st.tradeList)
except Exception as e:
profit = str(e)
for i in db.stratins:
if str(i.id) == str(id):
- i.history += "START:"+str(runner.run_started)+"STOP:"+str(runner.run_stopped)+"ACC:"+runner.run_account.value+"M:"+runner.run_mode.value+"PROFIT:"+str(profit)+ "REASON:" + str(reason)
+ i.history += "START:"+str(runner.run_started)+"STOP:"+str(runner.run_stopped)+"ACC:"+runner.run_account.value+"M:"+runner.run_mode.value+"PROFIT:"+str(round(profit,2))+ "TradeCNT:"+str(trade_count) + "REASON:" + str(reason)
#i.history += str(runner.__dict__)+"
"
db.save()
diff --git a/v2realbot/enums/__pycache__/enums.cpython-310.pyc b/v2realbot/enums/__pycache__/enums.cpython-310.pyc
index 4d9c1db..017f62b 100644
Binary files a/v2realbot/enums/__pycache__/enums.cpython-310.pyc and b/v2realbot/enums/__pycache__/enums.cpython-310.pyc differ
diff --git a/v2realbot/static/index.html b/v2realbot/static/index.html
index c7492bf..4ee058a 100644
--- a/v2realbot/static/index.html
+++ b/v2realbot/static/index.html
@@ -12,6 +12,7 @@
+
' + str_row + '
' + str_row + '