from op_futures.op_strategy_plugins.template_strategy import TemplateStrategy
from op_futures.op_objects.onepiece_data import OnePieceData
from op_futures.op_objects.tick_data import TickData
from op_futures.op_objects.bar_data import BarData
from tqz_extern.tqz_constant import BackTesterType, OrderSide
class PluginData:
def __init__(self, name: str = None, datas: [OnePieceData] = None, strategy: TemplateStrategy = None, back_tester_type: BackTesterType = None):
assert name is not None, f'name is None.'
assert datas is not None, f'datas is None.'
assert strategy is not None, f'strategy is None.'
assert back_tester_type is not None, f'back_tester_type is None.'
self.name = name
self.datas = datas
self.strategy = strategy
self.back_tester_type = back_tester_type
self.__profit_and_loss_list = [] # <- item is real money.
self.__profit_and_loss_value = 0 # <- item is real money.
self.__slippage_loss_money = 0 # <- real money, must be < 0;
def back_testing(self, slippage_counts: int = 1):
"""
start back test.
:return:
"""
if self.back_tester_type is BackTesterType.BAR_TYPE:
last_data: BarData = self.datas[-1]
for order in self.strategy.orders_detail:
price_diff = 0
if order.order_side in [OrderSide.BUY, OrderSide.COVER]:
price_diff = order.lots * (last_data.close_price - order.price)
elif order.order_side in [OrderSide.SELL, OrderSide.SHORT]:
price_diff = order.lots * (last_data.close_price - order.price) * -1
self.__profit_and_loss_list.append(
int(price_diff / last_data.price_tick) * last_data.volume_multiple
)
elif self.back_tester_type is BackTesterType.TICK_TYPE:
last_data: TickData = self.datas[-1]
for order in self.strategy.orders_detail:
price_diff = 0
if order.order_side in [OrderSide.BUY, OrderSide.COVER]:
price_diff = order.lots * (last_data.last_price - order.price)
elif order.order_side in [OrderSide.SELL, OrderSide.SHORT]:
price_diff = order.lots * (last_data.last_price - order.price) * -1
self.__profit_and_loss_list.append(
int(price_diff / last_data.price_tick) * last_data.volume_multiple
)
self.__profit_and_loss_value = sum(self.__profit_and_loss_list) # <- net profit and loss.
self.__slippage_loss_money = len(self.strategy.orders_detail) * self.datas[-1].volume_multiple * (-1 * slippage_counts) # <- slippage loss money.
def profit_and_loss_value(self):
"""
must call back outside after plugin.run() outside.
:return:
"""
return self.__profit_and_loss_value
def slippage_loss_money(self):
"""
must call back outside after plugin.run() outside.
:return:
"""
return self.__slippage_loss_money
09-08
9793
02-02
4万+
03-23
8613
05-07
05-07
“相关推荐”对你有帮助么?
-
非常没帮助
-
没帮助
-
一般
-
有帮助
-
非常有帮助
提交