Dashboard
Detecting...
Combined P&L
$0.00
Total Trades
0
Win Rate
-
Active Bots
0
KRAKEN - -
○ STOPPED
P&L $0.00 Trades 0 Win% - Strat -
Sess +$0.00 Trades 0 Win% - Streak - RSI - MACD -
Zoom
BINANCE - -
○ STOPPED
P&L $0.00 Trades 0 Win% - Strat -
Sess +$0.00 Trades 0 Win% - Streak - RSI - MACD -
Zoom
Live Signal Feed Waiting...
TIMEEXCHPRICERSIMACDSIGSTRATREASON
Waiting for signals...
Positions & Trades
Open Positions
No open positions
Recent Bot Trades
No trades yet
Strategy Tuner
Strategy & Signal
Dynamic Mode
Auto-Detect Regime
Engine picks strategy every 30 min
Stop & Target
Position Sizing
$0$100,000
P&L Summary
All-Time P&L
-
Today
-
This Week
-
Win Rate
-
Daily P&L
By Strategy
No data yet
Reports & Ledger
Total P&L
-
Trades
-
Win Rate
-
Profit Factor
-
Avg Win
-
Avg Loss
-
Exit Breakdown
By Strategy
Trade Ledger
Loading...
Settings
Subscription
Loading...
KRAKENAPI Keys
BINANCEAPI Keys
Account
Help & Setup Guide
Quick Start
1Create API keys on Kraken Futures and/or Binance (see below)
2Go to Settings and enter your API keys
3Start in Paper mode to test without real money
4Enable Dynamic Mode in Strategy Tuner for auto regime detection
5Click Start — your bot runs 24/7 on our servers
Kraken Futures API Setup

1. Log into pro.kraken.com (not regular Kraken)

2. Settings → API → Create API Key

3. Permissions: Query Funds, Query Orders, Create Orders, Cancel Orders

Do NOT enable Withdraw permissions

4. IP Restriction: 178.128.43.8

Symbol: PI_XBTUSD (BTC Perpetual Futures)

Binance Futures API Setup

1. Log into binance.com → API Management → Create API Key

2. Permissions: Enable Reading + Enable Futures (required)

Do NOT enable Spot Trading or Withdrawals

IP Restriction required: 178.128.43.8

Symbol: BTCUSDT (USDT-M Perpetual Futures)

Dynamic Strategy Engine
When Dynamic Mode is ON the engine picks the best strategy every 30 minutes automatically.
Trending UpTriple EMA, long-only Trending DownTriple EMA, short-only RangingRSI Mean Reversion VolatileBB Squeeze breakout ChaoticFLAT - no trades
FAQ
Does the bot keep running if I close my browser?
Yes. The bot runs on our servers 24/7 regardless of your browser or computer.
Does it restart after a server reboot?
Yes. Bots auto-restart with the same settings after any server reboot.
Can the bot withdraw my funds?
No. API keys only need trading permissions. Never enable withdrawal permissions.
Why is my Binance feed not working?
Binance API key must have Futures enabled AND be IP-restricted to 178.128.43.8. Both required.
Pause vs Stop?
Stop resets session stats. Pause preserves all session P&L, streak and history.
+Number(this.value).toLocaleString()">
P&L Summary
All-Time P&L
-
Today
-
This Week
-
Win Rate
-
Daily P&L
By Strategy
No data yet
Reports & Ledger
Total P&L
-
Trades
-
Win Rate
-
Profit Factor
-
Avg Win
-
Avg Loss
-
Exit Breakdown
By Strategy
Trade Ledger
Loading...
Settings
Subscription
Loading...
KRAKENAPI Keys
BINANCEAPI Keys
Account
Help & Setup Guide
Quick Start
1Create API keys on Kraken Futures and/or Binance (see below)
2Go to Settings and enter your API keys
3Start in Paper mode to test without real money
4Enable Dynamic Mode in Strategy Tuner for auto regime detection
5Click Start — your bot runs 24/7 on our servers
Kraken Futures API Setup

1. Log into pro.kraken.com (not regular Kraken)

2. Settings → API → Create API Key

3. Permissions: Query Funds, Query Orders, Create Orders, Cancel Orders

Do NOT enable Withdraw permissions

4. IP Restriction: 178.128.43.8

Symbol: PI_XBTUSD (BTC Perpetual Futures)

Binance Futures API Setup

1. Log into binance.com → API Management → Create API Key

2. Permissions: Enable Reading + Enable Futures (required)

Do NOT enable Spot Trading or Withdrawals

IP Restriction required: 178.128.43.8

Symbol: BTCUSDT (USDT-M Perpetual Futures)

