abolfazlbakhti69-art opened a new issue, #6495:
URL: https://github.com/apache/jmeter/issues/6495

   ‏import requests
   ‏import hmac
   ‏import hashlib
   ‏import time
   ‏import numpy as np
   ‏import os
   ‏import json
   ‏import threading
   ‏from datetime import datetime
   ‏import concurrent.futures
   
   # ===== تنظیمات اصلی =====
   ‏ACCESS_ID = os.environ.get("COINEX_API_KEY")
   ‏SECRET_KEY = os.environ.get("COINEX_SECRET_KEY")
   ‏BASE_URL = "https://api.coinex.com";
   
   # ===== لیست ارزها و پارامترهای اختصاصی =====
   ‏SYMBOL_CONFIG = {
   ‏    "SOLUSDT": {
   ‏        "profit_factor": 0.008,
   ‏        "risk_ceiling": 0.15,
   ‏        "volatility_threshold": 0.02,
   ‏        "min_hold_time": 300  # 5 دقیقه
       },
   ‏    "AVAXUSDT": {
   ‏        "profit_factor": 0.009,
   ‏        "risk_ceiling": 0.18,
   ‏        "volatility_threshold": 0.025,
   ‏        "min_hold_time": 240  # 4 دقیقه
       },
   ‏    "MATICUSDT": {
   ‏        "profit_factor": 0.007,
   ‏        "risk_ceiling": 0.12,
   ‏        "volatility_threshold": 0.018,
   ‏        "min_hold_time": 360  # 6 دقیقه
       },
   ‏    "DOTUSDT": {
   ‏        "profit_factor": 0.0065,
   ‏        "risk_ceiling": 0.13,
   ‏        "volatility_threshold": 0.015,
   ‏        "min_hold_time": 420  # 7 دقیقه
       },
   ‏    "ADAUSDT": {
   ‏        "profit_factor": 0.0085,
   ‏        "risk_ceiling": 0.16,
   ‏        "volatility_threshold": 0.022,
   ‏        "min_hold_time": 300  # 5 دقیقه
       }
   }
   
   # ===== مدیریت سرمایه =====
   ‏INITIAL_TOTAL_BALANCE = 60.0  # سرمایه کل
   ‏PROFIT_TARGET = 0.35  # هدف سود 35%
   ‏MAX_DAILY_LOSS = 0.15  # توقف ضرر 15%
   ‏RISK_FLOOR = 0.04  # حداقل ریسک
   
   # ===== سیستم لاگ‌گیری حرفه‌ای =====
   ‏class Logger:
   ‏    def __init__(self):
   ‏        self.log_file = 
f"multi_asset_log_{datetime.now().strftime('%Y%m%d_%H%M')}.txt"
   ‏        self.start_time = time.time()
   ‏        self.lock = threading.Lock()
           
   ‏    def log(self, message, symbol="GLOBAL", level="INFO"):
   ‏        with self.lock:
   ‏            timestamp = datetime.now().strftime("%Y-%m-%d %H:%M:%S")
   ‏            log_entry = f"[{timestamp}] [{symbol}] [{level}] {message}"
   ‏            print(log_entry)
   ‏            with open(self.log_file, "a") as f:
   ‏                f.write(log_entry + "\n")
               
   ‏    def performance_report(self, final_balance, symbol_reports):
   ‏        duration = time.time() - self.start_time
   ‏        profit = final_balance - INITIAL_TOTAL_BALANCE
           
   ‏        report = f"\n{'='*60}\n"
   ‏        report += f"🚀 MULTI-ASSET PERFORMANCE REPORT | Runtime: 
{duration/3600:.2f} hrs\n"
   ‏        report += f"💵 Initial Total Balance: ${INITIAL_TOTAL_BALANCE:.2f}\n"
   ‏        report += f"💰 Final Total Balance: ${final_balance:.2f}\n"
   ‏        report += f"📈 Total Profit: ${profit:.2f} 
