tvjsx / trading-vue-js

💹 Hackable charting lib for traders. You can draw literally ANYTHING on top of candlestick charts. [Not Maintained]
https://tvjsx.github.io/trading-vue-demo/
MIT License
2.09k stars 638 forks source link

Vue3 branch status? #227

Open bitcoinvsalts opened 3 years ago

bitcoinvsalts commented 3 years ago

What is the status of the vue3 branch? I tried to use it on my vue3 app but it did not work.

here is my error log:

TradingVue.vue?0d24:4 Uncaught (in promise) TypeError: Cannot read property '_c' of undefined at Proxy.render (TradingVue.vue?0d24:4) at renderComponentRoot (runtime-core.esm-bundler.js:846) at componentEffect (runtime-core.esm-bundler.js:4280) at reactiveEffect (reactivity.esm-bundler.js:42) at effect (reactivity.esm-bundler.js:17) at setupRenderEffect (runtime-core.esm-bundler.js:4263) at mountComponent (runtime-core.esm-bundler.js:4222) at processComponent (runtime-core.esm-bundler.js:4182) at patch (runtime-core.esm-bundler.js:3791) at mountChildren (runtime-core.esm-bundler.js:3975)

Swoorup commented 3 years ago

You should submit a patch ;) Since this C4 has retired from the project.

diadal commented 3 years ago

it will be easier for C4 to migrate this to vue3 he knows to core of the code, once that is done it will be more readable for others to submit PR

Swoorup commented 3 years ago

Btw what is the goal of having a vue3 branch? I think a better goal would be to slow port over to adopt typescript and use composition api, which is more maintainable imo. A direct port is really hard to get right, since it's hard to know what is broken.

novecento commented 3 years ago

Hi, someone have done step forward V3 porting?

diadal commented 3 years ago

@novecento it works with V3 with little tweek


<template>
  <div class="TVChartContainer" :id="containerId" />
</template>

<script>
/* eslint-disable @typescript-eslint/no-unsafe-call */
/* eslint-disable @typescript-eslint/no-unsafe-member-access */

import { widget } from '../../../public/chart/charting_library';

import Datafeed from './api';
import { ref, onMounted, onBeforeUnmount, defineComponent } from 'vue';

export default defineComponent({
  name: 'TVChartContainer',
  props: {
    containerId: {
      default: 'trchartcontainer',
      type: String,
    },

    libraryPath: {
      default: '/chart/charting_library/',
      type: String,
    },

    fullscreen: {
      default: false,
      type: Boolean,
    },
    autosize: {
      default: true,
      type: Boolean,
    },

    options: {
      type: Object,
    },
  },

  setup(props) {
    const tvWidget = ref(null);
    onMounted(() => {
      const widgetOptions = {
        datafeed: Datafeed,
        container_id: props.containerId,
        library_path: props.libraryPath,
        fullscreen: props.fullscreen,
        autosize: props.autosize,
      };
      const pt = props.options;
      const opt = { ...widgetOptions, ...pt };
      tvWidget.value = new widget(opt);

      tvWidget.value.onChartReady(() => {
        tvWidget.value.headerReady().then(() => {

          tvWidget.value
            .activeChart()
            .createStudy('Moving Average Exponential', false, false, [26]);

        });
      });
    });
    onBeforeUnmount(() => {
      if (tvWidget.value !== null) {
        tvWidget.value.remove();
        tvWidget.value = null;
      }
      // tvWidget.value.unsubscribe('onAutoSaveNeeded', function(e) {
      //         // });
    });

    return {};
  },
});
</script>