Dynamic Strategy Engine
When Dynamic Mode is ON the engine picks the best strategy every 30 minutes automatically.
Trending UpTriple EMA, long-only Trending DownTriple EMA, short-only RangingRSI Mean Reversion VolatileBB Squeeze breakout ChaoticFLAT - no trades
FAQ
Does the bot keep running if I close my browser?
Yes. The bot runs on our servers 24/7 regardless of your browser or computer.
Does it restart after a server reboot?
Yes. Bots auto-restart with the same settings after any server reboot.
Can the bot withdraw my funds?
No. API keys only need trading permissions. Never enable withdrawal permissions.
Why is my Binance feed not working?
Binance API key must have Futures enabled AND be IP-restricted to 178.128.43.8. Both required.
Pause vs Stop?
Stop resets session stats. Pause preserves all session P&L, streak and history.
+Number(v).toLocaleString()});sv('t-poll',s.pollSeconds||30,'t-poll-v',function(v){return v+'s'});document.getElementById('t-dynamic').checked=s.dynamicMode||false} function saveTuner(){saveTunerState();authFetch('/settings/tuner',{method:'POST',body:JSON.stringify({k:tunerState.k,b:tunerState.b})}).then(function(r){return r.json()}).then(function(d){if(d.ok){var el=document.getElementById('tuner-saved');el.style.display='inline';setTimeout(function(){el.style.display='none'},2500)}}).catch(function(e){alert('Save failed: '+e.message)})} function loadSettings(){authFetch('/settings').then(function(r){return r.json()}).then(function(d){if(!d.settings)return;var s=d.settings,ke=document.getElementById('k-exp'),kl=document.getElementById('k-lev'),be=document.getElementById('b-exp'),bl=document.getElementById('b-lev');if(ke)ke.value=s.krakenMaxExposureUsd||1000;if(kl)kl.value=s.krakenLeverage||1;if(be)be.value=s.binanceMaxExposureUsd||1000;if(bl)bl.value=s.binanceLeverage||1;tunerState.k={strategy:s.krakenStrategy||'rsi-reversion',minScore:s.krakenMinScore||5,rsiBuy:s.krakenRsiBuy||33,rsiSell:s.krakenRsiSell||67,tpAtr:s.krakenTpAtr||3.0,slAtr:s.krakenSlAtr||1.8,minTpPct:s.krakenMinTpPct||0.25,maxHoldMinutes:s.krakenMaxHoldMinutes||60,basePositionUsd:s.krakenBasePositionUsd||300,pollSeconds:s.pollSeconds||30,dynamicMode:s.krakenDynamicMode||false};tunerState.b={strategy:s.binanceStrategy||'triple-ema',minScore:s.binanceMinScore||4,rsiBuy:s.binanceRsiBuy||35,rsiSell:s.binanceRsiSell||65,tpAtr:s.binanceTpAtr||2.5,slAtr:s.binanceSlAtr||1.5,minTpPct:s.binanceMinTpPct||0.2,maxHoldMinutes:s.binanceMaxHoldMinutes||60,basePositionUsd:s.binanceBasePositionUsd||300,pollSeconds:s.pollSeconds||30,dynamicMode:s.binanceDynamicMode||false};loadTunerState()}).catch(function(){})} function loadSettingsPage(){authFetch('/settings').then(function(r){return r.json()}).then(function(d){if(!d.settings)return;var kk=document.getElementById('s-k-key'),bk=document.getElementById('s-b-key');if(kk)kk.value=d.settings.krakenApiKey||'';if(bk)bk.value=d.settings.binanceApiKey||''}).catch(function(){})} function saveSettings(){var payload={krakenApiKey:document.getElementById('s-k-key').value,krakenApiSecret:document.getElementById('s-k-secret').value,binanceApiKey:document.getElementById('s-b-key').value,binanceApiSecret:document.getElementById('s-b-secret').value};authFetch('/settings',{method:'POST',body:JSON.stringify(payload)}).then(function(r){return r.json()}).then(function(d){if(d.ok){var el=document.getElementById('settings-saved');el.style.display='inline';setTimeout(function(){el.style.display='none'},2500)}}).catch(function(e){alert('Save failed: '+e.message)})} function saveCapital(ex){var p=ex[0],exp=+document.getElementById(p+'-exp').value,lev=+document.getElementById(p+'-lev').value,pl=ex==='kraken'?{krakenMaxExposureUsd:exp,krakenLeverage:lev}:{binanceMaxExposureUsd:exp,binanceLeverage:lev};authFetch('/settings',{method:'POST',body:JSON.stringify(pl)}).catch(function(){})} function changePassword(){var np=document.getElementById('s-newpass').value;if(!np||np.length<8){alert('Password must be at least 8 characters');return}var cp=prompt('Current password:');if(!cp)return;authFetch('/auth/password',{method:'POST',body:JSON.stringify({currentPassword:cp,newPassword:np})}).then(function(r){return r.json()}).then(function(d){if(d.ok){alert('Password changed');document.getElementById('s-newpass').value=''}else alert('Error: '+d.error)}).catch(function(){alert('Failed')})} function loadLedger(){var ef=document.getElementById('r-filter-ex'),df=document.getElementById('r-filter-days'),ex=ef?ef.value:'all',days=df?parseInt(df.value):0,lt=document.getElementById('ledger-table');if(lt)lt.innerHTML='
Loading...
';authFetch('/ledger').then(function(r){return r.json()}).then(function(all){var trades=all;if(ex!=='all')trades=trades.filter(function(t){return(t.exchange||'kraken').toLowerCase()===ex});if(days>0){var cutoff=Date.now()-days*86400000;trades=trades.filter(function(t){return(t.closedAt||0)>=cutoff})}if(!trades.length){if(lt)lt.innerHTML='
No trades found
';return}var wins=trades.filter(function(t){return t.pnl>0}),losses=trades.filter(function(t){return t.pnl<=0}),total=trades.reduce(function(a,t){return a+(t.pnl||0)},0),avgW=wins.length?wins.reduce(function(a,t){return a+t.pnl},0)/wins.length:0,avgL=losses.length?Math.abs(losses.reduce(function(a,t){return a+t.pnl},0)/losses.length):0,pf=avgL>0?(avgW*wins.length)/(avgL*losses.length):wins.length>0?999:0,best=trades.reduce(function(a,t){return t.pnl>a?t.pnl:a},-Infinity),worst=trades.reduce(function(a,t){return t.pnl=0?'var(--green)':'var(--red)');setText('r-trades',trades.length);setText('r-wr',trades.length?(wins.length/trades.length*100).toFixed(1)+'%':'-');setText('r-pf',pf===999?'inf':pf.toFixed(2),pf>=1?'var(--green)':'var(--red)');setText('r-avgw','$'+avgW.toFixed(3));setText('r-avgl','$'+avgL.toFixed(3));setText('r-best',best===(-Infinity)?'-':'$'+best.toFixed(3));setText('r-worst',worst===Infinity?'-':'$'+worst.toFixed(3));var exits={};trades.forEach(function(t){var r=t.exitReason||'unknown';exits[r]=(exits[r]||0)+1});var ec={take_profit:'var(--green)',stop_loss:'var(--red)',timeout:'var(--amber)',unknown:'var(--text3)'};var xe=document.getElementById('r-exits');if(xe)xe.innerHTML=Object.entries(exits).map(function(e){return'
'+e[0].replace(/_/g,' ')+''+e[1]+'('+( e[1]/trades.length*100).toFixed(0)+'%)
'}).join('');var byS={};trades.forEach(function(t){var k=t.strategy||'unknown';if(!byS[k])byS[k]=[];byS[k].push(t)});var se=document.getElementById('r-by-strat');if(se){var rows=Object.entries(byS).map(function(e){var st=e[1],sw=st.filter(function(t){return t.pnl>0}),sp=st.reduce(function(a,t){return a+(t.pnl||0)},0),swr=(sw.length/st.length*100).toFixed(0);return''+e[0].replace(/-/g,' ')+''+st.length+''+(sp>=0?'+':'')+'$'+sp.toFixed(2)+''+swr+'%$'+(sw.length?sw.reduce(function(a,t){return a+t.pnl},0)/sw.length:0).toFixed(3)+''}).join('');se.innerHTML=''+rows+'
StrategyTradesP&LWin RateAvg Win
'}if(lt){var tr=trades.slice(0,200).map(function(t){var xc=(t.exchange||'').toLowerCase()==='binance'?'chip-binance':'chip-kraken',ec2=t.exitReason==='take_profit'?'var(--green)':t.exitReason==='stop_loss'?'var(--red)':'var(--amber)';return''+new Date(t.closedAt).toLocaleString()+''+(t.exchange||'KRK').toUpperCase()+''+(t.side||'').toUpperCase()+'$'+(t.entry||0).toFixed(0)+'$'+(t.exit||0).toFixed(0)+''+(t.pnl>=0?'+':'')+'$'+(t.pnl||0).toFixed(3)+''+(t.exitReason||'-').replace(/_/g,' ')+''+(t.strategy||'').replace(/-/g,' ')+''}).join('');lt.innerHTML=''+tr+'
DateExchSideEntryExitP&LExit ReasonStrategy
'+(trades.length>200?'
Showing 200 of '+trades.length+'
':'')}}).catch(function(){if(lt)lt.innerHTML='
Failed to load
'})} function exportCSV(){authFetch('/ledger').then(function(r){return r.json()}).then(function(trades){var h=['Date','Exchange','Side','Entry','Exit','PnL','ExitReason','Strategy'],rows=trades.map(function(t){return[new Date(t.closedAt).toISOString(),(t.exchange||''),(t.side||''),(t.entry||0).toFixed(2),(t.exit||0).toFixed(2),(t.pnl||0).toFixed(4),(t.exitReason||''),(t.strategy||'')]});var csv=[h].concat(rows).map(function(r){return r.join(',')}).join(String.fromCharCode(10));var a=document.createElement('a');a.href=URL.createObjectURL(new Blob([csv],{type:'text/csv'}));a.download='trades-'+new Date().toISOString().slice(0,10)+'.csv';a.click()})} function loadSummary(){authFetch('/summary').then(function(r){return r.json()}).then(function(d){if(!d.overall)return;setText('s-total','$'+(d.overall.totalPnl||0).toFixed(2),d.overall.totalPnl>=0?'var(--green)':'var(--red)');setText('s-today','$'+(d.today.totalPnl||0).toFixed(2),d.today.totalPnl>=0?'var(--green)':'var(--red)');setText('s-week','$'+(d.thisWeek.totalPnl||0).toFixed(2),d.thisWeek.totalPnl>=0?'var(--green)':'var(--red)');setText('s-wr',(d.overall.winRate||0).toFixed(1)+'%',d.overall.winRate>=50?'var(--green)':'var(--red)');var daily=Object.entries(d.daily||{}).slice(-30);if(daily.length)drawBarChart('summary-chart',daily.map(function(e){return{label:e[0].slice(5),value:e[1].totalPnl||0}}));if(d.byStrategy&&d.byStrategy.length){document.getElementById('strat-perf').innerHTML=''+d.byStrategy.map(function(s){return''}).join('')+'
StrategyTradesP&LWin RateAvg WinAvg Loss
'+(s.strategyId||'').replace(/-/g,' ')+''+s.trades+'$'+(s.totalPnl||0).toFixed(2)+''+(s.winRate||0).toFixed(1)+'%$'+(s.avgWin||0).toFixed(3)+'$'+(s.avgLoss||0).toFixed(3)+'
'}else{document.getElementById('strat-perf').textContent='No data yet'}}).catch(function(){})} function drawBarChart(id,data){var cv=document.getElementById(id);if(!cv||!data.length)return;var ctx=cv.getContext('2d'),W=cv.offsetWidth||600,H=cv.height;cv.width=W;cv.height=H;ctx.clearRect(0,0,W,H);var vals=data.map(function(d){return d.value}),max=Math.max(Math.abs(Math.max.apply(null,vals)),Math.abs(Math.min.apply(null,vals)),0.01),bw=W/data.length-2,midY=H/2;data.forEach(function(d,i){var h=Math.abs(d.value)/max*(H/2-10),x=i*(W/data.length)+1;ctx.fillStyle=d.value>=0?'rgba(63,185,80,0.7)':'rgba(248,81,73,0.7)';if(d.value>=0)ctx.fillRect(x,midY-h,bw,h);else ctx.fillRect(x,midY,bw,h)});ctx.strokeStyle='rgba(139,148,158,0.2)';ctx.beginPath();ctx.moveTo(0,midY);ctx.lineTo(W,midY);ctx.stroke()} function loadPositions(){Promise.all([authFetch('/kraken/status').then(function(r){return r.json()}).catch(function(){return null}),authFetch('/binance/status').then(function(r){return r.json()}).catch(function(){return null})]).then(function(res){var ks=res[0],bs=res[1],op=[ks&&ks.position,bs&&bs.position].filter(Boolean),pc=document.getElementById('positions-content');if(pc)pc.innerHTML=op.length?op.map(function(p){return'
'+(p.side||'').toUpperCase()+' $'+(p.entry||0).toFixed(0)+' TP: $'+(p.tp||0).toFixed(0)+' SL: $'+(p.sl||0).toFixed(0)+'
'}).join(''):'
No open positions
';var all=(ks?ks.recentTrades||[]:[]).map(function(t){return Object.assign({},t,{exchange:'kraken'})}).concat((bs?bs.recentTrades||[]:[]).map(function(t){return Object.assign({},t,{exchange:'binance'})})).sort(function(a,b){return(b.closedAt||0)-(a.closedAt||0)});var btc=document.getElementById('bot-trades-content');if(btc)btc.innerHTML=all.length?''+all.slice(0,30).map(function(t){var xc=t.exchange==='binance'?'chip-binance':'chip-kraken',ec=t.exitReason==='take_profit'?'var(--green)':t.exitReason==='stop_loss'?'var(--red)':'var(--amber)';return''}).join('')+'
TimeExchSideEntryExitP&LReason
'+new Date(t.closedAt||Date.now()).toLocaleTimeString()+''+(t.exchange||'').toUpperCase()+''+(t.side||'').toUpperCase()+'$'+(t.entry||0).toFixed(0)+'$'+(t.exit||0).toFixed(0)+''+(t.pnl>=0?'+':'')+'$'+(t.pnl||0).toFixed(3)+''+(t.exitReason||'-')+'
':'
No trades yet
'}).catch(function(){})} function setText(id,val,color){var el=document.getElementById(id);if(!el)return;el.textContent=val;if(color)el.style.color=color} function refreshAll(){refreshStatus();doPing();loadSummary()} function toggleTheme(){var l=document.body.classList.toggle('light');document.querySelectorAll('#theme-btn').forEach(function(b){b.textContent=l?'☀️':'🌙'});localStorage.setItem('dt_theme',l?'light':'dark');setTimeout(refreshStatus,100)} var chartState={ k:{interval:'5',zoom:5.0,history:null}, b:{interval:'5',zoom:5.0,history:null} } function setChartInterval(p,interval){ chartState[p].interval=interval // Update button styles var ex=p==='k'?'kraken':'binance' var activeColor=p==='k'?'rgba(88,166,255,.15)':'rgba(227,179,65,.15)' var activeText=p==='k'?'var(--blue)':'var(--amber)' ;['5','60','240','1440'].forEach(function(i){ var btn=document.getElementById(p+'-int-'+i) if(btn){btn.style.background=i===interval?activeColor:'';btn.style.color=i===interval?activeText:''} }) // Fetch historical data for this interval loadChartHistory(p, interval) } function loadChartHistory(p, interval){ var ex=p==='k'?'kraken':'binance' authFetch('/'+ex+'/history?interval='+interval) .then(function(r){return r.json()}) .then(function(d){ if(d.candles&&d.candles.length){ chartState[p].history=d.candles renderChart(p) } }).catch(function(){}) } function zoomChart(p, dir){ var z=chartState[p].zoom if(dir>0) z=Math.min(z*1.3, 8.0) else z=Math.max(z/1.3, 0.3) chartState[p].zoom=z renderChart(p) } function renderChart(p){ var state=chartState[p] var candles=state.history // Fall back to live candles if no history loaded if(!candles||!candles.length){ var liveStatus=p==='k'?window._kStatus:window._bStatus if(liveStatus&&liveStatus.candles) candles=liveStatus.candles } if(!candles||!candles.length) return var maxC=Math.round(200/state.zoom) drawChart(p+'-chart', candles, Math.max(10, maxC)) setTimeout(function(){var w=document.getElementById(p+'-chart-wrap');if(w)w.scrollLeft=w.scrollWidth},50) } var chartState={ k:{interval:'5',zoom:5.0,history:null}, b:{interval:'5',zoom:5.0,history:null} } function setChartInterval(p,interval){ chartState[p].interval=interval // Update button styles var ex=p==='k'?'kraken':'binance' var activeColor=p==='k'?'rgba(88,166,255,.15)':'rgba(227,179,65,.15)' var activeText=p==='k'?'var(--blue)':'var(--amber)' ;['5','60','240','1440'].forEach(function(i){ var btn=document.getElementById(p+'-int-'+i) if(btn){btn.style.background=i===interval?activeColor:'';btn.style.color=i===interval?activeText:''} }) // Fetch historical data for this interval loadChartHistory(p, interval) } function loadChartHistory(p, interval){ var ex=p==='k'?'kraken':'binance' authFetch('/'+ex+'/history?interval='+interval) .then(function(r){return r.json()}) .then(function(d){ if(d.candles&&d.candles.length){ chartState[p].history=d.candles renderChart(p) } }).catch(function(){}) } function zoomChart(p, dir){ var z=chartState[p].zoom if(dir>0) z=Math.min(z*1.3, 8.0) else z=Math.max(z/1.3, 0.3) chartState[p].zoom=z renderChart(p) } function renderChart(p){ var state=chartState[p] var candles=state.history // Fall back to live candles if no history loaded if(!candles||!candles.length){ var liveStatus=p==='k'?window._kStatus:window._bStatus if(liveStatus&&liveStatus.candles) candles=liveStatus.candles } if(!candles||!candles.length) return var maxC=Math.round(200/state.zoom) drawChart(p+'-chart', candles, Math.max(10, maxC)) setTimeout(function(){var w=document.getElementById(p+'-chart-wrap');if(w)w.scrollLeft=w.scrollWidth},50) } if(localStorage.getItem('dt_theme')==='light'){document.body.classList.add('light');document.addEventListener('DOMContentLoaded',function(){document.querySelectorAll('#theme-btn').forEach(function(b){b.textContent='☀️'})})} if(token){fetch('/auth/me',{headers:{'Authorization':'Bearer '+token}}).then(function(r){return r.json()}).then(function(d){if(d.ok){user=d.user;initApp()}else window.location.href='/login'}).catch(function(){window.location.href='/login'})}else{window.location.href='/login'} +Number(this.value).toLocaleString()">
P&L Summary
All-Time P&L
-
Today
-
This Week
-
Win Rate
-
Daily P&L
By Strategy
No data yet
Reports & Ledger
Total P&L
-
Trades
-
Win Rate
-
Profit Factor
-
Avg Win
-
Avg Loss
-
Exit Breakdown
By Strategy
Trade Ledger
Loading...
Settings
Subscription
Loading...
KRAKENAPI Keys
BINANCEAPI Keys
Account
Help & Setup Guide
Quick Start
1Create API keys on Kraken Futures and/or Binance (see below)
2Go to Settings and enter your API keys
3Start in Paper mode to test without real money
4Enable Dynamic Mode in Strategy Tuner for auto regime detection
5Click Start — your bot runs 24/7 on our servers
Kraken Futures API Setup

1. Log into pro.kraken.com (not regular Kraken)

2. Settings → API → Create API Key

3. Permissions: Query Funds, Query Orders, Create Orders, Cancel Orders

Do NOT enable Withdraw permissions

4. IP Restriction: 178.128.43.8

Symbol: PI_XBTUSD (BTC Perpetual Futures)

Binance Futures API Setup

1. Log into binance.com → API Management → Create API Key

2. Permissions: Enable Reading + Enable Futures (required)

Do NOT enable Spot Trading or Withdrawals

IP Restriction required: 178.128.43.8

Symbol: BTCUSDT (USDT-M Perpetual Futures)

Dynamic Strategy Engine
When Dynamic Mode is ON the engine picks the best strategy every 30 minutes automatically.
Trending UpTriple EMA, long-only Trending DownTriple EMA, short-only RangingRSI Mean Reversion VolatileBB Squeeze breakout ChaoticFLAT - no trades
FAQ
Does the bot keep running if I close my browser?
Yes. The bot runs on our servers 24/7 regardless of your browser or computer.
Does it restart after a server reboot?
Yes. Bots auto-restart with the same settings after any server reboot.
Can the bot withdraw my funds?
No. API keys only need trading permissions. Never enable withdrawal permissions.
Why is my Binance feed not working?
Binance API key must have Futures enabled AND be IP-restricted to 178.128.43.8. Both required.
Pause vs Stop?
Stop resets session stats. Pause preserves all session P&L, streak and history.
+max.toLocaleString() } } // Show upgrade hint for free users var hint = document.getElementById('pos-limit-hint') if (hint) hint.style.display = isPaid ? 'none' : 'block' }).catch(function(){}) } function checkSubscription(){authFetch('/subscription').then(function(r){return r.json()}).then(function(d){if(!d.active)document.getElementById('sub-warning').style.display='block';var el=document.getElementById('sub-status-content');if(el)el.innerHTML=d.active?'Active expires '+new Date(d.expiry).toLocaleDateString():'Inactive Renew'}).catch(function(){})} function authFetch(path,opts){opts=opts||{};var h=Object.assign({},opts.headers||{},{'Authorization':'Bearer '+token,'Content-Type':'application/json'});return fetch(path,Object.assign({},opts,{headers:h}))} function showPage(name,el){document.querySelectorAll('.page').forEach(function(p){p.classList.remove('active')});document.querySelectorAll('.nav-item').forEach(function(n){n.classList.remove('active')});document.getElementById('page-'+name).classList.add('active');if(el)el.classList.add('active');closeSidebar();if(name==='reports')loadLedger();if(name==='positions')loadPositions();if(name==='summary')loadSummary();if(name==='settings')loadSettingsPage()} function toggleBot(ex){var r=ex==='kraken'?kRunning:bRunning;authFetch('/'+ex+'/'+(r?'stop':'start'),{method:'POST'}).then(function(r){return r.json()}).then(function(d){if(!d.ok&&d.error)alert(d.error);refreshStatus()}).catch(function(e){alert('Error: '+e.message)})} function pauseBot(ex){authFetch('/'+ex+'/pause',{method:'POST'}).then(function(r){return r.json()}).then(function(d){alert(d.ok?ex+' paused':'Error: '+d.error);refreshStatus()}).catch(function(e){alert('Error: '+e.message)})} function resumeBot(ex){authFetch('/'+ex+'/resume',{method:'POST'}).then(function(r){return r.json()}).then(function(d){alert(d.ok?ex+' resumed':'Error: '+d.error);refreshStatus()}).catch(function(e){alert('Error: '+e.message)})} function refreshStatus(){return Promise.all([authFetch('/kraken/status').then(function(r){return r.json()}).catch(function(){return null}),authFetch('/binance/status').then(function(r){return r.json()}).catch(function(){return null})]).then(function(res){window._kStatus=res[0];window._kStatus=res[0];if(res[0])updateExUI('k',res[0]);window._bStatus=res[1];window._bStatus=res[1];if(res[1])updateExUI('b',res[1]);updateTopStats(res[0],res[1])}).catch(function(){})} function updateExUI(p,s){var running=s.running,trades=s.recentTrades||[],wins=trades.filter(function(t){return t.pnl>0}),pnl=trades.reduce(function(a,t){return a+(t.pnl||0)},0),wr=trades.length?(wins.length/trades.length*100).toFixed(0)+'%':'-';if(p==='k')kRunning=running;if(p==='b')bRunning=running;var st=document.getElementById(p+'-status'),btn=document.getElementById(p+'-btn'),pb=document.getElementById(p+'-pause-btn'),isp=s.paused&&!running;if(st){st.textContent=running?'ACTIVE':(isp?'PAUSED':'STOPPED');st.style.color=running?'var(--green)':(isp?'var(--amber)':'var(--text3)')}if(btn){btn.textContent=running?'Stop':(isp?'Resume':'Start');btn.className='btn '+(running?'btn-danger':'btn-success')+' btn-sm';btn.onclick=isp?function(){resumeBot(p==='k'?'kraken':'binance')}:function(){toggleBot(p==='k'?'kraken':'binance')}}if(pb)pb.style.display=running?'inline-flex':'none';setText(p+'-pnl','$'+pnl.toFixed(2),pnl>=0?'var(--green)':'var(--red)');setText(p+'-trades',trades.length);setText(p+'-wr',wr);setText(p+'-strat',s.activeStrategy||'-');var ss=s.state||{},sw=ss.wins||0,stc=ss.totalTrades||0,sp=ss.sessionPnl||0,swr=stc>0?(sw/stc*100).toFixed(0)+'%':'-',ws=ss.winStreak||0,ls=ss.lossStreak||0,stk=ws>0?'+'+ws+' W':ls>0?'-'+ls+' L':'-',skc=ws>0?'var(--green)':ls>0?'var(--red)':'var(--text3)';setText(p+'-sess-pnl',(sp>=0?'+':'')+'$'+sp.toFixed(2),sp>=0?'var(--green)':'var(--red)');setText(p+'-sess-trades',stc);setText(p+'-sess-wr',swr,stc>0&&sw/stc>=0.5?'var(--green)':'var(--red)');setText(p+'-sess-streak',stk,skc);var candles=s.candles||[];if(candles.length){var last=candles[candles.length-1],lp=parseFloat(last.close),rv=parseFloat(last.rsi),mv=parseFloat(last.macdHist);if(lp)setText(p+'-price','$'+lp.toLocaleString());if(!isNaN(rv))setText(p+'-live-rsi',rv.toFixed(1),rv>70?'var(--red)':rv<30?'var(--green2)':'var(--blue)');if(!isNaN(mv))setText(p+'-live-macd',mv.toFixed(2),mv>0?'var(--green)':'var(--red)');window['_'+p+'Status']={candles:candles};if(!chartState[p].history)renderChart(p);setTimeout(function(){var w=document.getElementById(p+'-chart-wrap');if(w)w.scrollLeft=w.scrollWidth},50)}var db2=document.getElementById(p+'-dynamic-badge');if(db2)db2.style.display=s.dynamicMode?'inline-block':'none';var regime=s.currentRegime,regEl=document.getElementById(p+'-regime');if(regEl&®ime){var RC={TRENDING_UP:'var(--green)',TRENDING_DOWN:'var(--red)',RANGING:'var(--blue)',VOLATILE:'var(--amber)',CHAOTIC:'var(--text3)'},RL={TRENDING_UP:'UP',TRENDING_DOWN:'DOWN',RANGING:'RANGE',VOLATILE:'VOL',CHAOTIC:'FLAT'};regEl.textContent=RL[regime]||regime;regEl.style.color=RC[regime]||'var(--text3)'}} function updateTopStats(ks,bs){var all=[].concat(ks?ks.recentTrades||[]:[]).concat(bs?bs.recentTrades||[]:[]),pnl=all.reduce(function(a,t){return a+(t.pnl||0)},0),wins=all.filter(function(t){return t.pnl>0}),bots=(ks&&ks.running?1:0)+(bs&&bs.running?1:0);setText('total-pnl','$'+pnl.toFixed(2),pnl>=0?'var(--green)':'var(--red)');setText('total-trades',all.length);setText('win-rate',all.length?(wins.length/all.length*100).toFixed(1)+'%':'-');setText('active-bots',bots,bots>0?'var(--green)':'var(--text)');var rb=document.getElementById('regime-badge');if(rb&&ks&&ks.currentRegime){var RC={TRENDING_UP:'var(--green)',TRENDING_DOWN:'var(--red)',RANGING:'var(--blue)',VOLATILE:'var(--amber)',CHAOTIC:'var(--text3)'},RL={TRENDING_UP:'Trending Up',TRENDING_DOWN:'Trending Down',RANGING:'Ranging',VOLATILE:'Volatile',CHAOTIC:'Flat'};rb.textContent=RL[ks.currentRegime]||ks.currentRegime;rb.style.color=RC[ks.currentRegime]||'var(--text2)'}} function startPolling(){refreshStatus();refreshTimer=setInterval(refreshStatus,5000)} function drawChart(id,candles,maxC){maxC=maxC||60;var cv=document.getElementById(id);if(!cv||!candles||!candles.length)return;var wrap=cv.parentElement,cW=wrap?wrap.clientWidth:500,n=Math.min(candles.length,maxC),W=Math.max(cW-2,n*8),PH=150,RH=45,MH=45,H=PH+RH+MH+18;cv.width=W;cv.height=H;cv.style.width=W+'px';cv.style.height=H+'px';var ctx=cv.getContext('2d');ctx.clearRect(0,0,W,H);var PL=52,PR=6,cw2=W-PL-PR,sl=candles.slice(-n),pd=sl.map(function(c){return{o:parseFloat(c.open||c.close),h:parseFloat(c.high||c.close),l:parseFloat(c.low||c.close),c:parseFloat(c.close),rsi:c.rsi,mh:c.macdHist,t:c.time}}),hi=Math.max.apply(null,pd.map(function(c){return c.h})),lo=Math.min.apply(null,pd.map(function(c){return c.l})),pad=(hi-lo)*0.06||20;hi+=pad;lo-=pad;var rP=hi-lo||1,toY=function(p){return Math.round(PH*(1-(p-lo)/rP))},gap=cw2/n,cw=Math.max(2,Math.floor(gap)-1),toX=function(i){return PL+Math.round(i*gap)},dark=!document.body.classList.contains('light');for(var g=0;g<5;g++){var gy=Math.round(PH*g/4);ctx.fillStyle=dark?'rgba(255,255,255,0.04)':'rgba(0,0,0,0.04)';ctx.fillRect(PL,gy,cw2,1);ctx.fillStyle=dark?'rgba(139,148,158,0.7)':'rgba(100,110,120,0.8)';ctx.font='9px monospace';ctx.textAlign='right';ctx.fillText('$'+(hi-(hi-lo)*g/4).toFixed(0),PL-3,gy+3)}pd.forEach(function(c,i){var x=toX(i),cx=x+Math.round(cw/2),up=c.c>=c.o,col=up?'#3fb950':'#f85149',bT=toY(Math.max(c.o,c.c)),bB=toY(Math.min(c.o,c.c)),bH=Math.max(1,bB-bT);ctx.strokeStyle=col;ctx.lineWidth=1;ctx.beginPath();ctx.moveTo(cx,toY(c.h));ctx.lineTo(cx,toY(c.l));ctx.stroke();ctx.fillStyle=col;ctx.fillRect(x,bT,cw,bH)});if(pd.length){var lc=pd[pd.length-1].c,py=toY(lc);ctx.strokeStyle='rgba(88,166,255,0.4)';ctx.lineWidth=1;ctx.setLineDash([3,3]);ctx.beginPath();ctx.moveTo(PL,py);ctx.lineTo(W-PR,py);ctx.stroke();ctx.setLineDash([]);ctx.fillStyle=dark?'rgba(13,17,23,0.9)':'rgba(240,242,245,0.9)';ctx.fillRect(W-PR-58,py-8,58,16);ctx.fillStyle=dark?'#e6edf3':'#1c2128';ctx.font='10px monospace';ctx.textAlign='right';ctx.fillText('$'+lc.toFixed(0),W-PR-2,py+4)}ctx.fillStyle=dark?'rgba(139,148,158,0.6)':'rgba(100,110,120,0.7)';ctx.font='8px monospace';ctx.textAlign='center';var le=Math.ceil(n/6);pd.forEach(function(c,i){if(i%le===0&&c.t){var t=new Date(c.t);ctx.fillText(t.getHours().toString().padStart(2,'0')+':'+t.getMinutes().toString().padStart(2,'0'),toX(i)+cw/2,PH+11)}});ctx.fillStyle=dark?'rgba(255,255,255,0.06)':'rgba(0,0,0,0.06)';ctx.fillRect(PL,PH+14,cw2,1);var RT=PH+16,toRY=function(v){return RT+Math.round(RH*(1-v/100))};ctx.fillStyle=dark?'rgba(139,148,158,0.6)':'rgba(100,110,120,0.7)';ctx.font='8px monospace';ctx.textAlign='right';ctx.fillText('RSI',PL-3,RT+9);ctx.fillText('70',PL-3,toRY(70)+3);ctx.fillText('30',PL-3,toRY(30)+3);ctx.strokeStyle='rgba(248,81,73,0.2)';ctx.lineWidth=1;ctx.setLineDash([2,3]);ctx.beginPath();ctx.moveTo(PL,toRY(70));ctx.lineTo(W-PR,toRY(70));ctx.stroke();ctx.strokeStyle='rgba(63,185,80,0.2)';ctx.beginPath();ctx.moveTo(PL,toRY(30));ctx.lineTo(W-PR,toRY(30));ctx.stroke();ctx.setLineDash([]);var rp=[],lr=null;pd.forEach(function(c,i){if(c.rsi!=null){rp.push({x:toX(i)+cw/2,y:toRY(parseFloat(c.rsi))});lr=parseFloat(c.rsi)}});if(rp.length>1){ctx.beginPath();ctx.moveTo(rp[0].x,rp[0].y);rp.forEach(function(p){ctx.lineTo(p.x,p.y)});ctx.strokeStyle=lr>70?'#f85149':lr<30?'#3fb950':'#58a6ff';ctx.lineWidth=1.5;ctx.stroke();ctx.fillStyle=lr>70?'#f85149':lr<30?'#3fb950':'#58a6ff';ctx.font='9px monospace';ctx.textAlign='right';ctx.fillText(lr.toFixed(1),W-PR-2,toRY(lr)-2)}ctx.fillStyle=dark?'rgba(255,255,255,0.06)':'rgba(0,0,0,0.06)';ctx.fillRect(PL,RT+RH+2,cw2,1);var MT=RT+RH+4,mv=pd.map(function(c){return parseFloat(c.mh)||0}),maxM=Math.max.apply(null,mv.map(Math.abs))||1,midM=MT+Math.round(MH/2),toMY=function(v){return MT+Math.round(MH/2*(1-v/maxM))};ctx.fillStyle=dark?'rgba(139,148,158,0.6)':'rgba(100,110,120,0.7)';ctx.font='8px monospace';ctx.textAlign='right';ctx.fillText('MACD',PL-3,MT+9);ctx.fillStyle=dark?'rgba(255,255,255,0.05)':'rgba(0,0,0,0.05)';ctx.fillRect(PL,midM,cw2,1);pd.forEach(function(c,i){if(c.mh==null)return;var v=parseFloat(c.mh),x=toX(i),y=toMY(v),bH=Math.abs(y-midM);ctx.fillStyle=v>=0?'rgba(63,185,80,0.65)':'rgba(248,81,73,0.65)';if(v>=0)ctx.fillRect(x,y,cw,bH);else ctx.fillRect(x,midM,cw,bH)})} function initChartScroll(wrapId){var wrap=document.getElementById(wrapId);if(!wrap)return;var isDown=false,startX,scrollLeft;wrap.addEventListener('mousedown',function(e){isDown=true;startX=e.pageX-wrap.offsetLeft;scrollLeft=wrap.scrollLeft});wrap.addEventListener('mouseleave',function(){isDown=false});wrap.addEventListener('mouseup',function(){isDown=false});wrap.addEventListener('mousemove',function(e){if(!isDown)return;e.preventDefault();wrap.scrollLeft=scrollLeft-(e.pageX-wrap.offsetLeft-startX)});wrap.addEventListener('touchstart',function(e){startX=e.touches[0].pageX-wrap.offsetLeft;scrollLeft=wrap.scrollLeft},{passive:true});wrap.addEventListener('touchmove',function(e){var x=e.touches[0].pageX-wrap.offsetLeft;wrap.scrollLeft=scrollLeft-(x-startX)},{passive:true});wrap.scrollLeft=wrap.scrollWidth} function doPing(){document.getElementById('ping-dot').textContent='pinging';authFetch('/dual-ping',{method:'POST'}).then(function(r){return r.json()}).then(function(d){var now=new Date().toISOString();if(d.kraken)addPingRow(Object.assign({},d.kraken,{time:now}));if(d.binance)addPingRow(Object.assign({},d.binance,{time:now}));document.getElementById('ping-dot').textContent='live';document.getElementById('ping-status').textContent='Last: '+new Date().toLocaleTimeString()}).catch(function(){document.getElementById('ping-dot').textContent='err';document.getElementById('ping-status').textContent='Failed'})} function addPingRow(p){var feed=document.getElementById('ping-feed');if(!feed)return;var sig=p.signal,col=sig==='buy'?'var(--green)':sig==='sell'?'var(--red)':'var(--text3)',icon=sig==='buy'?'BUY':sig==='sell'?'SELL':'WAIT',xc=p.exchange==='binance'?'chip-binance':'chip-kraken',price=p.price?'$'+parseFloat(p.price).toFixed(0):'-',rn=parseFloat(p.rsi)||50,rsi=p.rsi?rn.toFixed(1):'-',macd=p.macdHist?parseFloat(p.macdHist).toFixed(2):'-',rc=rn>70?'var(--red)':rn<30?'var(--green)':'var(--blue)',mc=(parseFloat(p.macdHist)||0)>0?'var(--green)':'var(--red)',strat=(p.activeStrategy||p.strategyId||'').replace(/-/g,' '),regime=p.currentRegime?'['+p.currentRegime+'] ':'',reason=p.error||(sig&&sig!=='none'?'score='+p.score:regime+(p.reasons||[])[0]||'');var row=document.createElement('div');row.className='feed-row';row.innerHTML=''+new Date(p.time).toLocaleTimeString()+''+(p.exchange||'').toUpperCase()+''+price+''+rsi+''+macd+''+icon+''+strat+''+reason+'';if(feed.children.length===1&&feed.children[0].querySelector&&feed.children[0].querySelector('.pulse'))feed.innerHTML='';feed.insertBefore(row,feed.firstChild);while(feed.children.length>60)feed.removeChild(feed.lastChild)} function startPingLoop(){doPing();pingTimer=setInterval(doPing,30000)} function tunerTab(ex){saveTunerState();currentTunerEx=ex;document.getElementById('tuner-tab-k').className='tab-btn'+(ex==='k'?' active':'');document.getElementById('tuner-tab-b').className='tab-btn'+(ex==='b'?' active':'');loadTunerState()} function saveTunerState(){tunerState[currentTunerEx]={strategy:document.getElementById('t-strategy').value,minScore:+document.getElementById('t-minscore').value,rsiBuy:+document.getElementById('t-rsibuy').value,rsiSell:+document.getElementById('t-rsisell').value,tpAtr:+document.getElementById('t-tpatr').value,slAtr:+document.getElementById('t-slatr').value,minTpPct:+document.getElementById('t-mintppc').value,maxHoldMinutes:+document.getElementById('t-hold').value,basePositionUsd:+document.getElementById('t-basepos').value,pollSeconds:+document.getElementById('t-poll').value,dynamicMode:document.getElementById('t-dynamic').checked}} function loadTunerState(){var s=tunerState[currentTunerEx];if(!s||!s.strategy)return;document.getElementById('t-strategy').value=s.strategy||'rsi-reversion';function sv(id,val,dId,fmt){document.getElementById(id).value=val;if(dId)document.getElementById(dId).textContent=fmt?fmt(val):val}sv('t-minscore',s.minScore||5,'t-minscore-v');sv('t-rsibuy',s.rsiBuy||33,'t-rsibuy-v');sv('t-rsisell',s.rsiSell||67,'t-rsisell-v');sv('t-tpatr',s.tpAtr||3.0,'t-tpatr-v',function(v){return(+v).toFixed(1)});sv('t-slatr',s.slAtr||1.8,'t-slatr-v',function(v){return(+v).toFixed(1)});sv('t-mintppc',s.minTpPct||0.25,'t-mintppc-v',function(v){return((+v)*100).toFixed(0)+'%'});sv('t-hold',s.maxHoldMinutes||60,'t-hold-v',function(v){return v+'min'});sv('t-basepos',s.basePositionUsd||300,'t-basepos-v',function(v){return';sv('t-poll',s.pollSeconds||30,'t-poll-v',function(v){return v+'s'});document.getElementById('t-dynamic').checked=s.dynamicMode||false} function saveTuner(){saveTunerState();authFetch('/settings/tuner',{method:'POST',body:JSON.stringify({k:tunerState.k,b:tunerState.b})}).then(function(r){return r.json()}).then(function(d){if(d.ok){var el=document.getElementById('tuner-saved');el.style.display='inline';setTimeout(function(){el.style.display='none'},2500)}}).catch(function(e){alert('Save failed: '+e.message)})} function loadSettings(){authFetch('/settings').then(function(r){return r.json()}).then(function(d){if(!d.settings)return;var s=d.settings,ke=document.getElementById('k-exp'),kl=document.getElementById('k-lev'),be=document.getElementById('b-exp'),bl=document.getElementById('b-lev');if(ke)ke.value=s.krakenMaxExposureUsd||1000;if(kl)kl.value=s.krakenLeverage||1;if(be)be.value=s.binanceMaxExposureUsd||1000;if(bl)bl.value=s.binanceLeverage||1;tunerState.k={strategy:s.krakenStrategy||'rsi-reversion',minScore:s.krakenMinScore||5,rsiBuy:s.krakenRsiBuy||33,rsiSell:s.krakenRsiSell||67,tpAtr:s.krakenTpAtr||3.0,slAtr:s.krakenSlAtr||1.8,minTpPct:s.krakenMinTpPct||0.25,maxHoldMinutes:s.krakenMaxHoldMinutes||60,basePositionUsd:s.krakenBasePositionUsd||300,pollSeconds:s.pollSeconds||30,dynamicMode:s.krakenDynamicMode||false};tunerState.b={strategy:s.binanceStrategy||'triple-ema',minScore:s.binanceMinScore||4,rsiBuy:s.binanceRsiBuy||35,rsiSell:s.binanceRsiSell||65,tpAtr:s.binanceTpAtr||2.5,slAtr:s.binanceSlAtr||1.5,minTpPct:s.binanceMinTpPct||0.2,maxHoldMinutes:s.binanceMaxHoldMinutes||60,basePositionUsd:s.binanceBasePositionUsd||300,pollSeconds:s.pollSeconds||30,dynamicMode:s.binanceDynamicMode||false};loadTunerState()}).catch(function(){})} function loadSettingsPage(){authFetch('/settings').then(function(r){return r.json()}).then(function(d){if(!d.settings)return;var kk=document.getElementById('s-k-key'),bk=document.getElementById('s-b-key');if(kk)kk.value=d.settings.krakenApiKey||'';if(bk)bk.value=d.settings.binanceApiKey||''}).catch(function(){})} function saveSettings(){var payload={krakenApiKey:document.getElementById('s-k-key').value,krakenApiSecret:document.getElementById('s-k-secret').value,binanceApiKey:document.getElementById('s-b-key').value,binanceApiSecret:document.getElementById('s-b-secret').value};authFetch('/settings',{method:'POST',body:JSON.stringify(payload)}).then(function(r){return r.json()}).then(function(d){if(d.ok){var el=document.getElementById('settings-saved');el.style.display='inline';setTimeout(function(){el.style.display='none'},2500)}}).catch(function(e){alert('Save failed: '+e.message)})} function saveCapital(ex){var p=ex[0],exp=+document.getElementById(p+'-exp').value,lev=+document.getElementById(p+'-lev').value,pl=ex==='kraken'?{krakenMaxExposureUsd:exp,krakenLeverage:lev}:{binanceMaxExposureUsd:exp,binanceLeverage:lev};authFetch('/settings',{method:'POST',body:JSON.stringify(pl)}).catch(function(){})} function changePassword(){var np=document.getElementById('s-newpass').value;if(!np||np.length<8){alert('Password must be at least 8 characters');return}var cp=prompt('Current password:');if(!cp)return;authFetch('/auth/password',{method:'POST',body:JSON.stringify({currentPassword:cp,newPassword:np})}).then(function(r){return r.json()}).then(function(d){if(d.ok){alert('Password changed');document.getElementById('s-newpass').value=''}else alert('Error: '+d.error)}).catch(function(){alert('Failed')})} function loadLedger(){var ef=document.getElementById('r-filter-ex'),df=document.getElementById('r-filter-days'),ex=ef?ef.value:'all',days=df?parseInt(df.value):0,lt=document.getElementById('ledger-table');if(lt)lt.innerHTML='
Loading...
';authFetch('/ledger').then(function(r){return r.json()}).then(function(all){var trades=all;if(ex!=='all')trades=trades.filter(function(t){return(t.exchange||'kraken').toLowerCase()===ex});if(days>0){var cutoff=Date.now()-days*86400000;trades=trades.filter(function(t){return(t.closedAt||0)>=cutoff})}if(!trades.length){if(lt)lt.innerHTML='
No trades found
';return}var wins=trades.filter(function(t){return t.pnl>0}),losses=trades.filter(function(t){return t.pnl<=0}),total=trades.reduce(function(a,t){return a+(t.pnl||0)},0),avgW=wins.length?wins.reduce(function(a,t){return a+t.pnl},0)/wins.length:0,avgL=losses.length?Math.abs(losses.reduce(function(a,t){return a+t.pnl},0)/losses.length):0,pf=avgL>0?(avgW*wins.length)/(avgL*losses.length):wins.length>0?999:0,best=trades.reduce(function(a,t){return t.pnl>a?t.pnl:a},-Infinity),worst=trades.reduce(function(a,t){return t.pnl=0?'var(--green)':'var(--red)');setText('r-trades',trades.length);setText('r-wr',trades.length?(wins.length/trades.length*100).toFixed(1)+'%':'-');setText('r-pf',pf===999?'inf':pf.toFixed(2),pf>=1?'var(--green)':'var(--red)');setText('r-avgw','$'+avgW.toFixed(3));setText('r-avgl','$'+avgL.toFixed(3));setText('r-best',best===(-Infinity)?'-':'$'+best.toFixed(3));setText('r-worst',worst===Infinity?'-':'$'+worst.toFixed(3));var exits={};trades.forEach(function(t){var r=t.exitReason||'unknown';exits[r]=(exits[r]||0)+1});var ec={take_profit:'var(--green)',stop_loss:'var(--red)',timeout:'var(--amber)',unknown:'var(--text3)'};var xe=document.getElementById('r-exits');if(xe)xe.innerHTML=Object.entries(exits).map(function(e){return'
'+e[0].replace(/_/g,' ')+''+e[1]+'('+( e[1]/trades.length*100).toFixed(0)+'%)
'}).join('');var byS={};trades.forEach(function(t){var k=t.strategy||'unknown';if(!byS[k])byS[k]=[];byS[k].push(t)});var se=document.getElementById('r-by-strat');if(se){var rows=Object.entries(byS).map(function(e){var st=e[1],sw=st.filter(function(t){return t.pnl>0}),sp=st.reduce(function(a,t){return a+(t.pnl||0)},0),swr=(sw.length/st.length*100).toFixed(0);return''+e[0].replace(/-/g,' ')+''+st.length+''+(sp>=0?'+':'')+'$'+sp.toFixed(2)+''+swr+'%$'+(sw.length?sw.reduce(function(a,t){return a+t.pnl},0)/sw.length:0).toFixed(3)+''}).join('');se.innerHTML=''+rows+'
StrategyTradesP&LWin RateAvg Win
'}if(lt){var tr=trades.slice(0,200).map(function(t){var xc=(t.exchange||'').toLowerCase()==='binance'?'chip-binance':'chip-kraken',ec2=t.exitReason==='take_profit'?'var(--green)':t.exitReason==='stop_loss'?'var(--red)':'var(--amber)';return''+new Date(t.closedAt).toLocaleString()+''+(t.exchange||'KRK').toUpperCase()+''+(t.side||'').toUpperCase()+'$'+(t.entry||0).toFixed(0)+'$'+(t.exit||0).toFixed(0)+''+(t.pnl>=0?'+':'')+'$'+(t.pnl||0).toFixed(3)+''+(t.exitReason||'-').replace(/_/g,' ')+''+(t.strategy||'').replace(/-/g,' ')+''}).join('');lt.innerHTML=''+tr+'
DateExchSideEntryExitP&LExit ReasonStrategy
'+(trades.length>200?'
Showing 200 of '+trades.length+'
':'')}}).catch(function(){if(lt)lt.innerHTML='
Failed to load
'})} function exportCSV(){authFetch('/ledger').then(function(r){return r.json()}).then(function(trades){var h=['Date','Exchange','Side','Entry','Exit','PnL','ExitReason','Strategy'],rows=trades.map(function(t){return[new Date(t.closedAt).toISOString(),(t.exchange||''),(t.side||''),(t.entry||0).toFixed(2),(t.exit||0).toFixed(2),(t.pnl||0).toFixed(4),(t.exitReason||''),(t.strategy||'')]});var csv=[h].concat(rows).map(function(r){return r.join(',')}).join(String.fromCharCode(10));var a=document.createElement('a');a.href=URL.createObjectURL(new Blob([csv],{type:'text/csv'}));a.download='trades-'+new Date().toISOString().slice(0,10)+'.csv';a.click()})} function loadSummary(){authFetch('/summary').then(function(r){return r.json()}).then(function(d){if(!d.overall)return;setText('s-total','$'+(d.overall.totalPnl||0).toFixed(2),d.overall.totalPnl>=0?'var(--green)':'var(--red)');setText('s-today','$'+(d.today.totalPnl||0).toFixed(2),d.today.totalPnl>=0?'var(--green)':'var(--red)');setText('s-week','$'+(d.thisWeek.totalPnl||0).toFixed(2),d.thisWeek.totalPnl>=0?'var(--green)':'var(--red)');setText('s-wr',(d.overall.winRate||0).toFixed(1)+'%',d.overall.winRate>=50?'var(--green)':'var(--red)');var daily=Object.entries(d.daily||{}).slice(-30);if(daily.length)drawBarChart('summary-chart',daily.map(function(e){return{label:e[0].slice(5),value:e[1].totalPnl||0}}));if(d.byStrategy&&d.byStrategy.length){document.getElementById('strat-perf').innerHTML=''+d.byStrategy.map(function(s){return''}).join('')+'
StrategyTradesP&LWin RateAvg WinAvg Loss
'+(s.strategyId||'').replace(/-/g,' ')+''+s.trades+'$'+(s.totalPnl||0).toFixed(2)+''+(s.winRate||0).toFixed(1)+'%$'+(s.avgWin||0).toFixed(3)+'$'+(s.avgLoss||0).toFixed(3)+'
'}else{document.getElementById('strat-perf').textContent='No data yet'}}).catch(function(){})} function drawBarChart(id,data){var cv=document.getElementById(id);if(!cv||!data.length)return;var ctx=cv.getContext('2d'),W=cv.offsetWidth||600,H=cv.height;cv.width=W;cv.height=H;ctx.clearRect(0,0,W,H);var vals=data.map(function(d){return d.value}),max=Math.max(Math.abs(Math.max.apply(null,vals)),Math.abs(Math.min.apply(null,vals)),0.01),bw=W/data.length-2,midY=H/2;data.forEach(function(d,i){var h=Math.abs(d.value)/max*(H/2-10),x=i*(W/data.length)+1;ctx.fillStyle=d.value>=0?'rgba(63,185,80,0.7)':'rgba(248,81,73,0.7)';if(d.value>=0)ctx.fillRect(x,midY-h,bw,h);else ctx.fillRect(x,midY,bw,h)});ctx.strokeStyle='rgba(139,148,158,0.2)';ctx.beginPath();ctx.moveTo(0,midY);ctx.lineTo(W,midY);ctx.stroke()} function loadPositions(){Promise.all([authFetch('/kraken/status').then(function(r){return r.json()}).catch(function(){return null}),authFetch('/binance/status').then(function(r){return r.json()}).catch(function(){return null})]).then(function(res){var ks=res[0],bs=res[1],op=[ks&&ks.position,bs&&bs.position].filter(Boolean),pc=document.getElementById('positions-content');if(pc)pc.innerHTML=op.length?op.map(function(p){return'
'+(p.side||'').toUpperCase()+' $'+(p.entry||0).toFixed(0)+' TP: $'+(p.tp||0).toFixed(0)+' SL: $'+(p.sl||0).toFixed(0)+'
'}).join(''):'
No open positions
';var all=(ks?ks.recentTrades||[]:[]).map(function(t){return Object.assign({},t,{exchange:'kraken'})}).concat((bs?bs.recentTrades||[]:[]).map(function(t){return Object.assign({},t,{exchange:'binance'})})).sort(function(a,b){return(b.closedAt||0)-(a.closedAt||0)});var btc=document.getElementById('bot-trades-content');if(btc)btc.innerHTML=all.length?''+all.slice(0,30).map(function(t){var xc=t.exchange==='binance'?'chip-binance':'chip-kraken',ec=t.exitReason==='take_profit'?'var(--green)':t.exitReason==='stop_loss'?'var(--red)':'var(--amber)';return''}).join('')+'
TimeExchSideEntryExitP&LReason
'+new Date(t.closedAt||Date.now()).toLocaleTimeString()+''+(t.exchange||'').toUpperCase()+''+(t.side||'').toUpperCase()+'$'+(t.entry||0).toFixed(0)+'$'+(t.exit||0).toFixed(0)+''+(t.pnl>=0?'+':'')+'$'+(t.pnl||0).toFixed(3)+''+(t.exitReason||'-')+'
':'
No trades yet
'}).catch(function(){})} function setText(id,val,color){var el=document.getElementById(id);if(!el)return;el.textContent=val;if(color)el.style.color=color} function refreshAll(){refreshStatus();doPing();loadSummary()} function toggleTheme(){var l=document.body.classList.toggle('light');document.querySelectorAll('#theme-btn').forEach(function(b){b.textContent=l?'☀️':'🌙'});localStorage.setItem('dt_theme',l?'light':'dark');setTimeout(refreshStatus,100)} var chartState={ k:{interval:'5',zoom:5.0,history:null}, b:{interval:'5',zoom:5.0,history:null} } function setChartInterval(p,interval){ chartState[p].interval=interval // Update button styles var ex=p==='k'?'kraken':'binance' var activeColor=p==='k'?'rgba(88,166,255,.15)':'rgba(227,179,65,.15)' var activeText=p==='k'?'var(--blue)':'var(--amber)' ;['5','60','240','1440'].forEach(function(i){ var btn=document.getElementById(p+'-int-'+i) if(btn){btn.style.background=i===interval?activeColor:'';btn.style.color=i===interval?activeText:''} }) // Fetch historical data for this interval loadChartHistory(p, interval) } function loadChartHistory(p, interval){ var ex=p==='k'?'kraken':'binance' authFetch('/'+ex+'/history?interval='+interval) .then(function(r){return r.json()}) .then(function(d){ if(d.candles&&d.candles.length){ chartState[p].history=d.candles renderChart(p) } }).catch(function(){}) } function zoomChart(p, dir){ var z=chartState[p].zoom if(dir>0) z=Math.min(z*1.3, 8.0) else z=Math.max(z/1.3, 0.3) chartState[p].zoom=z renderChart(p) } function renderChart(p){ var state=chartState[p] var candles=state.history // Fall back to live candles if no history loaded if(!candles||!candles.length){ var liveStatus=p==='k'?window._kStatus:window._bStatus if(liveStatus&&liveStatus.candles) candles=liveStatus.candles } if(!candles||!candles.length) return var maxC=Math.round(200/state.zoom) drawChart(p+'-chart', candles, Math.max(10, maxC)) setTimeout(function(){var w=document.getElementById(p+'-chart-wrap');if(w)w.scrollLeft=w.scrollWidth},50) } var chartState={ k:{interval:'5',zoom:5.0,history:null}, b:{interval:'5',zoom:5.0,history:null} } function setChartInterval(p,interval){ chartState[p].interval=interval // Update button styles var ex=p==='k'?'kraken':'binance' var activeColor=p==='k'?'rgba(88,166,255,.15)':'rgba(227,179,65,.15)' var activeText=p==='k'?'var(--blue)':'var(--amber)' ;['5','60','240','1440'].forEach(function(i){ var btn=document.getElementById(p+'-int-'+i) if(btn){btn.style.background=i===interval?activeColor:'';btn.style.color=i===interval?activeText:''} }) // Fetch historical data for this interval loadChartHistory(p, interval) } function loadChartHistory(p, interval){ var ex=p==='k'?'kraken':'binance' authFetch('/'+ex+'/history?interval='+interval) .then(function(r){return r.json()}) .then(function(d){ if(d.candles&&d.candles.length){ chartState[p].history=d.candles renderChart(p) } }).catch(function(){}) } function zoomChart(p, dir){ var z=chartState[p].zoom if(dir>0) z=Math.min(z*1.3, 8.0) else z=Math.max(z/1.3, 0.3) chartState[p].zoom=z renderChart(p) } function renderChart(p){ var state=chartState[p] var candles=state.history // Fall back to live candles if no history loaded if(!candles||!candles.length){ var liveStatus=p==='k'?window._kStatus:window._bStatus if(liveStatus&&liveStatus.candles) candles=liveStatus.candles } if(!candles||!candles.length) return var maxC=Math.round(200/state.zoom) drawChart(p+'-chart', candles, Math.max(10, maxC)) setTimeout(function(){var w=document.getElementById(p+'-chart-wrap');if(w)w.scrollLeft=w.scrollWidth},50) } if(localStorage.getItem('dt_theme')==='light'){document.body.classList.add('light');document.addEventListener('DOMContentLoaded',function(){document.querySelectorAll('#theme-btn').forEach(function(b){b.textContent='☀️'})})} if(token){fetch('/auth/me',{headers:{'Authorization':'Bearer '+token}}).then(function(r){return r.json()}).then(function(d){if(d.ok){user=d.user;initApp()}else window.location.href='/login'}).catch(function(){window.location.href='/login'})}else{window.location.href='/login'} +Number(this.value).toLocaleString()">
P&L Summary
All-Time P&L
-
Today
-
This Week
-
Win Rate
-
Daily P&L
By Strategy
No data yet
Reports & Ledger
Total P&L
-
Trades
-
Win Rate
-
Profit Factor
-
Avg Win
-
Avg Loss
-
Exit Breakdown
By Strategy
Trade Ledger
Loading...
Settings
Subscription
Loading...
KRAKENAPI Keys
BINANCEAPI Keys
Account
Help & Setup Guide
Quick Start
1Create API keys on Kraken Futures and/or Binance (see below)
2Go to Settings and enter your API keys
3Start in Paper mode to test without real money
4Enable Dynamic Mode in Strategy Tuner for auto regime detection
5Click Start — your bot runs 24/7 on our servers
Kraken Futures API Setup