({profit/INITIAL_TOTAL_BALANCE*100:.2f}%)\n"
   ‏        report += f"{'-'*60}\n"
           
   ‏        for symbol, data in symbol_reports.items():
   ‏            report += (
   ‏                f"🔹 {symbol}: "
   ‏                f"Start: ${data['start_balance']:.2f} | "
   ‏                f"End: ${data['end_balance']:.2f} | "
   ‏                f"Profit: {data['profit_percent']:.2f}% | "
   ‏                f"Trades: {data['trades']} | "
   ‏                f"Win Rate: {data['win_rate']:.1f}%\n"
               )
               
   ‏        report += f"{'='*60}"
   ‏        self.log(report)
   
   # ===== موتور معاملاتی برای هر ارز =====
   ‏class AssetTrader:
   ‏    def __init__(self, symbol, initial_balance, config, logger):
   ‏        self.symbol = symbol
   ‏        self.balance = initial_balance
   ‏        self.config = config
   ‏        self.logger = logger
   ‏        self.trade_history = []
   ‏        self.consecutive_wins = 0
   ‏        self.consecutive_losses = 0
   ‏        self.start_balance = initial_balance
   ‏        self.market_conditions = {
   ‏            "volatility": 0.01,
   ‏            "trend_strength": 0,
   ‏            "volume_ratio": 1.0
           }
           
   ‏    def get_historical_prices(self, minutes=30):
           """دریافت داده‌های تاریخی برای ارز خاص"""
   ‏        url = f"{BASE_URL}/v1/market/kline"
   ‏        params = {"market": self.symbol, "type": "5min", "limit": min(200, 
minutes//5)}
           
   ‏        try:
   ‏            resp = requests.get(url, params=params, timeout=3)
   ‏            data = resp.json()
   ‏            if data.get("code") == 0:
   ‏                return [float(entry[4]) for entry in data["data"]]
   ‏        except:
   ‏            pass
   ‏        return []
       
   ‏    def get_realtime_data(self):
           """دریافت داده‌های لحظه‌ای برای ارز خاص"""
   ‏        url = f"{BASE_URL}/v1/market/ticker"
   ‏        params = {"market": self.symbol}
           
   ‏        try:
   ‏            resp = requests.get(url, params=params, timeout=2)
   ‏            data = resp.json()
   ‏            if data.get("code") == 0:
   ‏                ticker = data["data"]["ticker"]
   ‏                return {
   ‏                    "price": float(ticker["last"]),
   ‏                    "high": float(ticker["high"]),
   ‏                    "low": float(ticker["low"]),
   ‏                    "volume": float(ticker["vol"])
                   }
   ‏        except:
   ‏            pass
   ‏        return None
       
   ‏    def calculate_technical_indicators(self, prices):
           """محاسبه اندیکاتورهای پیشرفته"""
   ‏        if len(prices) < 20:
   ‏            return {"rsi": 50, "macd": 0, "atr": 0.01}
           
           # محاسبه RSI
   ‏        deltas = np.diff(prices)
   ‏        gains = np.where(deltas > 0, deltas, 0)
   ‏        losses = np.where(deltas < 0, -deltas, 0)
           
   ‏        avg_gain = np.mean(gains[-14:])
   ‏        avg_loss = np.mean(losses[-14:])
   ‏        rsi = 100 - (100 / (1 + (avg_gain / avg_loss))) if avg_loss != 0 
else 100
           
           # محاسبه MACD
   ‏        ema12 = np.mean(prices[-12:])
   ‏        ema26 = np.mean(prices[-26:])
   ‏        macd = ema12 - ema26
           
           # محاسبه ATR
   ‏        tr = [max(prices[i]-prices[i-1], abs(prices[i]-prices[i-1]), 
abs(prices[i]-prices[i-1])) 
   ‏              for i in range(1, len(prices))]
   ‏        atr = np.mean(tr[-14:])
           
   ‏        return {"rsi": rsi, "macd": macd, "atr": atr}
       
   ‏    def update_market_conditions(self):
           """بروزرسانی شرایط بازار برای این ارز"""
   ‏        prices = self.get_historical_prices(120)
   ‏        realtime_data = self.get_realtime_data()
           
   ‏        if not prices or not realtime_data:
   ‏            return False
           
   ‏        returns = np.diff(prices) / prices[:-1]
   ‏        self.market_conditions["volatility"] = np.std(returns)
           
   ‏        sma_short = np.mean(prices[-6:])
   ‏        sma_long = np.mean(prices[-24:])
   ‏        self.market_conditions["trend_strength"] = (sma_short - sma_long) / 
sma_long
           
   ‏        avg_volume = np.mean([prices[i] for i in range(-10, 0)])
   ‏        self.market_conditions["volume_ratio"] = realtime_data["volume"] / 
avg_volume
           
   ‏        return True
       
   ‏    def calculate_dynamic_risk(self):
           """مدیریت ریسک پویا برای این ارز"""
   ‏        base_risk = 0.08
           
   ‏        if abs(self.market_conditions["trend_strength"]) > 0.01:
   ‏            base_risk = min(self.config["risk_ceiling"], base_risk * 1.5)
           
   ‏        if self.market_conditions["volatility"] > 
self.config["volatility_threshold"]:
   ‏            base_risk = max(RISK_FLOOR, base_risk * 0.7)
               
   ‏        if self.consecutive_wins >= 3:
   ‏            return min(self.config["risk_ceiling"], base_risk * (1 + 
self.consecutive_wins * 0.1))
   ‏        elif self.consecutive_losses >= 2:
   ‏            return max(RISK_FLOOR, base_risk * (1 - self.consecutive_losses 
* 0.15))
           
   ‏        return base_risk
       
   ‏    def calculate_profit_target(self):
           """حد سود پویا برای این ارز"""
   ‏        base_target = self.config["profit_factor"]
           
   ‏        if abs(self.market_conditions["trend_strength"]) > 0.015:
   ‏            base_target *= 1.4
               
   ‏        if self.market_conditions["volume_ratio"] > 1.5:
   ‏            base_target *= 1.3
               
   ‏        if self.market_conditions["volatility"] > 
self.config["volatility_threshold"]:
   ‏            base_target *= 0.8
               
   ‏        return max(0.006, min(0.015, base_target))
       
   ‏    def generate_trade_signal(self, current_price, indicators):
           """تولید سیگنال معاملاتی برای این ارز"""
   ‏        buy_conditions = (
   ‏            indicators["rsi"] < 65 and
   ‏            indicators["macd"] > 0 and
   ‏            self.market_conditions["trend_strength"] > 0.005 and
   ‏            self.market_conditions["volume_ratio"] > 1.2
           )
           
   ‏        sell_conditions = (
   ‏            indicators["rsi"] > 35 and
   ‏            indicators["macd"] < 0 and
   ‏            self.market_conditions["trend_strength"] < -0.005 and
   ‏            self.market_conditions["volume_ratio"] > 1.2
           )
           
   ‏        if buy_conditions:
   ‏            return "BUY"
   ‏        elif sell_conditions:
   ‏            return "SELL"
   ‏        return "NEUTRAL"
       
   ‏    def execute_trade(self):
           """اجرای معامله برای این ارز"""
   ‏        try:
   ‏            current_data = self.get_realtime_data()
   ‏            if not current_data:
   ‏                return False
                   
   ‏            prices = self.get_historical_prices(30)
   ‏            if len(prices) < 20:
   ‏                return False
                   
   ‏            indicators = self.calculate_technical_indicators(prices)
   ‏            self.update_market_conditions()
               
   ‏            signal = self.generate_trade_signal(current_data["price"], 
indicators)
   ‏            if signal == "NEUTRAL":
   ‏                return False
                   
   ‏            risk_percent = self.calculate_dynamic_risk()
   ‏            profit_target_percent = self.calculate_profit_target()
   ‏            stop_loss_percent = profit_target_percent * 0.7
               
   ‏            trade_amount = min(self.balance * risk_percent, self.balance * 
0.9)
   ‏            amount = trade_amount / current_data["price"]
               
   ‏            entry_price = current_data["price"]
               
   ‏            if signal == "BUY":
   ‏                profit_target = entry_price * (1 + profit_target_percent)
   ‏                stop_loss = entry_price * (1 - stop_loss_percent)
   ‏            else:
   ‏                profit_target = entry_price * (1 - profit_target_percent)
   ‏                stop_loss = entry_price * (1 + stop_loss_percent)
               
   ‏            trade = {
   ‏                'entry': entry_price,
   ‏                'amount': amount,
   ‏                'signal': signal,
   ‏                'profit_target': profit_target,
   ‏                'stop_loss': stop_loss,
   ‏                'start_time': time.time(),
   ‏                'result': None,
   ‏                'profit': 0
               }
               
   ‏            self.monitor_trade(trade)
   ‏            return True
               
   ‏        except Exception as e:
   ‏            self.logger.log(f"خطا در اجرای معامله: {str(e)}", self.symbol, 
"ERROR")
   ‏            return False
       
   ‏    def monitor_trade(self, trade):
   ‏        position_open = True
   ‏        best_price = trade['entry']
   ‏        last_update = time.time()
           
   ‏        self.logger.log(f"🔹 معامله جدید | {trade['signal']} | حجم: 
{trade['amount']:.4f} | ورود: {trade['entry']:.4f}", self.symbol)
           
   ‏        while position_open:
   ‏            try:
   ‏                current_data = self.get_realtime_data()
   ‏                if not current_data:
   ‏                    time.sleep(1)
   ‏                    continue
                       
   ‏                current_price = current_data["price"]
                   
   ‏                if (trade['signal'] == "BUY" and current_price > 
best_price) or \
   ‏                   (trade['signal'] == "SELL" and current_price < 
best_price):
   ‏                    best_price = current_price
                   
   ‏                if trade['signal'] == "BUY":
   ‏                    unrealized_profit = (current_price - trade['entry']) * 
trade['amount']
   ‏                else:
   ‏                    unrealized_profit = (trade['entry'] - current_price) * 
trade['amount']
                   
   ‏                if time.time() - last_update > 10:
   ‏                    self.logger.log(f"📊 قیمت: {current_price:.4f} | سود 
شناور: {unrealized_profit:.4f} USD", self.symbol)
   ‏                    last_update = time.time()
                   
   ‏                time_in_trade = time.time() - trade['start_time']
                   
                   # شرایط خروج
   ‏                if (trade['signal'] == "BUY" and current_price >= 
trade['profit_target']) or \
   ‏                   (trade['signal'] == "SELL" and current_price <= 
trade['profit_target']):
   ‏                    trade['result'] = "WIN"
   ‏                    trade['profit'] = unrealized_profit
   ‏                    position_open = False
   ‏                    self.logger.log(f"🎯 هدف سود فعال شد! سود: 
{unrealized_profit:.4f} USD", self.symbol)
                   
   ‏                elif (trade['signal'] == "BUY" and current_price <= 
trade['stop_loss']) or \
   ‏                     (trade['signal'] == "SELL" and current_price >= 
trade['stop_loss']):
   ‏                    trade['result'] = "LOSS"
   ‏                    trade['profit'] = unrealized_profit
   ‏                    position_open = False
   ‏                    self.logger.log(f"⛔ حد ضرر فعال شد! ضرر: 
{abs(unrealized_profit):.4f} USD", self.symbol)
                   
   ‏                elif time_in_trade > 30:
   ‏                    dynamic_factor = 0.6 + (min(time_in_trade, 300) / 600) 
* 0.4
                       
   ‏                    if trade['signal'] == "BUY":
   ‏                        dynamic_stop = best_price * (1 - 
(trade['stop_loss'] * dynamic_factor))
   ‏                        if current_price <= dynamic_stop:
   ‏                            trade['result'] = "WIN"
   ‏                            trade['profit'] = unrealized_profit
   ‏                            position_open = False
   ‏                            self.logger.log(f"🔒 تریلینگ استاپ فعال شد! سود: 
{unrealized_profit:.4f} USD", self.symbol)
   ‏                    else:
   ‏                        dynamic_stop = best_price * (1 + 
(trade['stop_loss'] * dynamic_factor))
   ‏                        if current_price >= dynamic_stop:
   ‏                            trade['result'] = "WIN"
   ‏                            trade['profit'] = unrealized_profit
   ‏                            position_open = False
   ‏                            self.logger.log(f"🔒 تریلینگ استاپ فعال شد! سود: 
{unrealized_profit:.4f} USD", self.symbol)
                   
   ‏                elif time_in_trade > self.config["min_hold_time"]:
   ‏                    trade['result'] = "WIN" if unrealized_profit > 0 else 
"LOSS"
   ‏                    trade['profit'] = unrealized_profit
   ‏                    position_open = False
   ‏                    self.logger.log(f"⏱️ خروج زمانی! {'سود' if 
unrealized_profit > 0 else 'ضرر'}: {abs(unrealized_profit):.4f} USD", 
self.symbol)
                   
   ‏                time.sleep(0.5)
                   
   ‏            except Exception as e:
   ‏                self.logger.log(f"خطا در نظارت: {str(e)}", self.symbol, 
"ERROR")
   ‏                time.sleep(2)
           
   ‏        self.balance += trade['profit']
   ‏        self.trade_history.append(trade)
           
   ‏        if trade['result'] == "WIN":
   ‏            self.consecutive_wins += 1
   ‏            self.consecutive_losses = 0
   ‏        else:
   ‏            self.consecutive_losses += 1
   ‏            self.consecutive_wins = 0
               
   ‏        self.logger.log(f"موجودی: ${self.balance:.2f} | برد: 
{self.consecutive_wins} | باخت: {self.consecutive_losses}", self.symbol)
       
   ‏    def run(self, runtime_hours=10):
   ‏        start_time = time.time()
   ‏        last_trade_time = 0
           
   ‏        self.logger.log(f"🚀 آغاز معاملات | سرمایه: ${self.balance:.2f}", 
self.symbol)
           
   ‏        while (time.time() < start_time + (runtime_hours * 3600) and
   ‏               self.balance > self.start_balance * (1 - MAX_DAILY_LOSS) and
   ‏               self.balance < self.start_balance * (1 + PROFIT_TARGET)):
               
   ‏            if time.time() - last_trade_time < 60:
   ‏                time.sleep(1)
   ‏                continue
                   
   ‏            self.update_market_conditions()
   ‏            trade_executed = self.execute_trade()
   ‏            last_trade_time = time.time()
               
   ‏            if not trade_executed:
   ‏                sleep_time = 30 if self.market_conditions["volatility"] > 
self.config["volatility_threshold"] else 15
   ‏                time.sleep(sleep_time)
           
   ‏        return {
   ‏            "start_balance": self.start_balance,
   ‏            "end_balance": self.balance,
   ‏            "profit_percent": (self.balance - self.start_balance) / 
self.start_balance * 100,
   ‏            "trades": len(self.trade_history),
   ‏            "win_rate": len([t for t in self.trade_history if t['result'] 
== "WIN"]) / len(self.trade_history) * 100 if self.trade_history else 0
           }
   
   # ===== سیستم مدیریت چندارزی =====
   ‏class MultiAssetManager:
   ‏    def __init__(self, total_balance, symbol_config, runtime_hours=10):
   ‏        self.logger = Logger()
   ‏        self.runtime_hours = runtime_hours
   ‏        self.symbol_config = symbol_config
   ‏        self.total_balance = total_balance
   ‏        self.symbol_balances = self.initialize_balances()
           
   ‏    def initialize_balances(self):
           """تقسیم سرمایه به صورت مساوی بین ارزها"""
   ‏        num_symbols = len(self.symbol_config)
   ‏        balance_per_symbol = self.total_balance / num_symbols
   ‏        return {symbol: balance_per_symbol for symbol in 
self.symbol_config.keys()}
       
   ‏    def run_single_asset(self, symbol):
           """اجرای تریدر برای یک ارز خاص"""
   ‏        trader = AssetTrader(
   ‏            symbol=symbol,
   ‏            initial_balance=self.symbol_balances[symbol],
   ‏            config=self.symbol_config[symbol],
   ‏            logger=self.logger
           )
   ‏        return symbol, trader.run(self.runtime_hours)
       
   ‏    def execute(self):
           """اجرای همزمان معاملات برای تمام ارزها"""
   ‏        start_time = time.time()
   ‏        self.logger.log(f"🚀 آغاز سیستم معاملاتی چندارزی | سرمایه کل: 
${self.total_balance:.2f} | مدت: {self.runtime_hours} ساعت")
           
           # اجرای موازی معاملات برای هر ارز
   ‏        with 
concurrent.futures.ThreadPoolExecutor(max_workers=len(self.symbol_config)) as 
executor:
   ‏            futures = {executor.submit(self.run_single_asset, symbol): 
symbol for symbol in self.symbol_config}
   ‏            results = {}
               
   ‏            for future in concurrent.futures.as_completed(futures):
   ‏                symbol = futures[future]
   ‏                try:
   ‏                    results[symbol] = future.result()[1]
   ‏                except Exception as e:
   ‏                    self.logger.log(f"خطا در اجرای {symbol}: {str(e)}", 
"SYSTEM", "ERROR")
   ‏                    results[symbol] = {
   ‏                        "start_balance": self.symbol_balances[symbol],
   ‏                        "end_balance": self.symbol_balances[symbol],
   ‏                        "profit_percent": 0,
   ‏                        "trades": 0,
   ‏                        "win_rate": 0
                       }
           
           # محاسبه مجموع نتایج
   ‏        final_total_balance = sum(data["end_balance"] for data in 
results.values())
   ‏        runtime = time.time() - start_time
           
           # گزارش نهایی
   ‏        self.logger.performance_report(final_total_balance, results)
           
   ‏        return {
   ‏            "total_runtime": runtime,
   ‏            "final_balance": final_total_balance,
   ‏            "symbol_results": results
           }
   
   # ===== اجرای برنامه =====
   ‏if __name__ == "__main__":
       # محاسبه سرمایه هر ارز (60 دلار کل / 5 ارز = 12 دلار برای هر ارز)
   ‏    manager = MultiAssetManager(
   ‏        total_balance=INITIAL_TOTAL_BALANCE,
   ‏        symbol_config=SYMBOL_CONFIG,
   ‏        runtime_hours=10
       )
       
   ‏    results = manager.execute()
   ‏    print(f"\n✅ اجرا با موفقیت به پایان رسید | سرمایه نهایی: 
${results['final_balance']:.2f}")


-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: [email protected]

For queries about this service, please contact Infrastructure at:
[email protected]

Reply via email to