<script setup>
import { onMounted, ref, onUnmounted } from "vue";
import { widget } from "../../public/charting_library";
import Datafeed from "@/api/tv/datafeed.js";
const chartContainer = ref();
let chartWidget;
let macdStudy;
let rsiStudy;
let emaStudy;
let kdjStudy;
let bollStudy;
let volStudy;
let maStudy;
let williamsRStudy;
let macStudy;
onMounted(() => {
const localTimezone = Intl.DateTimeFormat().resolvedOptions().timeZone;
const widgetOptions = {
symbol: "BTCUSDT",
interval: "1",
container: chartContainer.value,
datafeed: Datafeed,
library_path: "/charting_library/",
locale: getLanguageFromURL() || "zh",
debug: false,
// has_intraday: true,
disabled_features: [
"header_symbol_search", // 禁用符号搜索栏
"header_interval_dialog", // 禁用时间区间选择
"header_compare", // 禁用比较按钮
"header_saveload", // 禁用保存和加载布局的功能
"header_fullscreen_button", // 禁用全屏按钮
'header_indicators', // 禁用指标按钮
"header_undo_redo", // 禁用撤销/重做按钮
"header_screenshot", // 禁用截图按钮
"header_resolutions", // 禁用时间分辨率选择
"header_chart_type", // 禁用图表类型选择
"header_settings", // 禁用设置按钮
"context_menus", //右击隐藏
"symbol_search_hot_key",
"left_toolbar",
// "control_bar",
"go_to_date",
"header_saveload",
"items_favoriting",
"show_object_tree",
"show_interval_dialog_on_key_press",
// 'legend_widget',
"header_quick_search",
"legend_symbol_search",
"use_localstorage_for_settings",
"timeframes_toolbar", //底部的bar
"header_widget",//头部的bar
"main_series_scale_menu"//右下角设置隐藏
],
enabled_features: ["hide_resolution_in_legend"],
timezone: localTimezone,
time_frames: [
// 自定义时间范围按钮
],
"study_count_limit": 3,
autosize: true,
};
if (getStyle() == "dark") {
widgetOptions.overrides = {
"paneProperties.background": "#222630",
"paneProperties.vertGridProperties.color": "#303A47",
"paneProperties.horzGridProperties.color": "#303A47",
"scalesProperties.textColor": "#ffffff",
};
} else {
widgetOptions.overrides = {
"paneProperties.background": "#ffffff",
"paneProperties.vertGridProperties.color": "#EBEBEB",
"paneProperties.horzGridProperties.color": "#EBEBEB",
"scalesProperties.textColor": "#000000",
};
}
window.chartWidget = chartWidget = new widget(widgetOptions);
chartWidget.onChartReady(() => {
setTimeout(() => {
hidetoolbar();
}, 1000);
connectWebViewJavascriptBridge(function (bridge) {
bridge.init(function (message, responseCallback) {
var data = {
"Javascript Responds": "Android调用JS初始化方法!",
};
responseCallback(data);
});
bridge.registerHandler("openktype", function (data, responseCallback) {
openktype();
responseCallback(responseData);
});
bridge.registerHandler("openstudy", function (data, responseCallback) {
openstudy();
responseCallback(responseData);
});
bridge.registerHandler(
"setResolution",
function (data, responseCallback) {
if (data == "1s") {
chartWidget.chart().setResolution(1);
chartWidget.activeChart().setChartType(3);
} else {
chartWidget.activeChart().setChartType(1);
if (data == "3d") {
chartWidget.chart().setResolution(4320);
}
chartWidget.chart().setResolution(data);
}
responseCallback(responseData);
}
);
bridge.registerHandler("openmacd", function (data, responseCallback) {
if (data == "true") {
openmacd();
} else {
closemacd();
}
responseCallback(responseData);
});
bridge.registerHandler("openWRStudy", function (data, responseCallback) {
if (data == "true") {
openWRStudy();
} else {
closeWRStudy();
}
responseCallback(responseData);
});
bridge.registerHandler("openEMAStudy", function (data, responseCallback) {
if (data == "true") {
openEMAStudy();
} else {
closeEMAStudy();
}
responseCallback(responseData);
});
bridge.registerHandler(
"openBOLLStudyOnMainChart",
function (data, responseCallback) {
if (data == "true") {
openBOLLStudyOnMainChart();
} else {
closeBOLLStudyOnMainChart();
}
responseCallback(responseData);
}
);
bridge.registerHandler(
"openAVGVolStudy",
function (data, responseCallback) {
if (data == "true") {
openAVGVolStudy();
} else {
closeAVGVolStudy();
}
responseCallback(responseData);
}
);
bridge.registerHandler("openKDJStudy", function (data, responseCallback) {
if (data == "true") {
openKDJStudy();
} else {
closeKDJStudy();
}
responseCallback(responseData);
});
bridge.registerHandler("openRSIStudy", function (data, responseCallback) {
if (data == "true") {
openRSIStudy();
} else {
closeRSIStudy();
}
responseCallback(responseData);
});
bridge.registerHandler("openVOLStudy", function (data, responseCallback) {
if (data == "true") {
openVOLStudy();
} else {
closeVOLStudy();
}
responseCallback(responseData);
});
bridge.registerHandler("openma", function (data, responseCallback) {
if (data == "true") {
openma();
} else {
closema();
}
responseCallback(responseData);
});
bridge.registerHandler("openMAC", function (data, responseCallback) {
if (data == "true") {
openMAC();
} else {
closeMAC();
}
responseCallback(responseData);
});
bridge.registerHandler("changeTheme", function (data, responseCallback) {
changeTheme(data);
responseCallback(responseData);
});
bridge.registerHandler("closemacd", function (data, responseCallback) {
closemacd();
responseCallback(responseData);
});
bridge.registerHandler("closeWRStudy", function (data, responseCallback) {
closeWRStudy();
responseCallback(responseData);
});
bridge.registerHandler("closeEMAStudy", function (data, responseCallback) {
closeEMAStudy();
responseCallback(responseData);
});
bridge.registerHandler("closeBOLLStudyOnMainChart", function (data, responseCallback) {
closeBOLLStudyOnMainChart();
responseCallback(responseData);
});
bridge.registerHandler("closeSARStudy", function (data, responseCallback) {
closeSARStudy();
responseCallback(responseData);
});
bridge.registerHandler("closeKDJStudy", function (data, responseCallback) {
closeKDJStudy();
responseCallback(responseData);
});
bridge.registerHandler("closeRSIStudy", function (data, responseCallback) {
closeRSIStudy();
responseCallback(responseData);
});
bridge.registerHandler("closeVOLStudy", function (data, responseCallback) {
closeVOLStudy();
responseCallback(responseData);
});
bridge.registerHandler("closema", function (data, responseCallback) {
closema();
responseCallback(responseData);
});
bridge.registerHandler("closeMAC", function (data, responseCallback) {
closeMAC();
responseCallback(responseData);
});
});
window.openktype = openktype;
window.openstudy = openstudy;
window.hidetoolbar = hidetoolbar;
window.setResolution = setResolution;
window.openmacd = openmacd;
window.openma = openma;
window.openWRStudy = openWRStudy;
window.openEMAStudy = openEMAStudy;
window.openBOLLStudyOnMainChart = openBOLLStudyOnMainChart;
window.openKDJStudy = openKDJStudy;
window.openRSIStudy = openRSIStudy;
window.openVOLStudy = openVOLStudy;
window.closemacd = closemacd;
window.closeWRStudy = closeWRStudy;
window.closeEMAStudy = closeEMAStudy;
window.closeBOLLStudyOnMainChart = closeBOLLStudyOnMainChart;
window.closeKDJStudy = closeKDJStudy;
window.closeRSIStudy = closeRSIStudy;
window.closeVOLStudy = closeVOLStudy;
window.closema = closema;
window.changeTheme = changeTheme;
window.openMAC=openMAC;
window.closeMAC=closeMAC;
});
});
const hidetoolbar = () => {
const indicatorsButton = getdom(".layout__area--top", false);
if (indicatorsButton) {
//透明为空
indicatorsButton.style.top = "-38px";
} else {
console.log("Cannot find the Indicators button.");
}
//隐藏al
const price = getdom(".price-axis__modeButtons", false);
if (price) {
//透明为空
price.remove();
} else {
console.log("Cannot find the al button.");
}
//隐藏底部
const bottom = getdom(".chart-toolbar", false);
if (bottom) {
//透明为空
bottom.remove();
} else {
console.log("Cannot find the bottom button.");
}
//隐藏标的
const symbol = getdom("div[data-name='legend-series-item']", false);
if (symbol) {
//透明为空
symbol.removeChild(symbol.firstChild);
} else {
console.log("Cannot find the symbol.");
}
};
const setResolution = (data) => {
if (data == "1s") {
chartWidget.chart().setResolution(1);
chartWidget.activeChart().setChartType(3);
} else {
chartWidget.chart().setResolution(data);
chartWidget.activeChart().setChartType(1);
}
};
const changeTheme = (data) => {
chartWidget.changeTheme(data);
};
const connectWebViewJavascriptBridge = (callback) => {
if (window.WebViewJavascriptBridge) {
callback(WebViewJavascriptBridge);
} else {
document.addEventListener(
"WebViewJavascriptBridgeReady",
function () {
callback(WebViewJavascriptBridge);
},
false
);
}
};
const openstudy = () => {
const indicatorsButton = getdom(
'button[data-name="open-indicators-dialog"]',
false
);
if (indicatorsButton) {
indicatorsButton.click(); // 模拟点击内置指标按钮
} else {
console.log("Cannot find the Indicators button.");
}
};
const openktype = () => {
let indicatorsButton = null;
const Candlesbutton = getdom('button[aria-label="Candles"]', false);
const kbutton = getdom('button[aria-label="K线图"]', false);
Candlesbutton
? (indicatorsButton = Candlesbutton)
: (indicatorsButton = kbutton);
if (indicatorsButton) {
indicatorsButton.click(); // 模拟点击内置指标按钮
} else {
console.log("Cannot find the Indicators button.");
}
};
const openMAC= async()=> {
macStudy=await chartWidget.chart().createStudy('Moving Average Channel', false, {}, [14])
console.log(macStudy);
}
const closeMAC = () => {
if (macStudy) {
console.log(macStudy);
chartWidget.chart().removeEntity(macStudy);
macStudy = null;
}
};
const openmacd = async () => {
macdStudy = await chartWidget
.chart()
.createStudy("MACD", false, false, [], null, {});
console.log(macdStudy);
};
const closemacd = () => {
if (macdStudy) {
console.log(macdStudy);
chartWidget.chart().removeEntity(macdStudy);
macdStudy = null;
}
};
const openma = async () => {
maStudy = await chartWidget
.chart()
.createStudy("Moving Average Multiple", false, false, [], null, {});
};
const closema = () => {
if (maStudy) {
chartWidget.chart().removeEntity(maStudy);
maStudy = null;
}
};
const openEMAStudy = async () => {
emaStudy = await chartWidget.chart().createStudy(
"Moving Average Exponential",
false,
false,
{ length: 20 },
{
"plot.color": "#FF00FF", // 设置 EMA 线的颜色为紫色
"plot.linewidth": 2, // 设置 EMA 线的宽度为 2
"plot.linestyle": 0, // 设置 EMA 线的样式为实线
}
);
};
const closeEMAStudy = () => {
if (emaStudy) {
chartWidget.chart().removeEntity(emaStudy);
emaStudy = null;
}
};
const openBOLLStudyOnMainChart = async () => {
bollStudy = await chartWidget.chart().createStudy(
"Bollinger Bands",
true,
false,
{ length: 20, deviation: 2 },
{
"upper.linewidth": 2, // 设置上轨线的宽度
"lower.linewidth": 2, // 设置下轨线的宽度
"basis.color": "#0000FF", // 设置中线的颜色为蓝色
"upper.color": "#FF0000", // 设置上轨线的颜色为红色
"lower.color": "#00FF00", // 设置下轨线的颜色为绿色
}
);
console.log(bollStudy);
};
const closeBOLLStudyOnMainChart = () => {
if (bollStudy) {
console.log(bollStudy);
chartWidget.chart().removeEntity(bollStudy);
bollStudy = null;
}
};
const openKDJStudy = async () => {
kdjStudy = await chartWidget
.chart()
.createStudy("Stochastic", false, false, [], {
"K.color": "#FF0000", // 设置 K 线的颜色为红色
"D.color": "#0000FF", // 设置 D 线的颜色为蓝色
"J.color": "#00FF00", // 设置 J 线的颜色为绿色
"plot.linewidth": 2, // 设置线条的宽度
});
};
const closeKDJStudy = () => {
if (kdjStudy) {
chartWidget.chart().removeEntity(kdjStudy);
kdjStudy = null;
}
};
const openRSIStudy = async () => {
rsiStudy = await chartWidget.chart().createStudy(
"Relative Strength Index",
false,
false,
{ length: 14 },
{
"plot.color": "#FF4500", // 设置 RSI 线的颜色为橙红色
"plot.linewidth": 2, // 设置 RSI 线的宽度为 2
"overbought.color": "#FF0000", // 设置超买线的颜色为红色
"oversold.color": "#00FF00", // 设置超卖线的颜色为绿色
}
);
};
const closeRSIStudy = () => {
if (rsiStudy) {
chartWidget.chart().removeEntity(rsiStudy);
rsiStudy = null;
}
};
const openWRStudy = async () => {
williamsRStudy = await chartWidget
.chart()
.createStudy("Williams %R", false, false, [], null, {});
};
const closeWRStudy = () => {
if (williamsRStudy) {
chartWidget.chart().removeEntity(williamsRStudy);
williamsRStudy = null;
}
};
const openVOLStudy = async () => {
volStudy = await chartWidget.chart().createStudy("Volume", false, false, [], {
"plot.color": "#00BFFF", // 设置成交量柱的颜色为深天蓝色
"volume ma.length": 20, // 设置平均成交量的周期为 20
"volume ma.color": "#FF4500", // 设置平均成交量线的颜色为橙红色
"plot.linewidth": 2, // 设置成交量柱的宽度
});
};
const closeVOLStudy = () => {
if (volStudy) {
chartWidget.chart().removeEntity(volStudy);
volStudy = null;
}
};
const getLanguageFromURL = () => {
const regex = new RegExp("[\\?&]lang=([^&#]*)");
const results = regex.exec(window.location.search);
return results === null
? null
: decodeURIComponent(results[1].replace(/\+/g, " "));
};
const getStyle = () => {
const regex = new RegExp("[\\?&]theme=([^&#]*)");
const results = regex.exec(window.location.search);
return results === null
? null
: decodeURIComponent(results[1].replace(/\+/g, " "));
};
const getdom = (str, all) => {
var allElementsWithId = document.querySelectorAll("[id]");
var tradingViewElements = Array.from(allElementsWithId).filter(function (
element
) {
return element.id.startsWith("tradingview_");
});
var iframeDocument =
tradingViewElements[0].contentDocument ||
tradingViewElements[0].contentWindow.document;
if (all) {
return iframeDocument.querySelectorAll(str);
} else {
return iframeDocument.querySelector(str);
}
};
onUnmounted(() => {
if (chartWidget !== null) {
chartWidget.remove();
chartWidget = null;
}
});
</script>
<template>
<div class="TVChartContainer" ref="chartContainer" />
</template>
<style scoped>
.TVChartContainer {
width: 100%;
height: 100vh;
}
</style>
tradingview的配置和h5交互和jsbrige和ui定制
最新推荐文章于 2025-03-15 15:24:12 发布