mirror of
https://github.com/Ichinga-Samuel/aiomql.git
synced 2026-08-20 07:18:08 +00:00
Update tests and docs across core, lib, and contrib modules
This commit is contained in:
@@ -1,17 +0,0 @@
|
||||
{
|
||||
"balance": 367056.24,
|
||||
"profit": 0,
|
||||
"equity": 367056.24,
|
||||
"margin": 0.0,
|
||||
"margin_free": 367056.24,
|
||||
"margin_level": 0,
|
||||
"wins": 374,
|
||||
"losses": 394,
|
||||
"total": 768,
|
||||
"win_percentage": 48.7,
|
||||
"win": 946684.28,
|
||||
"loss": -580378.04,
|
||||
"net_profit": 366306.24,
|
||||
"profit_factor": 1.63,
|
||||
"profitability": 48840.83
|
||||
}
|
||||
@@ -1,17 +0,0 @@
|
||||
{
|
||||
"balance": 1251.1,
|
||||
"profit": 0,
|
||||
"equity": 1251.1,
|
||||
"margin": 0.0,
|
||||
"margin_free": 1251.1,
|
||||
"margin_level": 0,
|
||||
"wins": 29,
|
||||
"losses": 31,
|
||||
"total": 60,
|
||||
"win_percentage": 48.33,
|
||||
"win": 1530.54,
|
||||
"loss": -1029.44,
|
||||
"net_profit": 501.1,
|
||||
"profit_factor": 1.49,
|
||||
"profitability": 66.81
|
||||
}
|
||||
@@ -8,7 +8,7 @@ logging.basicConfig(level=logging.INFO)
|
||||
|
||||
|
||||
def x_bot():
|
||||
syms = ["LTCUSD", "ETHUSD", "SOLUSD", "BTCUSD"]
|
||||
syms = ["LTCUSD", "ETHUSD", "SOLUSD", "BTCUSD", "ADAUSD"]
|
||||
symbols = [ForexSymbol(name=sym) for sym in syms]
|
||||
strategies = [EMAXOver(symbol=symbol) for symbol in symbols]
|
||||
bot = Bot()
|
||||
@@ -18,4 +18,5 @@ def x_bot():
|
||||
bot.execute()
|
||||
|
||||
|
||||
x_bot()
|
||||
if __name__ == '__main__':
|
||||
x_bot()
|
||||
|
||||
@@ -14,7 +14,7 @@ class EMAXOver(Strategy):
|
||||
# default parameters for the strategy
|
||||
# they are set as attributes. You can override them in the constructor via the params argument.
|
||||
parameters = {'ttf': TimeFrame.M10, 'tcc': 3000, 'fast_ema': 34, 'slow_ema': 55, 'interval': TimeFrame.M5,
|
||||
'timeout': 120}
|
||||
'timeout': 120, "macd": 87, "sma": 90}
|
||||
|
||||
def __init__(self, *, symbol: ForexSymbol, params: dict | None = None, trader: Trader = None,
|
||||
sessions: Sessions = None, name: str = "EMAXOver"):
|
||||
|
||||
@@ -1 +1 @@
|
||||
from .track import close_after
|
||||
from .track import close_after, hedge_position, track_hedges
|
||||
|
||||
@@ -1,3 +1,4 @@
|
||||
import asyncio
|
||||
from logging import getLogger
|
||||
from datetime import datetime
|
||||
|
||||
@@ -16,3 +17,27 @@ async def close_after(open_pos: OpenPosition, /, *, duration: int, start: float
|
||||
_, res = await open_pos.close_position()
|
||||
if res.retcode == 10009:
|
||||
logger.info("%s, %d closed", pos.symbol, pos.ticket)
|
||||
|
||||
|
||||
async def hedge_position(pos: OpenPosition, /, *, hedge_amount: float = -2, close_hedge_amount: float = 0,
|
||||
order_params: dict = None):
|
||||
is_open = await pos.update_position()
|
||||
position = pos.position
|
||||
if not (is_open and pos.is_hedged is False and position.profit < 0):
|
||||
return
|
||||
|
||||
if position.profit <= hedge_amount:
|
||||
ok, order = await pos.hedge_position(order_params=order_params)
|
||||
if not ok:
|
||||
logger.error("Could not hedge %s:%d", pos.symbol, pos.ticket)
|
||||
|
||||
|
||||
async def track_hedges(pos: OpenPosition, close_hedge_amount: float = -10):
|
||||
res = await pos.update_position()
|
||||
if not res:
|
||||
return
|
||||
hedges = list(pos.hedges.values())
|
||||
await asyncio.gather(*[hedge.update_position() for hedge in hedges], return_exceptions=True)
|
||||
hedges = [hedge for hedge in hedges if hedge.is_open]
|
||||
await asyncio.gather(*[hedge.close_position() for hedge in hedges if hedge.position.profit <= close_hedge_amount],
|
||||
return_exceptions=True)
|
||||
@@ -1,8 +1,8 @@
|
||||
from logging import getLogger
|
||||
from datetime import datetime
|
||||
from aiomql import Trader, OrderType, OpenPosition, Positions, PositionTracker, Store
|
||||
from aiomql import Trader, OrderType, OpenPosition, Positions, PositionTracker, Store, exit_at_profit, round_off
|
||||
|
||||
from ..trackers import close_after
|
||||
from ..trackers import close_after, track_hedges, hedge_position
|
||||
|
||||
logger = getLogger(__name__)
|
||||
|
||||
@@ -25,7 +25,7 @@ class TestTrader(Trader):
|
||||
"""
|
||||
try:
|
||||
self.parameters |= parameters or {}
|
||||
volume = volume or self.symbol.volume_min
|
||||
volume = volume or self.symbol.volume_min * 20
|
||||
await self.create_order_no_stops(order_type=order_type, volume=volume)
|
||||
if not await self.check_order():
|
||||
return
|
||||
@@ -33,10 +33,28 @@ class TestTrader(Trader):
|
||||
res = await self.send_order()
|
||||
if res is not None and res.retcode == 10009:
|
||||
position = await self.positions.get_position_by_ticket(ticket=res.order)
|
||||
open_position = OpenPosition(ticket=res.order, symbol=self.symbol, position=position)
|
||||
kwargs = {"duration": 40, "start": datetime.now().timestamp()}
|
||||
ca = PositionTracker(close_after, **kwargs)
|
||||
open_position.add_tracker(tracker=ca)
|
||||
open_position = OpenPosition(ticket=res.order, symbol=self.symbol, position=position,
|
||||
close_hedges_on_close=True, close_stacks_on_close=True)
|
||||
kwargs = {"duration": 3600, "start": datetime.now().timestamp()}
|
||||
PositionTracker(open_position, hedge_position)
|
||||
PositionTracker(open_position, track_hedges)
|
||||
PositionTracker(open_position, close_after, function_params=kwargs)
|
||||
PositionTracker(open_position, exit_at_profit, function_params={"tp": 10, "sl": -12})
|
||||
price_to_hedge = await open_position.profit_to_price(profit=-10)
|
||||
price_to_stack = await open_position.profit_to_price(profit=5)
|
||||
price_to_stack = round_off(price_to_stack, self.symbol.digits)
|
||||
price_to_hedge = round_off(price_to_hedge, self.symbol.digits)
|
||||
# await open_position.stack_order(price=price_to_stack, open_pos_params={"close_stacks_on_close": True})
|
||||
# await open_position.hedge_order(price=price_to_hedge,
|
||||
# open_pos_params={"close_hedges_on_close": True})
|
||||
price_to_hedge2 = await open_position.profit_to_price(profit=-8)
|
||||
price_to_hedge2 = round_off(price_to_hedge2, self.symbol.digits)
|
||||
price_to_stack2 = await open_position.profit_to_price(profit=7)
|
||||
price_to_stack2 = round_off(price_to_stack2, self.symbol.digits)
|
||||
await open_position.hedge_order(price=price_to_hedge2,
|
||||
open_pos_params={"close_hedges_on_close": True})
|
||||
await open_position.stack_order(price=price_to_stack2,
|
||||
open_pos_params={"close_stacks_on_close": True})
|
||||
await self.record_trade(result=res, parameters=self.parameters)
|
||||
except Exception as err:
|
||||
logger.error(f"{err} in {self.__class__.__name__}.place_trade for {self.symbol.name}")
|
||||
|
||||
@@ -0,0 +1,17 @@
|
||||
import asyncio
|
||||
from aiomql import ResultDB, Result, TradeRecords
|
||||
|
||||
async def update_sql_records():
|
||||
tr = TradeRecords()
|
||||
# await tr.update_sql_records()
|
||||
# await tr.update_csv_records()
|
||||
await tr.update_json_records()
|
||||
|
||||
|
||||
def to_csv():
|
||||
ResultDB.dump_to_csv()
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
asyncio.run(update_sql_records())
|
||||
# to_csv()
|
||||
@@ -1,28 +0,0 @@
|
||||
import logging
|
||||
from datetime import datetime, UTC
|
||||
|
||||
from aiomql.lib.backtester import BackTester
|
||||
from aiomql.core import Config
|
||||
from aiomql.contrib.strategies import FingerTrap, Chaos
|
||||
from aiomql.contrib.symbols import ForexSymbol
|
||||
from aiomql.core.backtesting import BackTestEngine
|
||||
|
||||
|
||||
def back_tester():
|
||||
Config(mode="backtest")
|
||||
logging.basicConfig(level=logging.INFO, format="%(asctime)s - %(name)s - %(levelname)s - %(message)s")
|
||||
syms = ["Volatility 75 Index", "Volatility 100 Index", "Volatility 25 Index", "Volatility 10 Index"]
|
||||
symbols = [ForexSymbol(name=sym) for sym in syms]
|
||||
strategies = [FingerTrap(symbol=symbol) for symbol in symbols]
|
||||
start = datetime(2024, 1, 1, tzinfo=UTC)
|
||||
stop_time = datetime(2024, 12, 2, tzinfo=UTC)
|
||||
end = datetime(2024, 5, 7, tzinfo=UTC)
|
||||
back_test_engine = BackTestEngine(start=start, end=end, speed=3600,
|
||||
close_open_positions_on_exit=True, assign_to_config=True, preload=True,
|
||||
account_info={"balance": 750})
|
||||
backtester = BackTester(backtest_engine=back_test_engine)
|
||||
backtester.add_strategies(strategies=strategies)
|
||||
backtester.execute()
|
||||
|
||||
|
||||
back_tester()
|
||||
@@ -1,27 +0,0 @@
|
||||
import logging
|
||||
import asyncio
|
||||
|
||||
from aiomql.lib.bot import Bot
|
||||
from aiomql.contrib.strategies import FingerTrap, Chaos
|
||||
from aiomql.contrib.symbols import ForexSymbol
|
||||
|
||||
|
||||
def sample_bot():
|
||||
logging.basicConfig(level=logging.INFO, format="%(asctime)s - %(name)s - %(levelname)s - %(message)s")
|
||||
syms = ["Volatility 75 Index", "Volatility 100 Index", "Volatility 50 Index"]
|
||||
symbols = [ForexSymbol(name=sym) for sym in syms]
|
||||
strategies = [Chaos(symbol=symbol) for symbol in symbols]
|
||||
bot = Bot()
|
||||
bot.executor.timeout = 10
|
||||
bot.add_coroutine(coroutine=sleep_run)
|
||||
bot.add_strategies(strategies=strategies)
|
||||
bot.execute()
|
||||
|
||||
|
||||
async def sleep_run():
|
||||
while True:
|
||||
print("Sleeping for 5 seconds")
|
||||
await asyncio.sleep(5)
|
||||
print("Hello World")
|
||||
|
||||
sample_bot()
|
||||
@@ -1,4 +0,0 @@
|
||||
slow_ema,fast_ema,order,htf,actual_profit,symbol,date,closed,name,price,deal,ltf,bid,win,ask,lcc,volume,expected_profit,hcc
|
||||
20,8,8218315320,TIMEFRAME_M2,0,Volatility 75 Index,2025-01-16 11:49:50.421946,False,Chaos,96536.19,8126025355,TIMEFRAME_M1,96536.19,False,96562.33,100,0.001,0,100
|
||||
20,8,8218315356,TIMEFRAME_M2,0,Volatility 50 Index,2025-01-16 11:49:54.394496,False,Chaos,272.9174,8126025389,TIMEFRAME_M1,272.9174,False,272.9584,100,4.0,0,100
|
||||
20,8,8218315338,TIMEFRAME_M2,0,Volatility 100 Index,2025-01-16 11:49:54.395497,False,Chaos,1939.81,8126025382,TIMEFRAME_M1,1939.27,False,1939.81,100,0.5,0,100
|
||||
|
Reference in New Issue
Block a user