chung-khoan/chung-khoan.bundle.js · Nhập từ GitHub ocd4-assets@86f47de5 (bản đang chạy trên thudao.com 10/11/2026)

(function(){"use strict";var I=window.CK_API||"",K="https://cdn.jsdelivr.net/npm/lightweight-charts@4.2.3/dist/lightweight-charts.standalone.production.js",d={get:function(t){try{return JSON.parse(localStorage.getItem("ck_"+t))}catch{return null}},set:function(t,n){try{localStorage.setItem("ck_"+t,JSON.stringify(n))}catch{}},del:function(t){try{localStorage.removeItem("ck_"+t)}catch{}}},F=["#ck-app{--bg:#0e1116;--panel:#161b22;--panel2:#1d232c;--line:#2a313c;--text:#e8edf3;--muted:#9aa5b4;--up:#22c55e;--down:#ef4444;--ref:#eab308;--ceil:#c084fc;--floor:#38bdf8;--accent:#f59e0b;",'font:17px/1.5 system-ui,-apple-system,"Segoe UI",Roboto,"Helvetica Neue",Arial,sans-serif;color:var(--text);background:var(--bg);border-radius:14px;padding:14px;max-width:1200px;margin:0 auto;-webkit-font-smoothing:antialiased}',"#ck-app *{box-sizing:border-box}#ck-app button,#ck-app input,#ck-app select{font:inherit;color:inherit}","#ck-app .ck-num{font-variant-numeric:tabular-nums}","#ck-app .ck-top{display:flex;align-items:center;justify-content:space-between;gap:10px;flex-wrap:wrap;margin-bottom:12px}","#ck-app .ck-brand{font-weight:800;font-size:20px;letter-spacing:.2px}#ck-app .ck-brand span{color:var(--accent)}","#ck-app .ck-user{display:flex;align-items:center;gap:10px;color:var(--muted);font-size:15px}","#ck-app .ck-btn{background:var(--panel2);border:1px solid var(--line);border-radius:10px;padding:10px 16px;min-height:46px;cursor:pointer;font-weight:600}","#ck-app .ck-btn:hover{border-color:#3b4452}#ck-app .ck-btn.pri{background:var(--accent);border-color:var(--accent);color:#1a1205}","#ck-app .ck-btn.sm{min-height:38px;padding:6px 12px;font-size:15px}#ck-app .ck-btn.on{background:#2b3442;border-color:var(--accent);color:#fff}","#ck-app .ck-idx{display:grid;grid-template-columns:repeat(auto-fit,minmax(150px,1fr));gap:8px;margin-bottom:12px}","#ck-app .ck-idx div{background:var(--panel);border:1px solid var(--line);border-radius:10px;padding:8px 12px}","#ck-app .ck-idx b{display:block;font-size:13px;color:var(--muted);font-weight:600}#ck-app .ck-idx em{font-style:normal;font-size:19px;font-weight:700}","#ck-app .ck-tabs{display:grid;grid-template-columns:repeat(4,1fr);gap:6px;margin-bottom:12px}","#ck-app .ck-tabs button{background:var(--panel);border:1px solid var(--line);border-radius:10px;min-height:52px;font-weight:700;cursor:pointer}","#ck-app .ck-tabs button.on{background:var(--accent);color:#1a1205;border-color:var(--accent)}","#ck-app .ck-bar{display:flex;flex-wrap:wrap;gap:8px;align-items:center;margin-bottom:10px}","#ck-app .ck-in{background:var(--panel);border:1px solid var(--line);border-radius:10px;padding:10px 12px;min-height:46px;width:100%}","#ck-app .ck-in:focus{outline:2px solid var(--accent);outline-offset:1px}","#ck-app .ck-tablewrap{overflow-x:auto;border:1px solid var(--line);border-radius:10px;background:var(--panel)}","#ck-app table{border-collapse:collapse;width:100%;font-size:16px}","#ck-app th,#ck-app td{padding:8px 10px;text-align:right;white-space:nowrap;border-bottom:1px solid var(--line)}","#ck-app th{position:sticky;top:0;background:var(--panel2);color:var(--muted);font-size:13px;font-weight:600;text-transform:uppercase;letter-spacing:.3px}","#ck-app td:first-child,#ck-app th:first-child{text-align:left;position:sticky;left:0;background:var(--panel2);z-index:1;font-weight:800}","#ck-app tbody tr{cursor:pointer}#ck-app tbody tr:hover td{background:#1f2630}","#ck-app .u{color:var(--up)}#ck-app .d{color:var(--down)}#ck-app .r{color:var(--ref)}#ck-app .c{color:var(--ceil)}#ck-app .f{color:var(--floor)}#ck-app .m{color:var(--muted)}","#ck-app .ck-flash{animation:ckf .9s}@keyframes ckf{0%{background:#3a3220}100%{background:transparent}}","#ck-app .ck-note{color:var(--muted);font-size:14px;margin:8px 2px}","#ck-app .ck-card{background:var(--panel);border:1px solid var(--line);border-radius:12px;padding:14px;margin-bottom:10px}","#ck-app .ck-login{max-width:420px;margin:30px auto}#ck-app .ck-login h2{margin:0 0 4px;font-size:24px}","#ck-app label{display:block;font-size:14px;color:var(--muted);margin:12px 0 4px}","#ck-app .ck-err{color:#fca5a5;margin-top:10px;min-height:1.4em}","#ck-app .ck-chart{height:440px;border:1px solid var(--line);border-radius:10px;overflow:hidden;background:var(--panel)}","#ck-app .ck-quote{display:flex;flex-wrap:wrap;gap:6px 18px;align-items:baseline;margin:6px 0 10px}#ck-app .ck-quote .big{font-size:30px;font-weight:800}","#ck-app .ck-badge{display:inline-block;border-radius:999px;padding:3px 12px;font-size:14px;font-weight:800}","#ck-app .b-MANH{background:#14532d;color:#86efac}#ck-app .b-DAT{background:#1e3a8a;color:#bfdbfe}#ck-app .b-THEO_DOI{background:#422006;color:#fcd34d}","#ck-app .b-LOAI{background:#3f1d1d;color:#fca5a5}#ck-app .b-THIEU_DU_LIEU{background:#2a313c;color:var(--muted)}","#ck-app .ck-tc{list-style:none;margin:10px 0 0;padding:0}#ck-app .ck-tc li{display:flex;justify-content:space-between;gap:10px;padding:7px 0;border-top:1px dashed var(--line)}","#ck-app .ck-tc li span:last-child{font-weight:700;text-align:right}","#ck-app .ck-grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(160px,1fr));gap:8px}","#ck-app .ck-sum{display:grid;grid-template-columns:repeat(4,1fr);gap:8px;margin-bottom:10px}#ck-app .ck-sum div{background:var(--panel);border:1px solid var(--line);border-radius:10px;padding:10px;text-align:center}","#ck-app .ck-sum b{display:block;font-size:26px}#ck-app .ck-sum span{font-size:13px;color:var(--muted)}","#ck-app .ck-toast{position:fixed;left:50%;bottom:20px;transform:translateX(-50%);background:#111827;border:1px solid var(--accent);color:#fff;padding:12px 18px;border-radius:10px;z-index:9999;font-size:16px;max-width:92vw}","#ck-app .ck-hide{display:none!important}","@media (max-width:640px){#ck-app{padding:10px;border-radius:0}#ck-app .ck-tabs button{min-height:48px;font-size:15px}#ck-app .ck-sum{grid-template-columns:repeat(2,1fr)}#ck-app .ck-chart{height:360px}#ck-app table{font-size:15px}}"].join(""),b,l={tab:d.get("tab")||"bang",nhom:d.get("nhom")||"VN30",tuChon:d.get("tuChon")||"",ma:d.get("ma")||"FPT",khung:"D",range:260,user:d.get("user")},M=null,g=null,G={};function u(t){return String(t??"").replace(/[&<>"']/g,function(n){return{"&":"&amp;","<":"&lt;",">":"&gt;",'"':"&quot;","'":"&#39;"}[n]})}function p(t,n){return t==null||t===""||isNaN(t)?"—":Number(t).toLocaleString("vi-VN",{minimumFractionDigits:n||0,maximumFractionDigits:n===void 0?2:n})}function C(t){return t==null?"—":t>=1e6?p(t/1e6,2)+"tr":t>=1e3?p(t/1e3,1)+"k":p(t,0)}function f(t){return t>0?"+":""}function N(t,n){return t==null||n==null||n.tc==null?"":n.tran&&t>=n.tran?"c":n.sanGia&&t<=n.sanGia?"f":t>n.tc?"u":t<n.tc?"d":"r"}function c(t){return b.querySelector(t)}function k(t){var n=document.createElement("div");n.className="ck-toast",n.textContent=t,b.appendChild(n),setTimeout(function(){n.remove()},3500)}function m(t,n){var e=n||{};return e.action=t,e.token=d.get("token")||"",fetch(I,{method:"POST",body:JSON.stringify(e),redirect:"follow"}).then(function(a){return a.json()}).then(function(a){if(a&&a.hetPhien)return d.del("token"),t!=="logout"&&A(a.loi),new Promise(function(){});if(!a||!a.ok)throw new Error(a&&a.loi||"Lỗi không xác định");return a})}function z(){if(b=document.getElementById("ck-app"),!!b){if(!document.getElementById("ck-style")){var t=document.createElement("style");t.id="ck-style",t.textContent=F,document.head.appendChild(t)}if(!/^https:\/\//.test(I)){b.innerHTML='<div class="ck-card">Chưa dán URL Apps Script (/exec) vào biến CK_API trên trang Blogspot.</div>';return}d.get("token")?P():A()}}function A(t){E(),b.innerHTML='<div class="ck-login ck-card"><h2>Đăng nhập</h2><div class="ck-note">Bảng điện & tầm soát cổ phiếu – dành cho thành viên gia đình.</div><form id="ck-lf"><label for="ck-u">Tên đăng nhập</label><input id="ck-u" class="ck-in" autocomplete="username" autocapitalize="none" required><label for="ck-p">Mật khẩu</label><input id="ck-p" type="password" class="ck-in" autocomplete="current-password" required><button class="ck-btn pri" style="width:100%;margin-top:16px" type="submit">Đăng nhập</button><div class="ck-err" id="ck-le">'+u(t||"")+"</div></form></div>",c("#ck-lf").onsubmit=function(n){n.preventDefault();var e=this.querySelector("button");e.textContent="Đang kiểm tra…",m("login",{user:c("#ck-u").value,pass:c("#ck-p").value}).then(function(a){d.set("token",a.token),d.set("user",a.nguoiDung),l.user=a.nguoiDung,P()}).catch(function(a){c("#ck-le").textContent=a.message,e.textContent="Đăng nhập"})}}function P(){var t=l.user||{};b.innerHTML='<div class="ck-top"><div class="ck-brand">Bảng điện <span>·</span> Tầm soát</div><div class="ck-user"><span id="ck-hi">'+u(t.hoTen||"")+'</span><button class="ck-btn sm" id="ck-pw">Đổi mật khẩu</button><button class="ck-btn sm" id="ck-out">Đăng xuất</button></div></div><div class="ck-idx" id="ck-idx"></div><div class="ck-tabs" id="ck-tabs"><button data-t="bang">Bảng điện</button><button data-t="bieudo">Biểu đồ</button><button data-t="tamsoat">Tầm soát</button><button data-t="theodoi">Theo dõi</button></div><div id="ck-view"></div>',c("#ck-tabs").onclick=function(n){var e=n.target.getAttribute("data-t");e&&y(e)},c("#ck-out").onclick=function(){m("logout").catch(function(){}),d.del("token"),A()},c("#ck-pw").onclick=X,m("me").then(function(n){l.user=n.nguoiDung,d.set("user",n.nguoiDung),c("#ck-hi").textContent=n.nguoiDung.hoTen}).catch(function(){}),y(l.tab)}function X(){var t=prompt("Mật khẩu hiện tại:");if(t){var n=prompt("Mật khẩu mới (từ 6 ký tự):");n&&m("doiMatKhau",{cu:t,moi:n}).then(function(){k("Đã đổi mật khẩu.")}).catch(function(e){k(e.message)})}}function y(t){l.tab=t,d.set("tab",t),E(),g&&(g.remove(),g=null),[].forEach.call(b.querySelectorAll("#ck-tabs button"),function(n){n.classList.toggle("on",n.getAttribute("data-t")===t)}),{bang:_,bieudo:R,tamsoat:nt,theodoi:it}[t]()}function E(){M&&(clearTimeout(M),M=null)}function Q(){var t=new Date(Date.now()+(420+new Date().getTimezoneOffset())*6e4),n=t.getHours()*100+t.getMinutes(),e=t.getDay();return e>=1&&e<=5&&n>=900&&n<=1500}function B(t){var n=c("#ck-idx");!n||!t||(n.innerHTML=t.map(function(e){var a=e.thayDoi>0?"u":e.thayDoi<0?"d":"r";return"<div><b>"+u(e.ten)+'</b><em class="ck-num '+a+'">'+p(e.diem,2)+'</em> <span class="ck-num '+a+'">'+f(e.thayDoi)+p(e.thayDoi,2)+" ("+f(e.pct)+p(e.pct,2)+"%)</span></div>"}).join(""))}function _(){var t=[["VN30","VN30"],["HNX30","HNX30"],["THEO_DOI","Theo dõi"],["TU_CHON","Tự chọn"]];c("#ck-view").innerHTML='<div class="ck-bar" id="ck-nhom">'+t.map(function(e){return'<button class="ck-btn sm'+(l.nhom===e[0]?" on":"")+'" data-n="'+e[0]+'">'+e[1]+"</button>"}).join("")+'</div><div class="ck-bar'+(l.nhom==="TU_CHON"?"":" ck-hide")+'" id="ck-tcbar"><input class="ck-in" id="ck-tcin" style="flex:1;min-width:200px" placeholder="Nhập các mã, cách nhau dấu phẩy: FPT, HPG, MWG" value="'+u(l.tuChon)+'"><button class="ck-btn pri" id="ck-tcgo">Xem</button></div><div class="ck-tablewrap"><table><thead><tr><th>Mã</th><th>TC</th><th>Trần</th><th>Sàn</th><th>Giá</th><th>+/−</th><th>%</th><th>Tổng KL</th><th>Cao</th><th>Thấp</th><th>Mua 1</th><th>KL</th><th>Bán 1</th><th>KL</th><th>NN mua</th><th>NN bán</th></tr></thead><tbody id="ck-tb"></tbody></table></div><div class="ck-note" id="ck-bn">Giá: nghìn đồng. Bấm vào một mã để xem biểu đồ.</div>',c("#ck-nhom").onclick=function(e){var a=e.target.getAttribute("data-n");a&&(l.nhom=a,d.set("nhom",a),_())},c("#ck-tcgo").onclick=function(){l.tuChon=c("#ck-tcin").value.toUpperCase(),d.set("tuChon",l.tuChon),S()},c("#ck-tb").onclick=function(e){var a=e.target.closest("tr");!a||!a.dataset.ma||(l.ma=a.dataset.ma,d.set("ma",l.ma),y("bieudo"))};var n=d.get("bang_"+l.nhom);n&&(B(n.chiSo),U(n.bang,!0)),S()}function S(){E();var t=l.nhom;if(t==="TU_CHON"&&!l.tuChon.trim()){c("#ck-tb").innerHTML='<tr><td colspan="16" class="m">Nhập mã rồi bấm Xem.</td></tr>';return}m("bangDien",{nhom:t,ma:l.tuChon.split(/[\s,;]+/)}).then(function(n){l.tab!=="bang"||l.nhom!==t||(d.set("bang_"+t,{chiSo:n.chiSo,bang:n.bang}),B(n.chiSo),U(n.bang),c("#ck-bn").textContent="Cập nhật "+n.thoiGian.slice(11)+" · Giá: nghìn đồng · Bấm vào một mã để xem biểu đồ.")}).catch(function(n){c("#ck-bn").textContent="Không tải được: "+n.message}).then(function(){l.tab==="bang"&&(M=setTimeout(S,document.hidden?6e4:Q()?15e3:6e4))})}function U(t,n){var e=c("#ck-tb");if(e){if(!t||!t.length){e.innerHTML='<tr><td colspan="16" class="m">Chưa có mã nào'+(l.nhom==="THEO_DOI"?" – thêm ở tab Theo dõi.":".")+"</td></tr>";return}e.innerHTML=t.map(function(a){if(a.loi)return'<tr data-ma="'+u(a.ma)+'"><td>'+u(a.ma)+'</td><td colspan="15" class="m" style="text-align:left">'+u(a.loi)+"</td></tr>";var o=N(a.gia,a),r=G[a.ma],i=!n&&r&&r!==a.gia?" ck-flash":"";G[a.ma]=a.gia;var s=function(h){return'<td class="ck-num '+N(h,a)+'">'+p(h)+"</td>"};return'<tr data-ma="'+u(a.ma)+'"><td class="'+o+'">'+u(a.ma)+'</td><td class="ck-num r">'+p(a.tc)+'</td><td class="ck-num c">'+p(a.tran)+'</td><td class="ck-num f">'+p(a.sanGia)+'</td><td class="ck-num '+o+i+'" style="font-weight:800">'+p(a.gia)+'</td><td class="ck-num '+o+'">'+f(a.thayDoi)+p(a.thayDoi)+'</td><td class="ck-num '+o+'">'+f(a.pct)+p(a.pct)+'%</td><td class="ck-num">'+C(a.kl)+"</td>"+s(a.cao)+s(a.thap)+s(a.mua&&a.mua[0][0])+'<td class="ck-num m">'+C(a.mua&&a.mua[0][1])+"</td>"+s(a.ban&&a.ban[0][0])+'<td class="ck-num m">'+C(a.ban&&a.ban[0][1])+'</td><td class="ck-num">'+C(a.nnMua)+'</td><td class="ck-num">'+C(a.nnBan)+"</td></tr>"}).join("")}}function w(){return window.LightweightCharts?Promise.resolve():(w.p||(w.p=new Promise(function(t,n){var e=document.createElement("script");e.src=K,e.onload=t,e.onerror=function(){w.p=null,n(new Error("Không tải được thư viện biểu đồ"))},document.head.appendChild(e)})),w.p)}function R(){c("#ck-view").innerHTML='<div class="ck-bar"><form id="ck-cf" style="display:flex;gap:8px;flex:1;min-width:240px"><input class="ck-in" id="ck-cma" style="text-transform:uppercase" value="'+u(l.ma)+'" placeholder="Mã CK" maxlength="10"><button class="ck-btn pri" type="submit">Xem</button></form><div class="ck-bar" id="ck-rg" style="margin:0">'+[["D",130,"6 tháng"],["D",260,"1 năm"],["D",780,"3 năm"],["W",1500,"Tuần"]].map(function(t){return'<button class="ck-btn sm'+(l.khung===t[0]&&l.range===t[1]?" on":"")+'" data-k="'+t[0]+'" data-r="'+t[1]+'">'+t[2]+"</button>"}).join("")+'</div></div><div class="ck-quote" id="ck-q"></div><div class="ck-chart" id="ck-ch"></div><div class="ck-note">Nến ngày, đường cam MA20, đường xanh MA50, cột dưới là khối lượng. Giá: nghìn đồng.</div><div class="ck-bar"><button class="ck-btn" id="ck-add">+ Thêm vào theo dõi</button></div><div id="ck-bc"></div>',c("#ck-cf").onsubmit=function(t){t.preventDefault(),l.ma=c("#ck-cma").value.trim().toUpperCase(),d.set("ma",l.ma),O()},c("#ck-rg").onclick=function(t){var n=t.target.closest("button");n&&(l.khung=n.dataset.k,l.range=Number(n.dataset.r),[].forEach.call(this.querySelectorAll("button"),function(e){e.classList.toggle("on",e===n)}),O())},c("#ck-add").onclick=function(){l.themMa=l.ma,y("theodoi")},O()}function W(t){for(var n={t:[],o:[],h:[],l:[],c:[],v:[]},e=null,a=0;a<t.t.length;a++){var o=new Date((t.t[a]+25200)*1e3),r=(o.getUTCDay()+6)%7,i=t.t[a]-r*86400-(t.t[a]+7*3600)%86400;if(e===null||i!==e)e=i,n.t.push(t.t[a]),n.o.push(t.o[a]),n.h.push(t.h[a]),n.l.push(t.l[a]),n.c.push(t.c[a]),n.v.push(t.v[a]||0);else{var s=n.t.length-1;n.h[s]=Math.max(n.h[s],t.h[a]),n.l[s]=Math.min(n.l[s],t.l[a]),n.c[s]=t.c[a],n.v[s]+=t.v[a]||0}}return n}function V(t,n){for(var e=[],a=0,o=0;o<t.c.length;o++)a+=t.c[o],o>=n&&(a-=t.c[o-n]),o>=n-1&&e.push({time:t.t[o],value:Math.round(a/n*100)/100});return e}function O(){var t=l.ma,n=c("#ck-q");n.innerHTML='<span class="m">Đang tải '+u(t)+"…</span>",m("bieuDo",{ma:t,soNen:l.range}).then(function(e){if(!(l.tab!=="bieudo"||l.ma!==t)){var a=l.khung==="W"?W(e.nen):e.nen,o=e.gia||{},r=N(o.gia,o);if(n.innerHTML='<b style="font-size:22px">'+u(e.ma)+'</b><span class="big ck-num '+r+'">'+p(o.gia)+'</span><span class="ck-num '+r+'">'+f(o.thayDoi)+p(o.thayDoi)+" ("+f(o.pct)+p(o.pct)+'%)</span><span class="m">KL '+C(o.kl)+" · Cao "+p(o.cao)+" · Thấp "+p(o.thap)+'</span><span class="m">Nguồn giá: '+u(J[o.nguon]||o.nguon||"—")+"</span>",a.t.length<2)return j(e.ma,a.t.length);w().then(function(){l.tab==="bieudo"&&l.ma===t&&$(a)}).catch(function(){l.tab==="bieudo"&&l.ma===t&&j(e.ma,0)})}}).catch(function(e){n.innerHTML='<span class="d">'+u(e.message)+"</span>"}),m("baoCao",{ma:t}).then(function(e){l.ma===t&&Y(e.quy)}).catch(function(){})}var J={VPS:"VPS",DNSE:"DNSE",VCI:"Vietcap",GF:"Google Finance (chậm ~15–20 phút)"};function j(t,n){var e=c("#ck-ch");if(e){g&&(g.remove(),g=null);var a=document.getElementById("ck-fireant"),o='<a class="ck-btn sm" style="display:inline-block;text-decoration:none;color:var(--text);margin-top:8px" target="_blank" rel="noopener" href="https://fireant.vn/ma-chung-khoan/'+encodeURIComponent(t)+'">Mở biểu đồ '+u(t)+" trên FireAnt</a>";if(a&&a.innerHTML.trim()){var r=document.createElement("div");r.style.cssText="width:100%;height:100%;overflow:hidden;background:#fff",r.innerHTML=a.innerHTML.split("{MA}").join(encodeURIComponent(t)),[].forEach.call(r.querySelectorAll("script"),function(s){var h=document.createElement("script");[].forEach.call(s.attributes,function(x){h.setAttribute(x.name,x.value)}),h.text=s.text,s.parentNode.replaceChild(h,s)}),e.innerHTML="",e.appendChild(r);var i=e.parentNode.querySelector(".ck-note");i&&(i.innerHTML="Biểu đồ của FireAnt (máy chủ chưa lấy được nến). "+o);return}e.innerHTML='<div class="ck-note" style="padding:18px;line-height:1.7">Máy chủ chưa lấy được dữ liệu nến cho '+u(t)+(n?" (mới có "+n+" ngày tự lưu)":"")+".<br>"+o+"</div>"}}function $(t){var n=c("#ck-ch");if(n){if(g&&(g.remove(),g=null),!t.t.length){n.innerHTML='<div class="ck-note" style="padding:16px">Không có dữ liệu nến.</div>';return}var e=window.LightweightCharts;g=e.createChart(n,{autoSize:!0,layout:{background:{color:"#161b22"},textColor:"#9aa5b4",fontSize:13},grid:{vertLines:{color:"#20262f"},horzLines:{color:"#20262f"}},rightPriceScale:{borderColor:"#2a313c"},timeScale:{borderColor:"#2a313c",rightOffset:4},crosshair:{mode:0},localization:{locale:"vi-VN"}});var a=g.addCandlestickSeries({upColor:"#22c55e",downColor:"#ef4444",borderVisible:!1,wickUpColor:"#22c55e",wickDownColor:"#ef4444"});a.setData(t.t.map(function(r,i){return{time:r,open:t.o[i],high:t.h[i],low:t.l[i],close:t.c[i]}}));var o=g.addHistogramSeries({priceScaleId:"vol",priceFormat:{type:"volume"}});g.priceScale("vol").applyOptions({scaleMargins:{top:.8,bottom:0}}),a.priceScale().applyOptions({scaleMargins:{top:.06,bottom:.24}}),o.setData(t.t.map(function(r,i){return{time:r,value:t.v[i]||0,color:t.c[i]>=t.o[i]?"rgba(34,197,94,.45)":"rgba(239,68,68,.45)"}})),g.addLineSeries({color:"#f59e0b",lineWidth:2,priceLineVisible:!1,lastValueVisible:!1}).setData(V(t,20)),g.addLineSeries({color:"#38bdf8",lineWidth:2,priceLineVisible:!1,lastValueVisible:!1}).setData(V(t,50)),g.timeScale().fitContent()}}function Y(t){var n=c("#ck-bc");if(n){if(!t||!t.length){n.innerHTML='<div class="ck-note">Chưa có số liệu báo cáo quý của mã này trong tab BaoCaoQuy.</div>';return}n.innerHTML='<h3 style="margin:14px 0 8px">Báo cáo quý (tỷ đồng)</h3><div class="ck-tablewrap"><table><thead><tr><th>Quý</th><th>Doanh thu</th><th>LNST cốt lõi</th><th>LN bất thường</th><th>Vốn CSH</th><th>SL CP (tr)</th></tr></thead><tbody>'+t.map(function(e){return"<tr><td>"+u(e.quy)+'</td><td class="ck-num">'+p(e.dt)+'</td><td class="ck-num">'+p(e.ln)+'</td><td class="ck-num">'+p(e.lnbt)+'</td><td class="ck-num">'+p(e.von)+'</td><td class="ck-num">'+p(e.soCP)+"</td></tr>"}).join("")+"</tbody></table></div>"}}var Z={MANH:"Đạt · định giá hấp dẫn",DAT:"Đạt tầm soát",THEO_DOI:"Theo dõi thêm",LOAI:"Loại",THIEU_DU_LIEU:"Thiếu dữ liệu"},tt=[["ln","LNST cốt lõi tăng so cùng kỳ ≥","%"],["roe","ROE 4 quý ≥","%"],["dt","Doanh thu tăng so cùng kỳ ≥ (0 = chỉ cần tăng)","%"],["eps","EPS 4 quý tăng so với 4 quý trước",""],["lnQT","Quý liền trước cũng tăng ≥","%"],["bien","Biên lợi nhuận ròng cải thiện",""],["pe","P/E tương lai ≤ P/E hiện tại chia cho","lần"]];function q(){return l.user&&l.user.vaiTro==="ADMIN"}function nt(){var t=q(),n=d.get("tsf");n===null&&(n="DAT"),c("#ck-view").innerHTML='<div class="ck-bar"><select class="ck-in" id="ck-tsf" style="width:auto;flex:1;min-width:180px"><option value="DAT">Chỉ mã đạt điều kiện</option><option value="THEO_DOI">Theo dõi thêm (LN tăng mạnh)</option><option value="">Tất cả mã có số liệu</option></select><button class="ck-btn" id="ck-tsr">Tính lại</button></div><details class="ck-card" id="ck-tcp"><summary style="cursor:pointer;font-weight:700;min-height:30px">Tiêu chí lọc <span class="m" id="ck-tcl" style="font-weight:400"></span></summary><div id="ck-tcf" style="margin-top:8px"></div></details>'+(t?'<div class="ck-bar"><button class="ck-btn pri" id="ck-bc">Lấy báo cáo quý tự động</button><button class="ck-btn" id="ck-tsg">Gửi thông báo mã đạt</button></div>':"")+'<div class="ck-note" id="ck-bcn"></div><div class="ck-sum" id="ck-tss"></div><div id="ck-tsl"><div class="ck-note">Đang tải…</div></div><div class="ck-note">Khung tầm soát của Trường Money: LNST cốt lõi so cùng kỳ (không so quý liền trước), loại lợi nhuận bất thường, ROE, doanh thu, EPS 4 quý, P/E tương lai. LN cốt lõi tự động = LNST cổ đông công ty mẹ trừ 80% lợi nhuận khác. Kết quả là ứng viên cần đọc kỹ báo cáo tài chính, không phải khuyến nghị mua bán.</div>',c("#ck-tsf").value=n,c("#ck-tsf").onchange=function(){d.set("tsf",this.value),L(l.ts)},c("#ck-tsr").onclick=function(){v(!0)},t&&(c("#ck-bc").onclick=et,c("#ck-tsg").onclick=function(){c("#ck-tsl").innerHTML='<div class="ck-note">Đang tính và gửi…</div>',m("chayTamSoat").then(function(a){k("Đã gửi email các mã đạt mới (nếu có)."),v(!1,a)}).catch(function(a){k(a.message),v()})});var e=d.get("ts");e&&L(e),v()}function H(){return d.get("tc")}function v(t,n){if(n&&!H()){L(n);return}var e={},a=H();a?e.tieuChi=a:t&&(e.lamMoi=!0),t&&c("#ck-tsl")&&(c("#ck-tsl").innerHTML='<div class="ck-note">Đang tính…</div>'),m("tamSoat",e).then(L).catch(function(o){c("#ck-tsl")&&(c("#ck-tsl").innerHTML='<div class="ck-note d">'+u(o.message)+"</div>")})}function at(t){var n=c("#ck-tcf");if(!(!n||!t.tieuChi)){var e=t.tieuChi,a=q();c("#ck-tcl").textContent=H()?"· đang dùng tiêu chí riêng của bạn":"· đang dùng mặc định chung",n.innerHTML=tt.map(function(r){var i=e[r[0]]||{};return'<div style="display:flex;flex-wrap:wrap;align-items:center;gap:8px;padding:8px 0;border-top:1px dashed var(--line)"><label style="display:flex;align-items:center;gap:8px;margin:0;color:var(--text);flex:1;min-width:220px;font-size:16px"><input type="checkbox" data-k="'+r[0]+'" data-f="dung"'+(i.dung?" checked":"")+' style="width:22px;height:22px">'+u(r[1])+"</label>"+(r[2]?'<span style="display:flex;align-items:center;gap:6px"><input class="ck-in" type="number" step="any" inputmode="decimal" data-k="'+r[0]+'" data-f="nguong" value="'+u(i.nguong)+'" style="width:90px;min-height:42px">'+u(r[2])+"</span>":"")+'<select class="ck-in" data-k="'+r[0]+'" data-f="batBuoc" style="width:auto;min-height:42px"><option value="1"'+(i.batBuoc?" selected":"")+'>Bắt buộc</option><option value="0"'+(i.batBuoc?"":" selected")+">Cộng điểm</option></select></div>"}).join("")+'<div class="ck-bar" style="margin:12px 0 0"><button class="ck-btn pri" id="ck-tca">Áp dụng</button><button class="ck-btn" id="ck-tcm">Về mặc định chung</button><button class="ck-btn" id="ck-tcg">Mặc định Trường Money</button>'+(a?'<button class="ck-btn" id="ck-tcs">Lưu làm mặc định chung (dùng cho email)</button>':"")+'</div><div class="ck-note">"Bắt buộc": mã phải qua mới được tính là đạt. "Cộng điểm": chỉ cộng điểm. P/E tương lai cần cột DuPhongLNST4QuyToi trong Sheet.</div>';var o=function(){var r={};return[].forEach.call(n.querySelectorAll("[data-k]"),function(i){var s=i.dataset.k,h=i.dataset.f;r[s]=r[s]||{},h==="dung"?r[s].dung=i.checked:h==="batBuoc"?r[s].batBuoc=i.value==="1":i.value!==""&&(r[s].nguong=Number(String(i.value).replace(",",".")))}),r};c("#ck-tca").onclick=function(){d.set("tc",o()),v(!0),k("Đã áp dụng tiêu chí riêng của bạn.")},c("#ck-tcm").onclick=function(){d.del("tc"),v(!0)},c("#ck-tcg").onclick=function(){d.set("tc",t.tieuChiGoc||null),v(!0)},a&&(c("#ck-tcs").onclick=function(){var r=o();m("luuTieuChi",{tieuChi:r}).then(function(i){d.del("tc"),L(i),k("Đã lưu làm mặc định chung.")}).catch(function(i){k(i.message)})})}}function et(){var t=c("#ck-bc"),n=c("#ck-bcn"),e=0;t.disabled=!0,t.textContent="Đang lấy báo cáo…";var a=function(){m("capNhatBaoCao",{batDauMoi:e===0}).then(function(o){if(e++,n&&(n.textContent="Đang lấy báo cáo quý: "+o.daXong+"/"+o.tong+" mã"+(o.loi.length?" · chưa lấy được "+o.loi.length+" mã":"")+"…"),!o.xong&&e<60&&l.tab==="tamsoat")return a();o.tong?n&&(n.textContent="Đã lấy báo cáo "+o.soOk+"/"+o.tong+" mã."+(o.loi.length?" Chưa lấy được: "+o.loi.slice(0,20).join(", ")+(o.loi.length>20?"…":"")+(o.loiCuoi?" ("+o.loiCuoi+")":""):"")):n&&(n.textContent="Danh sách tầm soát đang trống: thêm mã vào tab DanhSachTamSoat trong Sheet, theo dõi vài mã, hoặc kiểm tra CauHinh → NhomTamSoat."),t.disabled=!1,t.textContent="Lấy báo cáo quý tự động",v(!0)}).catch(function(o){n&&(n.textContent="Lỗi: "+o.message),t.disabled=!1,t.textContent="Lấy báo cáo quý tự động"})};a()}function L(t){if(!(!t||!c("#ck-tsl"))){l.ts=t,H()||d.set("ts",{thoiGian:t.thoiGian,ketQua:t.ketQua,tieuChi:t.tieuChi,tieuChiGoc:t.tieuChiGoc,capNhatLuc:t.capNhatLuc}),at(t);var n=t.ketQua||[],e=c("#ck-tsf").value,a=function(i){return n.filter(function(s){return i.indexOf(s.ketLuan)>=0}).length};c("#ck-tss").innerHTML='<div><b class="u">'+a(["MANH","DAT"])+'</b><span>Đạt</span></div><div><b class="r">'+a(["THEO_DOI"])+'</b><span>Theo dõi</span></div><div><b class="d">'+a(["LOAI"])+"</b><span>Loại</span></div><div><b>"+n.length+"</b><span>Mã có số liệu</span></div>";var o=n.filter(function(i){return!e||(e==="DAT"?i.ketLuan==="DAT"||i.ketLuan==="MANH":i.ketLuan===e)}),r=t.capNhatLuc?"Báo cáo quý cập nhật lúc "+u(t.capNhatLuc)+" · ":"";if(!n.length){c("#ck-tsl").innerHTML='<div class="ck-card">Chưa có số liệu báo cáo quý. '+(q()?"Bấm <b>Lấy báo cáo quý tự động</b> ở trên: trang sẽ tải báo cáo các mã VN100 và mã bạn theo dõi (khoảng vài phút), sau đó tự lọc. Từ đó mỗi tối 18h hệ thống tự cập nhật.":'Nhờ quản trị bấm "Lấy báo cáo quý tự động". Mỗi tối 18h hệ thống tự cập nhật.')+"</div>";return}if(!o.length){c("#ck-tsl").innerHTML='<div class="ck-note">'+r+"Tính lúc "+u(t.thoiGian)+'</div><div class="ck-card">Hiện không có mã nào '+(e==="DAT"?"đạt đủ tiêu chí":"trong nhóm này")+'. Bạn có thể nới tiêu chí ở mục "Tiêu chí lọc" hoặc chọn "Tất cả mã có số liệu".</div>';return}c("#ck-tsl").innerHTML='<div class="ck-note">'+r+"Tính lúc "+u(t.thoiGian)+" · "+o.length+" mã</div>"+o.map(function(i){return'<div class="ck-card"><div style="display:flex;justify-content:space-between;align-items:center;gap:8px;flex-wrap:wrap"><div><b style="font-size:22px">'+u(i.ma)+'</b> <span class="m">'+u(i.quy)+(i.nganh?" · "+u(i.nganh):"")+'</span></div><span class="ck-badge b-'+i.ketLuan+'">'+Z[i.ketLuan]+'</span></div><div class="ck-grid" style="margin-top:8px"><div class="m">Giá: <b class="ck-num" style="color:var(--text)">'+p(i.gia)+'</b></div><div class="m">P/E: <b class="ck-num" style="color:var(--text)">'+p(i.pe,1)+'</b></div><div class="m">P/E tương lai: <b class="ck-num" style="color:var(--text)">'+p(i.peTuongLai,1)+'</b></div><div class="m">Điểm: <b style="color:var(--text)">'+(i.diem||0)+"/"+(i.diemToiDa||0)+"</b></div></div>"+(i.tieuChi&&i.tieuChi.length?'<ul class="ck-tc">'+i.tieuChi.map(function(s){return"<li><span>"+(s.dat?'<b class="u">✓</b> ':'<b class="d">✗</b> ')+u(s.ten)+(s.batBuoc?"":' <span class="m">(cộng điểm)</span>')+'</span><span class="ck-num">'+u(s.giaTri).replace(/(\d)\.(\d)/g,"$1,$2")+"</span></li>"}).join("")+"</ul>":"")+(i.ghiChu&&i.ghiChu.length?'<div class="ck-note" style="color:#fcd34d">'+i.ghiChu.map(u).join("<br>")+"</div>":"")+'<div class="ck-bar" style="margin:10px 0 0"><button class="ck-btn sm" data-chart="'+u(i.ma)+'">Xem biểu đồ</button><button class="ck-btn sm" data-td="'+u(i.ma)+'">+ Theo dõi</button></div></div>'}).join(""),c("#ck-tsl").onclick=function(i){var s=i.target.getAttribute("data-chart"),h=i.target.getAttribute("data-td");s&&(l.ma=s,d.set("ma",s),y("bieudo")),h&&(l.themMa=h,y("theodoi"))}}}function it(){var t=l.themMa||"";l.themMa="",c("#ck-view").innerHTML='<div class="ck-card"><h3 style="margin:0 0 4px">Thêm / sửa mã theo dõi</h3><div class="ck-note">Nhập giá mua để nhận cảnh báo cắt lỗ 5–8%. Ngưỡng trên/dưới tuỳ chọn. Giá theo nghìn đồng (vd 125.5).</div><form id="ck-tdf"><div class="ck-grid"><div><label for="ck-tma">Mã</label><input class="ck-in" id="ck-tma" maxlength="10" style="text-transform:uppercase" required value="'+u(t)+'"></div><div><label for="ck-tgm">Giá mua</label><input class="ck-in" id="ck-tgm" inputmode="decimal"></div><div><label for="ck-ttr">Ngưỡng trên</label><input class="ck-in" id="ck-ttr" inputmode="decimal"></div><div><label for="ck-tdu">Ngưỡng dưới</label><input class="ck-in" id="ck-tdu" inputmode="decimal"></div></div><label for="ck-tgc">Ghi chú / kế hoạch</label><input class="ck-in" id="ck-tgc" maxlength="200"><button class="ck-btn pri" style="margin-top:12px;width:100%" type="submit">Lưu</button></form></div><div id="ck-tdl"><div class="ck-note">Đang tải…</div></div>',c("#ck-tdf").onsubmit=function(e){e.preventDefault();var a={ma:c("#ck-tma").value.trim().toUpperCase(),giaMua:c("#ck-tgm").value.replace(",","."),nguongTren:c("#ck-ttr").value.replace(",","."),nguongDuoi:c("#ck-tdu").value.replace(",","."),ghiChu:c("#ck-tgc").value},o=this.querySelector("button[type=submit]");o.textContent="Đang lưu…",m("luuTheoDoi",a).then(function(r){k("Đã lưu "+a.ma),this.reset&&this.reset(),D(r.theoDoi)}.bind(this)).catch(function(r){k(r.message)}).then(function(){o.textContent="Lưu"})};var n=d.get("td");n&&D(n.list,n.gia),m("theoDoi").then(function(e){D(e.theoDoi)}).catch(function(e){c("#ck-tdl").innerHTML='<div class="ck-note d">'+u(e.message)+"</div>"})}function D(t,n){var e=c("#ck-tdl");if(e){if(l.td=t,!t.length){e.innerHTML='<div class="ck-note">Chưa theo dõi mã nào.</div>';return}var a=n||{},o=function(){e.innerHTML='<div class="ck-tablewrap"><table><thead><tr><th>Mã</th><th>Giá</th><th>%</th><th>Giá mua</th><th>Lãi/lỗ</th><th>Ngưỡng trên</th><th>Ngưỡng dưới</th><th style="text-align:left">Ghi chú</th><th></th></tr></thead><tbody>'+t.map(function(r){var i=a[r.ma]||{},s=r.giaMua&&i.gia?(i.gia-r.giaMua)/r.giaMua*100:null,h=N(i.gia,i),x=s===null?"":s>=0?"u":s<=-5?"d":"r";return'<tr data-ma="'+u(r.ma)+'"><td class="'+h+'">'+u(r.ma)+'</td><td class="ck-num '+h+'" style="font-weight:800">'+p(i.gia)+'</td><td class="ck-num '+h+'">'+(i.pct==null?"—":f(i.pct)+p(i.pct)+"%")+'</td><td class="ck-num">'+p(r.giaMua)+'</td><td class="ck-num '+x+'">'+(s===null?"—":f(s)+p(s,1)+"%")+'</td><td class="ck-num">'+p(r.nguongTren)+'</td><td class="ck-num">'+p(r.nguongDuoi)+'</td><td style="text-align:left;white-space:normal;min-width:140px">'+u(r.ghiChu)+'</td><td><button class="ck-btn sm" data-sua="'+u(r.ma)+'">Sửa</button> <button class="ck-btn sm" data-xoa="'+u(r.ma)+'">Xoá</button></td></tr>'}).join("")+'</tbody></table></div><div class="ck-note">Cảnh báo gửi qua Gmail trong giờ giao dịch, 15 phút kiểm tra một lần, mỗi loại một lần/ngày.</div>'};o(),e.onclick=function(r){var i=r.target.getAttribute("data-sua"),s=r.target.getAttribute("data-xoa");if(i){var h=t.filter(function(T){return T.ma===i})[0];c("#ck-tma").value=h.ma,c("#ck-tgm").value=h.giaMua==null?"":h.giaMua,c("#ck-ttr").value=h.nguongTren==null?"":h.nguongTren,c("#ck-tdu").value=h.nguongDuoi==null?"":h.nguongDuoi,c("#ck-tgc").value=h.ghiChu||"",c("#ck-tma").scrollIntoView({behavior:"smooth",block:"center"});return}if(s){if(!confirm("Bỏ theo dõi "+s+"?"))return;t=t.filter(function(T){return T.ma!==s}),o(),m("xoaTheoDoi",{ma:s}).then(function(T){D(T.theoDoi,a)}).catch(function(T){k(T.message),m("theoDoi").then(function(ct){D(ct.theoDoi,a)})});return}var x=r.target.closest("tr");x&&x.dataset.ma&&(l.ma=x.dataset.ma,d.set("ma",l.ma),y("bieudo"))},n||m("bangDien",{nhom:"THEO_DOI"}).then(function(r){B(r.chiSo),r.bang.forEach(function(i){a[i.ma]=i}),d.set("td",{list:t,gia:a}),l.tab==="theodoi"&&o()}).catch(function(){})}}document.addEventListener("visibilitychange",function(){!document.hidden&&l.tab==="bang"&&b&&c("#ck-tb")&&S()}),document.readyState==="loading"?document.addEventListener("DOMContentLoaded",z):z()})();

Nhận xét

Bài đăng phổ biến từ blog này

trang/thudao/dang-ky-hoc.html · Bản trước khi chuyển sang kho (tải từ GitHub/jsDelivr)

trang/thudao/bai-viet/benh-cua-thu-dan-duong-dai-the-trien-lam-xu-thu-va-nguy-menh-de-vuot-co-nhan.html · Bản trước khi chuyển sang kho (có video, tải từ GitHub/jsDelivr)

trang/thudao/tai-lieu.html · Bản đang chạy 11/11/2026 (khối tải nhanh từ kho)