--b to buy, s to sell, h to reset, n to kill --if ever in doubt look at Gui --made with a brain, design by ai. fuck design local RS = game:GetService("ReplicatedStorage") local Players = game:GetService("Players") local UIS = game:GetService("UserInputService") local player = Players.LocalPlayer --REMOTES local buyRemote, sellRemote, exchangeRemote, watchRemote for _, v in pairs(RS:GetDescendants()) do if v:IsA("RemoteFunction") then if v.Name == "MarketBuyPoints" and not buyRemote then buyRemote = v elseif v.Name == "MarketSellPoints" and not sellRemote then sellRemote = v elseif v.Name == "RequestExchange" and not exchangeRemote then exchangeRemote = v elseif v.Name == "WatchStock" and not watchRemote then watchRemote = v end end end -- STATE local targetIdRaw = nil local targetId = nil local pricePerShare = nil -- Best estimate (updated from buys AND sells) local buyCount = 0 local sellCount = 0 local cycles = 0 local mode = "detecting" local running = true local lastSnapShares = {} local lastSnapPoints = 0 local totalInvested = 0 local totalReturned = 0 -- DATA local dataStore = {Shares = {}, Points = 0} for _, v in pairs(RS:GetDescendants()) do if v.Name == "DataUpdate" and v:IsA("RemoteEvent") then v.OnClientEvent:Connect(function(data) if type(data) == "table" then if data.Shares then dataStore.Shares = data.Shares end if data.Points then dataStore.Points = data.Points end end end) end end -- HELPERS local function fmt(n) if not n then return "---" end if n >= 1e15 then return string.format("%.2fQ", n/1e15) elseif n >= 1e12 then return string.format("%.2fT", n/1e12) elseif n >= 1e9 then return string.format("%.2fB", n/1e9) elseif n >= 1e6 then return string.format("%.2fM", n/1e6) elseif n >= 1e3 then return string.format("%.2fK", n/1e3) else return string.format("%.2f", n) end end local function getBalance() return dataStore.Points or 0 end local function getShares() if not targetIdRaw then return 0 end return dataStore.Shares[targetIdRaw] or 0 end local function takeSnapshot() local shares = {} if dataStore.Shares then for k, v in pairs(dataStore.Shares) do shares[k] = v end end return shares, dataStore.Points or 0 end local function detectPurchase(oldShares, oldPoints, newShares, newPoints) local pointsDiff = oldPoints - newPoints local candidates = {} for k, v in pairs(newShares) do local oldVal = oldShares[k] or 0 local diff = v - oldVal if diff > 0 then table.insert(candidates, { key = k, numId = tonumber(k) or k, oldShares = oldVal, newShares = v, diff = diff }) end end if pointsDiff > 0 and #candidates > 0 then table.sort(candidates, function(a, b) return a.diff < b.diff end) return candidates[1], candidates, pointsDiff end if #candidates > 0 then table.sort(candidates, function(a, b) return a.diff < b.diff end) return candidates[1], candidates, pointsDiff end return nil, {}, pointsDiff end local function setupStock(id) if watchRemote then pcall(function() watchRemote:InvokeServer(id) end) wait(0.3) end if exchangeRemote then pcall(function() exchangeRemote:InvokeServer(id) end) wait(0.3) end end -- GUI local gui = Instance.new("ScreenGui") gui.Name = "StockTrader" gui.ResetOnSpawn = false gui.ZIndexBehavior = Enum.ZIndexBehavior.Sibling local frame = Instance.new("Frame") frame.Size = UDim2.new(0, 320, 0, 360) frame.Position = UDim2.new(0, 15, 0.5, -180) frame.BackgroundColor3 = Color3.fromRGB(12, 12, 22) frame.BorderSizePixel = 0 frame.Parent = gui local frameCorner = Instance.new("UICorner") frameCorner.CornerRadius = UDim.new(0, 8) frameCorner.Parent = frame local frameStroke = Instance.new("UIStroke") frameStroke.Color = Color3.fromRGB(0, 255, 150) frameStroke.Thickness = 1.5 frameStroke.Parent = frame -- Header bar local header = Instance.new("Frame") header.Size = UDim2.new(1, 0, 0, 30) header.BackgroundColor3 = Color3.fromRGB(0, 40, 25) header.BorderSizePixel = 0 header.Parent = frame local headerCorner = Instance.new("UICorner") headerCorner.CornerRadius = UDim.new(0, 8) headerCorner.Parent = header local headerCover = Instance.new("Frame") headerCover.Size = UDim2.new(1, 0, 0, 10) headerCover.Position = UDim2.new(0, 0, 0, 20) headerCover.BackgroundColor3 = Color3.fromRGB(0, 40, 25) headerCover.BorderSizePixel = 0 headerCover.Parent = header local title = Instance.new("TextLabel") title.Size = UDim2.new(1, -60, 0, 30) title.Position = UDim2.new(0, 10, 0, 0) title.BackgroundTransparency = 1 title.Text = "STOCK AUTO-TRADER v1.5" title.TextColor3 = Color3.fromRGB(0, 255, 150) title.TextXAlignment = Enum.TextXAlignment.Left title.Font = Enum.Font.GothamBold; title.TextSize = 13 title.Parent = header local closeBtn = Instance.new("TextButton") closeBtn.Size = UDim2.new(0, 22, 0, 22) closeBtn.Position = UDim2.new(1, -28, 0, 4) closeBtn.BackgroundColor3 = Color3.fromRGB(180, 30, 30) closeBtn.Text = "X"; closeBtn.TextColor3 = Color3.new(1, 1, 1) closeBtn.Font = Enum.Font.GothamBold; closeBtn.TextSize = 11 closeBtn.BorderSizePixel = 0 closeBtn.Parent = header local closeCorner = Instance.new("UICorner") closeCorner.CornerRadius = UDim.new(0, 4) closeCorner.Parent = closeBtn closeBtn.MouseButton1Click:Connect(function() running = false; gui:Destroy() end) -- Status indicator dot local statusDot = Instance.new("Frame") statusDot.Size = UDim2.new(0, 8, 0, 8) statusDot.Position = UDim2.new(0, 10, 0, 40) statusDot.BackgroundColor3 = Color3.fromRGB(255, 255, 0) statusDot.BorderSizePixel = 0 statusDot.Parent = frame local dotCorner = Instance.new("UICorner") dotCorner.CornerRadius = UDim.new(1, 0) dotCorner.Parent = statusDot -- Labels local lbl = {} local defs = { {"status", "SCANNING... Buy 1 share!", Color3.fromRGB(255,255,0), true}, {"stock", "Stock: ---", Color3.fromRGB(140,160,220), false}, {"balance", "Balance: ---", Color3.fromRGB(220,200,80), false}, {"shares", "Shares: ---", Color3.fromRGB(80,220,120), false}, {"price", "Est. Price: ---", Color3.fromRGB(200,150,80), false}, {"value", "Holdings: ---", Color3.fromRGB(100,180,220), false}, {"profit", "P/L: ---", Color3.fromRGB(180,180,180), false}, {"buys", "Buys: 0 | Sells: 0", Color3.fromRGB(180,180,200), false}, {"cycles", "Cycles: 0", Color3.fromRGB(180,120,220), false}, {"lastResult", "Last: ---", Color3.fromRGB(100,100,100), false}, {"confirm", "", Color3.fromRGB(255,200,0), true}, } for i, d in ipairs(defs) do local l = Instance.new("TextLabel") l.Size = UDim2.new(1, -20, 0, 20) if i == 1 then l.Position = UDim2.new(0, 24, 0, 38) else l.Position = UDim2.new(0, 10, 0, 36 + i * 20) end l.BackgroundTransparency = 1 l.Text = d[2]; l.TextColor3 = d[3] l.TextXAlignment = Enum.TextXAlignment.Left l.Font = d[4] and Enum.Font.GothamBold or Enum.Font.Gotham l.TextSize = 12 l.Parent = frame; lbl[d[1]] = l end -- Keybinds bar local keyBar = Instance.new("Frame") keyBar.Size = UDim2.new(1, 0, 0, 24) keyBar.Position = UDim2.new(0, 0, 1, -44) keyBar.BackgroundColor3 = Color3.fromRGB(8, 8, 16) keyBar.BorderSizePixel = 0 keyBar.Parent = frame local keyBarCorner = Instance.new("UICorner") keyBarCorner.CornerRadius = UDim.new(0, 8) keyBarCorner.Parent = keyBar local keyLabels = { {"[B]", "Buy", Color3.fromRGB(0,200,100)}, {"[S]", "Sell", Color3.fromRGB(255,80,80)}, {"[Y]", "Yes", Color3.fromRGB(0,200,255)}, {"[N]", "No", Color3.fromRGB(200,100,100)}, {"[H]", "Reset", Color3.fromRGB(200,200,100)}, } local xOffset = 8 for _, k in ipairs(keyLabels) do local keyText = Instance.new("TextLabel") keyText.Size = UDim2.new(0, 20, 0, 18) keyText.Position = UDim2.new(0, xOffset, 0, 3) keyText.BackgroundTransparency = 1 keyText.Text = k[1]; keyText.TextColor3 = k[3] keyText.Font = Enum.Font.GothamBold; keyText.TextSize = 10 keyText.Parent = keyBar local valText = Instance.new("TextLabel") valText.Size = UDim2.new(0, 30, 0, 18) valText.Position = UDim2.new(0, xOffset + 18, 0, 3) valText.BackgroundTransparency = 1 valText.Text = k[2]; valText.TextColor3 = Color3.fromRGB(130,130,140) valText.Font = Enum.Font.Gotham; valText.TextSize = 9 valText.Parent = keyBar xOffset = xOffset + 56 end -- Credit local credit = Instance.new("TextLabel") credit.Size = UDim2.new(1, 0, 0, 16) credit.Position = UDim2.new(0, 0, 1, -18) credit.BackgroundTransparency = 1 credit.Text = "Brought to you by FromBeyond" credit.TextColor3 = Color3.fromRGB(60, 60, 80) credit.Font = Enum.Font.Gotham; credit.TextSize = 9 credit.Parent = frame -- Draggable local dragging, dragStart, startPos frame.InputBegan:Connect(function(input) if input.UserInputType == Enum.UserInputType.MouseButton1 then dragging = true; dragStart = input.Position; startPos = frame.Position end end) frame.InputEnded:Connect(function(input) if input.UserInputType == Enum.UserInputType.MouseButton1 then dragging = false end end) UIS.InputChanged:Connect(function(input) if dragging and input.UserInputType == Enum.UserInputType.MouseMovement then frame.Position = UDim2.new(startPos.X.Scale, startPos.X.Offset + (input.Position.X - dragStart.X), startPos.Y.Scale, startPos.Y.Offset + (input.Position.Y - dragStart.Y)) end end) gui.Parent = player:WaitForChild("PlayerGui") -- PULSE ANIMATION, Took me too long icl spawn(function() while running do local colors = { detecting = Color3.fromRGB(255, 255, 0), confirming = Color3.fromRGB(255, 200, 0), ready = Color3.fromRGB(0, 200, 255), buying = Color3.fromRGB(0, 255, 100), selling = Color3.fromRGB(255, 80, 80), idle = Color3.fromRGB(100, 100, 100), } local baseColor = colors[mode] or Color3.fromRGB(150, 150, 150) for i = 1, 10 do if not running then break end local t = i / 10 local r = math.floor(baseColor.R * 255 * (0.4 + 0.6 * t)) local g = math.floor(baseColor.G * 255 * (0.4 + 0.6 * t)) local b = math.floor(baseColor.B * 255 * (0.4 + 0.6 * t)) statusDot.BackgroundColor3 = Color3.fromRGB(r, g, b) frameStroke.Color = Color3.fromRGB(r, g, b) wait(0.08) end end end) -- UPDATE GUI local function updateGUI() local mText, mColor if mode == "detecting" then mText = "SCANNING... Buy 1 share!"; mColor = Color3.fromRGB(255,255,0) elseif mode == "confirming" then mText = "CONFIRM? [Y/N]"; mColor = Color3.fromRGB(255,200,0) elseif mode == "ready" then mText = "LOCKED! Press B"; mColor = Color3.fromRGB(0,200,255) elseif mode == "buying" then mText = "PUMPING..."; mColor = Color3.fromRGB(0,255,100) elseif mode == "selling" then mText = "DUMPING..."; mColor = Color3.fromRGB(255,80,80) else mText = "IDLE"; mColor = Color3.fromRGB(150,150,150) end lbl.status.Text = mText; lbl.status.TextColor3 = mColor lbl.stock.Text = "Stock: " .. (targetId and tostring(targetId) or "---") lbl.balance.Text = "Balance: " .. fmt(getBalance()) lbl.shares.Text = "Shares: " .. getShares() lbl.price.Text = "Est. Price: " .. (pricePerShare and fmt(pricePerShare) or "---") -- Holdings value = shares × estimated price local sharesHeld = getShares() if pricePerShare and sharesHeld > 0 then local holdingsValue = sharesHeld * pricePerShare lbl.value.Text = "Holdings: " .. fmt(holdingsValue) .. " (" .. sharesHeld .. " x " .. fmt(pricePerShare) .. ")" -- P/L = total returned + current holdings value - total invested local profit = totalReturned + holdingsValue - totalInvested if profit >= 0 then lbl.profit.Text = "P/L: +" .. fmt(profit) lbl.profit.TextColor3 = Color3.fromRGB(0, 255, 100) else lbl.profit.Text = "P/L: -" .. fmt(math.abs(profit)) lbl.profit.TextColor3 = Color3.fromRGB(255, 80, 80) end else lbl.value.Text = "Holdings: ---" lbl.profit.Text = "P/L: ---" lbl.profit.TextColor3 = Color3.fromRGB(140, 140, 140) end lbl.buys.Text = "Buys: " .. buyCount .. " | Sells: " .. sellCount lbl.cycles.Text = "Cycles: " .. cycles end -- DETECTION LOOP spawn(function() wait(3) lastSnapShares, lastSnapPoints = takeSnapshot() updateGUI() while running and mode == "detecting" do local newShares, newPoints = takeSnapshot() local best, allChanges, ptsDiff = detectPurchase(lastSnapShares, lastSnapPoints, newShares, newPoints) if best then targetIdRaw = best.key targetId = best.numId local confirmText = "Detected: " .. tostring(targetId) .. " (+" .. best.diff .. " shares" if ptsDiff > 0 then confirmText = confirmText .. ", -" .. fmt(ptsDiff) .. " pts)" pricePerShare = ptsDiff / best.diff else confirmText = confirmText .. ", no bal change?)" end if #allChanges > 1 then confirmText = confirmText .. " | Also:" for i, c in ipairs(allChanges) do if i <= 3 and c.key ~= best.key then confirmText = confirmText .. " " .. tostring(c.numId) .. "(+" .. c.diff .. ")" end end end lbl.confirm.Text = confirmText mode = "confirming" updateGUI() end if mode == "detecting" then lastSnapShares, lastSnapPoints = newShares, newPoints end wait(0.5) end end) -- MAIN TRADING LOOP spawn(function() while running do if mode == "buying" and targetId then local balBefore = getBalance() local ok, result = pcall(function() return buyRemote:InvokeServer(targetId, 1) end) if ok and result == true then buyCount = buyCount + 1 local balAfter = getBalance() local paid = balBefore - balAfter if paid > 0 then pricePerShare = paid -- Update estimate from buy totalInvested = totalInvested + paid end lbl.lastResult.Text = "Buy OK #" .. buyCount .. " (-" .. fmt(paid) .. ")" lbl.lastResult.TextColor3 = Color3.fromRGB(0,255,100) -- Can't afford? Auto-switch to selling if pricePerShare and getBalance() < pricePerShare then local currentShares = getShares() if currentShares > 0 then mode = "selling" -- AUTO-SWITCH to dump! lbl.lastResult.Text = "CAN'T AFFORD -> AUTO SELL!" lbl.lastResult.TextColor3 = Color3.fromRGB(255,200,0) else mode = "idle" lbl.lastResult.Text = "BROKE & NO SHARES" lbl.lastResult.TextColor3 = Color3.fromRGB(255,80,80) end end else local errStr = ok and "false" or "ERR" lbl.lastResult.Text = "Buy " .. errStr .. " (cooldown)" lbl.lastResult.TextColor3 = Color3.fromRGB(80,80,80) end elseif mode == "selling" and targetId then local currentShares = getShares() if currentShares <= 0 then cycles = cycles + 1 mode = "idle" lbl.lastResult.Text = "SOLD OUT! Cycle " .. cycles .. " done" lbl.lastResult.TextColor3 = Color3.fromRGB(255,200,0) else local sellQty = math.max(1, math.floor(currentShares * 0.1)) local balBefore = getBalance() local ok, result = pcall(function() return sellRemote:InvokeServer(targetId, sellQty) end) if ok and result == true then sellCount = sellCount + 1 local balAfter = getBalance() local gained = balAfter - balBefore if gained > 0 then -- Update price estimate from sell! local sellPrice = gained / sellQty pricePerShare = sellPrice totalReturned = totalReturned + gained end lbl.lastResult.Text = "Sell OK #" .. sellCount .. " (x" .. sellQty .. " +" .. fmt(gained) .. ")" lbl.lastResult.TextColor3 = Color3.fromRGB(0,255,100) else local errStr = ok and "false" or "ERR" lbl.lastResult.Text = "Sell " .. errStr .. " (cooldown)" lbl.lastResult.TextColor3 = Color3.fromRGB(80,80,80) end end end updateGUI() wait(0.1) end end) -- KEY INPUT UIS.InputBegan:Connect(function(input, gpe) if gpe then return end if input.KeyCode == Enum.KeyCode.Y and mode == "confirming" then setupStock(targetId) lbl.confirm.Text = "Confirmed: " .. tostring(targetId) lbl.confirm.TextColor3 = Color3.fromRGB(0,255,100) mode = "ready" updateGUI() elseif mode == "confirming" and (input.KeyCode == Enum.KeyCode.N or input.KeyCode == Enum.KeyCode.H) then targetIdRaw = nil; targetId = nil; pricePerShare = nil lbl.confirm.Text = "Rejected. Re-scanning..." lbl.confirm.TextColor3 = Color3.fromRGB(255,100,100) mode = "detecting" lastSnapShares, lastSnapPoints = takeSnapshot() updateGUI() elseif input.KeyCode == Enum.KeyCode.B then if mode == "buying" then mode = "idle" elseif targetId and (mode == "ready" or mode == "idle" or mode == "selling") then mode = "buying" end updateGUI() elseif input.KeyCode == Enum.KeyCode.S then if mode == "selling" then mode = "idle" elseif targetId and (mode == "ready" or mode == "idle" or mode == "buying") then mode = "selling" end updateGUI() elseif input.KeyCode == Enum.KeyCode.H then targetIdRaw = nil; targetId = nil; pricePerShare = nil buyCount = 0; sellCount = 0; cycles = 0 totalInvested = 0; totalReturned = 0 lbl.confirm.Text = "" mode = "detecting" lastSnapShares, lastSnapPoints = takeSnapshot() spawn(function() while running and mode == "detecting" do local newShares, newPoints = takeSnapshot() local best, allChanges, ptsDiff = detectPurchase(lastSnapShares, lastSnapPoints, newShares, newPoints) if best then targetIdRaw = best.key targetId = best.numId local confirmText = "Detected: " .. tostring(targetId) .. " (+" .. best.diff .. " shares" if ptsDiff > 0 then confirmText = confirmText .. ", -" .. fmt(ptsDiff) .. " pts)" pricePerShare = ptsDiff / best.diff else confirmText = confirmText .. ", no bal change?)" end if #allChanges > 1 then confirmText = confirmText .. " | Also:" for i, c in ipairs(allChanges) do if i <= 3 and c.key ~= best.key then confirmText = confirmText .. " " .. tostring(c.numId) .. "(+" .. c.diff .. ")" end end end lbl.confirm.Text = confirmText mode = "confirming" updateGUI() end if mode == "detecting" then lastSnapShares, lastSnapPoints = newShares, newPoints end wait(0.5) end end) updateGUI() elseif input.KeyCode == Enum.KeyCode.N and mode ~= "confirming" then running = false gui:Destroy() end end)