Đẩy tín hiệu lên web/blog
Bước 1: Hướng dẫn tạo Firebase Realtime Database
1. Đăng nhập và tạo dự án:
- Truy cập vào trang quản trị của Google: console.firebase.google.com (đăng nhập bằng tài khoản Gmail của bác).
- Bấm vào ô Create a project (hoặc Add project).
- Đặt tên dự án (ví dụ: uptradingvn-signals).
- Bấm Continue. Ở bước hỏi về Google Analytics, bác có thể gạt tắt đi cho nhanh rồi bấm Create project. Đợi khoảng 30 giây để hệ thống thiết lập.
2. Tạo Cơ sở dữ liệu (Database):
- Sau khi dự án tạo xong, bác nhìn sang cột menu bên trái, mở rộng mục Build (Xây dựng) và chọn Realtime Database.
- Bấm vào nút Create Database ở giữa màn hình.
- Bảng chọn vị trí máy chủ (Location) hiện ra, bác chọn Singapore (để tốc độ về Việt Nam nhanh nhất) rồi bấm Next.
- Chọn Start in test mode (Bắt đầu ở chế độ thử nghiệm) rồi bấm Enable.
3. Mở khóa quyền Ghi/Đọc dữ liệu (Bắt buộc):
Để AmiBroker có thể tự do đẩy dữ liệu lên mà không bị chặn, chúng ta cần tinh chỉnh một chút ở lớp bảo mật.
- Bác chuyển sang thẻ Rules (Quy tắc) ở ngay cạnh thẻ Data.
- Sửa nội dung trong bảng code để cả read và write đều là true. Code sẽ trông chính xác như thế này:
JSON
{
"rules": {
".read": true,
".write": true
}
}
- Bấm nút Publish (Xuất bản) để lưu lại.
4. Lấy đường link kết nối (API URL):
- Bác quay trở lại thẻ Data (Dữ liệu).
- Ngay ở giữa màn hình sẽ có một đường link kèm biểu tượng cái mắt xích (Ví dụ: https://uptradingvn-............firebasedatabase.app/). Bác hãy Copy toàn bộ đường link này. thay vào trong trang web
Bước 2: Mã nguồn cho trang web/blog
Download trang Trading Terminal
Bước 3: Tích hợp Đẩy tín hiệu lên telegram và web cùng lúc
Copy mã code cho amibroker bên dưới để sử dụng, nhớ thay TeleToken (Bot API key) và TeleChatID (ID kênh).
// =========================================================================
// HỆ THỐNG XUẤT TÍN HIỆU LIVE LÊN FIREBASE & TELEGRAM (BẢN FULL CHUẨN)
// =========================================================================
// -------------------------------------------------------------------------
// 1. BỘ LỌC TÍN HIỆU
// -------------------------------------------------------------------------
_V20 = MA(V, 20);
_C20 = MA(C, 20);
VolDownMax10 = HHV( IIf(C < Ref(C, -1), V, 0), 10 );
isPocketPivot = C > Ref(C, -1) AND V > VolDownMax10 AND C > _C20 AND Ref(C,-1) <= _C20*1.02;
isVCPBreak = Cross(C, HHV(Ref(H, -1), 20)) AND V > _V20 * 1.5 AND C == H;
isSpring = L < Ref(LLV(L, 20), -1) AND C > O AND C > (H+L)/2 AND V > _V20;
isUpthrust = H > Ref(HHV(H, 20), -1) AND C < (H+L)/2 AND V > _V20 * 1.5;
BuySig = isPocketPivot OR isVCPBreak OR isSpring;
SellSig = isUpthrust;
Filter = BuySig OR SellSig;
// -------------------------------------------------------------------------
// 2. TỰ ĐỘNG DỌN RÁC FIREBASE KHI SANG NGÀY MỚI
// -------------------------------------------------------------------------
if (Status("stocknum") == 0) {
TodayNum = Now(3);
LastClearDate = Nz(StaticVarGet("LastClearDate"));
if (TodayNum != LastClearDate) {
FirebaseClearURL = "https://uptradingvn-signals-default-rtdb.asia-southeast1.firebasedatabase.app/signals.json";
httpClear = CreateObject("MSXML2.XMLHTTP");
if(httpClear) {
httpClear.Open("DELETE", FirebaseClearURL, 0);
httpClear.Send();
StaticVarSet("LastClearDate", TodayNum);
_TRACE("SYSTEM: Da don dep sach se kho du lieu cho NGAY MOI.");
}
}
}
/// -------------------------------------------------------------------------
// 3. BẮN TÍN HIỆU LÊN FIREBASE & TELEGRAM (THÊM %, VOL, GTGD)
// -------------------------------------------------------------------------
LB = BarCount - 1;
if (Filter[LB]) {
ActionStr = "BAN";
if (BuySig[LB]) ActionStr = "MUA";
// 🧠 TẠO MÃ GHI NHỚ TRÁNH LẶP
TodayNum = Now(3);
MemKey = "SENT_" + NumToStr(TodayNum, 1.0, False) + "_" + Name() + "_" + ActionStr;
// 🛑 KIỂM TRA BỘ NHỚ
if (Nz(StaticVarGet(MemKey)) == 0) {
SigNameStr = "";
if (isPocketPivot[LB]) SigNameStr = "Pocket Pivot Chan Song";
else if (isVCPBreak[LB]) SigNameStr = "Breakout VCP Bung No Vol";
else if (isSpring[LB]) SigNameStr = "Spring Ru Bo (Wyckoff)";
else if (isUpthrust[LB]) SigNameStr = "Upthrust - Bay Tang Gia";
// --- TÍNH TOÁN NGÀY GIỜ ---
DateStrFull = NumToStr(TodayNum, 1.0, False);
DayStr = StrRight(DateStrFull, 2);
MonthStr = StrMid(DateStrFull, 4, 2);
YearStr = StrLeft(DateStrFull, 4);
DateDisplay = DayStr + "/" + MonthStr + "/" + YearStr;
vTimeNum = Now(4);
TimeStrFull = StrFormat("%06.0f", vTimeNum);
TimeDisplay = StrLeft(TimeStrFull, 2) + ":" + StrMid(TimeStrFull, 2, 2);
PriceStr = NumToStr(C[LB], 1.2);
Ticker = Name();
// --- TÍNH TOÁN CÁC THÔNG SỐ NÂNG CAO ---
// 1. Phần trăm thay đổi giá (Đã sửa lỗi cú pháp Ref)
PrevClose = C[LB - 1]; // Giá đóng cửa phiên liền trước
PctChange = (C[LB] - PrevClose) / PrevClose * 100;
PctStrWeb = NumToStr(PctChange, 1.2) + "%";
PctStrTele = NumToStr(PctChange, 1.2) + "%25"; // Dùng %25 thay cho % để không lỗi URL
if (PctChange > 0) {
PctStrWeb = "+" + PctStrWeb;
PctStrTele = "%2B" + PctStrTele; // Dùng %2B thay cho dấu + để không lỗi URL
}
// 2. Khối lượng so với TB 20 phiên (VD: 2.5x)
VolRatio = V[LB] / _V20[LB];
VolRatioStr = NumToStr(VolRatio, 1.1) + "x";
// 3. Giá trị giao dịch (Quy đổi ra Tỷ VNĐ)
ValBil = (C[LB] * V[LB]) / 1000000;
ValStr = NumToStr(ValBil, 1.1) + " Ty";
// --- 3.1 GỬI LÊN WEB (FIREBASE) ĐÃ BỔ SUNG DATA ---
JsonData = "{\"time\":\"" + TimeDisplay + "\",\"ticker\":\"" + Ticker + "\",\"action\":\"" + ActionStr + "\",\"signame\":\"" + SigNameStr + "\",\"price\":\"" + PriceStr + "\",\"pct\":\"" + PctStrWeb + "\",\"val\":\"" + ValStr + "\",\"volratio\":\"" + VolRatioStr + "\"}";
FirebaseURL = "https://uptradingvn-signals-default-rtdb.asia-southeast1.firebasedatabase.app/signals.json";
http = CreateObject("MSXML2.XMLHTTP");
if(http) {
http.Open("POST", FirebaseURL, 0);
http.SetRequestHeader("Content-Type", "application/json");
http.Send(JsonData);
}
// --- 3.2 GỬI LÊN NHÓM TELEGRAM ---
TeleToken = "xxxxxxxxxxx";
TeleChatID = "xxxxxxxxxxx";
TeleIcon = "%E2%9A%A0";
if (BuySig[LB]) TeleIcon = "%F0%9F%9A%80";
TeleMsg = "%F0%9F%9A%A8 TIN HIEU ROBOT UPTRADINGVN %F0%9F%9A%A8%0A%0A" +
"%E2%8F%B0 Thoi gian: " + TimeDisplay + " (" + DateDisplay + ")%0A" +
TeleIcon + " Hanh dong: " + ActionStr + "%0A" +
"%F0%9F%8F%B7 Ma: " + Ticker + " (" + PctStrTele + ")%0A" +
"%F0%9F%93%9D Mo hinh: " + SigNameStr + "%0A" +
"%F0%9F%92%B2 Vung gia: " + PriceStr + "%0A" +
"%F0%9F%93%8A Vol vs MA20: " + VolRatioStr + "%0A" +
"%F0%9F%92%B0 GTGD: " + ValStr;
TeleURL = "https://api.telegram.org/bot" + TeleToken + "/sendMessage?chat_id=" + TeleChatID + "&text=" + TeleMsg;
httpTele = CreateObject("MSXML2.XMLHTTP");
if(httpTele) {
httpTele.Open("GET", TeleURL, 0);
httpTele.Send();
_TRACE("SUCCESS: Da ban Telegram ma " + Ticker);
}
// 🧠 LƯU VÀO SỔ TAY ĐỂ KHÔNG BÁO LẶP
StaticVarSet(MemKey, 1);
// 🛑 NGHỈ 1 GIÂY CHỐNG SPAM TELEGRAM
wsh = CreateObject("WScript.Shell");
if(wsh) {
wsh.Run("ping 127.0.0.1 -n 2", 0, True);
}
}
}
// -------------------------------------------------------------------------
// 4. HIỂN THỊ BẢNG AMIBROKER
// -------------------------------------------------------------------------
ActionCol = WriteIf(BuySig, "MUA", "BAN");
SigNameCol = WriteIf(isPocketPivot, "Pocket Pivot",
WriteIf(isVCPBreak, "Breakout VCP",
WriteIf(isSpring, "Spring Ru Bo",
WriteIf(isUpthrust, "Upthrust", ""))));
AddTextColumn(ActionCol, "Hanh Dong", 1.0, colorWhite, IIf(BuySig, colorDarkGreen, colorDarkRed));
AddTextColumn(SigNameCol, "Tin Hieu", 1.0);
AddColumn(V, "Khoi Luong", 1.0);
/* Neu dung doan ma truc tiep tren ami thi:
1. xoa doan ma tren web: sendTelegramMessage(...)
2. va doan sau:
// Cấu hình Telegram Bot
const TELEGRAM_TOKEN = 'ĐIỀN_TOKEN_CỦA_BOT_VÀO_ĐÂY';
const TELEGRAM_CHAT_ID = 'ĐIỀN_CHAT_ID_CỦA_NHÓM_VÀO_ĐÂY';
function sendTelegramMessage(ticker, action, signame, price) {
const url = `https://api.telegram.org/bot${TELEGRAM_TOKEN}/sendMessage`;
// Đổi màu icon cho trực quan
const icon = (action && action.trim().toUpperCase() === "MUA") ? "🟢" : "🔴";
// Soạn nội dung tin nhắn (Dùng HTML để in đậm/in nghiêng)
const message = `
🚨 TÍN HIỆU ${action.toUpperCase()} 🚨
${icon} Mã cổ phiếu: ${ticker}
📌 Mô hình/Tín hiệu: ${signame}
💰 Mức giá: ${price}
⏱ Thời gian: ${new Date().toLocaleTimeString('vi-VN')}
`;
// Gửi request tới Telegram
fetch(url, {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({
chat_id: TELEGRAM_CHAT_ID,
text: message,
parse_mode: 'HTML'
})
}).catch(error => console.error("Lỗi gửi Telegram:", error));
}
UPTRADINGVN