<style lang="scss" scoped>
.TVChartContainer {
  height: calc(100vh - 176px);
}
</style>
<template>
    <TVChartContainer
          :key="componentKey"
          :options="{
            debug: false,
            symbol: useGetParameterByName('sb'),
            interval: useGetParameterByName('res'),
            theme: 'Dark',
            saveSymbol: true,
            saveInterval: true,
            auto_save_delay: 10,
            auto_save: true,
            loading_screen: { backgroundColor: '#000000' },
            load_last_chart: true,
            withdateranges: true,
            time_frames: TIMEFRAMES,
            enabled_features: [
              'side_toolbar_in_fullscreen_mode',
              'study_templates',
              'charts',
            ],
            charts_storage_url: 'https://myweb.com',
            charts_storage_api_version: '1.1',
            client_id: $domx,
            user_id: getChatId(),
            disabled_features: [
              'header_compare',
              'header_symbol_search',
              'compare_symbol',
              'border_around_the_chart',
              'go_to_date',
            ],

            hide_side_toolbar: false,
            allow_symbol_change: false,
            overrides: {
              'painProperties.background': '#111c2e',
              'symbolWatermarkProperties.color': '#111c2e',
            },
          }"
        />
</template>

<script lang="ts">
import {
  ref,
  onMounted,
  getCurrentInstance,
  ComponentInternalInstance,
  onBeforeUnmount,
  defineComponent,
  computed,
  watch,
  ComponentCustomProperties,
  defineAsyncComponent,
  provide,
} from 'vue';

import TVChartContainer from 'components/market/TVChartContainer.vue';

const INTERVAL = {
  MINUTE: '1',
  MINUTES_5: '5',
  MINUTES_15: '15',
  MINUTES_30: '30',
  HOUR: '60',
  HOURS_3: '180',
  HOURS_6: '360',
  HOURS_12: '720',
  DAY: 'D',
  WEEK: 'W',
};

const TIMEFRAMES = [
  // { text: '3y', resolution: INTERVAL.WEEK, description: '3 Years' },
  // { text: '1y', resolution: INTERVAL.DAY, description: '1 Year' },
  { text: '3m', resolution: INTERVAL.HOURS_12, description: '3 Months' },
  { text: '1m', resolution: INTERVAL.HOURS_6, description: '1 Month' },
  { text: '7d', resolution: INTERVAL.HOUR, description: '7 Days' },
  { text: '3d', resolution: INTERVAL.MINUTES_30, description: '3 Days' },
  { text: '1d', resolution: INTERVAL.MINUTES_15, description: '1 Day' },
  // { text: '6h', resolution: INTERVAL.MINUTES_5, description: '6 Hours' },
  // { text: '1h', resolution: INTERVAL.MINUTE, description: '1 Hour' }
];

const columns = [
  {
    name: 'name',
    required: true,
    label: 'Price',
    align: 'left',
    field: 'P',
  },
  { name: 'amount', align: 'right', label: 'Amount', field: 'Q' },
];

export default defineComponent({
  name: 'Market',
  components: {
    TVChartContainer

  },
  setup() {

    const componentKey = ref(0);

    onMounted(() => {
      //
    });
    onBeforeUnmount(() => {
     //
    });

    return {
      componentKey,
      getChatId,
    };
  },
});
</script>
diadal commented 3 years ago

@novecento keynote you must disallow webpack from re-bundle charting_library folder

novecento commented 3 years ago

sorry @diadal I lost myself, your code seems how to put TradingView chart inside vue component, how is related to trading-vue vue3?

diadal commented 3 years ago

maybe I don't get you right @novecento I thought you asked when trading-vue you be compatible with Vue3 if that is what you asking them it already does you only need to change a few lines that is why I shared that code is working with vue3 without stress

SacDin commented 2 years ago

@diadal thank you for the tweak and code. I tried but unable to find reference to the /public/chart/charting_library. can you please provide more details on where to locate it ?

diadal commented 2 years ago

@SacDin you need to contact the admin to give you access to the library then you can have access to charting_library

https://www.tradingview.com/HTML5-stock-forex-bitcoin-charting-library/?feature=charting-and-trading-platform

SacDin commented 2 years ago

@diadal thank you for update. I was under impression that this is completely open source alternative of tradingview.com provided charting library. Does your solution for vue 3 above rely on charting_library provided by tradingview.com ? I thought it is patch for this library to work as it is for vue 3 without additional proprietary library.