1. Log into pro.kraken.com (not regular Kraken)

2. Settings → API → Create API Key

3. Permissions: Query Funds, Query Orders, Create Orders, Cancel Orders

Do NOT enable Withdraw permissions

4. IP Restriction: 178.128.43.8

Symbol: PI_XBTUSD (BTC Perpetual Futures)

Binance Futures API Setup

1. Log into binance.com → API Management → Create API Key

2. Permissions: Enable Reading + Enable Futures (required)

Do NOT enable Spot Trading or Withdrawals

IP Restriction required: 178.128.43.8

Symbol: BTCUSDT (USDT-M Perpetual Futures)

Dynamic Strategy Engine
When Dynamic Mode is ON the engine picks the best strategy every 30 minutes automatically.
Trending UpTriple EMA, long-only Trending DownTriple EMA, short-only RangingRSI Mean Reversion VolatileBB Squeeze breakout ChaoticFLAT - no trades
FAQ
Does the bot keep running if I close my browser?
Yes. The bot runs on our servers 24/7 regardless of your browser or computer.
Does it restart after a server reboot?
Yes. Bots auto-restart with the same settings after any server reboot.
Can the bot withdraw my funds?
No. API keys only need trading permissions. Never enable withdrawal permissions.
Why is my Binance feed not working?
Binance API key must have Futures enabled AND be IP-restricted to 178.128.43.8. Both required.
Pause vs Stop?
Stop resets session stats. Pause preserves all session P&L, streak and history.
+Number(v).toLocaleString()});sv('t-poll',s.pollSeconds||30,'t-poll-v',function(v){return v+'s'});document.getElementById('t-dynamic').checked=s.dynamicMode||false} function saveTuner(){saveTunerState();authFetch('/settings/tuner',{method:'POST',body:JSON.stringify({k:tunerState.k,b:tunerState.b})}).then(function(r){return r.json()}).then(function(d){if(d.ok){var el=document.getElementById('tuner-saved');el.style.display='inline';setTimeout(function(){el.style.display='none'},2500)}}).catch(function(e){alert('Save failed: '+e.message)})} function loadSettings(){authFetch('/settings').then(function(r){return r.json()}).then(function(d){if(!d.settings)return;var s=d.settings,ke=document.getElementById('k-exp'),kl=document.getElementById('k-lev'),be=document.getElementById('b-exp'),bl=document.getElementById('b-lev');if(ke)ke.value=s.krakenMaxExposureUsd||1000;if(kl)kl.value=s.krakenLeverage||1;if(be)be.value=s.binanceMaxExposureUsd||1000;if(bl)bl.value=s.binanceLeverage||1;tunerState.k={strategy:s.krakenStrategy||'rsi-reversion',minScore:s.krakenMinScore||5,rsiBuy:s.krakenRsiBuy||33,rsiSell:s.krakenRsiSell||67,tpAtr:s.krakenTpAtr||3.0,slAtr:s.krakenSlAtr||1.8,minTpPct:s.krakenMinTpPct||0.25,maxHoldMinutes:s.krakenMaxHoldMinutes||60,basePositionUsd:s.krakenBasePositionUsd||300,pollSeconds:s.pollSeconds||30,dynamicMode:s.krakenDynamicMode||false};tunerState.b={strategy:s.binanceStrategy||'triple-ema',minScore:s.binanceMinScore||4,rsiBuy:s.binanceRsiBuy||35,rsiSell:s.binanceRsiSell||65,tpAtr:s.binanceTpAtr||2.5,slAtr:s.binanceSlAtr||1.5,minTpPct:s.binanceMinTpPct||0.2,maxHoldMinutes:s.binanceMaxHoldMinutes||60,basePositionUsd:s.binanceBasePositionUsd||300,pollSeconds:s.pollSeconds||30,dynamicMode:s.binanceDynamicMode||false};loadTunerState()}).catch(function(){})} function loadSettingsPage(){authFetch('/settings').then(function(r){return r.json()}).then(function(d){if(!d.settings)return;var kk=document.getElementById('s-k-key'),bk=document.getElementById('s-b-key');if(kk)kk.value=d.settings.krakenApiKey||'';if(bk)bk.value=d.settings.binanceApiKey||''}).catch(function(){})} function saveSettings(){var payload={krakenApiKey:document.getElementById('s-k-key').value,krakenApiSecret:document.getElementById('s-k-secret').value,binanceApiKey:document.getElementById('s-b-key').value,binanceApiSecret:document.getElementById('s-b-secret').value};authFetch('/settings',{method:'POST',body:JSON.stringify(payload)}).then(function(r){return r.json()}).then(function(d){if(d.ok){var el=document.getElementById('settings-saved');el.style.display='inline';setTimeout(function(){el.style.display='none'},2500)}}).catch(function(e){alert('Save failed: '+e.message)})} function saveCapital(ex){var p=ex[0],exp=+document.getElementById(p+'-exp').value,lev=+document.getElementById(p+'-lev').value,pl=ex==='kraken'?{krakenMaxExposureUsd:exp,krakenLeverage:lev}:{binanceMaxExposureUsd:exp,binanceLeverage:lev};authFetch('/settings',{method:'POST',body:JSON.stringify(pl)}).catch(function(){})} function changePassword(){var np=document.getElementById('s-newpass').value;if(!np||np.length<8){alert('Password must be at least 8 characters');return}var cp=prompt('Current password:');if(!cp)return;authFetch('/auth/password',{method:'POST',body:JSON.stringify({currentPassword:cp,newPassword:np})}).then(function(r){return r.json()}).then(function(d){if(d.ok){alert('Password changed');document.getElementById('s-newpass').value=''}else alert('Error: '+d.error)}).catch(function(){alert('Failed')})} function loadLedger(){var ef=document.getElementById('r-filter-ex'),df=document.getElementById('r-filter-days'),ex=ef?ef.value:'all',days=df?parseInt(df.value):0,lt=document.getElementById('ledger-table');if(lt)lt.innerHTML='
Loading...
';authFetch('/ledger').then(function(r){return r.json()}).then(function(all){var trades=all;if(ex!=='all')trades=trades.filter(function(t){return(t.exchange||'kraken').toLowerCase()===ex});if(days>0){var cutoff=Date.now()-days*86400000;trades=trades.filter(function(t){return(t.closedAt||0)>=cutoff})}if(!trades.length){if(lt)lt.innerHTML='
No trades found
';return}var wins=trades.filter(function(t){return t.pnl>0}),losses=trades.filter(function(t){return t.pnl<=0}),total=trades.reduce(function(a,t){return a+(t.pnl||0)},0),avgW=wins.length?wins.reduce(function(a,t){return a+t.pnl},0)/wins.length:0,avgL=losses.length?Math.abs(losses.reduce(function(a,t){return a+t.pnl},0)/losses.length):0,pf=avgL>0?(avgW*wins.length)/(avgL*losses.length):wins.length>0?999:0,best=trades.reduce(function(a,t){return t.pnl>a?t.pnl:a},-Infinity),worst=trades.reduce(function(a,t){return t.pnl=0?'var(--green)':'var(--red)');setText('r-trades',trades.length);setText('r-wr',trades.length?(wins.length/trades.length*100).toFixed(1)+'%':'-');setText('r-pf',pf===999?'inf':pf.toFixed(2),pf>=1?'var(--green)':'var(--red)');setText('r-avgw','$'+avgW.toFixed(3));setText('r-avgl','$'+avgL.toFixed(3));setText('r-best',best===(-Infinity)?'-':'$'+best.toFixed(3));setText('r-worst',worst===Infinity?'-':'$'+worst.toFixed(3));var exits={};trades.forEach(function(t){var r=t.exitReason||'unknown';exits[r]=(exits[r]||0)+1});var ec={take_profit:'var(--green)',stop_loss:'var(--red)',timeout:'var(--amber)',unknown:'var(--text3)'};var xe=document.getElementById('r-exits');if(xe)xe.innerHTML=Object.entries(exits).map(function(e){return'
'+e[0].replace(/_/g,' ')+''+e[1]+'('+( e[1]/trades.length*100).toFixed(0)+'%)
'}).join('');var byS={};trades.forEach(function(t){var k=t.strategy||'unknown';if(!byS[k])byS[k]=[];byS[k].push(t)});var se=document.getElementById('r-by-strat');if(se){var rows=Object.entries(byS).map(function(e){var st=e[1],sw=st.filter(function(t){return t.pnl>0}),sp=st.reduce(function(a,t){return a+(t.pnl||0)},0),swr=(sw.length/st.length*100).toFixed(0);return''+e[0].replace(/-/g,' ')+''+st.length+''+(sp>=0?'+':'')+'$'+sp.toFixed(2)+''+swr+'%$'+(sw.length?sw.reduce(function(a,t){return a+t.pnl},0)/sw.length:0).toFixed(3)+''}).join('');se.innerHTML=''+rows+'
StrategyTradesP&LWin RateAvg Win
'}if(lt){var tr=trades.slice(0,200).map(function(t){var xc=(t.exchange||'').toLowerCase()==='binance'?'chip-binance':'chip-kraken',ec2=t.exitReason==='take_profit'?'var(--green)':t.exitReason==='stop_loss'?'var(--red)':'var(--amber)';return''+new Date(t.closedAt).toLocaleString()+''+(t.exchange||'KRK').toUpperCase()+''+(t.side||'').toUpperCase()+'$'+(t.entry||0).toFixed(0)+'$'+(t.exit||0).toFixed(0)+''+(t.pnl>=0?'+':'')+'$'+(t.pnl||0).toFixed(3)+''+(t.exitReason||'-').replace(/_/g,' ')+''+(t.strategy||'').replace(/-/g,' ')+''}).join('');lt.innerHTML=''+tr+'
DateExchSideEntryExitP&LExit ReasonStrategy
'+(trades.length>200?'
Showing 200 of '+trades.length+'
':'')}}).catch(function(){if(lt)lt.innerHTML='
Failed to load
'})} function exportCSV(){authFetch('/ledger').then(function(r){return r.json()}).then(function(trades){var h=['Date','Exchange','Side','Entry','Exit','PnL','ExitReason','Strategy'],rows=trades.map(function(t){return[new Date(t.closedAt).toISOString(),(t.exchange||''),(t.side||''),(t.entry||0).toFixed(2),(t.exit||0).toFixed(2),(t.pnl||0).toFixed(4),(t.exitReason||''),(t.strategy||'')]});var csv=[h].concat(rows).map(function(r){return r.join(',')}).join(String.fromCharCode(10));var a=document.createElement('a');a.href=URL.createObjectURL(new Blob([csv],{type:'text/csv'}));a.download='trades-'+new Date().toISOString().slice(0,10)+'.csv';a.click()})} function loadSummary(){authFetch('/summary').then(function(r){return r.json()}).then(function(d){if(!d.overall)return;setText('s-total','$'+(d.overall.totalPnl||0).toFixed(2),d.overall.totalPnl>=0?'var(--green)':'var(--red)');setText('s-today','$'+(d.today.totalPnl||0).toFixed(2),d.today.totalPnl>=0?'var(--green)':'var(--red)');setText('s-week','$'+(d.thisWeek.totalPnl||0).toFixed(2),d.thisWeek.totalPnl>=0?'var(--green)':'var(--red)');setText('s-wr',(d.overall.winRate||0).toFixed(1)+'%',d.overall.winRate>=50?'var(--green)':'var(--red)');var daily=Object.entries(d.daily||{}).slice(-30);if(daily.length)drawBarChart('summary-chart',daily.map(function(e){return{label:e[0].slice(5),value:e[1].totalPnl||0}}));if(d.byStrategy&&d.byStrategy.length){document.getElementById('strat-perf').innerHTML=''+d.byStrategy.map(function(s){return''}).join('')+'
StrategyTradesP&LWin RateAvg WinAvg Loss
'+(s.strategyId||'').replace(/-/g,' ')+''+s.trades+'$'+(s.totalPnl||0).toFixed(2)+''+(s.winRate||0).toFixed(1)+'%$'+(s.avgWin||0).toFixed(3)+'$'+(s.avgLoss||0).toFixed(3)+'
'}else{document.getElementById('strat-perf').textContent='No data yet'}}).catch(function(){})} function drawBarChart(id,data){var cv=document.getElementById(id);if(!cv||!data.length)return;var ctx=cv.getContext('2d'),W=cv.offsetWidth||600,H=cv.height;cv.width=W;cv.height=H;ctx.clearRect(0,0,W,H);var vals=data.map(function(d){return d.value}),max=Math.max(Math.abs(Math.max.apply(null,vals)),Math.abs(Math.min.apply(null,vals)),0.01),bw=W/data.length-2,midY=H/2;data.forEach(function(d,i){var h=Math.abs(d.value)/max*(H/2-10),x=i*(W/data.length)+1;ctx.fillStyle=d.value>=0?'rgba(63,185,80,0.7)':'rgba(248,81,73,0.7)';if(d.value>=0)ctx.fillRect(x,midY-h,bw,h);else ctx.fillRect(x,midY,bw,h)});ctx.strokeStyle='rgba(139,148,158,0.2)';ctx.beginPath();ctx.moveTo(0,midY);ctx.lineTo(W,midY);ctx.stroke()} function loadPositions(){Promise.all([authFetch('/kraken/status').then(function(r){return r.json()}).catch(function(){return null}),authFetch('/binance/status').then(function(r){return r.json()}).catch(function(){return null})]).then(function(res){var ks=res[0],bs=res[1],op=[ks&&ks.position,bs&&bs.position].filter(Boolean),pc=document.getElementById('positions-content');if(pc)pc.innerHTML=op.length?op.map(function(p){return'
'+(p.side||'').toUpperCase()+' $'+(p.entry||0).toFixed(0)+' TP: $'+(p.tp||0).toFixed(0)+' SL: $'+(p.sl||0).toFixed(0)+'
'}).join(''):'
No open positions
';var all=(ks?ks.recentTrades||[]:[]).map(function(t){return Object.assign({},t,{exchange:'kraken'})}).concat((bs?bs.recentTrades||[]:[]).map(function(t){return Object.assign({},t,{exchange:'binance'})})).sort(function(a,b){return(b.closedAt||0)-(a.closedAt||0)});var btc=document.getElementById('bot-trades-content');if(btc)btc.innerHTML=all.length?''+all.slice(0,30).map(function(t){var xc=t.exchange==='binance'?'chip-binance':'chip-kraken',ec=t.exitReason==='take_profit'?'var(--green)':t.exitReason==='stop_loss'?'var(--red)':'var(--amber)';return''}).join('')+'
TimeExchSideEntryExitP&LReason
'+new Date(t.closedAt||Date.now()).toLocaleTimeString()+''+(t.exchange||'').toUpperCase()+''+(t.side||'').toUpperCase()+'$'+(t.entry||0).toFixed(0)+'$'+(t.exit||0).toFixed(0)+''+(t.pnl>=0?'+':'')+'$'+(t.pnl||0).toFixed(3)+''+(t.exitReason||'-')+'
':'
No trades yet
'}).catch(function(){})} function setText(id,val,color){var el=document.getElementById(id);if(!el)return;el.textContent=val;if(color)el.style.color=color} function refreshAll(){refreshStatus();doPing();loadSummary()} function toggleTheme(){var l=document.body.classList.toggle('light');document.querySelectorAll('#theme-btn').forEach(function(b){b.textContent=l?'☀️':'🌙'});localStorage.setItem('dt_theme',l?'light':'dark');setTimeout(refreshStatus,100)} var chartState={ k:{interval:'5',zoom:5.0,history:null}, b:{interval:'5',zoom:5.0,history:null} } function setChartInterval(p,interval){ chartState[p].interval=interval // Update button styles var ex=p==='k'?'kraken':'binance' var activeColor=p==='k'?'rgba(88,166,255,.15)':'rgba(227,179,65,.15)' var activeText=p==='k'?'var(--blue)':'var(--amber)' ;['5','60','240','1440'].forEach(function(i){ var btn=document.getElementById(p+'-int-'+i) if(btn){btn.style.background=i===interval?activeColor:'';btn.style.color=i===interval?activeText:''} }) // Fetch historical data for this interval loadChartHistory(p, interval) } function loadChartHistory(p, interval){ var ex=p==='k'?'kraken':'binance' authFetch('/'+ex+'/history?interval='+interval) .then(function(r){return r.json()}) .then(function(d){ if(d.candles&&d.candles.length){ chartState[p].history=d.candles renderChart(p) } }).catch(function(){}) } function zoomChart(p, dir){ var z=chartState[p].zoom if(dir>0) z=Math.min(z*1.3, 8.0) else z=Math.max(z/1.3, 0.3) chartState[p].zoom=z renderChart(p) } function renderChart(p){ var state=chartState[p] var candles=state.history // Fall back to live candles if no history loaded if(!candles||!candles.length){ var liveStatus=p==='k'?window._kStatus:window._bStatus if(liveStatus&&liveStatus.candles) candles=liveStatus.candles } if(!candles||!candles.length) return var maxC=Math.round(200/state.zoom) drawChart(p+'-chart', candles, Math.max(10, maxC)) setTimeout(function(){var w=document.getElementById(p+'-chart-wrap');if(w)w.scrollLeft=w.scrollWidth},50) } var chartState={ k:{interval:'5',zoom:5.0,history:null}, b:{interval:'5',zoom:5.0,history:null} } function setChartInterval(p,interval){ chartState[p].interval=interval // Update button styles var ex=p==='k'?'kraken':'binance' var activeColor=p==='k'?'rgba(88,166,255,.15)':'rgba(227,179,65,.15)' var activeText=p==='k'?'var(--blue)':'var(--amber)' ;['5','60','240','1440'].forEach(function(i){ var btn=document.getElementById(p+'-int-'+i) if(btn){btn.style.background=i===interval?activeColor:'';btn.style.color=i===interval?activeText:''} }) // Fetch historical data for this interval loadChartHistory(p, interval) } function loadChartHistory(p, interval){ var ex=p==='k'?'kraken':'binance' authFetch('/'+ex+'/history?interval='+interval) .then(function(r){return r.json()}) .then(function(d){ if(d.candles&&d.candles.length){ chartState[p].history=d.candles renderChart(p) } }).catch(function(){}) } function zoomChart(p, dir){ var z=chartState[p].zoom if(dir>0) z=Math.min(z*1.3, 8.0) else z=Math.max(z/1.3, 0.3) chartState[p].zoom=z renderChart(p) } function renderChart(p){ var state=chartState[p] var candles=state.history // Fall back to live candles if no history loaded if(!candles||!candles.length){ var liveStatus=p==='k'?window._kStatus:window._bStatus if(liveStatus&&liveStatus.candles) candles=liveStatus.candles } if(!candles||!candles.length) return var maxC=Math.round(200/state.zoom) drawChart(p+'-chart', candles, Math.max(10, maxC)) setTimeout(function(){var w=document.getElementById(p+'-chart-wrap');if(w)w.scrollLeft=w.scrollWidth},50) } if(localStorage.getItem('dt_theme')==='light'){document.body.classList.add('light');document.addEventListener('DOMContentLoaded',function(){document.querySelectorAll('#theme-btn').forEach(function(b){b.textContent='☀️'})})} if(token){fetch('/auth/me',{headers:{'Authorization':'Bearer '+token}}).then(function(r){return r.json()}).then(function(d){if(d.ok){user=d.user;initApp()}else window.location.href='/login'}).catch(function(){window.location.href='/login'})}else{window.location.href='/login'} +Number(this.value).toLocaleString()">
P&L Summary
All-Time P&L
-
Today
-
This Week
-
Win Rate
-
Daily P&L
By Strategy
No data yet
Reports & Ledger
Total P&L
-
Trades
-
Win Rate
-
Profit Factor
-
Avg Win
-
Avg Loss
-
Exit Breakdown
By Strategy
Trade Ledger
Loading...
Settings
Subscription
Loading...
KRAKENAPI Keys
BINANCEAPI Keys
Account
Help & Setup Guide
Quick Start
1Create API keys on Kraken Futures and/or Binance (see below)
2Go to Settings and enter your API keys
3Start in Paper mode to test without real money
4Enable Dynamic Mode in Strategy Tuner for auto regime detection
5Click Start — your bot runs 24/7 on our servers
Kraken Futures API Setup

1. Log into pro.kraken.com (not regular Kraken)

2. Settings → API → Create API Key

3. Permissions: Query Funds, Query Orders, Create Orders, Cancel Orders

Do NOT enable Withdraw permissions

4. IP Restriction: 178.128.43.8

Symbol: PI_XBTUSD (BTC Perpetual Futures)

Binance Futures API Setup

1. Log into binance.com → API Management → Create API Key

2. Permissions: Enable Reading + Enable Futures (required)

Do NOT enable Spot Trading or Withdrawals

IP Restriction required: 178.128.43.8

Symbol: BTCUSDT (USDT-M Perpetual Futures)

Dynamic Strategy Engine
When Dynamic Mode is ON the engine picks the best strategy every 30 minutes automatically.
Trending UpTriple EMA, long-only Trending DownTriple EMA, short-only RangingRSI Mean Reversion VolatileBB Squeeze breakout ChaoticFLAT - no trades
FAQ
Does the bot keep running if I close my browser?
Yes. The bot runs on our servers 24/7 regardless of your browser or computer.
Does it restart after a server reboot?
Yes. Bots auto-restart with the same settings after any server reboot.
Can the bot withdraw my funds?
No. API keys only need trading permissions. Never enable withdrawal permissions.
Why is my Binance feed not working?
Binance API key must have Futures enabled AND be IP-restricted to 178.128.43.8. Both required.
Pause vs Stop?
Stop resets session stats. Pause preserves all session P&L, streak and history.