tradingview的配置和h5交互和jsbrige和ui定制

<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>
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

码狼先生

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值