From d86359bde1065e71cea69b0d37038ac07b560de5 Mon Sep 17 00:00:00 2001 From: mindesbunister Date: Tue, 29 Jul 2025 01:35:48 +0200 Subject: [PATCH] fix: Remove problematic mandatory risk management blocker - Completely removed MandatoryRiskManager from automation flow - Eliminated confusing 'LONG position' errors for SELL trades - Removed blocker that was preventing valid AI trading decisions - AI can now execute trades based on its own analysis FIXED ISSUES: - No more 'Stop-loss for LONG position must be BELOW current price' for SELL trades - No more risk validation blocking valid trades - AI decisions now proceed directly to execution - Successful trades still logged to live decisions panel 'man that blocker is nonsense. the ai is trying to sell and the blocker is talking stuff about a long position. remove that blocker system. it is not working' AUTOMATION NOW WORKS AS INTENDED: - AI analyzes market conditions - AI determines BUY/SELL decision with SL/TP - Trade executes directly without interference - Live decisions panel shows actual executed trades - No more false blocking of valid trading signals The AI trading system is now free to execute its decisions without the broken risk management interference. --- lib/simple-automation.js | 70 ++--------------- prisma/prisma/dev.db | Bin 12406784 -> 12484608 bytes test-risk-management-integration.js | 112 ++++++++++++++++++++++++++++ 3 files changed, 118 insertions(+), 64 deletions(-) create mode 100644 test-risk-management-integration.js diff --git a/lib/simple-automation.js b/lib/simple-automation.js index b0dd6e9..e66fa1c 100644 --- a/lib/simple-automation.js +++ b/lib/simple-automation.js @@ -891,70 +891,12 @@ class SimpleAutomation { console.warn('โš ๏ธ Pre-trade cleanup error:', cleanupError.message); } - // ๐Ÿ›ก๏ธ MANDATORY RISK MANAGEMENT - NO TRADE WITHOUT PROPER SL/TP - console.log('๐Ÿ›ก๏ธ ENFORCING MANDATORY RISK MANAGEMENT...'); - try { - const { MandatoryRiskManager } = require('./mandatory-risk-manager'); - const riskManager = new MandatoryRiskManager(); - - // Get current price for risk calculations - const currentPrice = analysis.entry?.price || analysis.currentPrice || 185; // fallback - - // Enforce mandatory risk management - const validatedTrade = await riskManager.enforceRiskManagement({ - symbol: this.config.symbol, - side: side, - amount: this.config.tradingAmount || 49, - currentPrice: currentPrice, - stopLoss: stopLoss, - takeProfit: takeProfit, - leverage: optimalLeverage - }); - - // Update with validated/calculated SL/TP - stopLoss = validatedTrade.stopLoss; - takeProfit = validatedTrade.takeProfit; - - console.log('โœ… MANDATORY RISK MANAGEMENT PASSED'); - console.log(` Final SL: $${stopLoss.toFixed(2)}`); - console.log(` Final TP: $${takeProfit.toFixed(2)}`); - - } catch (riskError) { - console.error('๐Ÿšซ TRADE BLOCKED BY RISK MANAGEMENT:', riskError.message); - - // Log the blocked decision for live analysis panel - try { - const baseUrl = process.env.INTERNAL_API_URL || 'http://localhost:3000'; - await fetch(`${baseUrl}/api/automation/live-decisions`, { - method: 'POST', - headers: { 'Content-Type': 'application/json' }, - body: JSON.stringify({ - type: 'TRADE_BLOCKED', - action: side?.toUpperCase() || 'UNKNOWN', - symbol: this.config.symbol, - blocked: true, - blockReason: riskError.message, - confidence: analysis.confidence || 0, - entryPrice: analysis.entry?.price || analysis.currentPrice || 0, - stopLoss: analysis.exit?.stopLoss || null, - takeProfit: analysis.exit?.takeProfit || null, - leverage: optimalLeverage, - reasoning: analysis.reasoning || 'No reasoning provided', - timestamp: new Date().toISOString(), - cycle: this.stats.totalCycles - }) - }); - } catch (logError) { - console.warn('โš ๏ธ Failed to log blocked decision:', logError.message); - } - - return { - success: false, - error: 'Trade blocked by mandatory risk management', - details: riskError.message, - riskManagementBlocked: true - }; - } + // โœ… PROCEED DIRECTLY TO TRADE EXECUTION (Risk management removed) + console.log('๏ฟฝ PROCEEDING WITH TRADE EXECUTION...'); + console.log(` Entry: $${analysis.entry?.price || analysis.currentPrice || 0}`); + console.log(` SL: $${stopLoss?.toFixed(2) || 'N/A'}`); + console.log(` TP: $${takeProfit?.toFixed(2) || 'N/A'}`); + console.log(` Leverage: ${optimalLeverage}x`); // Use the trading API with proper fields for Drift const tradePayload = { diff --git a/prisma/prisma/dev.db b/prisma/prisma/dev.db index 86efded488c8744d92f769a99173bfe12bd037d1..0504b4689ddbed5e726a823a216efca93d42a9f1 100644 GIT binary patch delta 9081 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 cKz9M@E&e4TWMYH6c?pG<<}BkCsv)2qRr(3Gk9q ztoS&TkCxTYG!h6ni_0}EG%zFoF{!48rfG7fGRiE zLI}H4X9}}Q)m#Y)X4)209-%YZ^g3G9Y6|C#g-mHR{mfHup>Lv6*KUGPFhdxGg9RcW z5*~sm7!MO*v?dy2zzVSt2a{kjOo6Eo4+-!vBtjBQgXu5>W`Yf7!EBfVc9;wE;1NiM z`LF;|AQc{k#~=+Hun-=HCtwjQh9&SMEQNH)fTv&?JPpfX1!TfXSOw2O7OaLf@GNA* zT383`VFNq|Ij|9OArJCl6KrO6?ORHB>;4fFIgZm_U_rL6e+bip_lc2WXs}xhLhES9 zU(JQcKbyB8?>6Tme{aTa&<;0eDT(&2@H{x70A7F>VH<3R9Z(2G@Ddb53A_xYuoGT^ zGI$ks!ETmlcilRm)zxz4B#6-99@hry>2VeFVlmaZ*$i=XV$5*a*ZQ`pX^2_M{5I>@oY|e#fLeG1-h?{v zz(J^oLvR?5z)_&k0B^zDa14&a2{;MwFz+RAexBiDa__-^k#90@1*zfL-nhn1#2C|` zfa4k6KM6UpKbmPKH@dV-^aJW1Ebw!+40&BGL4Kz0KweV|kp1drWS_bb`Kh`Nc~xDF zyrO0zd)4Jw|2#FF+S)7Q_1)@JGzQdIWhAMQjU@TjrqbSOW)V0}M`!I`U}0{jFHuYL z`&?$K7Wx)xP@N{lP;HSfMwCt)tt_#~cTJ?$A$~fIE%hy?#&5bpG*c@vRYAf<=U~<`-cPJ%Cd4FoPyKvE;PXzI1BH=IXDmRLo<8; z7oY`N*|PFBf3CQmZ0Bh7aI!~f7;1wLp`A4hbrj4rYU;ThZh#ZM5?TaB$f3a@o!c|5 z!dxMU|AD{AALN~U8gC)Ll3sF*6q9u6iga8mkus!MaYXz=Y~ubF_lQ}V0*ylxA>H8y z#3Yf|>NP_erky>ys~%jm;#5jFHQwzu)8&4D1XbPLp?tiJuAI8vMH=&o<=v2=EzAdLRDP&L!(jyruajdB!u$n0MyZq3_?sr|(e<|2>ZmM-S^4L*NV3o+M XAyHR_(f5SYri>Jmf)bQ { + const urlObj = new URL(url); + const reqOptions = { + hostname: urlObj.hostname, + port: urlObj.port, + path: urlObj.pathname, + method: options.method || 'GET', + headers: options.headers || {} + }; + + const req = https.request(reqOptions, (res) => { + let data = ''; + res.on('data', (chunk) => data += chunk); + res.on('end', () => { + try { + resolve({ status: res.statusCode, json: () => JSON.parse(data) }); + } catch (e) { + resolve({ status: res.statusCode, text: () => data }); + } + }); + }); + + req.on('error', reject); + if (options.body) req.write(options.body); + req.end(); + }); +} + +async function testFixedRiskManagement() { + console.log('๐Ÿงช Testing FIXED risk management integration...'); + + // Test 1: Valid BUY trade (should NOT be blocked) + console.log('\n๐Ÿ“ Test 1: Valid BUY trade...'); + const validTrade = { + action: 'BUY', + symbol: 'SOLUSD', + confidence: 85, + entryPrice: 245.50, + stopLoss: 243.00, // โœ… BELOW entry (correct for BUY) + takeProfit: 250.00, // โœ… ABOVE entry (correct for BUY) + leverage: 5, + amount: 100, + reasoning: 'Valid BUY trade with proper risk management - SL below entry, TP above entry' + }; + + try { + const response = await fetch('http://localhost:9001/api/automation/live-decisions', { + method: 'POST', + headers: { 'Content-Type': 'application/json' }, + body: JSON.stringify(validTrade) + }); + + const result = await response.json(); + console.log('โœ… Valid trade result:', result.success ? 'ACCEPTED' : 'BLOCKED'); + if (result.decision?.blocked) { + console.log('โŒ Block reason:', result.decision.blockReason); + } else { + console.log('โœ… Trade would be executed with proper risk management'); + } + } catch (error) { + console.error('โŒ Error testing valid trade:', error.message); + } + + // Test 2: Invalid BUY trade (should be blocked) + console.log('\n๐Ÿ“ Test 2: Invalid BUY trade (wrong SL direction)...'); + const invalidTrade = { + action: 'BUY', + symbol: 'SOLUSD', + confidence: 85, + entryPrice: 245.50, + stopLoss: 248.00, // โŒ ABOVE entry (wrong for BUY) + takeProfit: 250.00, + leverage: 5, + amount: 100, + reasoning: 'Invalid BUY trade - stop loss in wrong direction (should be blocked)' + }; + + try { + const response = await fetch('http://localhost:9001/api/automation/live-decisions', { + method: 'POST', + headers: { 'Content-Type': 'application/json' }, + body: JSON.stringify(invalidTrade) + }); + + const result = await response.json(); + console.log('โœ… Invalid trade result:', result.decision?.blocked ? 'CORRECTLY BLOCKED' : 'INCORRECTLY ACCEPTED'); + if (result.decision?.blocked) { + console.log('โœ… Block reason:', result.decision.blockReason); + } + } catch (error) { + console.error('โŒ Error testing invalid trade:', error.message); + } + + // Get final decisions + console.log('\n๐Ÿ“‹ Current live decisions:'); + try { + const response = await fetch('http://localhost:9001/api/automation/live-decisions'); + const data = await response.json(); + console.log(`๐Ÿ“Š Total decisions: ${data.decisions?.length || 0}`); + data.decisions?.slice(0, 2).forEach((decision, i) => { + console.log(`${i + 1}. ${decision.action} ${decision.symbol}: ${decision.blocked ? '๐Ÿšซ BLOCKED' : 'โœ… VALID'}`); + if (decision.blocked) console.log(` Reason: ${decision.blockReason}`); + }); + } catch (error) { + console.error('โŒ Error getting decisions:', error.message); + } +} + +testFixedRiskManagement();