@kodiak-finance/orderly-ui-tradingview 2.8.18-rc.1 → 2.8.19-rc.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.js +4369 -6
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +4366 -3
- package/dist/index.mjs.map +1 -1
- package/package.json +11 -11
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/icons/index.tsx","../src/components/lineType/index.tsx","../src/components/timeInterval/index.tsx","../src/components/displayControl/displayControl.desktop.tsx","../src/components/displayControl/displayControl.mobile.tsx","../src/components/displayControl/index.tsx","../src/components/tradingview.widget.tsx","../src/components/tradingview.script.ts","../src/utils/chart.util.ts","../src/tradingviewAdapter/broker/getBrokerAdapter.ts","../src/tradingviewAdapter/datafeed/helpers.ts","../src/tradingviewAdapter/datafeed/history-provider.ts","../src/tradingviewAdapter/datafeed/requester.ts","../src/tradingviewAdapter/datafeed/symbol-storage.ts","../src/tradingviewAdapter/datafeed/abstract-datafeed.ts","../src/tradingviewAdapter/datafeed/eventBus.ts","../src/utils/common.util.ts","../src/tradingviewAdapter/datafeed/websocket.service.ts","../src/tradingviewAdapter/datafeed/datafeed.ts","../src/tradingviewAdapter/hooks/useBroker.ts","../src/tradingviewAdapter/hooks/useCancelOrder.ts","../src/tradingviewAdapter/renderer/tpsl.util.ts","../src/tradingviewAdapter/hooks/useEditOrder.ts","../src/tradingviewAdapter/hooks/useSendOrder.ts","../src/tradingviewAdapter/hooks/useCreateRenderer.ts","../src/tradingviewAdapter/renderer/execution.service.ts","../src/tradingviewAdapter/broker/utils.ts","../src/tradingviewAdapter/renderer/orderLine.service.ts","../src/tradingviewAdapter/renderer/order.util.ts","../src/tradingviewAdapter/renderer/tpslCal.service.ts","../src/tradingviewAdapter/renderer/positionLine.service.ts","../src/tradingviewAdapter/renderer/tpsl.service.tsx","../src/tradingviewAdapter/renderer/renderer.ts","../src/tradingviewAdapter/renderer/brokerHostHandler.ts","../src/tradingviewAdapter/widget/util.ts","../src/tradingviewAdapter/widget/chart_hack.ts","../src/tradingviewAdapter/widget/option.ts","../src/tradingviewAdapter/widget/persistUtils.ts","../src/tradingviewAdapter/widget/index.ts","../src/components/tradingview.ui.tsx","../src/components/noTradingview/index.tsx","../src/components/topBar/index.tsx"],"names":["jsx","jsxs","CaretIcon","DisplaySettingIcon","IndicatorsIcon","SettingIcon","BarIcon","CandlesIcon","HollowCandlesIcon","LineIcon","AreaIcon","BaseLineIcon","UnSelectIcon","SelectedIcon","init_icons","__esmMin","props","lineType_exports","__export","lineType_default","useMemo","useState","useTranslation","Box","cn","DropdownMenuContent","DropdownMenuPortal","DropdownMenuRoot","DropdownMenuTrigger","Flex","Text","LineType","init_lineType","open","setOpen","t","lineTypeList","currentLineTypeIcon","data","item","e","timeInterval_exports","MobileTimeInterval","TimeInterval","React","useMediaQuery","MEDIA_TABLET","useMobileTimeIntervalMoreMap","DesktopTimeInterval","DropDownTimeInterval","init_timeInterval","timeIntervalMap","mobileTimeIntervalDefaultMap","mobileTimeIntervalMoreMap","currentIntervalIsInExpand","row","id","Switch","Fragment","DesktopDisplayControl","init_displayControl_desktop","displayControlState","changeDisplayControlState","displayControlMap","checked","MobileDisplayControl","init_displayControl_mobile","mobileDisplayControlMap","index","displayControl_exports","init_displayControl","forwardRef","useEffect","useRef","useAccount","useConfig","useLocalStorage","useOrderEntry_deprecated","useSymbolsInfo","useWS","useLocaleCode","AccountStatusEnum","OrderSide","OrderType","TradingviewFullscreenKey","modal","toast","Decimal","upColor","downColor","chartBG","pnlUpColor","pnlDownColor","pnlZoreColor","textColor","qtyTextColor","font","defaultColorConfig","getOveriides","colorConfig","isMobile","overrides","studiesOverrides","EXCHANGE","EXCHANGE_DISPLAY","withoutExchangePrefix","symbol","withExchangePrefix","getBrokerAdapter","host","broker","_symbolInfo","getOrderCombinationType","orderType","order","side","quantity","limitPrice","triggerPrice","orderCombinationType","context","getBrokerAdapter_default","getErrorMessage","error","HistoryProvider","datafeedUrl","requester","limitedServerResponse","symbolInfo","resolution","periodParams","requestParams","resolve","reject","initialResponse","result","reasonString","lastResultLength","followupResponse","followupResult","response","bars","meta","volumePresent","ohlPresent","i","barValue","Requester","headers","urlPath","params","paramKeys","key","options","responseTest","extractField","field","arrayIndex","valueIsArray","value","symbolKey","currency","unit","SymbolsStorage","datafeedSupportedResolutions","symbolName","currencyCode","unitId","searchString","exchange","symbolType","maxSearchResults","weightedResult","queryIsEmpty","positionInName","positionInDescription","weight","item1","item2","promises","alreadyRequestedExchanges","reason","symbolIndex","symbolsCount","tickerPresent","listedExchange","tradedExchange","fullName","ticker","definedValueOrDefault","defaultValue","AbstractDatafeed","datafeedURL","defaultConfiguration","configuration","onResult","onError","callback","userInput","onResolve","extension","resolveRequestStartTime","onResultReady","configurationData","MultiBroadcastEventBus","eventName","callbacks","cb","mapResolution","time","TradingViewSDKLocalstorageKey","getKlineKey","type","getSymbolTopics","topic","_WebsocketService","ws","subscribeId","onTickCallback","klineKey","unsub","close","high","low","volume","startTime","lastPrice","_","klineData","cbParams","onTickCbs","onTickCb","WebsocketService","getAutoIncrementId","Datafeed","apiUrl","message","bbo","s","listenerGuid","onTick","onResetCacheNeededCallback","symbols","onDataCallback","subscriptionId","msg","dataMap","symbolData","fastSymbols","onRealtimeCallback","useCallback","useOrderStream","i18n","EST_TPSL_PNL_DECIMAL","textDash","BracketAlgoType","TpslAlgoType","isTpslOrder","isBracketAlgoType","algoType","isPositionTpsl","isActivatedPositionTpsl","isActivatedTpslOrder","isActivatedQuantityTpsl","getTpslTag","quantityTpslNoMap","suffix","buildQuantityTpslNoMap","orders","idx","getTpslEstPnl","tpslOrder","position","sideFlag","openPrice","formatPnl","pnl","OrderStatus","useCancelOrder","pendingOrders","cancelOrder","cancelAlgoOrder","cancelTPSLChildOrder","rootOrder","useEventEmitter","useEditOrder","onToast","ee","updateOrder","updateAlgoOrder","updateTPSLOrder","lineValue","algoParams","res","values","useSendOrder","_sendMarketOrder","_sendOrder","createBrokerMethod","method","useBroker","closeConfirm","mode","editOrder","closePosition","sendMarketOrder","sendLimitOrder","getSymbolInfo","useBroker_default","usePositionStream","commify","startOfSecond","startOfMinute","startOfHour","startOfDay","startOfYear","startOfWeek","startOfMonth","IntervalMap","collectionOrders","collection","interval","orderList","startOf","period","base","group","limitOrdersByInterval","child","ExecutionService","_ExecutionService","instance","rerenderExecutions","changeInterval","filledOrders","basePriceDecimal","execution","avgExecPrice","excutedNumber","timestamp","getTrailingStopPrice","getOrderId","TpslCalService","estPnl","newPendingOrders","changed","orderId","prevPnl","newPnl","positions","_OrderLineService","orderLine","newOrderIdSet","pendingOrder","text","tpslTypeText","per","color","borderColor","price","lineLength","editKey","OrderLineService","PositionLineService","_PositionLineService","balance","unrealPnl","decimal","lineId","isPositiveUnrealPnl","isPositiveBalance","pnlColor","pnlDecimal","sideColor","DEFAULT_THRESHOLD","TPSLService","args","err","qty","priceScale","priceRange","tpslOrderLine","verticalLine","direction","tpslStartCircle","tpslEndCircle","range","intersectantPosition","endTime","percentage","duration","factor","offset","targetTime","Renderer","useCreateRenderer","displayControlSetting","renderer","setRenderer","rendererRef","state","unPnlPriceBasis","positionsInfo","quote_dp","fillOrders","createRenderer","container","removeRenderer","positionList","currentSymbolFillOrders","positionTpsl","limitOrder","stopOrder","bracketOrder","trailingStopOrder","symbolPosition","child_order","preventDefaultRenderHack","adapter","delegate","forceSilentOrdersPlacement","val","brokerHostHandler","waitForElm","iframeDocument","selector","initialIframe","observer","iframe","ChartHack","getDisabledFeatures","showVolumeInSamePane","disabledFeatures","getOptions","getChartSettingAdapterKey","chartKey","defaultSettings","chartCacheMap","parseAndCacheChartData","savedDataString","adapterSettingString","settingAdapterKey","transformedSavedDataString","savedData","adapterSetting","getChartData","isLoggedIn","localStorageSavedData","localStorageAdapterSetting","saveChartData","setting","saveChartAdapterSetting","debounce","func","delay","timer","debounced","DEFAULT_SETTINGS_KEY","DEBOUNCE_SAVE_TIME","Widget","chartProps","currentInterval","actionId","lineType","onClick","getBroker","widgetOptions","CHART_KEY","MOBILE_CHART_KEY","getChartKey","defaultLocale","localeCode","useTradingviewScript","tradingViewScriptSrc","libraryPath","tradingViewCustomCssUrl","customerOverrides","customerStudiesOverrides","theme","customerLoadingScreen","customerColorConfig","locale","classNames","chart","apiBaseUrl","accountState","setSide","symbolsInfo","fullscreen","setFullscreen","onSubmit","submitting","setDisplayControlState","displaySettingInfo","setInterval","lastUsedInterval","setLineType","lastUsedLineType","loadingScreen","chartingLibrarySciprtReady","setChartingLibrarySciprtReady","closePositionConfirmCallback","chartRef","onFullScreenChange","newInterval","changeLineType","newLineType","changeDisplaySetting","newSetting","openChartSetting","openChartIndicators","script","defaultOverrides","defaultItems","service","Divider","Trans","Link","url","children","NoTradingview","TopBar","topBar_default","LazyLineType","LazyTimeInterval","mod","LazyMobileDisplayControl","LazyDesktopDisplayControl","OperateButton","ZoomOutIcon","ZoomInIcon","TradingviewUI","ref","TradingviewWidget"],"mappings":"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","sourcesContent":["import React, { FC, SVGProps } from \"react\";\n\nexport const CaretIcon: FC<SVGProps<SVGSVGElement>> = (props) => (\n <svg\n viewBox=\"0 0 12 12\"\n fill=\"currentColor\"\n xmlns=\"http://www.w3.org/2000/svg\"\n {...props}\n >\n <g id=\"Caret-down\">\n <path\n id=\"Vector\"\n d=\"M3.00349 3.9978C2.59149 3.9978 2.36564 4.4653 2.61289 4.7948C2.98789 5.2948 5.23784 8.29479 5.61289 8.79479C5.81289 9.06128 6.20974 9.06128 6.40974 8.79479L9.40974 4.7948C9.65694 4.4653 9.41554 3.9978 9.00349 3.9978H3.00349Z\"\n />\n </g>\n </svg>\n);\n\nexport const DisplaySettingIcon: FC<SVGProps<SVGSVGElement>> = (props) => (\n <svg\n viewBox=\"0 0 18 18\"\n fill=\"currentColor\"\n xmlns=\"http://www.w3.org/2000/svg\"\n {...props}\n >\n <g id=\"Display settings\">\n <path\n id=\"Union\"\n fillRule=\"evenodd\"\n clipRule=\"evenodd\"\n d=\"M15.0571 10.9856L11.6295 5.06523L8.71377 10.8968C8.38933 11.5456 7.54464 11.7223 6.98733 11.2579L5.75311 10.2294L2.83709 14.7654L1.57532 13.9543L4.49134 9.41824C4.97892 8.65978 6.0207 8.49981 6.71338 9.07705L7.58387 9.80246L10.5991 3.77192C10.9997 2.97082 12.1302 2.93624 12.579 3.71137L14.6517 7.29147C14.7714 7.03643 15.0305 6.85983 15.3309 6.85983C15.7451 6.85983 16.0809 7.19562 16.0809 7.60983C16.0809 8.02405 15.7451 8.35983 15.3309 8.35983C15.31 8.35983 15.2892 8.35897 15.2687 8.35729L16.3553 10.2341L15.0571 10.9856ZM2.58093 6.85983C2.16672 6.85983 1.83093 7.19562 1.83093 7.60983C1.83093 8.02405 2.16672 8.35983 2.58093 8.35983C2.99515 8.35983 3.33093 8.02405 3.33093 7.60983C3.33093 7.19562 2.99515 6.85983 2.58093 6.85983ZM4.83093 6.85983C4.41672 6.85983 4.08093 7.19562 4.08093 7.60983C4.08093 8.02405 4.41672 8.35983 4.83093 8.35983C5.24515 8.35983 5.58093 8.02405 5.58093 7.60983C5.58093 7.19562 5.24515 6.85983 4.83093 6.85983ZM6.33093 7.60983C6.33093 7.19562 6.66672 6.85983 7.08093 6.85983C7.49515 6.85983 7.83093 7.19562 7.83093 7.60983C7.83093 8.02405 7.49515 8.35983 7.08093 8.35983C6.66672 8.35983 6.33093 8.02405 6.33093 7.60983ZM11.5809 6.85983C11.1667 6.85983 10.8309 7.19562 10.8309 7.60983C10.8309 8.02405 11.1667 8.35983 11.5809 8.35983C11.9951 8.35983 12.3309 8.02405 12.3309 7.60983C12.3309 7.19562 11.9951 6.85983 11.5809 6.85983Z\"\n />\n </g>\n </svg>\n);\n\nexport const LineTypeIcon: FC<SVGProps<SVGSVGElement>> = (props) => (\n <svg\n viewBox=\"0 0 18 18\"\n fill=\"currentColor\"\n xmlns=\"http://www.w3.org/2000/svg\"\n {...props}\n >\n <path\n fillRule=\"evenodd\"\n clipRule=\"evenodd\"\n d=\"M6 1.5C5.58579 1.5 5.25 1.83579 5.25 2.25V3.75H4.5C4.08579 3.75 3.75 4.08579 3.75 4.5V13.5C3.75 13.9142 4.08579 14.25 4.5 14.25H5.25V15.75C5.25 16.1642 5.58579 16.5 6 16.5C6.41421 16.5 6.75 16.1642 6.75 15.75V14.25H7.5C7.91421 14.25 8.25 13.9142 8.25 13.5V4.5C8.25 4.08579 7.91421 3.75 7.5 3.75H6.75V2.25C6.75 1.83579 6.41421 1.5 6 1.5ZM5.25 12.75V5.25H6.75V12.75H5.25ZM11.25 12.75V7.5H12.75V12.75H11.25ZM9.75 6.75C9.75 6.33579 10.0858 6 10.5 6H11.25V4.5C11.25 4.08579 11.5858 3.75 12 3.75C12.4142 3.75 12.75 4.08579 12.75 4.5V6H13.5C13.9142 6 14.25 6.33579 14.25 6.75V13.5C14.25 13.9142 13.9142 14.25 13.5 14.25H12.75V15.75C12.75 16.1642 12.4142 16.5 12 16.5C11.5858 16.5 11.25 16.1642 11.25 15.75V14.25H10.5C10.0858 14.25 9.75 13.9142 9.75 13.5V6.75Z\"\n />\n </svg>\n);\n\nexport const IndicatorsIcon: FC<SVGProps<SVGSVGElement>> = (props) => (\n <svg\n viewBox=\"0 0 18 18\"\n fill=\"currentColor\"\n xmlns=\"http://www.w3.org/2000/svg\"\n {...props}\n >\n <g id=\"Indicators\">\n <path\n id=\"Union\"\n fillRule=\"evenodd\"\n clipRule=\"evenodd\"\n d=\"M9.74483 2.25C8.96145 2.25 8.26885 2.76459 8.04549 3.51818L7.46202 5.48254H5.06262V7.08339H6.98652L5.00539 13.7532L4.31554 13.1112L3.22498 14.2831L4.4777 15.4489C5.08739 16.015 6.08317 15.7469 6.32134 14.945L8.65649 7.08339H11.6032V5.48254H9.13198L9.58033 3.97311C9.60167 3.90112 9.66833 3.85084 9.74483 3.85084H11.69V2.25H9.74483ZM10.6234 11.2354L10.2638 11.5172C10.0153 11.712 9.65591 11.6684 9.46115 11.4199C9.26639 11.1713 9.30998 10.812 9.55852 10.6172L10.1451 10.1575C10.5693 9.82514 11.1868 9.94011 11.4642 10.4005L11.4682 10.407L12.1304 11.5752L13.4594 10.3111C13.6882 10.0935 14.05 10.1025 14.2677 10.3313C14.4853 10.5601 14.4763 10.922 14.2475 11.1396L12.7116 12.6006L13.3897 13.797L13.6482 13.4503C13.8369 13.1972 14.1951 13.145 14.4483 13.3337C14.7014 13.5225 14.7536 13.8807 14.5649 14.1338L13.9917 14.9025L13.94 14.9457C13.5178 15.2981 12.8837 15.1886 12.6003 14.7226L12.5958 14.7151L11.8576 13.4129L10.3563 14.841C10.1275 15.0586 9.76561 15.0495 9.54798 14.8208C9.33036 14.592 9.3394 14.2301 9.56819 14.0125L11.2764 12.3875L10.6234 11.2354Z\"\n />\n </g>\n </svg>\n);\n\nexport const SettingIcon: FC<SVGProps<SVGSVGElement>> = (props) => (\n <svg\n viewBox=\"0 0 18 18\"\n fill=\"currentColor\"\n xmlns=\"http://www.w3.org/2000/svg\"\n {...props}\n >\n <g id=\"Setting\">\n <path\n id=\"Vector\"\n d=\"M6.72589 1.84154C5.66239 2.17904 4.74515 2.72954 3.93665 3.48254C3.6869 3.71504 3.6104 4.09604 3.7724 4.39604C4.37315 5.50679 3.74464 6.69554 2.38939 6.76379C2.05789 6.78029 1.76465 7.0263 1.68665 7.34955C1.5524 7.9083 1.49915 8.37629 1.49915 8.98979C1.49915 9.50504 1.55464 10.0885 1.66339 10.6075C1.73089 10.9315 2.0129 11.1648 2.3429 11.1933C3.7064 11.311 4.3814 12.3513 3.7724 13.6773C3.6374 13.972 3.6989 14.3245 3.93665 14.545C4.73315 15.2815 5.64814 15.8013 6.72589 16.1388C7.03339 16.2348 7.38064 16.1185 7.56964 15.8575C8.40364 14.7033 9.6134 14.6995 10.4054 15.8575C10.5921 16.1298 10.9341 16.261 11.2491 16.162C12.2894 15.8343 13.2584 15.277 14.0616 14.545C14.3091 14.3193 14.3744 13.954 14.2259 13.654C13.6019 12.3948 14.3197 11.239 15.6082 11.2165C15.9502 11.2105 16.2547 10.9863 16.3349 10.654C16.4647 10.1163 16.4991 9.64829 16.4991 8.98979C16.4991 8.42429 16.4324 7.86704 16.3116 7.32629C16.2351 6.98354 15.9359 6.74054 15.5849 6.73979C14.3167 6.73754 13.6056 5.49104 14.2259 4.39604C14.3984 4.09154 14.3444 3.71804 14.0849 3.48254C13.2674 2.74004 12.2706 2.15954 11.2259 1.84154C10.9049 1.74404 10.5636 1.86404 10.3821 2.14604C9.65764 3.27179 8.30465 3.29129 7.5929 2.17004C7.41065 1.88204 7.04989 1.73879 6.72589 1.84154ZM11.2844 3.43455C11.7966 3.64905 12.2009 3.8733 12.6651 4.22505C12.1206 5.9478 13.0439 7.73729 14.9564 8.17304C15.0036 8.48279 14.9991 8.67029 14.9991 8.98979C14.9991 9.37154 15.0044 9.50579 14.9609 9.78179C13.0566 10.1763 12.1146 11.9155 12.6449 13.7538C12.1889 14.0845 11.8626 14.314 11.2904 14.5353C9.94639 13.1673 8.0804 13.1073 6.7079 14.5443C6.1724 14.3088 5.76066 14.0995 5.34441 13.7478C5.86041 11.881 4.98815 10.2693 3.05165 9.7803C2.9654 9.4383 2.9999 8.4723 3.0494 8.17905C5.0519 7.69905 5.8409 5.92679 5.34365 4.21979C5.78315 3.88904 6.1784 3.6483 6.69215 3.4398C7.9859 4.75605 9.92839 4.8873 11.2844 3.43455ZM8.99915 5.98979C7.3424 5.98979 5.99915 7.33304 5.99915 8.98979C5.99915 10.6473 7.3424 11.9898 8.99915 11.9898C10.6559 11.9898 11.9991 10.6473 11.9991 8.98979C11.9991 7.33304 10.6559 5.98979 8.99915 5.98979ZM8.99915 7.48979C9.8279 7.48979 10.4991 8.16179 10.4991 8.98979C10.4991 9.81855 9.8279 10.4898 8.99915 10.4898C8.1704 10.4898 7.49915 9.81855 7.49915 8.98979C7.49915 8.16179 8.1704 7.48979 8.99915 7.48979Z\"\n />\n </g>\n </svg>\n);\n\nexport const BarIcon: FC<SVGProps<SVGSVGElement>> = (props) => (\n <svg\n viewBox=\"0 0 20 20\"\n fill=\"currentColor\"\n xmlns=\"http://www.w3.org/2000/svg\"\n {...props}\n >\n <g id=\"Bars\">\n <path\n id=\"Union\"\n fillRule=\"evenodd\"\n clipRule=\"evenodd\"\n d=\"M12.5 15.5C12.5 15.7761 12.7239 16 13 16H14C14.2761 16 14.5 15.7761 14.5 15.5V14H16C16.2761 14 16.5 13.7761 16.5 13.5V12.5C16.5 12.2239 16.2761 12 16 12H14.5V2.5C14.5 2.22386 14.2761 2 14 2H13C12.7239 2 12.5 2.22386 12.5 2.5V4H11C10.7239 4 10.5 4.22386 10.5 4.5V5.5C10.5 5.77614 10.7239 6 11 6H12.5V15.5ZM5.5 17.5C5.5 17.7761 5.72386 18 6 18H7C7.27614 18 7.5 17.7761 7.5 17.5V10H9C9.27614 10 9.5 9.77614 9.5 9.5V8.5C9.5 8.22386 9.27614 8 9 8H7.5V4.5C7.5 4.22386 7.27614 4 7 4H6C5.72386 4 5.5 4.22386 5.5 4.5V14H4C3.72386 14 3.5 14.2239 3.5 14.5V15.5C3.5 15.7761 3.72386 16 4 16H5.5V17.5Z\"\n />\n </g>\n </svg>\n);\n\nexport const CandlesIcon: FC<SVGProps<SVGSVGElement>> = (props) => (\n <svg\n viewBox=\"0 0 20 20\"\n fill=\"currentColor\"\n xmlns=\"http://www.w3.org/2000/svg\"\n {...props}\n >\n <g id=\"Candles\">\n <path\n id=\"Union\"\n fillRule=\"evenodd\"\n clipRule=\"evenodd\"\n d=\"M7.25 2.5V4H8.5C8.77614 4 9 4.22386 9 4.5V15.5C9 15.7761 8.77614 16 8.5 16H7.25V17.5C7.25 17.7761 7.02614 18 6.75 18H6.25C5.97386 18 5.75 17.7761 5.75 17.5V16H4.5C4.22386 16 4 15.7761 4 15.5V4.5C4 4.22386 4.22386 4 4.5 4H5.75V2.5C5.75 2.22386 5.97386 2 6.25 2H6.75C7.02614 2 7.25 2.22386 7.25 2.5ZM5.5 5.5V14.5H7.5V5.5H5.5ZM14.25 4.5V7H15.5C15.7761 7 16 7.22386 16 7.5V15.5C16 15.7761 15.7761 16 15.5 16H14.25V17.5C14.25 17.7761 14.0261 18 13.75 18H13.25C12.9739 18 12.75 17.7761 12.75 17.5V16H11.5C11.2239 16 11 15.7761 11 15.5V7.5C11 7.22386 11.2239 7 11.5 7H12.75V4.5C12.75 4.22386 12.9739 4 13.25 4H13.75C14.0261 4 14.25 4.22386 14.25 4.5ZM12.5 8.5V14.5H14.5V8.5H12.5Z\"\n />\n </g>\n </svg>\n);\n\nexport const HollowCandlesIcon: FC<SVGProps<SVGSVGElement>> = (props) => (\n <svg\n viewBox=\"0 0 20 20\"\n fill=\"currentColor\"\n xmlns=\"http://www.w3.org/2000/svg\"\n {...props}\n >\n <g id=\"Hollow Candles\">\n <path\n id=\"Subtract\"\n fillRule=\"evenodd\"\n clipRule=\"evenodd\"\n d=\"M5.5 14.5V5.5H7.5V14.5H5.5Z\"\n fill=\"white\"\n fillOpacity=\"0.12\"\n />\n <path\n id=\"Union\"\n fillRule=\"evenodd\"\n clipRule=\"evenodd\"\n d=\"M7.25 2.5V4H8.5C8.77614 4 9 4.22386 9 4.5V15.5C9 15.7761 8.77614 16 8.5 16H7.25V17.5C7.25 17.7761 7.02614 18 6.75 18H6.25C5.97386 18 5.75 17.7761 5.75 17.5V16H4.5C4.22386 16 4 15.7761 4 15.5V4.5C4 4.22386 4.22386 4 4.5 4H5.75V2.5C5.75 2.22386 5.97386 2 6.25 2H6.75C7.02614 2 7.25 2.22386 7.25 2.5ZM5.5 5.5V14.5H7.5V5.5H5.5ZM14.25 4.5V7H15.5C15.7761 7 16 7.22386 16 7.5V15.5C16 15.7761 15.7761 16 15.5 16H14.25V17.5C14.25 17.7761 14.0261 18 13.75 18H13.25C12.9739 18 12.75 17.7761 12.75 17.5V16H11.5C11.2239 16 11 15.7761 11 15.5V7.5C11 7.22386 11.2239 7 11.5 7H12.75V4.5C12.75 4.22386 12.9739 4 13.25 4H13.75C14.0261 4 14.25 4.22386 14.25 4.5ZM12.5 8.5V14.5H14.5V8.5H12.5Z\"\n />\n </g>\n </svg>\n);\n\nexport const LineIcon: FC<SVGProps<SVGSVGElement>> = (props) => (\n <svg\n viewBox=\"0 0 20 20\"\n fill=\"currentColor\"\n xmlns=\"http://www.w3.org/2000/svg\"\n {...props}\n >\n <g id=\"Line\">\n <path\n id=\"Vector 16 (Stroke)\"\n fillRule=\"evenodd\"\n clipRule=\"evenodd\"\n d=\"M18.3 2.72288C18.542 2.85596 18.6303 3.15999 18.4972 3.40195L13.495 12.4968C13.0776 13.2557 12.1061 13.5044 11.3754 13.0394L7.19878 10.3816L2.97738 17.558C2.83737 17.796 2.53092 17.8754 2.2929 17.7354L1.43097 17.2284C1.19295 17.0884 1.1135 16.7819 1.25351 16.5439L5.73746 8.92122C6.16792 8.18943 7.1194 7.96045 7.83567 8.41626L11.9995 11.0659L16.7448 2.43811C16.8778 2.19615 17.1819 2.10788 17.4238 2.24096L18.3 2.72288Z\"\n />\n </g>\n </svg>\n);\n\nexport const AreaIcon: FC<SVGProps<SVGSVGElement>> = (props) => (\n <svg\n viewBox=\"0 0 20 20\"\n fill=\"currentColor\"\n xmlns=\"http://www.w3.org/2000/svg\"\n {...props}\n >\n <g id=\"Area\">\n <path\n id=\"Vector 16 (Stroke)\"\n fillRule=\"evenodd\"\n clipRule=\"evenodd\"\n d=\"M18.3 2.72288C18.542 2.85596 18.6303 3.15999 18.4972 3.40195L13.495 12.4968C13.0776 13.2557 12.1061 13.5044 11.3754 13.0394L7.19878 10.3816L2.97738 17.558C2.83737 17.796 2.53092 17.8754 2.2929 17.7354L1.43097 17.2284C1.19295 17.0884 1.1135 16.7819 1.25351 16.5439L5.73746 8.92122C6.16792 8.18943 7.1194 7.96045 7.83567 8.41626L11.9995 11.0659L16.7448 2.43811C16.8778 2.19615 17.1819 2.10788 17.4238 2.24096L18.3 2.72288Z\"\n />\n <path\n id=\"Subtract\"\n fillRule=\"evenodd\"\n clipRule=\"evenodd\"\n d=\"M2.7608 17.7562C2.84602 17.899 3.00106 18 3.19016 18H16.362C17.4665 18 18.362 17.1046 18.362 16V3.94663C18.362 3.86618 18.3453 3.79397 18.3162 3.73108L13.495 12.4968C13.0776 13.2557 12.1061 13.5044 11.3754 13.0394L7.19881 10.3816L2.9774 17.558C2.92465 17.6477 2.84826 17.7148 2.7608 17.7562Z\"\n fill=\"white\"\n fillOpacity=\"0.12\"\n />\n </g>\n </svg>\n);\n\nexport const BaseLineIcon: FC<SVGProps<SVGSVGElement>> = (props) => (\n <svg\n viewBox=\"0 0 20 20\"\n fill=\"currentColor\"\n xmlns=\"http://www.w3.org/2000/svg\"\n {...props}\n >\n <g id=\"Baseline\">\n <path\n id=\"Union\"\n fillRule=\"evenodd\"\n clipRule=\"evenodd\"\n d=\"M6.05938 2.93544C6.55642 1.71198 8.27766 1.68139 8.81785 2.88642L11.4361 8.72723H9.24438L7.4717 4.77279L5.86521 8.72723H3.70647L6.05938 2.93544ZM13.9282 14.2865L13.0051 12.2272H10.8133L12.5586 16.1204C13.088 17.3014 14.7641 17.3026 15.2952 16.1224L17.048 12.2272H14.8549L13.9282 14.2865ZM2.28459 12.2272H4.44333L1.85293 18.6036L0 17.8509L2.28459 12.2272ZM16.4299 8.72723H18.623L19.3384 7.13759L17.5145 6.31686L16.4299 8.72723ZM1.42645 10.2272C1.42645 9.95109 1.65031 9.72723 1.92645 9.72723H2.92645C3.20259 9.72723 3.42645 9.95109 3.42645 10.2272V10.7272C3.42645 11.0034 3.20259 11.2272 2.92645 11.2272H1.92645C1.65031 11.2272 1.42645 11.0034 1.42645 10.7272V10.2272ZM4.42645 10.2272C4.42645 9.95109 4.65031 9.72723 4.92645 9.72723H5.92645C6.20259 9.72723 6.42645 9.95109 6.42645 10.2272V10.7272C6.42645 11.0034 6.20259 11.2272 5.92645 11.2272H4.92645C4.65031 11.2272 4.42645 11.0034 4.42645 10.7272V10.2272ZM7.92645 9.72723C7.65031 9.72723 7.42645 9.95109 7.42645 10.2272V10.7272C7.42645 11.0034 7.65031 11.2272 7.92645 11.2272H8.92645C9.20259 11.2272 9.42645 11.0034 9.42645 10.7272V10.2272C9.42645 9.95109 9.20259 9.72723 8.92645 9.72723H7.92645ZM10.4265 10.2272C10.4265 9.95109 10.6503 9.72723 10.9265 9.72723H11.9265C12.2026 9.72723 12.4265 9.95109 12.4265 10.2272V10.7272C12.4265 11.0034 12.2026 11.2272 11.9265 11.2272H10.9265C10.6503 11.2272 10.4265 11.0034 10.4265 10.7272V10.2272ZM13.9265 9.72723C13.6503 9.72723 13.4265 9.95109 13.4265 10.2272V10.7272C13.4265 11.0034 13.6503 11.2272 13.9265 11.2272H14.9265C15.2026 11.2272 15.4265 11.0034 15.4265 10.7272V10.2272C15.4265 9.95109 15.2026 9.72723 14.9265 9.72723H13.9265ZM16.4265 10.2272C16.4265 9.95109 16.6503 9.72723 16.9265 9.72723H17.9265C18.2026 9.72723 18.4265 9.95109 18.4265 10.2272V10.7272C18.4265 11.0034 18.2026 11.2272 17.9265 11.2272H16.9265C16.6503 11.2272 16.4265 11.0034 16.4265 10.7272V10.2272Z\"\n />\n </g>\n </svg>\n);\n\nexport const UnSelectIcon: FC<SVGProps<SVGSVGElement>> = (props) => (\n <svg\n viewBox=\"0 0 12 12\"\n fill=\"currentColor\"\n xmlns=\"http://www.w3.org/2000/svg\"\n {...props}\n >\n <g id=\"Unselected\">\n <path\n id=\"Vector\"\n d=\"M6.00684 0.999023C3.24544 0.999023 1.00684 3.23752 1.00684 5.99902C1.00684 8.76051 3.24544 10.999 6.00684 10.999C8.76834 10.999 11.0068 8.76051 11.0068 5.99902C11.0068 3.23752 8.76834 0.999023 6.00684 0.999023ZM6.00684 1.99902C8.21584 1.99902 10.0068 3.79002 10.0068 5.99902C10.0068 8.20801 8.21584 9.99901 6.00684 9.99901C3.79769 9.99901 2.00684 8.20801 2.00684 5.99902C2.00684 3.79002 3.79769 1.99902 6.00684 1.99902Z\"\n fill=\"white\"\n fillOpacity=\"0.2\"\n />\n </g>\n </svg>\n);\n\nexport const SelectedIcon: FC<SVGProps<SVGSVGElement>> = (props) => (\n <svg\n viewBox=\"0 0 12 12\"\n fill=\"currentColor\"\n xmlns=\"http://www.w3.org/2000/svg\"\n {...props}\n >\n <g id=\"Selected-Multiple Choices-fill\">\n <path\n id=\"Subtract\"\n fillRule=\"evenodd\"\n clipRule=\"evenodd\"\n d=\"M1.00684 5.99902C1.00684 3.23752 3.24544 0.999023 6.00684 0.999023C8.76834 0.999023 11.0068 3.23752 11.0068 5.99902C11.0068 8.76051 8.76834 10.999 6.00684 10.999C3.24544 10.999 1.00684 8.76051 1.00684 5.99902ZM8.49243 3.65563C8.60602 3.54726 8.76156 3.49957 8.91068 3.49957C9.05981 3.49957 9.21534 3.54726 9.32893 3.65563C9.5567 3.87231 9.5567 4.23649 9.32893 4.45317L5.25362 8.33706C5.02644 8.55374 4.6443 8.55374 4.41712 8.33706L2.67014 6.67253C2.44296 6.45585 2.44296 6.09161 2.67014 5.87499C2.89791 5.65831 3.28004 5.65831 3.50722 5.87499L4.83537 7.1407L8.49243 3.65563Z\"\n fill=\"#608CFF\"\n />\n </g>\n </svg>\n);\n","import React, { useMemo, useState } from \"react\";\nimport { useTranslation } from \"@kodiak-finance/orderly-i18n\";\nimport {\n Box,\n cn,\n DropdownMenuContent,\n DropdownMenuPortal,\n DropdownMenuRoot,\n DropdownMenuTrigger,\n Flex,\n Text,\n} from \"@kodiak-finance/orderly-ui\";\nimport {\n AreaIcon,\n BarIcon,\n BaseLineIcon,\n CandlesIcon,\n HollowCandlesIcon,\n LineIcon,\n} from \"../../icons\";\n\ninterface IProps {\n lineType: string;\n changeLineType: (type: string) => void;\n}\n\nconst LineType: React.FC<IProps> = (props) => {\n const [open, setOpen] = useState(false);\n const { t } = useTranslation();\n const lineTypeList = useMemo(() => {\n return [\n {\n icon: <BarIcon fill=\"currentColor\" className=\"oui-w-5 oui-h-5\" />,\n label: t(\"tradingView.lineType.bars\"),\n value: \"0\",\n },\n {\n icon: <CandlesIcon fill=\"currentColor\" className=\"oui-w-5 oui-h-5\" />,\n label: t(\"tradingView.lineType.candles\"),\n value: \"1\",\n },\n {\n icon: (\n <HollowCandlesIcon fill=\"currentColor\" className=\"oui-w-5 oui-h-5\" />\n ),\n label: t(\"tradingView.lineType.hollowCandles\"),\n value: \"9\",\n },\n {\n icon: <LineIcon fill=\"currentColor\" className=\"oui-w-5 oui-h-5\" />,\n label: t(\"tradingView.lineType.line\"),\n value: \"2\",\n },\n {\n icon: <AreaIcon fill=\"currentColor\" className=\"oui-w-5 oui-h-5\" />,\n label: t(\"tradingView.lineType.area\"),\n value: \"3\",\n },\n {\n icon: <BaseLineIcon fill=\"currentColor\" className=\"oui-w-5 oui-h-5\" />,\n label: t(\"tradingView.lineType.baseline\"),\n value: \"10\",\n },\n ];\n }, [t]);\n\n const currentLineTypeIcon = useMemo(() => {\n const data = lineTypeList.find((item) => item.value === props.lineType);\n if (data) {\n return data.icon;\n }\n return lineTypeList[1].icon;\n }, [props.lineType]);\n\n return (\n <DropdownMenuRoot open={open} onOpenChange={setOpen}>\n <DropdownMenuTrigger asChild>\n <Box\n className={cn(\n \"oui-w-[18px] oui-h-[18px] oui-cursor-pointer oui-text-base-contrast-36 hover:oui-text-base-contrast-80\",\n open && \"oui-text-base-contrast-80\",\n )}\n >\n {currentLineTypeIcon}\n </Box>\n </DropdownMenuTrigger>\n <DropdownMenuPortal>\n <DropdownMenuContent\n onCloseAutoFocus={(e) => e.preventDefault()}\n onClick={(e) => e.stopPropagation()}\n align=\"start\"\n sideOffset={20}\n className=\"oui-bg-base-8\"\n >\n <Flex\n direction=\"column\"\n gap={4}\n px={5}\n py={5}\n width={240}\n justify=\"start\"\n itemAlign=\"start\"\n >\n {lineTypeList.map((item) => (\n <Flex\n key={item.value}\n justify={\"start\"}\n itemAlign={\"center\"}\n gap={2}\n className={cn(\n \"oui-text-base-contrast-36 oui-cursor-pointer oui-w-full hover:oui-text-base-contrast\",\n props.lineType === item.value && \"oui-text-base-contrast\",\n )}\n onClick={() => props.changeLineType(item.value)}\n >\n {item.icon}\n <Text className=\"oui-text-sm\">{item.label}</Text>\n </Flex>\n ))}\n </Flex>\n </DropdownMenuContent>\n </DropdownMenuPortal>\n </DropdownMenuRoot>\n );\n};\n\nexport default LineType;\n","import React, { ReactNode, useMemo } from \"react\";\nimport { useMediaQuery } from \"@kodiak-finance/orderly-hooks\";\nimport { useTranslation, i18n } from \"@kodiak-finance/orderly-i18n\";\nimport { MEDIA_TABLET } from \"@kodiak-finance/orderly-types\";\nimport {\n Box,\n cn,\n DropdownMenuContent,\n DropdownMenuPortal,\n DropdownMenuRoot,\n DropdownMenuTrigger,\n Flex,\n Text,\n} from \"@kodiak-finance/orderly-ui\";\nimport { CaretIcon } from \"../../icons\";\n\ninterface IProps {\n changeInterval: (interval: string) => void;\n interval: string;\n}\n\nconst useMobileTimeIntervalMoreMap = () => {\n const { t } = useTranslation();\n const mobileTimeIntervalMoreMap = useMemo(() => {\n return [\n [\n {\n value: \"3\",\n label: t(\"tradingView.timeInterval.3m\"),\n },\n {\n value: \"5\",\n label: t(\"tradingView.timeInterval.5m\"),\n },\n\n {\n value: \"30\",\n label: t(\"tradingView.timeInterval.30m\"),\n },\n\n {\n value: \"120\",\n label: t(\"tradingView.timeInterval.2h\"),\n },\n ],\n [\n {\n value: \"360\",\n label: t(\"tradingView.timeInterval.6h\"),\n },\n {\n value: \"720\",\n label: t(\"tradingView.timeInterval.12h\"),\n },\n {\n value: \"3d\",\n label: t(\"tradingView.timeInterval.3d\"),\n },\n {\n value: \"1M\",\n label: t(\"tradingView.timeInterval.1M\"),\n },\n ],\n ];\n }, [t]);\n\n return { mobileTimeIntervalMoreMap };\n};\n\nexport const TimeInterval: React.FC<IProps> = (props) => {\n const isMobile = useMediaQuery(MEDIA_TABLET);\n if (isMobile) {\n return <MobileTimeInterval {...props} />;\n }\n return <DesktopTimeInterval {...props} />;\n};\n\nconst DesktopTimeInterval: React.FC<IProps> = (props) => {\n const { t } = useTranslation();\n const timeIntervalMap = useMemo(() => {\n return [\n {\n value: \"1\",\n label: t(\"tradingView.timeInterval.1m\"),\n },\n {\n value: \"3\",\n label: t(\"tradingView.timeInterval.3m\"),\n },\n {\n value: \"5\",\n label: t(\"tradingView.timeInterval.5m\"),\n },\n {\n value: \"15\",\n label: t(\"tradingView.timeInterval.15m\"),\n },\n {\n value: \"30\",\n label: t(\"tradingView.timeInterval.30m\"),\n },\n\n {\n value: \"60\",\n label: t(\"tradingView.timeInterval.1h\"),\n },\n\n {\n value: \"240\",\n label: t(\"tradingView.timeInterval.4h\"),\n },\n\n {\n value: \"720\",\n label: t(\"tradingView.timeInterval.12h\"),\n },\n {\n value: \"1D\",\n label: t(\"tradingView.timeInterval.1d\"),\n },\n\n {\n value: \"1W\",\n label: t(\"tradingView.timeInterval.1w\"),\n },\n {\n value: \"1M\",\n label: t(\"tradingView.timeInterval.1M\"),\n },\n ];\n }, [t]);\n\n return (\n <div\n className={cn(\n \"oui-text-2xs oui-text-base-contrast-36 oui-flex oui-gap-[2px] oui-items-center oui-mr-3 oui-font-semibold\",\n \"oui-overflow-hidden\",\n )}\n >\n {timeIntervalMap.map((item) => (\n <div\n key={item.value}\n className={cn(\n \"oui-cursor-pointer oui-px-2\",\n \"hover:oui-text-base-contrast-80\",\n \"oui-break-normal oui-whitespace-nowrap\",\n props.interval === item.value &&\n \"oui-text-base-contrast-80 oui-bg-white/[.06] oui-rounded\",\n )}\n id={item.value}\n onClick={() => props.changeInterval(item.value)}\n >\n {item.label}\n </div>\n ))}\n </div>\n );\n};\n\nexport const MobileTimeInterval: React.FC<IProps> = (props) => {\n const { t } = useTranslation();\n\n const mobileTimeIntervalDefaultMap = useMemo(() => {\n return [\n {\n value: \"1\",\n label: t(\"tradingView.timeInterval.1m\"),\n },\n {\n value: \"15\",\n label: t(\"tradingView.timeInterval.15m\"),\n },\n {\n value: \"60\",\n label: t(\"tradingView.timeInterval.1h\"),\n },\n {\n value: \"240\",\n label: t(\"tradingView.timeInterval.4h\"),\n },\n {\n value: \"1D\",\n label: t(\"tradingView.timeInterval.1d\"),\n },\n\n {\n value: \"1W\",\n label: t(\"tradingView.timeInterval.1w\"),\n },\n ];\n }, [t]);\n\n const { mobileTimeIntervalMoreMap } = useMobileTimeIntervalMoreMap();\n\n const currentIntervalIsInExpand = useMemo(() => {\n for (const row of mobileTimeIntervalMoreMap) {\n for (const item of row) {\n if (item.value === props.interval) {\n return item.label;\n }\n }\n }\n return null;\n }, [props.interval, mobileTimeIntervalMoreMap]);\n\n return (\n <Flex\n justify=\"start\"\n itemAlign=\"center\"\n gap={3}\n className={cn(\n \"oui-text-2xs oui-text-base-contrast-36\",\n \"oui-overflow-hidden\",\n )}\n >\n <div className=\" oui-flex oui-gap-1 oui-items-center oui-mr-3 oui-font-semibold\">\n {mobileTimeIntervalDefaultMap.map((item) => (\n <div\n className={cn(\n \"oui-px-2\",\n \"oui-break-normal oui-whitespace-nowrap\",\n props.interval === item.value &&\n \"oui-text-base-contrast-80 oui-bg-white/[.06] oui-rounded\",\n )}\n key={item.value}\n onClick={() => props.changeInterval(item.value)}\n >\n {item.label}\n </div>\n ))}\n </div>\n <DropDownTimeInterval {...props}>\n {currentIntervalIsInExpand ? (\n <div className=\"oui-text-base-contrast-80\">\n {currentIntervalIsInExpand}\n </div>\n ) : (\n <Text className=\"oui-break-normal oui-whitespace-nowrap\">\n {t(\"tradingView.timeInterval.more\")}\n </Text>\n )}\n </DropDownTimeInterval>\n </Flex>\n );\n};\n\nconst DropDownTimeInterval: React.FC<React.PropsWithChildren<IProps>> = (\n props,\n) => {\n const [open, setOpen] = React.useState(false);\n const { mobileTimeIntervalMoreMap } = useMobileTimeIntervalMoreMap();\n\n return (\n <DropdownMenuRoot open={open} onOpenChange={setOpen}>\n <DropdownMenuTrigger asChild>\n <div className=\"oui-flex oui-justify-start oui-items-center oui-gap-0.5\">\n {props.children}\n <CaretIcon\n className={cn(\n \"oui-w-3 oui-h-3\",\n open && \"oui-text-base-contrast-80 oui-rotate-180\",\n )}\n />\n </div>\n </DropdownMenuTrigger>\n <DropdownMenuPortal>\n <DropdownMenuContent\n onCloseAutoFocus={(e) => e.preventDefault()}\n onClick={(e) => e.stopPropagation()}\n align=\"start\"\n alignOffset={0}\n sideOffset={0}\n className={cn(\n \"oui-markets-dropdown-menu-content oui-bg-base-9 oui-w-screen oui-flex oui-flex-col oui-gap-2 oui-p-3\",\n )}\n >\n {mobileTimeIntervalMoreMap.map((row, id) => (\n <div className=\"oui-flex oui-gap-2\" key={id}>\n {row.map((item) => (\n <div\n className={cn(\n \"oui-w-full oui-text-2xs oui-flex oui-items-center oui-justify-center oui-h-6 oui-rounded\",\n item.value === props.interval\n ? \"oui-text-base-contrast oui-bg-primary-darken\"\n : \"oui-text-base-contrast-36 oui-bg-base-5\",\n )}\n key={item.value}\n onClick={() => {\n props.changeInterval(item.value);\n }}\n >\n <div>{item.label}</div>\n </div>\n ))}\n </div>\n ))}\n </DropdownMenuContent>\n </DropdownMenuPortal>\n </DropdownMenuRoot>\n );\n};\n","import { useMemo, useState } from \"react\";\nimport { useTranslation } from \"@kodiak-finance/orderly-i18n\";\nimport {\n DropdownMenuContent,\n DropdownMenuPortal,\n DropdownMenuRoot,\n DropdownMenuTrigger,\n Flex,\n Text,\n cn,\n Switch,\n} from \"@kodiak-finance/orderly-ui\";\nimport {\n CaretIcon,\n DisplaySettingIcon,\n SelectedIcon,\n UnSelectIcon,\n} from \"../../icons\";\nimport { DisplayControl, IProps } from \"./common\";\n\nexport const DesktopDisplayControl: React.FC<IProps> = (props) => {\n const { displayControlState, changeDisplayControlState } = props;\n const [open, setOpen] = useState(false);\n const { t } = useTranslation();\n\n const displayControlMap = useMemo<DisplayControl[]>(() => {\n return [\n {\n label: t(\"common.position\"),\n id: \"position\",\n },\n {\n label: t(\"tradingView.displayControl.buySell\"),\n id: \"buySell\",\n },\n {\n label: t(\"tradingView.displayControl.limitOrders\"),\n id: \"limitOrders\",\n },\n {\n label: t(\"tradingView.displayControl.stopOrders\"),\n id: \"stopOrders\",\n },\n {\n label: t(\"common.tpsl\"),\n id: \"tpsl\",\n },\n {\n label: t(\"tpsl.positionTpsl\"),\n id: \"positionTpsl\",\n },\n {\n label: t(\"orderEntry.orderType.trailingStop\"),\n id: \"trailingStop\",\n },\n ];\n }, [t]);\n\n return (\n <>\n <DropdownMenuRoot open={open} onOpenChange={setOpen}>\n <DropdownMenuTrigger asChild>\n <Flex\n justify=\"start\"\n itemAlign=\"center\"\n className=\"oui-gap-[2px] oui-cursor-pointer oui-text-base-contrast-36 hover:oui-text-base-contrast-80\"\n >\n <DisplaySettingIcon\n className={cn(\n \"oui-w-[18px] oui-h-[18px] \",\n open && \"oui-text-base-contrast-80\",\n )}\n />\n <CaretIcon\n className={cn(\n \"oui-w-3 oui-h-3\",\n open && \"oui-text-base-contrast-80 oui-rotate-180\",\n )}\n />\n </Flex>\n </DropdownMenuTrigger>\n <DropdownMenuPortal>\n <DropdownMenuContent\n onCloseAutoFocus={(e) => e.preventDefault()}\n onClick={(e) => e.stopPropagation()}\n align=\"start\"\n className=\"oui-bg-base-8\"\n >\n <Flex\n direction=\"column\"\n gap={4}\n px={5}\n py={5}\n width={240}\n justify=\"start\"\n itemAlign=\"start\"\n >\n {displayControlMap.map((item) => (\n <Flex\n key={item.id}\n justify={\"between\"}\n itemAlign={\"center\"}\n className=\"oui-w-full\"\n >\n <Text\n className={cn(\n \"oui-text-sm oui-text-base-contrast-80\",\n !displayControlState[item.id] &&\n \"oui-text-base-contrast-36\",\n )}\n >\n {item.label}\n </Text>\n <Switch\n className=\"oui-h-4 oui-w-8\"\n checked={displayControlState[item.id]}\n onCheckedChange={(checked) => {\n changeDisplayControlState({\n ...displayControlState,\n [item.id]: checked,\n });\n }}\n />\n </Flex>\n ))}\n </Flex>\n </DropdownMenuContent>\n </DropdownMenuPortal>\n </DropdownMenuRoot>\n </>\n );\n};\n","import { useMemo, useState } from \"react\";\nimport { useTranslation } from \"@kodiak-finance/orderly-i18n\";\nimport {\n DropdownMenuContent,\n DropdownMenuPortal,\n DropdownMenuRoot,\n DropdownMenuTrigger,\n cn,\n} from \"@kodiak-finance/orderly-ui\";\nimport {\n CaretIcon,\n DisplaySettingIcon,\n SelectedIcon,\n UnSelectIcon,\n} from \"../../icons\";\nimport { DisplayControl, IProps } from \"./common\";\n\nexport const MobileDisplayControl: React.FC<IProps> = (props) => {\n const [open, setOpen] = useState(false);\n const { t } = useTranslation();\n\n const mobileDisplayControlMap = useMemo<DisplayControl[][]>(() => {\n return [\n [\n {\n label: t(\"common.position\"),\n id: \"position\",\n },\n\n {\n label: t(\"tradingView.displayControl.limitOrders\"),\n id: \"limitOrders\",\n },\n ],\n [\n {\n label: t(\"tradingView.displayControl.stopOrders\"),\n id: \"stopOrders\",\n },\n {\n label: t(\"common.tpsl\"),\n id: \"tpsl\",\n },\n ],\n [\n {\n label: t(\"tpsl.positionTpsl\"),\n id: \"positionTpsl\",\n },\n {\n label: t(\"tradingView.displayControl.buySell\"),\n id: \"buySell\",\n },\n ],\n [\n {\n label: t(\"orderEntry.orderType.trailingStop\"),\n id: \"trailingStop\",\n },\n // placeholder\n {} as DisplayControl,\n ],\n ];\n }, [t]);\n\n return (\n <DropdownMenuRoot open={open} onOpenChange={setOpen}>\n <DropdownMenuTrigger asChild>\n <div\n className={cn(\n \"oui-flex oui-items-center oui-justify-center oui-gap-0.5 oui-text-base-contrast-36\",\n open && \"oui-text-base-contrast-8\",\n )}\n >\n <DisplaySettingIcon\n className={cn(\n \"oui-size-[18px] \",\n open && \"oui-text-base-contrast-80\",\n )}\n />\n <CaretIcon\n className={cn(\n \"oui-size-3\",\n open && \"oui-rotate-180 oui-text-base-contrast-80\",\n )}\n />\n </div>\n </DropdownMenuTrigger>\n <DropdownMenuPortal>\n <DropdownMenuContent\n onCloseAutoFocus={(e) => e.preventDefault()}\n onClick={(e) => e.stopPropagation()}\n align=\"start\"\n alignOffset={0}\n sideOffset={0}\n className={cn(\n \"oui-tradingview-display-control-dropdown-menu-content oui-flex oui-w-screen oui-flex-col oui-gap-2 oui-bg-base-9 oui-p-3\",\n )}\n >\n {mobileDisplayControlMap.map((row, id) => (\n <div className=\"oui-flex oui-gap-2\" key={id}>\n {row.map((item, index) => {\n return (\n <div\n className={cn(\n \"oui-flex oui-h-6 oui-w-full oui-items-center oui-justify-between\",\n \"oui-rounded oui-px-2 oui-text-2xs\",\n item.id && \"oui-bg-base-5\",\n props.displayControlState[item.id]\n ? \"oui-text-base-contrast\"\n : \"oui-text-base-contrast-36\",\n )}\n key={item.id || index}\n onClick={() => {\n if (!item.id) {\n return;\n }\n props.changeDisplayControlState({\n ...props.displayControlState,\n [item.id]: !props.displayControlState[item.id],\n });\n }}\n >\n {item.id && (\n <>\n <div>{item.label}</div>\n {props.displayControlState[item.id] ? (\n <SelectedIcon className=\"oui-size-3\" />\n ) : (\n <UnSelectIcon className=\"oui-size-3\" />\n )}\n </>\n )}\n </div>\n );\n })}\n </div>\n ))}\n </DropdownMenuContent>\n </DropdownMenuPortal>\n </DropdownMenuRoot>\n );\n};\n","export { DesktopDisplayControl } from \"./displayControl.desktop\";\nexport { MobileDisplayControl } from \"./displayControl.mobile\";\n","import { forwardRef } from \"react\";\nimport type { TradingviewWidgetPropsInterface } from \"../type\";\nimport { useTradingviewScript } from \"./tradingview.script\";\nimport { TradingviewUI } from \"./tradingview.ui\";\n\nexport const TradingviewWidget = forwardRef<\n HTMLDivElement,\n TradingviewWidgetPropsInterface\n>((props, ref) => {\n const state = useTradingviewScript(props);\n return <TradingviewUI {...state} ref={ref} />;\n});\n","import { useEffect, useMemo, useRef, useState } from \"react\";\nimport {\n useAccount,\n useConfig,\n useLocalStorage,\n useMediaQuery,\n useOrderEntry_deprecated,\n useSymbolsInfo,\n useWS,\n} from \"@kodiak-finance/orderly-hooks\";\nimport { LocaleCode, useLocaleCode } from \"@kodiak-finance/orderly-i18n\";\nimport { WS } from \"@kodiak-finance/orderly-net\";\nimport {\n AccountStatusEnum,\n MEDIA_TABLET,\n OrderSide,\n OrderType,\n TradingviewFullscreenKey,\n} from \"@kodiak-finance/orderly-types\";\nimport { modal, toast } from \"@kodiak-finance/orderly-ui\";\nimport { Decimal } from \"@kodiak-finance/orderly-utils\";\nimport getBrokerAdapter from \"../tradingviewAdapter/broker/getBrokerAdapter\";\nimport { Datafeed } from \"../tradingviewAdapter/datafeed/datafeed\";\nimport { WebsocketService } from \"../tradingviewAdapter/datafeed/websocket.service\";\nimport useBroker from \"../tradingviewAdapter/hooks/useBroker\";\nimport useCreateRenderer from \"../tradingviewAdapter/hooks/useCreateRenderer\";\nimport brokerHostHandler from \"../tradingviewAdapter/renderer/brokerHostHandler\";\nimport { Widget, WidgetProps } from \"../tradingviewAdapter/widget\";\nimport {\n DisplayControlSettingInterface,\n TradingviewWidgetPropsInterface,\n} from \"../type\";\nimport {\n getOveriides,\n withExchangePrefix,\n defaultColorConfig,\n chartBG,\n} from \"../utils/chart.util\";\nimport { TradingViewSDKLocalstorageKey } from \"../utils/common.util\";\n\nconst CHART_KEY = \"SDK_Tradingview\";\nconst MOBILE_CHART_KEY = \"SDK_Moblie_Tradingview\";\n\nconst getChartKey = (isMobile?: boolean) => {\n return isMobile ? MOBILE_CHART_KEY : CHART_KEY;\n};\n\nconst defaultLocale = (localeCode: LocaleCode) => {\n return localeCode === \"id\" ? \"id_ID\" : localeCode;\n};\n\nexport function useTradingviewScript(props: TradingviewWidgetPropsInterface) {\n const {\n scriptSRC: tradingViewScriptSrc,\n libraryPath,\n customCssUrl: tradingViewCustomCssUrl,\n overrides: customerOverrides,\n studiesOverrides: customerStudiesOverrides,\n symbol,\n theme,\n loadingScreen: customerLoadingScreen,\n mode,\n colorConfig: customerColorConfig,\n showVolumeInSamePane,\n locale = defaultLocale,\n classNames,\n } = props;\n\n const localeCode = useLocaleCode();\n\n const chart = useRef<Widget | null>(null);\n const apiBaseUrl: string = useConfig(\"apiBaseUrl\") as string;\n const { state: accountState } = useAccount();\n const [side, setSide] = useState<OrderSide>(OrderSide.SELL);\n const symbolsInfo = useSymbolsInfo();\n const [fullscreen, setFullscreen] = useLocalStorage(\n TradingviewFullscreenKey,\n false,\n );\n\n const { onSubmit, submitting } = useOrderEntry_deprecated(\n {\n symbol: symbol ?? \"\",\n side: side,\n order_type: OrderType.MARKET,\n },\n {\n watchOrderbook: true,\n },\n );\n const [displayControlState, setDisplayControlState] =\n useState<DisplayControlSettingInterface>(() => {\n const displaySettingInfo = localStorage.getItem(\n TradingViewSDKLocalstorageKey.displayControlSetting,\n );\n if (displaySettingInfo) {\n return JSON.parse(displaySettingInfo) as DisplayControlSettingInterface;\n }\n return {\n position: true,\n buySell: true,\n limitOrders: true,\n stopOrders: true,\n tpsl: true,\n positionTpsl: true,\n trailingStop: true,\n };\n });\n\n const [interval, setInterval] = useState<string>(() => {\n const lastUsedInterval = localStorage.getItem(\n TradingViewSDKLocalstorageKey.interval,\n );\n if (!lastUsedInterval) {\n return \"15\";\n }\n return lastUsedInterval;\n });\n\n const [lineType, setLineType] = useState<string>(() => {\n const lastUsedLineType = localStorage.getItem(\n TradingViewSDKLocalstorageKey.lineType,\n );\n if (!lastUsedLineType) {\n return \"1\";\n }\n return lastUsedLineType;\n });\n\n const isMobile = useMediaQuery(MEDIA_TABLET);\n\n const colorConfig = useMemo(\n () => Object.assign({}, defaultColorConfig, customerColorConfig ?? {}),\n [customerColorConfig],\n );\n\n const loadingScreen = useMemo(() => {\n if (typeof customerLoadingScreen === \"object\") {\n return customerLoadingScreen;\n }\n return {\n backgroundColor: chartBG,\n };\n }, [customerLoadingScreen]);\n const ws = useWS();\n const [chartingLibrarySciprtReady, setChartingLibrarySciprtReady] =\n useState<boolean>(false);\n\n const closePositionConfirmCallback = (data: any) => {\n const symbolInfo = symbolsInfo[symbol!];\n if (!symbolInfo) {\n return;\n }\n const side = new Decimal(data.balance).greaterThan(0)\n ? OrderSide.SELL\n : OrderSide.BUY;\n const order: any = {\n // order_price: undefined,\n order_quantity: new Decimal(data.balance).abs().toNumber(),\n symbol: symbol,\n order_type: OrderType.MARKET,\n side,\n reduce_only: true,\n };\n setSide(side);\n modal.show(\"MarketCloseConfirmID\", {\n base: symbolInfo(\"base\"),\n quantity: data.balance,\n onConfirm: async () => {\n return onSubmit(order).catch((error) => {\n if (typeof error === \"string\") {\n toast.error(error);\n } else {\n toast.error(error.message);\n }\n });\n },\n submitting,\n });\n };\n\n const chartRef = useRef<HTMLDivElement>(null);\n const isLoggedIn = useMemo(() => {\n if (\n accountState.status < AccountStatusEnum.EnableTrading &&\n accountState.status !== AccountStatusEnum.EnableTradingWithoutConnected\n ) {\n return false;\n }\n return true;\n }, [accountState]);\n\n const broker = useBroker({\n closeConfirm: closePositionConfirmCallback,\n colorConfig,\n onToast: toast,\n symbol: symbol ?? \"\",\n mode,\n });\n const [createRenderer, removeRenderer] = useCreateRenderer(\n symbol!,\n displayControlState,\n );\n\n const onFullScreenChange = () => {\n if (fullscreen) {\n setFullscreen(false);\n } else {\n setFullscreen(true);\n }\n props.onFullScreenChange?.(!fullscreen);\n };\n\n const changeInterval = (newInterval: string) => {\n if (!chart.current) {\n return;\n }\n localStorage.setItem(TradingViewSDKLocalstorageKey.interval, newInterval);\n setInterval(newInterval);\n chart.current?.setSymbol(symbol ?? \"\", newInterval as any);\n };\n\n const changeLineType = (newLineType: string) => {\n if (!chart.current) {\n return;\n }\n localStorage.setItem(TradingViewSDKLocalstorageKey.lineType, newLineType);\n setLineType(newLineType);\n chart.current?.changeLineType(Number(newLineType));\n };\n\n const changeDisplaySetting = (newSetting: DisplayControlSettingInterface) => {\n localStorage.setItem(\n TradingViewSDKLocalstorageKey.displayControlSetting,\n JSON.stringify(newSetting),\n );\n setDisplayControlState(newSetting);\n };\n\n const openChartSetting = () => {\n if (!chart.current) {\n return;\n }\n chart.current.executeActionById(\"chartProperties\");\n };\n\n const openChartIndicators = () => {\n if (!chart.current) {\n return;\n }\n chart.current.executeActionById(\"insertIndicator\");\n };\n\n useEffect(() => {\n if (!tradingViewScriptSrc) {\n return;\n }\n if (!chartRef.current) {\n return;\n }\n if (!chartingLibrarySciprtReady) {\n const script = document.createElement(\"script\");\n script.setAttribute(\"data-nscript\", \"afterInteractive\");\n script.src = tradingViewScriptSrc;\n script.async = true;\n script.type = \"text/javascript\";\n script.onload = () => {\n setChartingLibrarySciprtReady(true);\n };\n script.onerror = () => {\n console.log(\"trading view path error\");\n };\n chartRef.current.appendChild(script);\n }\n }, [chartRef, chartingLibrarySciprtReady, tradingViewScriptSrc]);\n\n useEffect(() => {\n if (!symbol) {\n return;\n }\n if (!chartingLibrarySciprtReady || !tradingViewScriptSrc) {\n return;\n }\n\n const defaultOverrides = getOveriides(colorConfig, isMobile);\n const overrides = customerOverrides\n ? Object.assign({}, defaultOverrides.overrides, customerOverrides)\n : defaultOverrides.overrides;\n\n console.log(\"-- overides\", overrides, mode);\n // console.log('-- overrides', overrides);\n const studiesOverrides = customerStudiesOverrides\n ? Object.assign(\n {},\n defaultOverrides.studiesOverrides,\n customerStudiesOverrides,\n )\n : defaultOverrides.studiesOverrides;\n if (chartRef.current) {\n // options example: https://www.tradingview.com/widget-docs/widgets/charts/advanced-chart/\n // ChartingLibraryWidgetOptions\n const options: any = {\n // fullscreen: fullscreen ?? false,\n fullscreen: false,\n autosize: true,\n symbol: withExchangePrefix(symbol!),\n locale: typeof locale === \"function\" ? locale(localeCode) : locale,\n timezone: Intl.DateTimeFormat().resolvedOptions().timeZone,\n container: chartRef.current,\n libraryPath: libraryPath,\n customCssUrl: tradingViewCustomCssUrl,\n interval: interval ?? \"1\",\n theme: theme ?? \"dark\",\n loadingScreen: loadingScreen ?? {},\n showVolumeInSamePane,\n overrides: overrides,\n studiesOverrides,\n datafeed: new Datafeed(apiBaseUrl!, ws),\n contextMenu: {\n items_processor: async (defaultItems: any) => {\n return defaultItems;\n },\n },\n // todo broker effect sell/buy\n getBroker: (instance: any, host: any) => {\n console.log(\"-- broker_factory\");\n brokerHostHandler(instance, host);\n return getBrokerAdapter(host, broker);\n },\n // getBroker: undefined,\n };\n\n const chartProps: WidgetProps = {\n options,\n chartKey: getChartKey(isMobile),\n mode,\n onClick: () => {},\n };\n\n chart.current = new Widget(chartProps);\n }\n\n return () => {\n chart.current?.remove();\n };\n }, [\n chartingLibrarySciprtReady,\n isMobile,\n mode,\n chart,\n chartRef,\n chartingLibrarySciprtReady,\n tradingViewScriptSrc,\n colorConfig,\n locale,\n localeCode,\n showVolumeInSamePane,\n ]);\n\n useEffect(() => {\n ws.on(\n \"status:change\",\n (message: any) => {\n if (!message.isPrivate && message.isReconnect) {\n if (\n typeof (window as any).onResetCacheNeededCallback === \"function\"\n ) {\n (window as any).onResetCacheNeededCallback();\n if (chart.current?.instance) {\n chart.current?.instance.activeChart()?.resetData();\n }\n }\n }\n },\n \"tradingview\",\n );\n }, [ws]);\n\n useEffect(() => {\n if (chart.current && chart.current?.instance) {\n chart.current?.instance?.onChartReady(() => {\n if (isLoggedIn && chart.current?.instance) {\n createRenderer(\n chart.current.instance,\n undefined,\n broker,\n chartRef.current!,\n );\n }\n });\n }\n return () => {\n removeRenderer();\n };\n }, [chart.current, isLoggedIn]);\n\n useEffect(() => {\n if (!symbol || !chart.current) {\n return;\n }\n chart.current?.setSymbol(symbol);\n const service = new WebsocketService(ws as WS);\n service.subscribeSymbol(symbol);\n return () => {\n service.unsubscribeKline(symbol);\n };\n }, [symbol]);\n\n return {\n tradingViewScriptSrc,\n chartRef,\n changeDisplaySetting,\n displayControlState,\n interval,\n changeInterval,\n lineType,\n changeLineType,\n openChartSetting,\n openChartIndicators,\n symbol,\n onFullScreenChange,\n classNames,\n fullscreen,\n };\n}\n","import { ColorConfigInterface } from \"../tradingviewAdapter/type\";\n\nconst upColor = \"#008676\";\nconst downColor = \"#D92D6B\";\nexport const chartBG = \"#131519\";\nconst pnlUpColor = \"#00B49E\";\nconst pnlDownColor = \"#FF447C\";\nconst pnlZoreColor = \"#333948\";\nconst textColor = \"#FFFFFF\";\nconst qtyTextColor = \"#F4F7F9\";\nconst font = \"regular 11px Manrope\";\n\nexport const defaultColorConfig: ColorConfigInterface = {\n upColor,\n downColor,\n chartBG,\n pnlUpColor,\n pnlDownColor,\n pnlZoreColor,\n textColor,\n qtyTextColor,\n font,\n volumeUpColor: \"#00E5A0\",\n volumeDownColor: \"#FF6B94\",\n closeIcon: \"rgba(255, 255, 255, 0.8)\",\n};\n\nexport const getOveriides = (\n colorConfig: ColorConfigInterface,\n isMobile?: boolean,\n) => {\n const overrides = {\n \"paneProperties.background\": colorConfig.chartBG,\n // \"paneProperties.background\": \"#ffff00\",\n // \"mainSeriesProperties.style\": 1,\n \"paneProperties.backgroundType\": \"solid\",\n // \"paneProperties.background\": \"#151822\",\n\n \"mainSeriesProperties.candleStyle.upColor\": colorConfig.upColor,\n \"mainSeriesProperties.candleStyle.downColor\": colorConfig.downColor,\n \"mainSeriesProperties.candleStyle.borderColor\": colorConfig.upColor,\n \"mainSeriesProperties.candleStyle.borderUpColor\": colorConfig.upColor,\n \"mainSeriesProperties.candleStyle.borderDownColor\": colorConfig.downColor,\n \"mainSeriesProperties.candleStyle.wickUpColor\": colorConfig.upColor,\n \"mainSeriesProperties.candleStyle.wickDownColor\": colorConfig.downColor,\n \"paneProperties.separatorColor\": \"#2B2833\",\n \"paneProperties.vertGridProperties.color\": \"#26232F\",\n \"paneProperties.horzGridProperties.color\": \"#26232F\",\n \"scalesProperties.fontSize\": isMobile ? 8 : 12,\n \"scalesProperties.textColor\": \"#97969B\",\n \"paneProperties.legendProperties.showSeriesTitle\": isMobile ? false : true,\n \"mainSeriesProperties.statusViewStyle.symbolTextSource\": \"ticker\",\n \"mainSeriesProperties.statusViewStyle.showExchange\": false,\n };\n const studiesOverrides = {\n \"volume.volume.color.0\": colorConfig.volumeDownColor,\n \"volume.volume.color.1\": colorConfig.volumeUpColor,\n };\n\n return {\n overrides,\n studiesOverrides,\n };\n};\n\nexport const EXCHANGE = \"Orderly\";\nexport const EXCHANGE_DISPLAY = \"Kodiak\";\nexport const withoutExchangePrefix = (symbol: string) =>\n symbol.includes(\":\") ? symbol.split(\":\")[1] : symbol;\n\nexport const withExchangePrefix = (symbol: string) =>\n symbol.startsWith(`${EXCHANGE}:`) ? symbol : `${EXCHANGE}:${symbol}`;\n","import {IBrokerConnectionAdapterHost} from '../type';\nimport useBroker from '../hooks/useBroker';\nimport { SideType, AlgoType, OrderCombinationType} from \"../type\";\nimport { withoutExchangePrefix } from '../../utils/chart.util';\nimport { OrderType } from \"@kodiak-finance/orderly-types\";\n\nconst getBrokerAdapter = (host: IBrokerConnectionAdapterHost, broker: ReturnType<typeof useBroker>) => {\n let symbol: string;\n let _symbolInfo: any;\n const getOrderCombinationType = (orderType: any) => {\n return [\n null,\n 'limit',\n OrderCombinationType.MARKET,\n OrderCombinationType.STOP_MARKET,\n OrderCombinationType.STOP_LIMIT,\n ][orderType];\n };\n\n return {\n symbolInfo: async (symbol: string): Promise<any> => {\n _symbolInfo = broker.getSymbolInfo(withoutExchangePrefix(symbol));\n\n return {\n qty: {\n min: _symbolInfo?.baseMin ?? 0,\n max: _symbolInfo?.baseMax ?? 0,\n step: _symbolInfo?.baseTick ?? 0,\n },\n pipValue: 0,\n pipSize: _symbolInfo?.quoteTick ?? 0,\n minTick: _symbolInfo?.quoteTick ?? 0,\n description: '',\n };\n },\n placeOrder: async (order: any) => {\n const side = [SideType.SELL, SideType.BUY][+(order.side > 0)];\n const quantity = order.qty.toString();\n const limitPrice = (order.limitPrice ?? 0).toString();\n const triggerPrice = (order.stopPrice ?? 0).toString();\n const symbol = withoutExchangePrefix(order.symbol);\n const orderCombinationType = getOrderCombinationType(order.type);\n console.log('-- order orderCombinationType ', orderCombinationType);\n console.log('-- side, orderquantity ',side, quantity, limitPrice, triggerPrice, symbol);\n\n if (orderCombinationType === OrderCombinationType.MARKET) {\n console.log('--0 order', order);\n // @ts-ignore\n broker.sendMarketOrder({ side, order_quantity: quantity, symbol, order_type: OrderType.MARKET });\n } else if (orderCombinationType === OrderCombinationType.LIMIT) {\n // broker.sendLimitOrder({ side, orderQuantity: quantity, orderPrice: limitPrice, symbol });\n }\n },\n orders: () => [],\n positions: () => [],\n executions: () => [],\n connectionStatus: () => 1,\n chartContextMenuActions: (context: any) => host.defaultContextMenuActions(context),\n isTradable: async () => true,\n accountManagerInfo: () => ({}),\n currentAccount: () => '1',\n accountsMetainfo: async () => [{ id: '1' }],\n remove: () => host?.silentOrdersPlacement().unsubscribe(),\n }\n}\n\nexport default getBrokerAdapter;","export interface RequestParams {\n [paramName: string]: string | string[] | number;\n}\n\nexport interface UdfResponse {\n s: string;\n}\n\nexport interface UdfOkResponse extends UdfResponse {\n s: \"ok\";\n}\n\nexport interface UdfErrorResponse {\n s: \"error\";\n errmsg: string;\n}\n\n/**\n * If you want to enable logs from datafeed set it to `true`\n */\nconst isLoggingEnabled = false;\n\nexport function logMessage(message: string): void {\n if (isLoggingEnabled) {\n const now = new Date();\n // tslint:disable-next-line:no-console\n console.log(\n `${now.toLocaleTimeString()}.${now.getMilliseconds()}> ${message}`\n );\n }\n}\n\nexport function getErrorMessage(error: string | Error | undefined): string {\n if (error === undefined) {\n return \"\";\n }\n if (typeof error === \"string\") {\n return error;\n }\n\n return error.message;\n}\n","import { Bar, HistoryMetadata, LibrarySymbolInfo, PeriodParams } from \"../type\";\nimport {\n RequestParams,\n UdfErrorResponse,\n UdfOkResponse,\n UdfResponse,\n getErrorMessage,\n} from \"./helpers\";\nimport { IRequester } from \"./iRequester\";\n\n// tslint:disable: no-any\ninterface HistoryPartialDataResponse extends UdfOkResponse {\n t: any;\n c: any;\n o?: never;\n h?: never;\n l?: never;\n v?: never;\n}\n\ninterface HistoryFullDataResponse extends UdfOkResponse {\n t: any;\n c: any;\n o: any;\n h: any;\n l: any;\n v: any;\n}\n\n// tslint:enable: no-any\ninterface HistoryNoDataResponse extends UdfResponse {\n s: \"no_data\";\n nextTime?: number;\n}\n\ntype HistoryResponse =\n | HistoryFullDataResponse\n | HistoryPartialDataResponse\n | HistoryNoDataResponse;\n\nexport type PeriodParamsWithOptionalCountback = Omit<\n PeriodParams,\n \"countBack\"\n> & { countBack?: number };\n\nexport interface GetBarsResult {\n bars: Bar[];\n meta: HistoryMetadata;\n}\n\nexport interface LimitedResponseConfiguration {\n /**\n * Set this value to the maximum number of bars which\n * the data backend server can supply in a single response.\n * This doesn't affect or change the library behavior regarding\n * how many bars it will request. It just allows this Datafeed\n * implementation to correctly handle this situation.\n */\n maxResponseLength: number;\n /**\n * If the server can't return all the required bars in a single\n * response then `expectedOrder` specifies whether the server\n * will send the latest (newest) or earliest (older) data first.\n */\n expectedOrder: \"latestFirst\" | \"earliestFirst\";\n}\n\nexport class HistoryProvider {\n private _datafeedUrl: string;\n private readonly _requester: IRequester;\n private readonly _limitedServerResponse?: LimitedResponseConfiguration;\n\n public constructor(\n datafeedUrl: string,\n requester: IRequester,\n limitedServerResponse?: LimitedResponseConfiguration\n ) {\n this._datafeedUrl = datafeedUrl;\n this._requester = requester;\n this._limitedServerResponse = limitedServerResponse;\n }\n\n public getBars(\n symbolInfo: LibrarySymbolInfo,\n resolution: string,\n periodParams: PeriodParamsWithOptionalCountback\n ): Promise<GetBarsResult> {\n const requestParams: RequestParams = {\n symbol: symbolInfo.ticker || \"\",\n resolution: resolution,\n from: periodParams.from,\n to: periodParams.to,\n };\n if (periodParams.countBack !== undefined) {\n requestParams.countback = periodParams.countBack;\n }\n\n if (symbolInfo.currency_code !== undefined) {\n requestParams.currencyCode = symbolInfo.currency_code;\n }\n\n if (symbolInfo.unit_id !== undefined) {\n requestParams.unitId = symbolInfo.unit_id;\n }\n\n // eslint-disable-next-line no-async-promise-executor\n return new Promise(\n async (\n resolve: (result: GetBarsResult) => void,\n reject: (reason: string) => void\n ) => {\n try {\n const initialResponse =\n await this._requester.sendRequest<HistoryResponse>(\n this._datafeedUrl,\n \"history\",\n requestParams\n );\n const result = this._processHistoryResponse(initialResponse);\n\n if (this._limitedServerResponse) {\n await this._processTruncatedResponse(result, requestParams);\n }\n resolve(result);\n } catch (e: unknown) {\n if (e instanceof Error || typeof e === \"string\") {\n const reasonString = getErrorMessage(e);\n // tslint:disable-next-line:no-console\n console.warn(\n `HistoryProvider: getBars() failed, error=${reasonString}`\n );\n reject(reasonString);\n }\n }\n }\n );\n }\n\n private async _processTruncatedResponse(\n result: GetBarsResult,\n requestParams: RequestParams\n ) {\n let lastResultLength = result.bars.length;\n try {\n while (\n this._limitedServerResponse &&\n this._limitedServerResponse.maxResponseLength > 0 &&\n this._limitedServerResponse.maxResponseLength === lastResultLength &&\n requestParams.from < requestParams.to\n ) {\n // adjust request parameters for follow-up request\n if (requestParams.countback) {\n requestParams.countback =\n (requestParams.countback as number) - lastResultLength;\n }\n if (this._limitedServerResponse.expectedOrder === \"earliestFirst\") {\n requestParams.from = Math.round(\n result.bars[result.bars.length - 1].time / 1000\n );\n } else {\n requestParams.to = Math.round(result.bars[0].time / 1000);\n }\n\n // eslint-disable-next-line no-await-in-loop\n const followupResponse =\n await this._requester.sendRequest<HistoryResponse>(\n this._datafeedUrl,\n \"history\",\n requestParams\n );\n const followupResult = this._processHistoryResponse(followupResponse);\n lastResultLength = followupResult.bars.length;\n // merge result with results collected so far\n if (this._limitedServerResponse.expectedOrder === \"earliestFirst\") {\n if (\n followupResult.bars[0].time ===\n result.bars[result.bars.length - 1].time\n ) {\n // Datafeed shouldn't include a value exactly matching the `to` timestamp but in case it does\n // we will remove the duplicate.\n followupResult.bars.shift();\n }\n result.bars.push(...followupResult.bars);\n } else {\n if (\n followupResult.bars[followupResult.bars.length - 1].time ===\n result.bars[0].time\n ) {\n // Datafeed shouldn't include a value exactly matching the `to` timestamp but in case it does\n // we will remove the duplicate.\n followupResult.bars.pop();\n }\n result.bars.unshift(...followupResult.bars);\n }\n }\n } catch (e: unknown) {\n /**\n * Error occurred during followup request. We won't reject the original promise\n * because the initial response was valid so we will return what we've got so far.\n */\n if (e instanceof Error || typeof e === \"string\") {\n const reasonString = getErrorMessage(e);\n // tslint:disable-next-line:no-console\n console.warn(\n `HistoryProvider: getBars() warning during followup request, error=${reasonString}`\n );\n }\n }\n }\n\n private _processHistoryResponse(\n response: HistoryResponse | UdfErrorResponse\n ) {\n if (response.s !== \"ok\" && response.s !== \"no_data\") {\n throw new Error(response.errmsg);\n }\n\n const bars: Bar[] = [];\n const meta: HistoryMetadata = {\n noData: false,\n };\n\n if (response.s === \"no_data\") {\n meta.noData = true;\n meta.nextTime = response.nextTime;\n } else {\n const volumePresent = response.v !== undefined;\n const ohlPresent = response.o !== undefined;\n\n for (let i = 0; i < response.t.length; ++i) {\n const barValue: Bar = {\n time: response.t[i] * 1000,\n close: parseFloat(response.c[i]),\n open: parseFloat(response.c[i]),\n high: parseFloat(response.c[i]),\n low: parseFloat(response.c[i]),\n };\n\n if (ohlPresent) {\n barValue.open = parseFloat(\n (response as HistoryFullDataResponse).o[i]\n );\n barValue.high = parseFloat(\n (response as HistoryFullDataResponse).h[i]\n );\n barValue.low = parseFloat((response as HistoryFullDataResponse).l[i]);\n }\n\n if (volumePresent) {\n barValue.volume = parseFloat(\n (response as HistoryFullDataResponse).v[i]\n );\n }\n\n bars.push(barValue);\n }\n }\n\n return {\n bars: bars,\n meta: meta,\n };\n }\n}\n","/* eslint-disable */\nimport {\n RequestParams,\n UdfErrorResponse,\n UdfResponse,\n logMessage,\n} from \"./helpers\";\n\nexport class Requester {\n private _headers: HeadersInit | undefined;\n\n public constructor(headers?: HeadersInit) {\n if (headers) {\n this._headers = headers;\n }\n }\n\n public sendRequest<T extends UdfResponse>(\n datafeedUrl: string,\n urlPath: string,\n params?: RequestParams\n ): Promise<T | UdfErrorResponse>;\n public sendRequest<T>(\n datafeedUrl: string,\n urlPath: string,\n params?: RequestParams\n ): Promise<T>;\n public sendRequest<T>(\n datafeedUrl: string,\n urlPath: string,\n params?: RequestParams\n ): Promise<T> {\n if (params !== undefined) {\n const paramKeys = Object.keys(params);\n if (paramKeys.length !== 0) {\n urlPath += \"?\";\n }\n\n urlPath += paramKeys\n .map((key: string) => {\n return `${encodeURIComponent(key)}=${encodeURIComponent(\n params[key].toString()\n )}`;\n })\n .join(\"&\");\n }\n\n logMessage(\"New request: \" + urlPath);\n\n // Send user cookies if the URL is on the same origin as the calling script.\n const options: RequestInit = { credentials: \"same-origin\" };\n\n if (this._headers !== undefined) {\n options.headers = this._headers;\n }\n\n return fetch(`${datafeedUrl}/${urlPath}`, options)\n .then((response: Response) => response.text())\n .then((responseTest: string) => JSON.parse(responseTest));\n }\n}\n","/* eslint-disable */\nimport {\n LibrarySymbolInfo,\n ResolutionString,\n SearchSymbolResultItem,\n VisiblePlotsSet,\n} from \"../type\";\nimport { getErrorMessage, logMessage } from \"./helpers\";\nimport { IRequester } from \"./iRequester\";\n\ninterface SymbolInfoMap {\n [symbol: string]: LibrarySymbolInfo | undefined;\n}\n\ninterface ExchangeDataResponseSymbolData {\n type: string;\n timezone: LibrarySymbolInfo[\"timezone\"];\n description: string;\n\n \"exchange-listed\": string;\n \"exchange-traded\": string;\n\n \"session-regular\": string;\n corrections?: string;\n \"session-holidays\"?: string;\n\n fractional: boolean;\n\n pricescale: number;\n\n ticker?: string;\n\n minmov2?: number;\n minmove2?: number;\n\n minmov?: number;\n minmovement?: number;\n\n \"supported-resolutions\"?: ResolutionString[];\n \"intraday-multipliers\"?: string[];\n\n \"has-intraday\"?: boolean;\n \"has-daily\"?: boolean;\n \"has-weekly-and-monthly\"?: boolean;\n \"has-empty-bars\"?: boolean;\n \"visible-plots-set\"?: VisiblePlotsSet;\n \"currency-code\"?: string;\n \"original-currency-code\"?: string;\n \"unit-id\"?: string;\n \"original-unit-id\"?: string;\n \"unit-conversion-types\"?: string[];\n\n \"volume-precision\"?: number;\n}\n\n// Here is some black magic with types to get compile-time checks of names and types\ntype PickArrayedObjectFields<T> = Pick<\n T,\n {\n // tslint:disable-next-line:no-any\n [K in keyof T]-?: NonNullable<T[K]> extends any[] ? K : never;\n }[keyof T]\n>;\n\ntype ExchangeDataResponseArrayedSymbolData =\n PickArrayedObjectFields<ExchangeDataResponseSymbolData>;\ntype ExchangeDataResponseNonArrayedSymbolData = Pick<\n ExchangeDataResponseSymbolData,\n Exclude<\n keyof ExchangeDataResponseSymbolData,\n keyof ExchangeDataResponseArrayedSymbolData\n >\n>;\n\ntype ExchangeDataResponse = {\n symbol: string[];\n} & {\n [K in keyof ExchangeDataResponseSymbolData]:\n | ExchangeDataResponseSymbolData[K]\n | NonNullable<ExchangeDataResponseSymbolData[K]>[];\n};\n\nfunction extractField<\n Field extends keyof ExchangeDataResponseNonArrayedSymbolData\n>(\n data: ExchangeDataResponse,\n field: Field,\n arrayIndex: number\n): ExchangeDataResponseNonArrayedSymbolData[Field];\nfunction extractField<\n Field extends keyof ExchangeDataResponseArrayedSymbolData\n>(\n data: ExchangeDataResponse,\n field: Field,\n arrayIndex: number,\n valueIsArray: true\n): ExchangeDataResponseArrayedSymbolData[Field];\nfunction extractField<Field extends keyof ExchangeDataResponseSymbolData>(\n data: ExchangeDataResponse,\n field: Field,\n arrayIndex: number,\n valueIsArray?: boolean\n): ExchangeDataResponseSymbolData[Field] {\n const value: ExchangeDataResponse[keyof ExchangeDataResponseSymbolData] =\n data[field];\n\n if (Array.isArray(value) && (!valueIsArray || Array.isArray(value[0]))) {\n return value[arrayIndex] as ExchangeDataResponseSymbolData[Field];\n }\n\n return value as ExchangeDataResponseSymbolData[Field];\n}\n\nfunction symbolKey(symbol: string, currency?: string, unit?: string): string {\n // here we're using a separator that quite possible shouldn't be in a real symbol name\n return (\n symbol +\n (currency !== undefined ? \"_%|#|%_\" + currency : \"\") +\n (unit !== undefined ? \"_%|#|%_\" + unit : \"\")\n );\n}\n\nexport class SymbolsStorage {\n private readonly _exchangesList: string[] = [\"Orderly\"];\n private readonly _symbolsInfo: SymbolInfoMap = {};\n private readonly _symbolsList: string[] = [];\n private readonly _datafeedUrl: string;\n private readonly _readyPromise: Promise<void>;\n private readonly _datafeedSupportedResolutions: ResolutionString[];\n private readonly _requester: IRequester;\n\n public constructor(\n datafeedUrl: string,\n datafeedSupportedResolutions: ResolutionString[],\n requester: IRequester\n ) {\n this._datafeedUrl = datafeedUrl;\n this._datafeedSupportedResolutions = datafeedSupportedResolutions;\n this._requester = requester;\n this._readyPromise = this._init();\n this._readyPromise.catch((error: Error) => {\n // seems it is impossible\n // tslint:disable-next-line:no-console\n console.error(`SymbolsStorage: Cannot init, error=${error.toString()}`);\n });\n }\n\n // BEWARE: this function does not consider symbol's exchange\n public resolveSymbol(\n symbolName: string,\n currencyCode?: string,\n unitId?: string\n ): Promise<LibrarySymbolInfo> {\n return this._readyPromise.then(() => {\n const symbolInfo =\n this._symbolsInfo[symbolKey(symbolName, currencyCode, unitId)];\n if (symbolInfo === undefined) {\n return Promise.reject(\"invalid symbol\");\n }\n\n return Promise.resolve(symbolInfo);\n });\n }\n\n public searchSymbols(\n searchString: string,\n exchange: string,\n symbolType: string,\n maxSearchResults: number\n ): Promise<SearchSymbolResultItem[]> {\n interface WeightedItem {\n symbolInfo: LibrarySymbolInfo;\n weight: number;\n }\n\n return this._readyPromise.then(() => {\n const weightedResult: WeightedItem[] = [];\n const queryIsEmpty = searchString.length === 0;\n\n searchString = searchString.toUpperCase();\n\n for (const symbolName of this._symbolsList) {\n const symbolInfo = this._symbolsInfo[symbolName];\n\n if (symbolInfo === undefined) {\n continue;\n }\n\n if (symbolType.length > 0 && symbolInfo.type !== symbolType) {\n continue;\n }\n\n if (\n exchange &&\n exchange.length > 0 &&\n symbolInfo.exchange !== exchange\n ) {\n continue;\n }\n\n const positionInName = symbolInfo.name\n .toUpperCase()\n .indexOf(searchString);\n const positionInDescription = symbolInfo.description\n .toUpperCase()\n .indexOf(searchString);\n\n if (queryIsEmpty || positionInName >= 0 || positionInDescription >= 0) {\n const alreadyExists = weightedResult.some(\n (item: WeightedItem) => item.symbolInfo === symbolInfo\n );\n if (!alreadyExists) {\n const weight =\n positionInName >= 0\n ? positionInName\n : 8000 + positionInDescription;\n weightedResult.push({ symbolInfo: symbolInfo, weight: weight });\n }\n }\n }\n\n const result = weightedResult\n .sort(\n (item1: WeightedItem, item2: WeightedItem) =>\n item1.weight - item2.weight\n )\n .slice(0, maxSearchResults)\n .map((item: WeightedItem) => {\n const symbolInfo = item.symbolInfo;\n return {\n symbol: symbolInfo.name,\n full_name: `${symbolInfo.exchange}:${symbolInfo.name}`,\n description: symbolInfo.description,\n exchange: symbolInfo.exchange,\n params: [],\n type: symbolInfo.type,\n ticker: symbolInfo.name,\n };\n });\n\n return Promise.resolve(result);\n });\n }\n\n private _init(): Promise<void> {\n interface BooleanMap {\n [key: string]: boolean | undefined;\n }\n\n const promises: Promise<void>[] = [];\n const alreadyRequestedExchanges: BooleanMap = {};\n\n for (const exchange of this._exchangesList) {\n if (alreadyRequestedExchanges[exchange]) {\n continue;\n }\n\n alreadyRequestedExchanges[exchange] = true;\n promises.push(this._requestExchangeData(exchange));\n }\n\n return Promise.all(promises).then(() => {\n this._symbolsList.sort();\n logMessage(\"SymbolsStorage: All exchanges data loaded\");\n });\n }\n\n private _requestExchangeData(exchange: string): Promise<void> {\n return new Promise(\n (resolve: () => void, reject: (error: Error) => void) => {\n this._requester\n .sendRequest<ExchangeDataResponse>(this._datafeedUrl, \"symbol_info\", {\n group: exchange,\n })\n .then((response: ExchangeDataResponse) => {\n try {\n this._onExchangeDataReceived(exchange, response);\n } catch (error) {\n reject(\n error instanceof Error\n ? error\n : new Error(`SymbolsStorage: Unexpected exception ${error}`)\n );\n return;\n }\n\n resolve();\n })\n .catch((reason?: string | Error) => {\n logMessage(\n `SymbolsStorage: Request data for exchange '${exchange}' failed, reason=${getErrorMessage(\n reason\n )}`\n );\n resolve();\n });\n }\n );\n }\n\n private _onExchangeDataReceived(\n exchange: string,\n data: ExchangeDataResponse\n ): void {\n let symbolIndex = 0;\n\n try {\n const symbolsCount = data.symbol.length;\n const tickerPresent = data.ticker !== undefined;\n\n for (; symbolIndex < symbolsCount; ++symbolIndex) {\n const symbolName = data.symbol[symbolIndex];\n const listedExchange = extractField(\n data,\n \"exchange-listed\",\n symbolIndex\n );\n const tradedExchange = extractField(\n data,\n \"exchange-traded\",\n symbolIndex\n );\n const fullName = tradedExchange + \":\" + symbolName;\n const currencyCode = extractField(data, \"currency-code\", symbolIndex);\n const unitId = extractField(data, \"unit-id\", symbolIndex);\n\n const ticker = tickerPresent\n ? (extractField(data, \"ticker\", symbolIndex) as string)\n : symbolName;\n\n const symbolInfo: LibrarySymbolInfo = {\n ticker: ticker,\n name: symbolName,\n base_name: [listedExchange + \":\" + symbolName],\n listed_exchange: listedExchange,\n exchange: tradedExchange,\n currency_code: currencyCode,\n original_currency_code: extractField(\n data,\n \"original-currency-code\",\n symbolIndex\n ),\n unit_id: unitId,\n original_unit_id: extractField(data, \"original-unit-id\", symbolIndex),\n unit_conversion_types: extractField(\n data,\n \"unit-conversion-types\",\n symbolIndex,\n true\n ),\n description: extractField(data, \"description\", symbolIndex),\n has_intraday: definedValueOrDefault(\n extractField(data, \"has-intraday\", symbolIndex),\n false\n ),\n // show volume at the bottom by default: https://github.com/tradingview/charting_library/issues/8306\n visible_plots_set: definedValueOrDefault(\n extractField(data, \"visible-plots-set\", symbolIndex),\n \"ohlcv\"\n ),\n minmov:\n extractField(data, \"minmovement\", symbolIndex) ||\n extractField(data, \"minmov\", symbolIndex) ||\n 0,\n minmove2:\n extractField(data, \"minmove2\", symbolIndex) ||\n extractField(data, \"minmov2\", symbolIndex),\n fractional: extractField(data, \"fractional\", symbolIndex),\n pricescale: extractField(data, \"pricescale\", symbolIndex),\n type: extractField(data, \"type\", symbolIndex),\n session: extractField(data, \"session-regular\", symbolIndex),\n session_holidays: extractField(data, \"session-holidays\", symbolIndex),\n corrections: extractField(data, \"corrections\", symbolIndex),\n timezone: extractField(data, \"timezone\", symbolIndex),\n supported_resolutions: definedValueOrDefault(\n extractField(data, \"supported-resolutions\", symbolIndex, true),\n this._datafeedSupportedResolutions\n ),\n has_daily: definedValueOrDefault(\n extractField(data, \"has-daily\", symbolIndex),\n true\n ),\n intraday_multipliers: definedValueOrDefault(\n extractField(data, \"intraday-multipliers\", symbolIndex, true),\n [\"1\", \"5\", \"15\", \"30\", \"60\"]\n ),\n has_weekly_and_monthly: extractField(\n data,\n \"has-weekly-and-monthly\",\n symbolIndex\n ),\n has_empty_bars: extractField(data, \"has-empty-bars\", symbolIndex),\n volume_precision: definedValueOrDefault(\n extractField(data, \"volume-precision\", symbolIndex),\n 0\n ),\n format: \"price\",\n };\n\n this._symbolsInfo[ticker] = symbolInfo;\n this._symbolsInfo[symbolName] = symbolInfo;\n this._symbolsInfo[fullName] = symbolInfo;\n if (currencyCode !== undefined || unitId !== undefined) {\n this._symbolsInfo[symbolKey(ticker, currencyCode, unitId)] =\n symbolInfo;\n this._symbolsInfo[symbolKey(symbolName, currencyCode, unitId)] =\n symbolInfo;\n this._symbolsInfo[symbolKey(fullName, currencyCode, unitId)] =\n symbolInfo;\n }\n\n this._symbolsList.push(symbolName);\n }\n } catch (error) {\n throw new Error(\n `SymbolsStorage: API error when processing exchange ${exchange} symbol #${symbolIndex} (${\n data.symbol[symbolIndex]\n }): ${Object(error).message}`\n );\n }\n }\n}\n\nfunction definedValueOrDefault<T>(value: T | undefined, defaultValue: T): T {\n return value !== undefined ? value : defaultValue;\n}\n","import {\n DatafeedConfiguration,\n ErrorCallback,\n HistoryCallback,\n LibrarySymbolInfo,\n OnReadyCallback,\n QuotesCallback,\n ResolutionString,\n ResolveCallback,\n SearchSymbolResultItem,\n SearchSymbolsCallback,\n SubscribeBarsCallback,\n SymbolResolveExtension,\n} from \"../type\";\nimport { RequestParams, getErrorMessage, logMessage } from \"./helpers\";\nimport {\n GetBarsResult,\n HistoryProvider,\n PeriodParamsWithOptionalCountback,\n} from \"./history-provider\";\nimport { Requester } from \"./requester\";\nimport { SymbolsStorage } from \"./symbol-storage\";\n\nexport interface UdfCompatibleConfiguration extends DatafeedConfiguration {\n // tslint:disable:tv-variable-name\n supports_search?: boolean;\n supports_group_request?: boolean;\n // tslint:enable:tv-variable-name\n}\n\nexport interface ResolveSymbolResponse extends LibrarySymbolInfo {\n s: undefined;\n}\n\n// it is hack to let's TypeScript make code flow analysis\nexport interface UdfSearchSymbolsResponse\n extends Array<SearchSymbolResultItem> {\n s?: undefined;\n}\n\nexport const enum Constants {\n SearchItemsLimit = 30,\n}\n\nexport abstract class AbstractDatafeed {\n protected _configuration: UdfCompatibleConfiguration = defaultConfiguration();\n\n private readonly _datafeedURL: string;\n\n private readonly _configurationReadyPromise: Promise<void>;\n\n private _symbolsStorage: SymbolsStorage | null = null;\n\n private readonly _historyProvider: HistoryProvider;\n\n private readonly _requester: Requester;\n\n constructor(datafeedURL: string) {\n this._datafeedURL = datafeedURL;\n this._requester = new Requester();\n this._historyProvider = new HistoryProvider(datafeedURL, this._requester);\n\n this._configurationReadyPromise = this._requestConfiguration().then(\n (configuration: UdfCompatibleConfiguration | null) => {\n if (configuration === null) {\n configuration = defaultConfiguration();\n }\n\n this._setupWithConfiguration(configuration);\n }\n );\n }\n\n public getBars(\n symbolInfo: LibrarySymbolInfo,\n resolution: ResolutionString,\n periodParams: PeriodParamsWithOptionalCountback,\n onResult: HistoryCallback,\n onError: ErrorCallback\n ): void {\n this._historyProvider\n .getBars(symbolInfo, resolution, periodParams)\n .then((result: GetBarsResult) => {\n onResult(result.bars, result.meta);\n })\n .catch(onError);\n }\n\n // @ts-ignore\n public abstract subscribeBars(\n symbolInfo: LibrarySymbolInfo,\n resolution: ResolutionString,\n onTick: SubscribeBarsCallback,\n listenerGuid: string,\n onResetCacheNeededCallback: () => void\n );\n\n public onReady(callback: OnReadyCallback): void {\n this._configurationReadyPromise.then(() => {\n callback(this._configuration);\n });\n }\n\n public searchSymbols(\n userInput: string,\n exchange: string,\n symbolType: string,\n onResult: SearchSymbolsCallback\n ): void {\n if (this._symbolsStorage === null) {\n throw new Error(\"Datafeed: inconsistent configuration (symbols storage)\");\n }\n\n this._symbolsStorage\n .searchSymbols(\n userInput,\n exchange,\n symbolType,\n Constants.SearchItemsLimit\n )\n .then(onResult)\n .catch(onResult.bind(null, []));\n }\n\n public resolveSymbol(\n symbolName: string,\n onResolve: ResolveCallback,\n onError: ErrorCallback,\n extension?: SymbolResolveExtension\n ): void {\n const currencyCode = extension && extension.currencyCode;\n const unitId = extension && extension.unitId;\n\n const resolveRequestStartTime = Date.now();\n\n function onResultReady(symbolInfo: LibrarySymbolInfo): void {\n logMessage(`Symbol resolved: ${Date.now() - resolveRequestStartTime}ms`);\n onResolve(symbolInfo);\n }\n\n if (this._symbolsStorage === null) {\n throw new Error(\"Datafeed: inconsistent configuration (symbols storage)\");\n }\n\n this._symbolsStorage\n .resolveSymbol(symbolName, currencyCode, unitId)\n .then(onResultReady)\n .catch(onError);\n }\n\n public abstract unsubscribeBars(listenerGuid: string): void;\n\n public getMarks(): void {\n /* not supported */\n }\n\n public getTimescaleMarks(): void {\n /* not supported */\n }\n\n public getServerTime(): void {\n /* not supported */\n }\n\n public abstract getQuotes(\n symbols: string[],\n onDataCallback: QuotesCallback,\n onErrorCallback: (msg: string) => void\n ): void;\n\n public abstract subscribeQuotes(\n symbols: string[],\n fastSymbols: string[],\n onRealtimeCallback: QuotesCallback,\n listenerGuid: string\n ): void;\n\n public abstract unsubscribeQuotes(listenerGuid: string): void;\n\n public abstract remove(): void;\n\n protected _requestConfiguration(): Promise<UdfCompatibleConfiguration | null> {\n return this._send<UdfCompatibleConfiguration>(\"config\").catch(\n (reason?: string | Error) => {\n logMessage(\n `Datafeed: Cannot get datafeed configuration - use default, error=${getErrorMessage(\n reason\n )}`\n );\n return null;\n }\n );\n }\n\n private _send<T>(urlPath: string, params?: RequestParams): Promise<T> {\n return this._requester.sendRequest<T>(this._datafeedURL, urlPath, params);\n }\n\n private _setupWithConfiguration(\n configurationData: UdfCompatibleConfiguration\n ): void {\n this._configuration = configurationData;\n\n if (configurationData.exchanges === undefined) {\n configurationData.exchanges = [];\n }\n\n if (\n !configurationData.supports_search &&\n !configurationData.supports_group_request\n ) {\n throw new Error(\n \"Unsupported datafeed configuration. Must either support search, or support group request\"\n );\n }\n\n if (\n configurationData.supports_group_request ||\n !configurationData.supports_search\n ) {\n this._symbolsStorage = new SymbolsStorage(\n this._datafeedURL,\n configurationData.supported_resolutions || [],\n this._requester\n );\n }\n\n logMessage(\n `Datafeed: Initialized with ${JSON.stringify(configurationData)}`\n );\n }\n}\n\nfunction defaultConfiguration(): UdfCompatibleConfiguration {\n return {\n supports_search: false,\n supports_group_request: true,\n supported_resolutions: [\n \"1\" as ResolutionString,\n \"3\" as ResolutionString,\n \"5\" as ResolutionString,\n \"15\" as ResolutionString,\n \"30\" as ResolutionString,\n \"60\" as ResolutionString,\n \"120\" as ResolutionString,\n \"240\" as ResolutionString,\n \"480\" as ResolutionString,\n \"720\" as ResolutionString,\n \"1D\" as ResolutionString,\n \"3D\" as ResolutionString,\n \"1W\" as ResolutionString,\n \"1M\" as ResolutionString,\n ],\n supports_marks: false,\n supports_timescale_marks: false,\n };\n}\n","export class MultiBroadcastEventBus {\n private subscribers: Map<string, Array<(data: any) => void>> = new Map();\n\n subscribe(eventName: string, callback: (data: any) => void): () => void {\n if (!this.subscribers.has(eventName)) {\n this.subscribers.set(eventName, []);\n }\n const callbacks = this.subscribers.get(eventName)!;\n callbacks.push(callback);\n\n return () => {\n this.unsubscribe(eventName, callback);\n };\n }\n\n unsubscribe(eventName: string, callback: (data: any) => void): void {\n if (this.subscribers.has(eventName)) {\n const callbacks = this.subscribers.get(eventName)!;\n this.subscribers.set(\n eventName,\n callbacks.filter((cb) => cb !== callback)\n );\n if (this.subscribers.get(eventName)!.length === 0) {\n this.subscribers.delete(eventName);\n }\n }\n }\n\n publish(eventName: string, data: any): void {\n if (this.subscribers.has(eventName)) {\n const callbacks = this.subscribers.get(eventName)!;\n callbacks.forEach((callback) => {\n callback(data);\n });\n }\n }\n}\n","export enum KlineResolution {\n RESOLUTION_1m = '1',\n RESOLUTION_3m = '3',\n RESOLUTION_5m = '5',\n RESOLUTION_15m = '15',\n RESOLUTION_30m = '30',\n RESOLUTION_60m = '60',\n RESOLUTION_120m = '120',\n RESOLUTION_240m = '240',\n RESOLUTION_480m = '480',\n RESOLUTION_720m = '720',\n RESOLUTION_D = 'D',\n RESOLUTION_1D = '1D',\n RESOLUTION_3D = '3D',\n RESOLUTION_1W = '1W',\n RESOLUTION_1M = '1M',\n}\nexport const mapResolution = (resolution: any) => {\n let time = '1d';\n switch (resolution) {\n case KlineResolution.RESOLUTION_1m:\n time = '1m';\n break;\n case KlineResolution.RESOLUTION_3m:\n time = '3m';\n break;\n case KlineResolution.RESOLUTION_5m:\n time = '5m';\n break;\n case KlineResolution.RESOLUTION_15m:\n time = '15m';\n break;\n case KlineResolution.RESOLUTION_30m:\n time = '30m';\n break;\n case KlineResolution.RESOLUTION_60m:\n time = '1h';\n break;\n case KlineResolution.RESOLUTION_120m:\n time = '2h';\n break;\n case KlineResolution.RESOLUTION_240m:\n time = '4h';\n break;\n case KlineResolution.RESOLUTION_480m:\n time = '8h';\n break;\n case KlineResolution.RESOLUTION_720m:\n time = '12h';\n break;\n case KlineResolution.RESOLUTION_D:\n case KlineResolution.RESOLUTION_1D:\n time = '1d';\n break;\n case KlineResolution.RESOLUTION_3D:\n time = '3d';\n break;\n case KlineResolution.RESOLUTION_1W:\n time = '1w';\n break;\n case KlineResolution.RESOLUTION_1M:\n time = '1M ';\n break;\n default:\n }\n\n return time;\n};\n\nexport const TradingViewSDKLocalstorageKey = {\n interval: \"TradingviewSDK.lastUsedTimeBasedResolution\",\n lineType: \"TradingviewSDK.lastUsedStyle\",\n displayControlSetting: \"TradingviewSDK.displaySetting\",\n};\n","import { mapResolution } from \"../../utils/common.util\";\nimport { WS } from \"@kodiak-finance/orderly-net\";\n\nconst getKlineKey = (symbol: string, type: string) => `${symbol}kline_${type}`;\n\nconst getSymbolTopics = (symbol: string) => {\n const symbolTopics = [\"trade\"];\n return symbolTopics.map((topic) => `${symbol}@${topic}`);\n};\n\nexport class WebsocketService {\n static _created = false;\n static _instance: any = null;\n private klineSubscribeIdMap: Map<string, any> = new Map();\n private klineOnTickCallback = new Map();\n subscribeCachedTopics = new Map<string, any>();\n private wsInstance: WS | null = null;\n\n private klineData = new Map();\n\n constructor(ws: WS) {\n if (!WebsocketService._created) {\n this.wsInstance = ws;\n WebsocketService._instance = this;\n WebsocketService._created = true;\n }\n\n return WebsocketService._instance;\n }\n\n subscribeKline(\n subscribeId: string,\n symbol: any,\n resolution: any,\n onTickCallback: any\n ) {\n const time = mapResolution(resolution);\n\n this.klineSubscribeIdMap.set(subscribeId, { symbol, resolution });\n\n const klineKey = getKlineKey(symbol, time);\n if (this.klineOnTickCallback.has(klineKey)) {\n const value = this.klineOnTickCallback.get(klineKey);\n value[subscribeId] = onTickCallback;\n } else {\n this.klineOnTickCallback.set(klineKey, {\n [subscribeId]: onTickCallback,\n });\n const unsub = this.wsInstance?.subscribe(\n {\n event: \"subscribe\",\n topic: `${symbol}@kline_${time}`,\n id: `${symbol}@kline_${time}`,\n ts: new Date().getTime(),\n },\n {\n onMessage: (data) => {\n const { open, close, high, low, volume, startTime } = data;\n const key = getKlineKey(data.symbol, data.type);\n this.updateKline(key, {\n time: startTime,\n close,\n open,\n high,\n low,\n volume,\n });\n },\n }\n );\n this.subscribeCachedTopics.set(`${symbol}@kline_${time}`, unsub);\n }\n }\n\n unsubscribeKline(subscribeId: string) {\n if (!this.klineSubscribeIdMap.has(subscribeId)) {\n return;\n }\n\n const { symbol, resolution } = this.klineSubscribeIdMap.get(subscribeId);\n const time = mapResolution(resolution);\n const klineKey = getKlineKey(symbol, time);\n if (this.klineOnTickCallback.has(klineKey)) {\n const value = this.klineOnTickCallback.get(klineKey);\n delete value[subscribeId];\n\n if (Object.keys(value).length === 0) {\n this.klineOnTickCallback.delete(klineKey);\n const unsub = this.subscribeCachedTopics.get(`${symbol}@kline_${time}`);\n unsub();\n }\n }\n\n // @ts-ignore\n delete this.klineSubscribeIdMap[subscribeId];\n }\n\n subscribeSymbol(symbol: string) {\n const symbolTopics = getSymbolTopics(symbol);\n symbolTopics.forEach((topic) => {\n // check if subscribed\n if (!this.subscribeCachedTopics.has(topic)) {\n const unsub = this.wsInstance?.subscribe(\n {\n event: \"subscribe\",\n topic: topic,\n id: topic,\n ts: new Date().getTime(),\n },\n {\n onMessage: (data) => {\n this.updateKlineByLastPrice(data.symbol, data.price);\n },\n }\n );\n this.subscribeCachedTopics.set(topic, unsub);\n }\n });\n }\n\n updateKlineByLastPrice(symbol: string, lastPrice: number) {\n this.klineOnTickCallback.forEach((_, key) => {\n if (key.startsWith(symbol)) {\n const klineData = this.klineData.get(key);\n if (klineData) {\n this.updateKline(key, { ...klineData, close: lastPrice });\n }\n }\n });\n }\n\n updateKline(key: string, cbParams: any) {\n const onTickCbs = this.klineOnTickCallback.get(key);\n if (onTickCbs && cbParams) {\n this.klineData.set(key, cbParams);\n\n Object.keys(onTickCbs).forEach((key: any) => {\n const onTickCb = onTickCbs[key];\n if (onTickCb && typeof onTickCb === \"function\") {\n onTickCb(cbParams);\n }\n });\n }\n }\n}\n","import {\n EXCHANGE,\n EXCHANGE_DISPLAY,\n withExchangePrefix,\n withoutExchangePrefix,\n} from \"../../utils/chart.util\";\nimport {\n LibrarySymbolInfo,\n QuoteData,\n QuotesCallback,\n ResolutionString,\n SubscribeBarsCallback,\n} from \"../type\";\nimport { AbstractDatafeed } from \"./abstract-datafeed\";\nimport { MultiBroadcastEventBus } from \"./eventBus\";\nimport { WebsocketService } from \"./websocket.service\";\n\nconst getAutoIncrementId = (() => {\n let id = 0;\n return () => id++;\n})();\n\nexport class Datafeed extends AbstractDatafeed {\n private _subscribeQuoteMap: Map<string, any>;\n\n private _prefixId: number;\n private _publicWs: WebsocketService;\n\n private bbosMap: Map<string, any> = new Map();\n private tickersMap: Map<string, any> = new Map();\n private eventBus: MultiBroadcastEventBus = new MultiBroadcastEventBus();\n\n constructor(apiUrl: string, ws: any) {\n const datafeedURL = `${apiUrl}/tv`;\n super(datafeedURL);\n\n this._subscribeQuoteMap = new Map();\n this._prefixId = getAutoIncrementId();\n this._publicWs = new WebsocketService(ws);\n\n this.bbosMap = new Map();\n\n ws.on(\"tickers\", (message: any) => {\n for (const ticker of message.data) {\n ticker.change = ticker.close - ticker.open;\n ticker.perChange = ticker.open\n ? +((100 * ticker.change) / ticker.open).toFixed(2)\n : 0;\n this.tickersMap!.set(ticker.symbol, ticker);\n }\n this.eventBus.publish(\"tickerUpdate\", { message: \"ticker\" });\n });\n\n ws.subscribe(\n {\n event: \"subscribe\",\n topic: `bbos`,\n },\n {\n formatter: (message: any) => message,\n onMessage: (message: any) => {\n for (const bbo of message.data) {\n this.bbosMap!.set(bbo.symbol, {\n ask: bbo.ask,\n bid: bbo.bid,\n askSize: bbo.askSize,\n bidSize: bbo.bidSize,\n });\n }\n this.eventBus.publish(\"tickerUpdate\", { message: \"bbos\" });\n },\n },\n );\n }\n\n public remove() {\n Array.from(this._subscribeQuoteMap.values()).forEach((s) => s?.());\n }\n\n private getSubscriptionId(listenerGuid: string) {\n return `${this._prefixId}${listenerGuid}`;\n }\n\n public subscribeBars(\n symbolInfo: LibrarySymbolInfo,\n resolution: ResolutionString,\n onTick: SubscribeBarsCallback,\n listenerGuid: string,\n onResetCacheNeededCallback: () => void,\n ) {\n (window as any).onResetCacheNeededCallback = onResetCacheNeededCallback;\n this._publicWs.subscribeKline(\n `${this._prefixId}${listenerGuid}`,\n symbolInfo.ticker,\n resolution,\n onTick,\n );\n }\n\n public unsubscribeBars(listenerGuid: string): void {\n this._publicWs.unsubscribeKline(`${this._prefixId}${listenerGuid}`);\n }\n\n public getQuotes(symbols: string[], onDataCallback: QuotesCallback): void {\n const subscriptionId = this.getSubscriptionId(\"getQuotes\");\n\n this.unsubscribeQuotes(\"getQuotes\");\n\n const unsub = this.eventBus.subscribe(\"tickerUpdate\", (msg: any) => {\n const dataMap = new Map();\n\n symbols.forEach((symbol) => {\n const bbo = this.bbosMap.get(withoutExchangePrefix(symbol));\n const ticker = this.tickersMap.get(withoutExchangePrefix(symbol));\n if (!bbo || !ticker) {\n return;\n }\n const data = {\n ...ticker,\n ask: bbo.ask,\n bid: bbo.bid,\n };\n dataMap.set(withoutExchangePrefix(symbol), data);\n });\n\n if (!dataMap.size) {\n return;\n }\n onDataCallback(\n Array.from(dataMap.values()).map((symbolData: any) =>\n this._toUDFTicker(symbolData),\n ),\n );\n });\n this._subscribeQuoteMap.set(subscriptionId, unsub);\n }\n\n public subscribeQuotes(\n symbols: string[],\n fastSymbols: string[],\n onRealtimeCallback: QuotesCallback,\n listenerGuid: string,\n ): void {\n const subscriptionId = `${this._prefixId}${listenerGuid}`;\n if (symbols.length > 0) {\n this.unsubscribeQuotes(subscriptionId);\n\n const unsub = this.eventBus.subscribe(\"tickerUpdate\", (msg: any) => {\n const dataMap = new Map();\n symbols.forEach((symbol) => {\n const bbo = this.bbosMap.get(withoutExchangePrefix(symbol));\n const ticker = this.tickersMap.get(withoutExchangePrefix(symbol));\n if (!bbo || !ticker) {\n return;\n }\n const data = {\n ...ticker,\n ask: bbo.ask,\n bid: bbo.bid,\n };\n dataMap.set(withoutExchangePrefix(symbol), data);\n });\n if (!dataMap.size) {\n return;\n }\n onRealtimeCallback(\n Array.from(dataMap.values()).map((symbolData: any) =>\n this._toUDFTicker(symbolData),\n ),\n );\n });\n this._subscribeQuoteMap.set(subscriptionId, unsub);\n }\n }\n\n public unsubscribeQuotes(listenerGuid: string): void {\n const subscriptionId = this.getSubscriptionId(listenerGuid);\n\n const unsub = this._subscribeQuoteMap.get(subscriptionId);\n if (unsub) {\n unsub();\n this._subscribeQuoteMap.delete(subscriptionId);\n }\n }\n\n private _toUDFTicker(t: any): QuoteData {\n return {\n n: withExchangePrefix(t.symbol),\n s: \"ok\",\n v: {\n ask: t.ask,\n bid: t.bid,\n ch: t.change,\n chp: t.perChange / 100,\n description: \"\",\n exchange: EXCHANGE_DISPLAY,\n hight_price: t.high,\n low_price: t.low,\n lp: t.close,\n open_price: t.open,\n prev_close_price: 0,\n volume: t.volume,\n },\n };\n }\n}\n","import { useRef, useEffect, useCallback, useMemo } from \"react\";\nimport useCancelOrder from \"../hooks/useCancelOrder\";\nimport useEditOrder from \"./useEditOrder\";\nimport useSenderOrder from \"./useSendOrder\";\nimport { useSymbolsInfo } from \"@kodiak-finance/orderly-hooks\";\nimport { ChartMode, ColorConfigInterface } from \"../type\";\n\nconst createBrokerMethod = <T extends (...args: any) => any>(method: T) => {\n return (params: T) => method(params);\n};\n\nconst useBroker = ({\n closeConfirm,\n colorConfig,\n onToast,\n mode,\n symbol,\n}: {\n closeConfirm: any;\n colorConfig: ColorConfigInterface;\n onToast?: any;\n symbol: string;\n mode?: ChartMode;\n}) => {\n const cancelOrder = useCancelOrder();\n const editOrder = useEditOrder(onToast);\n const symbolData = useSymbolsInfo();\n const closePosition = useCallback(\n (position: any) => closeConfirm && closeConfirm(position),\n [closeConfirm]\n );\n const { sendMarketOrder, sendLimitOrder} = useSenderOrder(symbol);\n\n const getSymbolInfo = useCallback(\n (symbol: string) => {\n if (!symbolData) {\n return;\n }\n return {\n baseMin: symbolData[symbol](\"base_min\"),\n baseMax: symbolData[symbol](\"base_max\"),\n baseTick: symbolData[symbol](\"base_tick\"),\n quoteTick: symbolData[symbol](\"quote_tick\"),\n };\n },\n [symbolData]\n );\n const broker = useRef({\n cancelOrder,\n closePosition,\n editOrder,\n colorConfig,\n sendLimitOrder,\n getSymbolInfo,\n sendMarketOrder: createBrokerMethod(sendMarketOrder),\n mode,\n });\n\n useEffect(() => {\n broker.current.getSymbolInfo = getSymbolInfo;\n }, [symbolData]);\n\n useEffect(() => {\n broker.current.sendLimitOrder = sendLimitOrder;\n broker.current.sendMarketOrder = sendMarketOrder;\n }, [sendLimitOrder, sendMarketOrder]);\n\n useEffect(() => {\n broker.current.closePosition = closePosition;\n }, [closeConfirm]);\n\n useEffect(() => {\n broker.current.cancelOrder = cancelOrder;\n }, [cancelOrder]);\n\n return broker.current;\n};\n\nexport default useBroker;\n","import { useCallback } from \"react\";\nimport { useOrderStream } from \"@kodiak-finance/orderly-hooks\";\nimport { BracketAlgoType, TpslAlgoType } from \"../renderer/tpsl.util\";\nimport { OrderStatus } from \"@kodiak-finance/orderly-types\";\nimport { toast } from \"@kodiak-finance/orderly-ui\";\n\nexport default function useCancelOrder() {\n const [\n pendingOrders,\n { cancelOrder, cancelAlgoOrder, cancelTPSLChildOrder},\n ] = useOrderStream({\n status: OrderStatus.INCOMPLETE,\n });\n return useCallback(\n (order: any) => {\n if (order.algo_order_id) {\n if (TpslAlgoType.includes(order.root_algo_order_algo_type)) {\n // check if tpsl active\n const rootOrder = pendingOrders?.find(\n (item) => item.algo_order_id === order.root_algo_order_id\n );\n const isEditActivated = rootOrder.child_orders.every(\n (item: any) => !!item.trigger_price\n );\n if (isEditActivated) {\n return cancelTPSLChildOrder(\n order.algo_order_id,\n order.root_algo_order_id\n );\n }\n return cancelAlgoOrder(rootOrder.algo_order_id, order.symbol).then();\n }\n return cancelAlgoOrder(order.algo_order_id, order.symbol).then();\n }\n return cancelOrder(order.order_id, order.symbol).then();\n },\n [cancelOrder, pendingOrders]\n );\n}\n","import { Decimal } from \"@kodiak-finance/orderly-utils\";\nimport { AlgoType, OrderInterface, OrderType, SideType } from \"../type\";\nimport { i18n } from \"@kodiak-finance/orderly-i18n\";\n\nexport const EST_TPSL_PNL_DECIMAL = 2;\n\nexport const textDash = \"--\";\n\nexport const BracketAlgoType = [AlgoType.BRACKET, AlgoType.STOP_BRACKET];\nexport const TpslAlgoType = [AlgoType.POSITIONAL_TP_SL, AlgoType.TP_SL];\nexport const isTpOrder = (order: OrderInterface) =>\n order.root_algo_order_id !== order.algo_order_id &&\n order.algo_type === AlgoType.TAKE_PROFIT;\n\nexport const isSlOrder = (order: OrderInterface) =>\n order.root_algo_order_id !== order.algo_order_id &&\n order.algo_type === AlgoType.STOP_LOSS;\n\nexport const isTpslOrder = (order: OrderInterface) =>\n order.root_algo_order_id !== order.algo_order_id &&\n (order.algo_type === AlgoType.TAKE_PROFIT ||\n order.algo_type === AlgoType.STOP_LOSS);\n\nexport const isBracketAlgoType = (algoType: AlgoType | undefined | null) =>\n !!algoType && BracketAlgoType.includes(algoType);\n\nexport const formatOrderNo = (orderNo?: number) => {\n return orderNo ? String(orderNo).padStart(2, \"0\") : \"\";\n};\n\nexport const isPositionTpsl = (order: OrderInterface) =>\n order.type === OrderType.CLOSE_POSITION;\nexport const isActivatedPositionTpsl = (order: OrderInterface) =>\n isPositionTpsl(order) && order.is_activated;\n\nexport const isActivatedTpslOrder = (order: OrderInterface) =>\n isTpslOrder(order) && order.is_activated;\n\nexport const isActivatedQuantityTpsl = (order: OrderInterface) =>\n order.root_algo_order_algo_type === AlgoType.TP_SL ||\n (isBracketAlgoType(order.root_algo_order_algo_type) && order.is_activated);\n\nexport const getTpslTag = (\n order: OrderInterface,\n quantityTpslNoMap: Map<number, number>\n) => {\n const algoType = order.algo_type;\n // @ts-ignore\n const suffix = {\n [AlgoType.TAKE_PROFIT]: i18n.t(\"tpsl.takeProfit\"),\n [AlgoType.STOP_LOSS]: i18n.t(\"tpsl.stopLoss\"),\n }[algoType];\n\n if (!suffix) {\n return null;\n }\n\n return suffix;\n};\n\nexport const buildQuantityTpslNoMap = (orders: OrderInterface[]) => {\n const quantityTpslNoMap = new Map<number, number>();\n\n let idx = 1;\n [...orders]\n .reverse()\n .filter(isActivatedQuantityTpsl)\n .forEach((order) => {\n if (\n order.root_algo_order_id &&\n !quantityTpslNoMap.has(order.root_algo_order_id)\n ) {\n quantityTpslNoMap.set(order.root_algo_order_id, idx++);\n }\n });\n\n return quantityTpslNoMap;\n};\n\nexport const getTpslEstPnl = (tpslOrder: OrderInterface, position: any) => {\n const quantity = Math.abs(\n tpslOrder.type === OrderType.CLOSE_POSITION\n ? position.balance\n : tpslOrder.quantity\n );\n const sideFlag = tpslOrder.side === SideType.SELL ? 1 : -1;\n\n const openPrice = position.open.toString();\n const estPnl = new Decimal(tpslOrder.trigger_price)\n .minus(openPrice ?? 0)\n .times(quantity)\n .times(sideFlag)\n .toString();\n\n return { estPnl, quantity, openPrice };\n};\n\nexport const formatPnl = (pnl: number | string | undefined) => {\n return pnl !== undefined && pnl !== \"\"\n ? new Decimal(pnl).todp(EST_TPSL_PNL_DECIMAL, Decimal.ROUND_FLOOR)\n : textDash;\n};\n","import { useCallback } from \"react\";\nimport { useEventEmitter, useOrderStream } from \"@kodiak-finance/orderly-hooks\";\nimport { OrderStatus } from \"@kodiak-finance/orderly-types\";\nimport { Decimal } from \"@kodiak-finance/orderly-utils\";\nimport { BracketAlgoType, TpslAlgoType } from \"../renderer/tpsl.util\";\n\nexport default function useEditOrder(onToast: any) {\n const ee = useEventEmitter();\n const [, { updateOrder, cancelAlgoOrder, updateAlgoOrder, updateTPSLOrder }] =\n useOrderStream({\n status: OrderStatus.INCOMPLETE,\n });\n return useCallback(\n (order: any, lineValue: any) => {\n if (order.algo_order_id) {\n if (TpslAlgoType.includes(order.root_algo_order_algo_type)) {\n const algoParams = [\n {\n order_id: order.algo_order_id,\n trigger_price: new Decimal(lineValue.value).toString(),\n },\n ];\n\n // @ts-ignore\n return updateTPSLOrder(order.root_algo_order_id, algoParams)\n .then((res) => {})\n .catch((e) => {\n if (onToast) {\n onToast.error(e.message);\n }\n });\n } else if (BracketAlgoType.includes(order.algo_type)) {\n // @ts-ignore\n return updateAlgoOrder(order.algo_order_id, {\n order_price: new Decimal(lineValue.value).toString(),\n })\n .then((res) => {})\n .catch((e) => {\n if (onToast) {\n onToast.error(e.message);\n }\n });\n } else {\n const values: any = {\n quantity: order.quantity,\n trigger_price: order.trigger_price,\n symbol: order.symbol,\n price: order.price,\n // order_type: order.type,\n // side: order.side,\n // reduce_only: Boolean(order.reduce_only),\n algo_order_id: order.algo_order_id,\n };\n if (order.order_tag) {\n values.order_tag = order.order_tag;\n }\n if (order.client_order_id) {\n values.client_order_id = order.client_order_id;\n }\n if (lineValue.type === \"price\") {\n values.price = new Decimal(lineValue.value).toString();\n }\n if (lineValue.type === \"trigger_price\") {\n values.trigger_price = new Decimal(lineValue.value).toString();\n }\n\n // @ts-ignore\n return updateAlgoOrder(order.algo_order_id, values)\n .then((res) => {})\n .catch((e) => {\n if (onToast) {\n onToast.error(e.message);\n }\n });\n }\n }\n const values: any = {\n order_price: order.price?.toString(),\n order_quantity: order.quantity.toString(),\n symbol: order.symbol,\n order_type: order.type,\n side: order.side,\n visible_quantity: 0,\n reduce_only: order.reduce_only,\n };\n if (\n new Decimal(order.visible_quantity ?? order.visible ?? 0).eq(\n order.quantity,\n )\n ) {\n delete values.visible_quantity;\n }\n if (!Object.keys(order).includes(\"reduce_only\")) {\n delete values.reduce_only;\n }\n if (order.order_tag) {\n values.order_tag = order.order_tag;\n }\n if (order.client_order_id) {\n values.client_order_id = order.client_order_id;\n }\n if (lineValue.type === \"price\") {\n values.order_price = new Decimal(lineValue.value).toString();\n }\n return updateOrder(order.order_id, values)\n .then((res) => {})\n .catch((e) => {\n onToast.error(e.message);\n });\n },\n [updateOrder],\n );\n}\n","import { useOrderEntry_deprecated } from \"@kodiak-finance/orderly-hooks\";\nimport { OrderSide, OrderType } from \"@kodiak-finance/orderly-types\";\nimport { Decimal } from \"@kodiak-finance/orderly-utils\";\nimport { toast } from \"@kodiak-finance/orderly-ui\";\n\nexport default function useSendOrder(symbol: string) {\n const { onSubmit: _sendMarketOrder } = useOrderEntry_deprecated(\n {\n symbol,\n side: OrderSide.BUY,\n order_type: OrderType.MARKET,\n },\n {\n watchOrderbook: true,\n }\n );\n const _sendOrder = () => {};\n\n const sendLimitOrder = () => {};\n\n const sendMarketOrder = (data: any) => {\n console.log(\"-order DAta\", data);\n data.reduce_only = false;\n return _sendMarketOrder(data).catch((e) => {\n console.log(\"--- e\", e);\n toast.error(e);\n });\n };\n\n return {\n sendLimitOrder,\n sendMarketOrder,\n };\n}\n","import { useEffect, useRef, useState } from \"react\";\nimport {\n useAccount,\n useLocalStorage,\n useOrderStream,\n usePositionStream,\n useSymbolsInfo,\n} from \"@kodiak-finance/orderly-hooks\";\nimport { AccountStatusEnum, OrderStatus } from \"@kodiak-finance/orderly-types\";\nimport { DisplayControlSettingInterface } from \"../../type\";\nimport { Renderer } from \"../renderer/renderer\";\nimport { AlgoType } from \"../type\";\n\nexport default function useCreateRenderer(\n symbol: string,\n displayControlSetting?: DisplayControlSettingInterface,\n) {\n const [renderer, setRenderer] = useState<Renderer>();\n const rendererRef = useRef<Renderer>();\n const { state } = useAccount();\n const [unPnlPriceBasis] = useLocalStorage(\"unPnlPriceBasis\", \"markPrice\");\n const [{ rows: positions }, positionsInfo] = usePositionStream(symbol, {\n calcMode: unPnlPriceBasis,\n });\n const [pendingOrders] = useOrderStream({\n status: OrderStatus.INCOMPLETE,\n symbol: symbol,\n });\n\n const config = useSymbolsInfo();\n const symbolInfo = config?.[symbol];\n const quote_dp = symbolInfo(\"quote_dp\");\n\n const [fillOrders] = useOrderStream({\n symbol: symbol,\n status: OrderStatus.FILLED,\n size: 500,\n });\n\n const createRenderer = useRef(\n (instance: any, host: any, broker: any, container: HTMLDivElement) => {\n if (rendererRef.current) {\n rendererRef.current.remove();\n }\n rendererRef.current = new Renderer(instance, host, broker);\n setRenderer(rendererRef.current);\n },\n );\n const removeRenderer = useRef(() => {\n rendererRef.current?.remove();\n rendererRef.current = undefined;\n });\n\n useEffect(() => {\n if (\n state.status < AccountStatusEnum.EnableTrading &&\n state.status !== AccountStatusEnum.EnableTradingWithoutConnected\n ) {\n renderer?.renderPositions([]);\n return;\n }\n\n if (!displayControlSetting || !displayControlSetting.position) {\n renderer?.renderPositions([]);\n return;\n }\n const positionList = (positions ?? [])\n .filter((_) => _.symbol === symbol)\n .map((item) => {\n return {\n symbol: item.symbol,\n open: item.average_open_price,\n balance: item.position_qty,\n closablePosition: 9999,\n // @ts-ignore\n unrealPnl: item.unrealized_pnl ?? 0,\n interest: 0,\n unrealPnlDecimal: 2,\n basePriceDecimal: 4,\n };\n });\n renderer?.renderPositions(positionList);\n }, [renderer, positions, symbol, displayControlSetting, state]);\n\n useEffect(() => {\n if (!displayControlSetting || !displayControlSetting.buySell) {\n renderer?.renderFilledOrders([], 6);\n return;\n }\n const currentSymbolFillOrders = fillOrders?.filter(\n (item) => item.symbol === symbol,\n );\n renderer?.renderFilledOrders(currentSymbolFillOrders ?? [], quote_dp ?? 6);\n }, [renderer, fillOrders, symbol, quote_dp, displayControlSetting]);\n\n useEffect(() => {\n let tpslOrder: any = [];\n let positionTpsl: any = [];\n let limitOrder: any = [];\n let stopOrder: any = [];\n let bracketOrder: any = [];\n let trailingStopOrder: any = [];\n\n if (\n state.status < AccountStatusEnum.EnableTrading &&\n state.status !== AccountStatusEnum.EnableTradingWithoutConnected\n ) {\n renderer?.renderPendingOrders([]);\n return;\n }\n\n const symbolPosition = (positions ?? []).find(\n (item) => item.symbol === symbol,\n );\n pendingOrders?.forEach((order) => {\n if (symbol !== order.symbol) {\n return;\n }\n if (!order.algo_order_id) {\n limitOrder.push(order);\n } else if (order.algo_order_id) {\n if (order.algo_type === AlgoType.POSITIONAL_TP_SL) {\n for (const child_order of order.child_orders) {\n child_order.root_algo_order_algo_type = order.algo_type;\n if (\n child_order.trigger_price &&\n child_order.status !== OrderStatus.FILLED\n ) {\n positionTpsl.push(child_order);\n }\n }\n } else if (order.algo_type === AlgoType.TP_SL) {\n if (symbolPosition) {\n for (const child_order of order.child_orders) {\n child_order.root_algo_order_algo_type = order.algo_type;\n child_order.position_qty = symbolPosition.position_qty;\n if (\n child_order.trigger_price &&\n child_order.status !== OrderStatus.FILLED\n ) {\n tpslOrder.push(child_order);\n }\n }\n }\n } else if (\n order.algo_type === AlgoType.STOP_LOSS ||\n order.algo_type === AlgoType.TAKE_PROFIT\n ) {\n stopOrder.push(order);\n } else if (order.algo_type === AlgoType.BRACKET) {\n bracketOrder.push(order);\n } else if (order.algo_type === AlgoType.TRAILING_STOP) {\n if (order.is_activated && order.extreme_price) {\n trailingStopOrder.push(order);\n }\n }\n }\n });\n if (displayControlSetting) {\n if (!displayControlSetting.positionTpsl) {\n positionTpsl = [];\n }\n if (!displayControlSetting.tpsl) {\n tpslOrder = [];\n }\n if (!displayControlSetting.limitOrders) {\n limitOrder = [];\n bracketOrder = [];\n }\n if (!displayControlSetting.stopOrders) {\n stopOrder = [];\n }\n if (!displayControlSetting.trailingStop) {\n trailingStopOrder = [];\n }\n }\n\n renderer?.renderPendingOrders(\n tpslOrder\n .concat(positionTpsl)\n .concat(limitOrder)\n .concat(stopOrder)\n .concat(bracketOrder)\n .concat(trailingStopOrder),\n );\n }, [\n renderer,\n pendingOrders,\n symbol,\n displayControlSetting,\n positions,\n state.status,\n ]);\n\n return [createRenderer.current, removeRenderer.current] as const;\n}\n","import {\n IChartingLibraryWidget,\n IExecutionLineAdapter,\n ResolutionString,\n} from \"../charting_library\";\nimport { OrderInterface, SideType } from \"../type\";\nimport useBroker from \"../hooks/useBroker\";\nimport { commify, Decimal } from \"@kodiak-finance/orderly-utils\";\nimport { limitOrdersByInterval } from \"../broker/utils\";\nimport { i18n } from \"@kodiak-finance/orderly-i18n\";\n\nexport class ExecutionService {\n private instance: IChartingLibraryWidget;\n private interval = \"1D\";\n private executions: IExecutionLineAdapter[];\n private filledOrders: OrderInterface[];\n private basePriceDecimal: number;\n private broker: ReturnType<typeof useBroker>;\n\n constructor(\n instance: IChartingLibraryWidget,\n broker: ReturnType<typeof useBroker>\n ) {\n this.instance = instance;\n this.executions = [];\n this.filledOrders = [];\n this.basePriceDecimal = 0;\n this.broker = broker;\n\n this.subscribeIntervalChange();\n }\n\n async subscribeIntervalChange() {\n this.interval = this.instance.symbolInterval().interval;\n\n const changeInterval = this.changeInterval;\n this.instance\n .activeChart()\n .onIntervalChanged()\n .subscribe(null, changeInterval);\n }\n\n changeInterval = (interval: ResolutionString) => {\n const rerenderExecutions = () => {\n this.renderExecutions(this.filledOrders, this.basePriceDecimal);\n this.instance\n .activeChart()\n .onDataLoaded()\n .unsubscribe(null, rerenderExecutions);\n };\n\n this.interval = interval;\n this.instance\n .activeChart()\n .onDataLoaded()\n .subscribe(null, rerenderExecutions);\n };\n\n renderExecutions(filledOrders: OrderInterface[], basePriceDecimal: number) {\n this.filledOrders = filledOrders;\n this.basePriceDecimal = basePriceDecimal;\n\n if (!this.interval) {\n return;\n }\n\n this.removeAll();\n\n limitOrdersByInterval(filledOrders, this.interval).forEach((order) => {\n this.executions.push(this.drawExecution(order, basePriceDecimal));\n });\n }\n removeAll() {\n this.executions.forEach((execution) => execution.remove());\n this.executions = [];\n }\n\n static getExecutionInfo(order: OrderInterface, basePriceDecimal: number) {\n const side = order.side;\n const avgExecPrice =\n order.average_executed_price ||\n order.child_orders?.find((child) => !!child.average_executed_price)\n ?.average_executed_price ||\n 0;\n\n const excutedNumber = new Decimal(avgExecPrice)\n .todp(basePriceDecimal, Decimal.ROUND_FLOOR)\n .toString();\n return `${\n side === SideType.BUY ? i18n.t(\"common.buy\") : i18n.t(\"common.sell\")\n } ${order.total_executed_quantity} @${commify(excutedNumber)}`;\n }\n\n drawExecution(order: OrderInterface, basePriceDecimal: number) {\n const side = order.side;\n const avgExecPrice =\n order.average_executed_price ||\n order.child_orders?.find((child) => !!child.average_executed_price)\n ?.average_executed_price ||\n 0;\n\n const timestamp = new Date(order.updated_time).getTime() / 1000;\n // const timestamp = new Date(order.updated_time).getTime();\n const colorConfig = this.broker.colorConfig;\n // console.log('-- avag exec price',{\n // avgExecPrice,\n // timestamp: new Date(order.updated_time).toLocaleString(),\n // tooltips: ExecutionService.getExecutionInfo(order, basePriceDecimal),\n // });\n\n return this.instance\n .activeChart()\n .createExecutionShape()\n .setArrowHeight(9)\n .setTooltip(ExecutionService.getExecutionInfo(order, basePriceDecimal))\n .setTime(timestamp)\n .setPrice(avgExecPrice)\n .setArrowColor(\n side === SideType.BUY ? colorConfig.upColor! : colorConfig.downColor!\n )\n .setDirection(side === SideType.BUY ? \"buy\" : \"sell\");\n }\n\n unsubscribeIntervalChange() {\n const changeInterval = this.changeInterval;\n\n try {\n this.instance\n .activeChart()\n .onIntervalChanged()\n .unsubscribe(null, changeInterval);\n } catch (e: unknown) {\n if (\n e instanceof Error &&\n e.message ===\n \"Cannot read properties of null (reading 'tradingViewApi')\"\n ) {\n // ignore when it's triggered by hot reloaded\n } else {\n console.error(e);\n }\n }\n }\n\n destroy() {\n this.removeAll();\n this.unsubscribeIntervalChange();\n }\n}\n","import { OrderInterface, SideType } from \"../type\";\nimport { OrderStatus } from \"@kodiak-finance/orderly-types\";\nimport {startOfSecond, startOfMinute, startOfHour, startOfDay, startOfYear, startOfWeek, startOfMonth} from 'date-fns';\n\nconst IntervalMap: { [interval: string]: { startOf: string; period: number } } = {\n 1: { startOf: 'minute', period: 0 },\n 3: { startOf: 'hour', period: 3 * 60 * 1000 },\n 5: { startOf: 'hour', period: 5 * 60 * 1000 },\n 15: { startOf: 'hour', period: 15 * 60 * 1000 },\n 30: { startOf: 'hour', period: 30 * 60 * 1000 },\n 60: { startOf: 'hour', period: 0 },\n 120: { startOf: 'day', period: 2 * 60 * 60 * 1000 },\n 240: { startOf: 'day', period: 4 * 60 * 60 * 1000 },\n 480: { startOf: 'day', period: 8 * 60 * 60 * 1000 },\n 720: { startOf: 'day', period: 12 * 60 * 60 * 1000 },\n D: { startOf: 'day', period: 0 }, // default day interval shown as D instead of 1D\n '1D': { startOf: 'day', period: 0 },\n '3D': { startOf: 'year', period: 3 * 24 * 60 * 60 * 1000 },\n '5D': { startOf: 'year', period: 5 * 24 * 60 * 60 * 1000 },\n '1W': { startOf: 'week', period: 0 },\n '1M': { startOf: 'month', period: 0 },\n};\n\nfunction collectionOrders(order: OrderInterface, collection:any,interval: string, orderList: any[], ) {\n const { startOf, period } = IntervalMap[interval];\n\n const time = new Date(order.updated_time).getTime();\n let base = startOfSecond(time).getTime();\n if (startOf === 'minute') {\n base = startOfMinute(time).getTime();\n } else if (startOf === 'hour') {\n base =startOfHour(time).getTime();\n } else if (startOf === 'day') {\n base = startOfDay(time).getTime();\n } else if (startOf === 'month') {\n base = startOfMonth(time).getTime();\n } else if (startOf === 'year') {\n base = startOfYear(time).getTime();\n } else if (startOf === 'week') {\n base = startOfWeek(time).getTime();\n } else if (startOf === 'month'){\n base = startOfMonth(time).getTime();\n }\n\n\n const group = period === 0 ? base : Math.floor((time - base) / period) * period + base;\n\n if (!collection[group]) {\n collection[group] = { [SideType.BUY]: [], [SideType.SELL]: [] };\n }\n\n if (collection[group][order.side].length < 5) {\n collection[group][order.side].push(order);\n orderList.push(order);\n }\n}\n\nexport const limitOrdersByInterval = (orders: OrderInterface[], interval: string) => {\n const res: OrderInterface[] = [];\n const collection: any = {};\n\n if (!IntervalMap[interval]) {\n return [];\n }\n\n orders.forEach((order) => {\n if (order.child_orders) {\n for (const child of order.child_orders) {\n if (child.is_activated && child.algo_status=== OrderStatus.FILLED) {\n collectionOrders(child, collection, interval, res);\n\n }\n }\n } else {\n collectionOrders(order, collection, interval, res);\n }\n\n });\n\n\n return res;\n};\n","import { i18n } from \"@kodiak-finance/orderly-i18n\";\nimport { Decimal, commify, getTrailingStopPrice } from \"@kodiak-finance/orderly-utils\";\nimport { IChartingLibraryWidget, IOrderLineAdapter } from \"../charting_library\";\nimport useBroker from \"../hooks/useBroker\";\nimport {\n SideType,\n AlgoType,\n OrderCombinationType,\n OrderType,\n OrderInterface,\n ChartPosition,\n ChartMode,\n} from \"../type\";\nimport { CHART_QTY_DECIMAL, getOrderId } from \"./order.util\";\nimport {\n getTpslTag,\n isActivatedPositionTpsl,\n isActivatedQuantityTpsl,\n isPositionTpsl,\n isTpslOrder,\n} from \"./tpsl.util\";\nimport { TpslCalService } from \"./tpslCal.service\";\n\nexport class OrderLineService {\n private instance: IChartingLibraryWidget;\n private pendingOrderLineMap: Map<number, IOrderLineAdapter>;\n private pendingOrders: any[];\n private broker: ReturnType<typeof useBroker>;\n private tpslCalService: TpslCalService;\n\n constructor(\n instance: IChartingLibraryWidget,\n broker: ReturnType<typeof useBroker>,\n ) {\n this.instance = instance;\n this.pendingOrderLineMap = new Map();\n this.pendingOrders = [];\n this.broker = broker;\n this.tpslCalService = new TpslCalService();\n }\n\n renderPendingOrders(newPendingOrders: any[]) {\n if (newPendingOrders) {\n this.pendingOrders = newPendingOrders;\n }\n this.cleanOldPendingOrders(this.pendingOrders);\n this.tpslCalService.prepareTpslPnlMap(this.pendingOrders);\n this.tpslCalService.prepareQuantityTpslNoMap(this.pendingOrders);\n this.pendingOrders.forEach((order) => this.renderPendingOrder(order));\n }\n\n updatePositions(positions: ChartPosition[] | null) {\n const changed = this.tpslCalService.recalculatePnl(\n positions,\n this.pendingOrders,\n );\n\n this.pendingOrders\n .filter((order) => changed.includes(getOrderId(order)!))\n .forEach((order) => this.renderPendingOrder(order));\n }\n\n renderPendingOrder(order: any) {\n const orderId = OrderLineService.getOrderId(order);\n if (!orderId) {\n return;\n }\n const orderLine = this.drawOrderLine(orderId, order);\n\n if (orderLine) {\n this.pendingOrderLineMap.set(orderId, orderLine);\n }\n }\n\n cleanOldPendingOrders(newPendingOrders: any[]) {\n const newOrderIdSet = new Set(\n newPendingOrders.map((order) => OrderLineService.getOrderId(order)),\n );\n\n this.pendingOrderLineMap.forEach(\n (_, orderId) =>\n !newOrderIdSet.has(orderId) && this.removePendingOrder(orderId),\n );\n }\n\n removePendingOrder(orderId: number | undefined) {\n if (orderId === undefined) {\n return;\n }\n\n const orderLine = this.pendingOrderLineMap.get(orderId);\n\n if (orderLine) {\n this.pendingOrderLineMap.delete(orderId);\n orderLine.remove();\n }\n }\n getBaseOrderLine() {\n const colorConfig = this.broker.colorConfig;\n return this.instance\n .activeChart()\n .createOrderLine()\n .setCancelTooltip(i18n.t(\"orders.cancelOrder\"))\n .setQuantityTextColor(colorConfig.qtyTextColor!)\n .setQuantityBackgroundColor(colorConfig.chartBG!)\n .setBodyBackgroundColor(colorConfig.chartBG!)\n .setCancelButtonBackgroundColor(colorConfig.chartBG!)\n .setLineStyle(1)\n .setBodyFont(colorConfig.font!)\n .setQuantityFont(colorConfig.font!);\n }\n\n static getCombinationType(order: any): OrderCombinationType {\n const { algo_type: algoType, type } = order;\n\n if (\n (algoType === AlgoType.STOP_LOSS ||\n algoType === AlgoType.TAKE_PROFIT ||\n algoType === AlgoType.STOP) &&\n type === OrderType.LIMIT\n ) {\n return OrderCombinationType.STOP_LIMIT;\n }\n if (\n (algoType === AlgoType.STOP_LOSS ||\n algoType === AlgoType.TAKE_PROFIT ||\n algoType === AlgoType.STOP) &&\n type === OrderType.MARKET\n ) {\n return OrderCombinationType.STOP_MARKET;\n }\n if (algoType === AlgoType.BRACKET) {\n if (type === OrderType.LIMIT) {\n return OrderCombinationType.BRACKET_LIMIT;\n }\n if (type === OrderType.MARKET) {\n return OrderCombinationType.BRACKET_MARKET;\n }\n }\n\n if (algoType === AlgoType.TRAILING_STOP) {\n return OrderCombinationType.TRAILING_STOP;\n }\n\n return OrderCombinationType.LIMIT;\n }\n\n static getText(pendingOrder: any) {\n const orderCombinationType =\n OrderLineService.getCombinationType(pendingOrder);\n if (\n orderCombinationType === OrderCombinationType.STOP_LIMIT ||\n orderCombinationType === OrderCombinationType.STOP_MARKET ||\n orderCombinationType === OrderCombinationType.STOP_BRACKET_LIMIT ||\n orderCombinationType === OrderCombinationType.STOP_BRACKET_MARKET\n ) {\n if (pendingOrder.type === OrderType.LIMIT) {\n return `${i18n.t(\"orderEntry.orderType.stopLimit\")} ${commify(\n pendingOrder.price,\n )}`;\n }\n return i18n.t(\"orderEntry.orderType.stopMarket\");\n }\n if (orderCombinationType === OrderCombinationType.TRAILING_STOP) {\n return i18n.t(\"orderEntry.trailing\");\n }\n return i18n.t(\"orderEntry.orderType.limit\");\n }\n\n static getOrderPrice(pendingOrder: any) {\n if (pendingOrder.algo_type === AlgoType.TRAILING_STOP) {\n return getTrailingStopPrice(pendingOrder);\n }\n\n return pendingOrder.trigger_price || pendingOrder.price;\n }\n\n static getOrderId = (order: any) => {\n if (order === null || order === undefined) {\n return undefined;\n }\n return order.algo_order_id || order.order_id;\n };\n\n getTPSLTextWithTpsl(text: string, pendingOrder: OrderInterface) {\n const orderId = getOrderId(pendingOrder);\n if (!orderId) {\n return text;\n }\n\n // first hiden pnl\n // const unrealPnl = this.tpslCalService.getTpslPnlMap().get(orderId);\n // if (unrealPnl) {\n // return `${text} | PnL ${unrealPnl}`;\n // }\n\n return text;\n }\n\n getTPSLText(pendingOrder: any) {\n const tpslTypeText = getTpslTag(\n pendingOrder,\n this.tpslCalService.getQuantityTpslNoMap(),\n );\n\n if (tpslTypeText) {\n return this.getTPSLTextWithTpsl(tpslTypeText, pendingOrder);\n }\n\n return null;\n }\n\n getOrderQuantity(pendingOrder: OrderInterface) {\n if (pendingOrder.algo_order_id) {\n if (\n isActivatedPositionTpsl(pendingOrder) ||\n isPositionTpsl(pendingOrder)\n ) {\n return \"100%\";\n }\n if (isActivatedQuantityTpsl(pendingOrder)) {\n const qty = new Decimal(pendingOrder.quantity).minus(\n pendingOrder.executed ?? 0,\n );\n const per = qty\n .div(new Decimal(pendingOrder.position_qty!))\n .mul(100)\n .todp(2)\n .toNumber();\n return `${Math.min(Math.abs(per), 100).toString()}%`;\n }\n }\n return commify(new Decimal(pendingOrder.quantity).toString());\n }\n\n drawOrderLine(orderId: number, pendingOrder: any) {\n // const text = OrderLineService.getText(pendingOrder);\n const text = isTpslOrder(pendingOrder)\n ? this.getTPSLText(pendingOrder)\n : OrderLineService.getText(pendingOrder);\n if (text === null) {\n return null;\n }\n\n const colorConfig = this.broker.colorConfig;\n const orderLine =\n this.pendingOrderLineMap.get(orderId) ?? this.getBaseOrderLine();\n const color =\n pendingOrder.side === SideType.BUY\n ? colorConfig.upColor\n : colorConfig.downColor;\n const borderColor =\n pendingOrder.side === SideType.BUY\n ? colorConfig.pnlUpColor\n : colorConfig.pnlDownColor;\n const price = OrderLineService.getOrderPrice(pendingOrder);\n const lineLength = 100;\n const quantity = this.getOrderQuantity(pendingOrder);\n const textColor = colorConfig.textColor;\n\n orderLine\n .setText(text)\n .setCancelButtonIconColor(colorConfig.closeIcon!)\n .setCancelButtonBorderColor(color!)\n .setBodyTextColor(textColor!)\n .setBodyBorderColor(color!)\n .setQuantityBorderColor(color!)\n .setQuantityTextColor(color!)\n // .setBodyBackgroundColor(color)\n .setLineColor(color!)\n .setLineLength(lineLength)\n .setQuantity(quantity ?? \"\")\n .setPrice(price);\n\n if (this.broker.mode !== ChartMode.MOBILE) {\n orderLine.onCancel(null, () => this.broker.cancelOrder(pendingOrder));\n this.applyEditOnMove(orderLine, pendingOrder);\n } else {\n orderLine.setEditable(false).setCancellable(false);\n }\n // orderLine.onCancel(null, () => this.broker.cancelOrder(pendingOrder));\n // this.applyEditOnMove(orderLine, pendingOrder);\n\n return orderLine;\n }\n\n static getOrderEditKey(pendingOrder: any) {\n const orderCombinationType = this.getCombinationType(pendingOrder);\n\n if (\n [OrderCombinationType.LIMIT, OrderCombinationType.BRACKET_LIMIT].includes(\n orderCombinationType,\n )\n ) {\n return \"price\";\n }\n\n if (\n orderCombinationType === OrderCombinationType.STOP_LIMIT ||\n orderCombinationType === OrderCombinationType.STOP_MARKET ||\n pendingOrder.rootAlgoOrderAlgoType === AlgoType.POSITIONAL_TP_SL ||\n pendingOrder.rootAlgoOrderAlgoType === AlgoType.TP_SL ||\n pendingOrder.rootAlgoOrderAlgoType === AlgoType.BRACKET ||\n pendingOrder.rootAlgoOrderAlgoType === AlgoType.STOP_BRACKET\n ) {\n return \"trigger_price\";\n }\n }\n\n applyEditOnMove(orderLine: IOrderLineAdapter, pendingOrder: any) {\n const editKey = OrderLineService.getOrderEditKey(pendingOrder);\n if (!editKey) {\n return;\n }\n orderLine.onMove(() => {\n this.broker\n .editOrder(pendingOrder, {\n type: editKey,\n value: `${orderLine.getPrice()}`,\n })\n .then((res: any) => {\n if (!res.success) {\n this.renderPendingOrder(pendingOrder); // go back to the original price\n }\n })\n .catch(() => this.renderPendingOrder(pendingOrder));\n });\n }\n\n removeAll() {\n this.pendingOrderLineMap.forEach((orderLine) => orderLine.remove());\n this.pendingOrderLineMap.clear();\n this.pendingOrders = [];\n this.tpslCalService.clear();\n }\n}\n","import { OrderInterface } from \"../type\";\n\nexport const CHART_QTY_DECIMAL = 4;\n\nexport const getOrderId = (order: OrderInterface | null | undefined) => {\n if (order === null || order === undefined) {\n return undefined;\n }\n return order.algo_order_id || order.order_id;\n};\n","import { ChartPosition, OrderInterface } from \"../type\";\nimport { getOrderId } from \"./order.util\";\nimport {\n buildQuantityTpslNoMap,\n formatPnl,\n getTpslEstPnl,\n isActivatedTpslOrder,\n} from \"./tpsl.util\";\n\nexport class TpslCalService {\n private quantityTpslNoMap: Map<number, number>;\n private tpslPnlMap: Map<number, string>;\n private positions: ChartPosition[] | null;\n\n constructor() {\n this.quantityTpslNoMap = new Map();\n this.tpslPnlMap = new Map();\n this.positions = null;\n }\n\n getQuantityTpslNoMap() {\n return this.quantityTpslNoMap;\n }\n\n getTpslPnlMap() {\n return this.tpslPnlMap;\n }\n\n getFormattedEstPnl(tpslOrder: OrderInterface) {\n if (this.positions === null) {\n return \"\";\n }\n\n const position = this.positions[0];\n\n if (!position) {\n return \"\";\n }\n\n const { estPnl } = getTpslEstPnl(tpslOrder, position);\n\n return formatPnl(estPnl);\n }\n\n prepareTpslPnlMap(newPendingOrders: OrderInterface[]) {\n const changed: number[] = [];\n\n newPendingOrders.forEach((order) => {\n const orderId = getOrderId(order);\n\n if (orderId && isActivatedTpslOrder(order)) {\n const prevPnl = this.tpslPnlMap.get(orderId);\n const newPnl = this.getFormattedEstPnl(order);\n if (prevPnl !== newPnl) {\n changed.push(orderId);\n // @ts-ignore\n this.tpslPnlMap.set(orderId, newPnl);\n }\n }\n });\n\n return changed;\n }\n\n prepareQuantityTpslNoMap(newPendingOrders: OrderInterface[]) {\n this.quantityTpslNoMap = buildQuantityTpslNoMap(newPendingOrders);\n }\n\n recalculatePnl(\n positions: ChartPosition[] | null,\n pendingOrders: OrderInterface[]\n ) {\n this.positions = positions;\n\n return this.prepareTpslPnlMap(pendingOrders);\n }\n\n clear() {\n this.positions = null;\n this.quantityTpslNoMap.clear();\n this.tpslPnlMap.clear();\n }\n}\n","import { i18n } from \"@kodiak-finance/orderly-i18n\";\nimport { Decimal, commify } from \"@kodiak-finance/orderly-utils\";\nimport {\n IChartingLibraryWidget,\n IOrderLineAdapter,\n IPositionLineAdapter,\n} from \"../charting_library\";\nimport useBroker from \"../hooks/useBroker\";\nimport { ChartMode, ChartPosition } from \"../type\";\n\nexport class PositionLineService {\n private instance: IChartingLibraryWidget;\n private positionLines: Record<number, IPositionLineAdapter>;\n private currentSymbol: string;\n private broker: ReturnType<typeof useBroker>;\n private lastPositions: ChartPosition[] | null;\n\n constructor(\n instance: IChartingLibraryWidget,\n broker: ReturnType<typeof useBroker>,\n ) {\n this.instance = instance;\n this.currentSymbol = \"\";\n this.broker = broker;\n this.positionLines = {};\n this.lastPositions = null;\n }\n\n renderPositions(positions: ChartPosition[] | null) {\n if (positions === null || positions.length === 0) {\n this.removePositions();\n return;\n }\n\n if (this.lastPositions?.length !== positions.length) {\n this.removePositions();\n }\n\n if (positions[0].symbol !== this.currentSymbol) {\n this.removePositions();\n this.currentSymbol = positions[0].symbol;\n }\n\n positions.forEach((position, idx) => this.drawPositionLine(position, idx));\n this.lastPositions = positions;\n }\n\n getBasePositionLine() {\n return this.instance\n .activeChart()\n .createPositionLine()\n .setTooltip(i18n.t(\"positions.closePosition\"))\n .setQuantityBackgroundColor(this.broker.colorConfig.chartBG!)\n .setCloseButtonBackgroundColor(this.broker.colorConfig.chartBG!)\n .setBodyTextColor(this.broker.colorConfig.textColor!)\n .setQuantityTextColor(this.broker.colorConfig.qtyTextColor!)\n .setBodyFont(this.broker.colorConfig.font!)\n .setQuantityFont(this.broker.colorConfig.font!)\n .setLineLength(100)\n .setLineStyle(1);\n }\n\n static getPositionQuantity(balance: number) {\n return commify(new Decimal(balance).todp(4, Decimal.ROUND_DOWN).toString());\n }\n\n static getPositionPnL(unrealPnl: number, decimal: number) {\n const text = i18n.t(\"tpsl.pnl\");\n const pnl = new Decimal(unrealPnl).toFixed(decimal, Decimal.ROUND_DOWN);\n if (new Decimal(unrealPnl).eq(0)) {\n return `${text} 0`;\n }\n if (new Decimal(unrealPnl).greaterThan(0)) {\n return `${text} +${commify(pnl)}`;\n }\n return `${text} ${commify(pnl)}`;\n }\n\n removePositions() {\n Object.keys(this.positionLines).forEach((lineId) => {\n this.positionLines[Number(lineId)].remove();\n delete this.positionLines[Number(lineId)];\n });\n }\n\n drawPositionLine(position: ChartPosition, idx: number) {\n const colorConfig = this.broker.colorConfig;\n const isPositiveUnrealPnl = position.unrealPnl >= 0;\n const isPositiveBalance = position.balance >= 0;\n\n let pnlColor = colorConfig.pnlZoreColor;\n const pnlDecimal = new Decimal(position.unrealPnl);\n if (pnlDecimal.greaterThan(0)) {\n pnlColor = colorConfig.upColor;\n } else if (pnlDecimal.lessThan(0)) {\n pnlColor = colorConfig.downColor;\n }\n const borderColor = isPositiveUnrealPnl\n ? colorConfig.pnlUpColor\n : colorConfig.pnlDownColor;\n const sideColor = isPositiveBalance\n ? colorConfig.upColor\n : colorConfig.downColor;\n const price = new Decimal(position.open).toNumber();\n\n this.positionLines[idx] =\n this.positionLines[idx] ?? this.getBasePositionLine();\n this.positionLines[idx]\n .setQuantity(PositionLineService.getPositionQuantity(position.balance))\n .setPrice(price)\n .setCloseButtonIconColor(colorConfig.closeIcon!)\n .setCloseButtonBorderColor(sideColor!)\n .setBodyBackgroundColor(pnlColor!)\n .setQuantityTextColor(sideColor!)\n .setBodyBorderColor(pnlColor!)\n .setLineColor(sideColor!)\n .setQuantityBorderColor(sideColor!)\n .setText(\n PositionLineService.getPositionPnL(\n position.unrealPnl,\n position.unrealPnlDecimal,\n ),\n );\n\n if (this.broker.mode !== ChartMode.MOBILE) {\n this.positionLines[idx].onClose(null, () => {\n this.broker.closePosition(position);\n });\n }\n // this.positionLines[idx].onClose(null, () => {\n // this.broker.closePosition(position);\n // });\n }\n}\n","/* eslint-disable @typescript-eslint/no-unused-vars */\n/* eslint-disable no-console */\nimport React, { useRef } from \"react\";\nimport { useSymbolsInfo, utils } from \"@kodiak-finance/orderly-hooks\";\nimport { i18n, useTranslation } from \"@kodiak-finance/orderly-i18n\";\nimport { useOrderEntryFormErrorMsg } from \"@kodiak-finance/orderly-react-app\";\nimport {\n Box,\n cn,\n convertValueToPercentage,\n Flex,\n Input,\n inputFormatter,\n modal,\n Slider,\n Text,\n} from \"@kodiak-finance/orderly-ui\";\nimport { Decimal } from \"@kodiak-finance/orderly-utils\";\nimport type {\n CrossHairMovedEventParams,\n EntityId,\n IChartingLibraryWidget,\n ILineDataSourceApi,\n IOrderLineAdapter,\n} from \"../charting_library\";\nimport useBroker from \"../hooks/useBroker\";\nimport type { ChartPosition } from \"../type\";\n\nconst DEFAULT_THRESHOLD = 10;\n\nenum MouseInteractiveMode {\n NONE,\n START_TP_SL,\n TP_SL_DRAGGING,\n // END_TP_SL,\n}\n\nconst maskLayerStore = new WeakMap<\n IChartingLibraryWidget,\n { maskLayer: HTMLDivElement }\n>();\n\nexport class TPSLService {\n private instance: IChartingLibraryWidget;\n private broker: ReturnType<typeof useBroker>;\n private lastPositions: ChartPosition[] | null;\n\n private interactiveMode: MouseInteractiveMode = MouseInteractiveMode.NONE;\n\n private tpslElRemoveTimer: ReturnType<typeof setTimeout> | null = null;\n\n private currentPosition: ChartPosition | null = null;\n private tpslOrderLine: IOrderLineAdapter | null = null;\n private tpslPnLVerticalLineEntityId: EntityId | null = null;\n private tpslVerticalLineTime: number | null = null;\n private tpslStartCircleEntityId: EntityId | null = null;\n private tpslEndCircleEntityId: EntityId | null = null;\n private threshold: number = 10;\n private lastArgs: CrossHairMovedEventParams | null = null;\n\n constructor(\n instance: IChartingLibraryWidget,\n broker: ReturnType<typeof useBroker>,\n // onUpdate\n ) {\n this.instance = instance;\n this.broker = broker;\n this.lastPositions = null;\n // this.positionLineService = positionLineService;\n this.tpslElRemoveTimer = null;\n this.currentPosition = null;\n\n this.bindEvent();\n }\n\n private bindEvent() {\n // console.log(\"******* TPSL bindEvent *******\", this.container);\n // this.chart.setScrollEnabled(false);\n\n // this.instance.subscribe()\n\n this.chart.crossHairMoved().subscribe(null, (args) => {\n this.lastArgs = args;\n\n if (this.interactiveMode === MouseInteractiveMode.TP_SL_DRAGGING) {\n this.clearTpslElRemoveTimer();\n return;\n }\n const position = this.getIntersectantPosition(args);\n\n if (\n this.currentPosition &&\n position &&\n this.currentPosition.symbol === position.symbol\n ) {\n // console.log(\"no change\");\n return;\n }\n if (!position) {\n this.clearTPSLElements();\n return;\n }\n\n if (position) {\n this.clearTpslElRemoveTimer();\n this.currentPosition = position;\n\n this.createTPSLTriggerButton(args);\n }\n });\n }\n\n private clearTpslElRemoveTimer() {\n if (this.tpslElRemoveTimer) {\n clearTimeout(this.tpslElRemoveTimer);\n this.tpslElRemoveTimer = null;\n }\n }\n\n private showTPSLDialog(params: { price: number }) {\n const pnl = new Decimal(params.price)\n .minus(this.currentPosition!.open)\n .mul(this.currentPosition?.balance ?? 0);\n modal\n .show(\"TPSLSimpleDialogId\", {\n title: pnl.gt(0)\n ? i18n.t(\"tpsl.TPOrderConfirm\")\n : i18n.t(\"tpsl.SLOrderConfirm\"),\n triggerPrice: params.price,\n type: pnl.gt(0) ? \"tp\" : \"sl\",\n symbol: this.currentPosition!.symbol,\n onComplete: () => {\n this.clearTPSLElements();\n this.chart.setScrollEnabled(true);\n this.chart.setZoomEnabled(true);\n this.interactiveMode = MouseInteractiveMode.NONE;\n },\n showAdvancedTPSLDialog: (options: { qty: number }) => {\n this.showAdvancedTPSLDialog({\n type: pnl.gt(0) ? \"tp\" : \"sl\",\n triggerPrice: params.price,\n qty: options.qty,\n });\n },\n })\n .then(\n () => {\n console.log(\"completate\");\n },\n (err) => {\n console.log(err);\n },\n )\n .finally(() => {\n this.clearTPSLElements();\n this.chart.setScrollEnabled(true);\n this.chart.setZoomEnabled(true);\n this.interactiveMode = MouseInteractiveMode.NONE;\n });\n }\n\n private showAdvancedTPSLDialog({\n type,\n triggerPrice,\n qty,\n }: {\n type: \"tp\" | \"sl\";\n triggerPrice: number;\n qty: number;\n }) {\n console.log(\"showAdvancedTPSLDialog\", type, triggerPrice);\n modal\n .show(\"TPSLDialogId\", {\n withTriggerPrice: true,\n type,\n triggerPrice,\n symbol: this.currentPosition?.symbol,\n qty,\n onComplete: () => {\n this.clearTPSLElements();\n this.chart.setScrollEnabled(true);\n this.chart.setZoomEnabled(true);\n this.interactiveMode = MouseInteractiveMode.NONE;\n },\n })\n .then(\n () => {\n console.log(\"completate\");\n },\n (err) => {\n console.log(\"show advanced tpsl dialog error\", err);\n },\n )\n .finally(() => {\n this.clearTPSLElements();\n this.chart.setScrollEnabled(true);\n this.chart.setZoomEnabled(true);\n this.interactiveMode = MouseInteractiveMode.NONE;\n });\n }\n\n updatePositions(positions: ChartPosition[] | null) {\n this.lastPositions = positions;\n this.threshold = this.generateThreshold();\n }\n\n private generateThreshold() {\n // return new Decimal(position.open).mul(0.01).abs().toNumber();\n // const priceRange = this.chart.get\n const priceScale = this.chart.getPanes()[0]?.getRightPriceScales()[0];\n if (!priceScale) {\n return DEFAULT_THRESHOLD;\n }\n const priceRange = priceScale.getVisiblePriceRange();\n if (!priceRange) {\n return DEFAULT_THRESHOLD;\n }\n\n const priceWidth = priceRange.to - priceRange.from;\n const threshold = priceWidth * 0.02;\n // console.log(threshold);\n return threshold;\n }\n\n private drawTPSL(params: { price: number }) {\n const { price } = params;\n const pnl = new Decimal(price)\n .minus(this.currentPosition!.open)\n .mul(this.currentPosition?.balance ?? 0);\n\n const { tpslOrderLine, verticalLine } = this.ensureTPSLElements({\n price,\n pnl,\n });\n const direction = pnl.gt(0) ? i18n.t(\"tpsl.tp\") : i18n.t(\"tpsl.sl\");\n\n const color = pnl.gt(0)\n ? this.broker.colorConfig.upColor\n : this.broker.colorConfig.downColor;\n tpslOrderLine\n ?.setText(`${direction} ${pnl.toDecimalPlaces(2).toNumber()}`)\n .setBodyTextColor(color!)\n .setBodyBorderColor(color!)\n .setLineColor(color!);\n\n if (this.tpslVerticalLineTime) {\n verticalLine?.setPoints([\n { price: this.currentPosition?.open, time: this.tpslVerticalLineTime },\n { time: this.tpslVerticalLineTime, price: price },\n ]);\n }\n }\n\n private ensureTPSLElements(params: { price: number; pnl: Decimal }) {\n const tpslOrderLine = this.tpslOrderLine;\n let verticalLine;\n let tpslStartCircle;\n let tpslEndCircle;\n // if (this.tpslPnLLabelEntityId) {\n // tpslPnLLabel = this.chart.getShapeById(this.tpslPnLLabelEntityId);\n // }\n if (!tpslOrderLine) {\n this.tpslOrderLine = this.createTPSLOrderLine();\n }\n\n if (this.tpslPnLVerticalLineEntityId) {\n verticalLine = this.chart.getShapeById(this.tpslPnLVerticalLineEntityId);\n }\n\n if (!verticalLine) {\n if (!this.currentPosition || !this.tpslVerticalLineTime) {\n return {};\n }\n\n this.tpslPnLVerticalLineEntityId = this.chart.createMultipointShape(\n [\n {\n price: this.currentPosition.open,\n time: this.tpslVerticalLineTime,\n },\n { time: this.tpslVerticalLineTime, price: params.price },\n ],\n {\n shape: \"trend_line\",\n // shape: \"parallel_channel\",\n lock: true,\n disableSave: true,\n disableSelection: true,\n disableUndo: true,\n zOrder: \"top\",\n overrides: {\n linecolor: \"rgba(255,255,255, 0.2)\",\n linewidth: 1,\n rightEnd: 1,\n leftEnd: 1,\n },\n },\n );\n }\n verticalLine?.setProperties({\n linecolor: params.pnl.gt(0)\n ? this.broker.colorConfig.upColor\n : this.broker.colorConfig.downColor,\n linewidth: 1,\n });\n\n return {\n tpslOrderLine,\n verticalLine,\n };\n }\n\n private createTPSLTriggerButton(params: CrossHairMovedEventParams) {\n if (!this.tpslOrderLine) {\n this.tpslOrderLine = this.createTPSLOrderLine();\n }\n this.tpslOrderLine.onMove(() => {\n const price = this.tpslOrderLine?.getPrice();\n this.showTPSLDialog({ price: price ?? 0 });\n });\n this.tpslOrderLine.onMoving(() => {\n this.interactiveMode = MouseInteractiveMode.TP_SL_DRAGGING;\n const price = this.tpslOrderLine?.getPrice();\n this.verticalLineTime();\n this.drawTPSL({ price: price ?? 0 });\n });\n }\n\n private createTPSLOrderLine() {\n return (\n this.chart\n .createOrderLine()\n // .setEditable(false)\n .setCancellable(false)\n .setExtendLeft(true)\n .setTooltip(i18n.t(\"tpsl.dragToSet\"))\n .setPrice(this.currentPosition!.open)\n .setLineLength(-200, \"pixel\")\n .setText(i18n.t(\"tpsl.advanced.title\"))\n .setQuantity(\"\")\n .setBodyTextColor(this.broker.colorConfig.textColor!)\n .setBodyBackgroundColor(this.broker.colorConfig.chartBG!)\n .setBodyBorderColor(this.broker.colorConfig.pnlZoreColor!)\n .setQuantityBackgroundColor(this.broker.colorConfig.chartBG!)\n .setQuantityBorderColor(this.broker.colorConfig.pnlZoreColor!)\n .setQuantityTextColor(this.broker.colorConfig.qtyTextColor!)\n .setBodyFont(this.broker.colorConfig.font!)\n .setQuantityFont(this.broker.colorConfig.font!)\n .setLineStyle(3)\n // .setLineColor(\"rgba(255,255,255,0)\")\n );\n }\n\n private verticalLineTime() {\n const range = this.chart.getVisibleRange();\n\n // const timeScaler = this.chart.getTimeScale();\n // // console.log(timeScaler.width());\n // const width = timeScaler.width();\n // console.log(width);\n\n // const time = timeScaler.coordinateToTime(width - 100);\n this.tpslVerticalLineTime = this.getTimeAtPercentage(\n range.from,\n range.to,\n 90,\n );\n }\n\n private clearTPSLElements() {\n if (this.tpslElRemoveTimer) {\n return;\n }\n // check area\n this.tpslElRemoveTimer = setTimeout(() => {\n this.currentPosition = null;\n if (this.tpslOrderLine) {\n this.tpslOrderLine.remove();\n this.tpslOrderLine = null;\n }\n\n if (this.tpslPnLVerticalLineEntityId) {\n this.chart.removeEntity(this.tpslPnLVerticalLineEntityId);\n this.tpslPnLVerticalLineEntityId = null;\n }\n this.tpslElRemoveTimer = null;\n }, 100);\n // this.tpslVerticalLineTime = null;\n }\n\n private getIntersectantPosition(params: CrossHairMovedEventParams) {\n if (!Array.isArray(this.lastPositions) || this.lastPositions.length === 0) {\n return null;\n }\n\n // this.lastPositions.forEach((position) => {\n // console.log(position);\n // });\n const { price, time } = params;\n let intersectantPosition: ChartPosition | null = null;\n\n // console.log('params', params);\n // console.log('xxx lastPositions', this.lastPositions, this.threshold, price);\n for (const position of this.lastPositions) {\n if (position) {\n if (Math.abs(position.open - price) < this.threshold) {\n intersectantPosition = position;\n break;\n }\n }\n }\n\n return intersectantPosition;\n }\n\n private get chart() {\n return this.instance.activeChart();\n }\n\n private getTimeAtPercentage(\n startTime: number,\n endTime: number,\n percentage: number,\n ) {\n // --- 1. Input Validation (Very Important) ---\n if (\n typeof startTime !== \"number\" ||\n typeof endTime !== \"number\" ||\n typeof percentage !== \"number\"\n ) {\n console.error(\n \"Input Error: startTime, endTime, and percentage must all be numbers.\",\n );\n return null;\n }\n if (percentage < 0 || percentage > 100) {\n console.error(\n `Input Error: Percentage (${percentage}) must be between 0 and 100.`,\n );\n return null;\n }\n if (startTime > endTime) {\n console.error(\n `Input Error: Start time (${startTime}) cannot be later than end time (${endTime}).`,\n );\n return null;\n }\n\n // --- 2. Core Algorithm ---\n // Calculate total duration\n const duration = endTime - startTime;\n\n // Convert percentage to decimal (e.g., 50 -> 0.5)\n const factor = percentage / 100.0;\n\n // Calculate offset\n const offset = duration * factor;\n\n // Calculate final time\n const targetTime = startTime + offset;\n\n // --- 3. Return Result ---\n // Timestamps are usually integers, round to nearest integer\n return Math.round(targetTime);\n }\n}\n","import {\n IChartingLibraryWidget,\n IBrokerConnectionAdapterHost,\n} from \"../charting_library\";\nimport useBroker from \"../hooks/useBroker\";\nimport { ChartPosition } from \"../type\";\nimport { ExecutionService } from \"./execution.service\";\nimport { OrderLineService } from \"./orderLine.service\";\nimport { PositionLineService } from \"./positionLine.service\";\nimport { TPSLService } from \"./tpsl.service\";\n\nexport class Renderer {\n private instance: IChartingLibraryWidget;\n private positionLineService: PositionLineService;\n private orderLineService: OrderLineService;\n private executionService: ExecutionService;\n private tpslService: TPSLService;\n\n constructor(\n instance: IChartingLibraryWidget,\n host: IBrokerConnectionAdapterHost,\n broker: ReturnType<typeof useBroker>,\n ) {\n this.instance = instance;\n this.positionLineService = new PositionLineService(instance, broker);\n this.orderLineService = new OrderLineService(instance, broker);\n this.executionService = new ExecutionService(instance, broker);\n this.tpslService = new TPSLService(instance, broker);\n }\n\n async renderPositions(positions: ChartPosition[] | null) {\n await this.chartReady();\n await this.onDataLoaded();\n this.positionLineService.renderPositions(positions);\n this.orderLineService.updatePositions(positions);\n this.tpslService.updatePositions(positions);\n }\n\n async renderPendingOrders(pendingOrders: any) {\n await this.chartReady();\n this.orderLineService.renderPendingOrders(pendingOrders);\n }\n\n async renderFilledOrders(filledOrders: any, basePriceDecimal: number) {\n await this.chartReady();\n await this.onDataLoaded();\n\n this.executionService.renderExecutions(filledOrders, basePriceDecimal);\n }\n\n remove() {\n this.orderLineService.removeAll();\n this.positionLineService.removePositions();\n this.executionService.destroy();\n }\n\n onDataLoaded(): Promise<void> {\n if (this.instance.activeChart().symbolExt()) {\n return Promise.resolve();\n }\n\n return new Promise((resolve) =>\n this.instance\n .activeChart()\n .onDataLoaded()\n .subscribe(\n null,\n () => {\n resolve();\n },\n true,\n ),\n );\n }\n\n chartReady(): Promise<void> {\n return new Promise((resolve) =>\n this.instance.onChartReady(() => {\n try {\n this.instance.activeChart().dataReady(() => resolve());\n } catch (err: any) {\n if (err!.toString().includes(\"tradingViewApi\")) {\n // hot reload error will be silent\n } else {\n console.log(\"-- chartReady error\", err);\n // throw err;\n }\n }\n }),\n );\n }\n}\n","import {\n IBrokerConnectionAdapterHost,\n IChartingLibraryWidget,\n} from \"../charting_library\";\n\nfunction preventDefaultRenderHack(host: IBrokerConnectionAdapterHost) {\n (host as any).setBrokerConnectionAdapter = function (adapter: any) {\n const delegate = {\n subscribe: () => {},\n unsubscribe: () => {},\n unsubscribeAll: () => {},\n };\n\n Object.defineProperty(adapter, \"_ordersCache\", {\n get: function () {\n return {\n start: () => {},\n stop: () => {},\n update: () => {},\n partialUpdate: () => {},\n fullUpdate: () => {},\n getObjects: async () => [],\n updateDelegate: delegate,\n partialUpdateDelegate: delegate,\n };\n },\n set: () => {},\n });\n adapter._waitForOrderModification = async () => true;\n this._adapter = adapter;\n };\n}\n\nfunction forceSilentOrdersPlacement(\n instance: IChartingLibraryWidget,\n host: IBrokerConnectionAdapterHost\n) {\n instance.onChartReady(() => {\n // Apply default teamplate makes the silentOrdersPlacement disabled, need to set it back\n host.silentOrdersPlacement().subscribe((val: any) => {\n if (!val) {\n host.silentOrdersPlacement().setValue(true);\n if (instance) {\n (instance as any)._iFrame.contentDocument.querySelector(\n \".wrapper-3X2QgaDd\"\n ).className = \"wrapper-3X2QgaDd highButtons-3X2QgaDd\";\n }\n\n // The block can only be executed while \"Apply default teamplate\".\n // We don't wnat to show btn buy defualt, so close it.\n host.sellBuyButtonsVisibility()?.setValue(false);\n }\n });\n });\n}\n\nexport default function brokerHostHandler(\n instance: IChartingLibraryWidget,\n host: IBrokerConnectionAdapterHost\n) {\n preventDefaultRenderHack(host);\n forceSilentOrdersPlacement(instance, host);\n}\n","const waitForElm = (\n iframeDocument: HTMLElement,\n selector: string\n): Promise<Element | null> => {\n return new Promise((resolve) => {\n const initialIframe = iframeDocument.querySelector(selector);\n if (initialIframe) {\n resolve(initialIframe);\n }\n\n const observer = new MutationObserver(() => {\n const iframe = iframeDocument.querySelector(selector);\n if (iframe) {\n resolve(iframe);\n observer.disconnect();\n }\n });\n\n observer.observe(iframeDocument, {\n childList: true,\n subtree: true,\n });\n });\n};\n\n\nexport { waitForElm };\n","import { waitForElm } from \"./util\";\n\nexport class ChartHack {\n private iframeDocument: any;\n\n constructor({ iframeDocument }: { iframeDocument: any }) {\n this.iframeDocument = iframeDocument;\n }\n\n public defaultHack() {\n this.showFavoriteStarByDefault();\n }\n\n private showFavoriteStarByDefault() {\n waitForElm(this.iframeDocument, \".dropdown-2R6OKuTS\").then(() => {\n const items = this.iframeDocument.querySelectorAll(\n \".toolbox-2IihgTnv.showOnHover-2IihgTnv\"\n );\n items.forEach((item: HTMLElement) => {\n item.style.opacity = \"1\";\n });\n });\n }\n}\n","import { ChartMode, TradingTerminalWidgetOptions } from \"../type\";\n\nconst getDisabledFeatures = (\n mode: ChartMode,\n showVolumeInSamePane: boolean = true,\n) => {\n let disabledFeatures = [\n \"header_symbol_search\",\n \"trading_account_manager\",\n \"drawing_templates\",\n \"open_account_manager\",\n \"right_toolbar\",\n \"support_multicharts\",\n \"header_layouttoggle\",\n \"order_panel\",\n \"order_info\",\n \"trading_notifications\",\n \"display_market_status\",\n \"broker_button\",\n \"add_to_watchlist\",\n \"chart_crosshair_menu\",\n \"header_fullscreen_button\",\n \"header_widget\",\n ];\n\n // Only disable volume_force_overlay if volume should be in a separate pane\n if (!showVolumeInSamePane) {\n disabledFeatures.push(\"volume_force_overlay\");\n }\n\n if (mode === ChartMode.MOBILE) {\n disabledFeatures = [\n ...disabledFeatures,\n \"left_toolbar\",\n \"timeframes_toolbar\",\n \"go_to_date\",\n \"timezone_menu\",\n // add volume back\n \"create_volume_indicator_by_default\",\n \"buy_sell_buttons\",\n ];\n }\n if (mode === ChartMode.BASIC) {\n disabledFeatures = [\n ...disabledFeatures,\n \"header_widget\",\n \"left_toolbar\",\n \"timeframes_toolbar\",\n \"buy_sell_buttons\",\n ];\n } else if (mode === ChartMode.ADVANCED) {\n disabledFeatures = [\n ...disabledFeatures,\n \"left_toolbar\",\n \"timeframes_toolbar\",\n \"buy_sell_buttons\",\n ];\n }\n\n return disabledFeatures;\n};\n\nexport default function getOptions(\n options: any,\n mode: any,\n showVolumeInSamePane: boolean = true,\n): TradingTerminalWidgetOptions {\n return {\n ...options,\n disabled_features: getDisabledFeatures(mode, showVolumeInSamePane),\n enabled_features: [\n \"hide_left_toolbar_by_default\",\n \"order_panel_close_button\",\n \"iframe_loading_compatibility_mode\",\n ],\n auto_save_delay: 0.1,\n broker_config: {\n configFlags: {\n supportStopLimitOrders: true,\n supportReversePosition: false,\n },\n },\n };\n}\n","export const SETTING_CHAR_LIMIT = 300_000;\nexport const getChartSettingAdapterKey = (chartKey: string) =>\n `${chartKey}_adapter`;\n\nexport const defaultSettings = {\n \"trading.chart.proterty\": JSON.stringify({\n showSellBuyButtons: 0,\n noConfirmEnabled: 1,\n qweqrq: 0,\n showPricesWithZeroVolume: 1,\n showSpread: 1,\n orderExecutedSoundParams: '{\"enabled\":0,\"name\":\"alert/alarm_clock\"}',\n }),\n \"hint.startFocusedZoom\": \"true\",\n};\n\nconst chartCacheMap = new Map<string, string>();\n\nexport const clearChartCache = () => chartCacheMap.clear();\n\nconst parseAndCacheChartData = (\n chartKey: string,\n savedDataString: string,\n adapterSettingString: string\n) => {\n const settingAdapterKey = getChartSettingAdapterKey(chartKey);\n try {\n const transformedSavedDataString = savedDataString;\n\n const savedData = transformedSavedDataString\n ? JSON.parse(transformedSavedDataString)\n : undefined;\n const adapterSetting = adapterSettingString\n ? JSON.parse(adapterSettingString)\n : defaultSettings;\n\n if (transformedSavedDataString) {\n chartCacheMap.set(chartKey, transformedSavedDataString);\n }\n if (adapterSettingString) {\n chartCacheMap.set(settingAdapterKey, adapterSettingString);\n }\n\n return { savedData, adapterSetting };\n } catch (e) {\n console.error(e);\n }\n\n return { savedData: undefined, adapterSetting: defaultSettings };\n};\n\n// 1. Try to fetch data from cache first.\n// - That make the copying the chart synchronously. cause new chart will find the data from cache\n// - This causes the request only happen 1 time before refreshing the page.\n// 2. If there is no data in cache, try to fetch it from api\n// 3. If there is no data from backend, try to fetch it from local storage (it's a transition mechanism between localstorage way and beckend storage)\n// 4. If data format is not a valid json format or api call failed, it fallback to the default one.\nexport const getChartData = async (chartKey: string, isLoggedIn: boolean) => {\n const settingAdapterKey = getChartSettingAdapterKey(chartKey);\n\n const localStorageSavedData = localStorage.getItem(chartKey) || \"\";\n const localStorageAdapterSetting =\n localStorage.getItem(settingAdapterKey) || \"\";\n\n try {\n if (chartCacheMap.has(chartKey) && chartCacheMap.has(settingAdapterKey)) {\n return {\n savedData: JSON.parse(chartCacheMap.get(chartKey)!),\n adapterSetting: JSON.parse(chartCacheMap.get(settingAdapterKey)!),\n };\n }\n } catch (e) {\n console.error(e);\n }\n\n return parseAndCacheChartData(\n chartKey,\n localStorageSavedData,\n localStorageAdapterSetting\n );\n};\n\nexport const saveChartData = async (\n chartKey: string,\n setting: string,\n isLoggedIn: boolean\n) => {\n if (setting) {\n localStorage.setItem(chartKey, setting);\n chartCacheMap.set(chartKey, setting);\n }\n};\n\nexport const saveChartAdapterSetting = async (\n chartKey: string,\n setting: string,\n isLoggedIn: boolean\n) => {\n const settingAdapterKey = getChartSettingAdapterKey(chartKey);\n\n if (setting) {\n localStorage.setItem(settingAdapterKey, setting);\n chartCacheMap.set(settingAdapterKey, setting);\n }\n};\n\nexport const deleteChartData = async (\n chartKeys: string[],\n isLoggedIn: boolean\n) => {\n const allKeys = chartKeys.concat(chartKeys.map(getChartSettingAdapterKey));\n\n allKeys.forEach((key) => {\n if (localStorage.getItem(key)) {\n localStorage.removeItem(key);\n }\n if (chartCacheMap.has(key)) {\n chartCacheMap.delete(key);\n }\n });\n};\n\nexport const copyChartData = async (\n fromChartKey: string,\n toChartKey: string,\n isLoggedIn: boolean\n) => {\n const fromSettingAdapterKey = getChartSettingAdapterKey(fromChartKey);\n const chartData = chartCacheMap.get(fromChartKey);\n const adapterSettingData = chartCacheMap.get(fromSettingAdapterKey);\n\n if (chartData && adapterSettingData) {\n saveChartData(toChartKey, chartData, isLoggedIn);\n saveChartAdapterSetting(toChartKey, adapterSettingData, isLoggedIn);\n }\n};\n","import { withoutExchangePrefix } from \"../../utils/chart.util\";\nimport {\n ChartActionId,\n LoadingScreenOptions,\n Overrides,\n ThemeName,\n} from \"../charting_library\";\nimport type { AbstractDatafeed } from \"../datafeed/abstract-datafeed\";\nimport type {\n ChartMode,\n IBrokerConnectionAdapterHost,\n IBrokerTerminal,\n IBrokerWithoutRealtime,\n IChartingLibraryWidget,\n LanguageCode,\n ResolutionString,\n TradingTerminalWidgetOptions,\n} from \"../type\";\nimport { ChartHack } from \"./chart_hack\";\nimport getOptions from \"./option\";\nimport {\n defaultSettings,\n getChartData,\n saveChartAdapterSetting,\n saveChartData,\n} from \"./persistUtils\";\n\nconst debounce = (func: any, delay: any) => {\n let timer: ReturnType<typeof setTimeout> | null = null;\n const debounced = (...args: any[]) => {\n timer && window.clearTimeout(timer);\n timer = setTimeout(() => {\n func(...args);\n }, delay);\n };\n debounced.cancel = () => {\n timer && window.clearTimeout(timer);\n timer = null;\n };\n return debounced;\n};\n\ndeclare let TradingView: any;\n\nconst DEFAULT_SETTINGS_KEY = \"chartProp_default\";\nconst DEBOUNCE_SAVE_TIME = 300;\n\nexport interface WidgetOptions {\n fullscreen?: TradingTerminalWidgetOptions[\"fullscreen\"];\n autosize?: TradingTerminalWidgetOptions[\"autosize\"];\n symbol: TradingTerminalWidgetOptions[\"symbol\"];\n overrides?: Overrides;\n studiesOverrides?: Overrides;\n theme?: ThemeName;\n loadingScreen?: LoadingScreenOptions;\n interval: ResolutionString;\n locale: string;\n timezone?: string;\n container: TradingTerminalWidgetOptions[\"container\"];\n libraryPath: TradingTerminalWidgetOptions[\"library_path\"];\n customCssUrl: TradingTerminalWidgetOptions[\"custom_css_url\"];\n customFontFamily: TradingTerminalWidgetOptions[\"custom_font_family\"];\n datafeed: AbstractDatafeed;\n positionControlCallback: (...args: any[]) => void;\n showVolumeInSamePane?: boolean;\n getBroker?(\n instance: IChartingLibraryWidget,\n host: IBrokerConnectionAdapterHost,\n ): IBrokerWithoutRealtime | IBrokerTerminal;\n}\n\nexport interface WidgetProps {\n options: WidgetOptions;\n chartKey?: string;\n mode?: ChartMode;\n onClick?: (e: any) => void;\n}\n\nexport class Widget {\n private _instance: IChartingLibraryWidget | null = null;\n\n private _onClick = null;\n\n private _broker: any;\n\n private _datafeed: AbstractDatafeed | null = null;\n\n private _chartKey: string = DEFAULT_SETTINGS_KEY;\n\n private _adapterSetting: any = defaultSettings;\n\n private _savedData: any = null;\n\n private _isLoggedIn: boolean = false;\n\n constructor(props: WidgetProps) {\n this._create(props);\n }\n\n public remove() {\n this.unsubscribeClick();\n this._datafeed?.remove();\n this._broker?.remove();\n this._instance?.remove();\n this.debounceSaveChart.cancel();\n this.debounceSaveChartAdapterSetting.cancel();\n }\n\n public updateOverrides(overrides: Overrides) {\n if (!this.instance) {\n return;\n }\n this.instance.applyOverrides(overrides);\n }\n\n public setSymbol(symbol: string, interval?: number, callback?: any) {\n try {\n this._instance?.onChartReady(() => {\n let currentInterval =\n interval ?? this._instance?.symbolInterval()?.interval;\n if (!currentInterval) {\n currentInterval = 1;\n }\n this._instance?.setSymbol(symbol, currentInterval as any, callback);\n });\n } catch (e) {\n console.log(\"set symbol error\", e);\n }\n }\n\n public executeActionById(actionId: ChartActionId) {\n try {\n this._instance?.onChartReady(() => {\n // this._instance?.activeChart().showPropertiesDialog(this._instance.activeChart().getAllShapes()[0].id);\n\n this._instance?.activeChart().executeActionById(actionId);\n });\n } catch (e) {\n console.log(\"executeActionId error\", e);\n }\n }\n public changeLineType(lineType: any) {\n try {\n this._instance?.onChartReady(() => {\n // this._instance?.activeChart().showPropertiesDialog(this._instance.activeChart().getAllShapes()[0].id);\n\n this._instance?.activeChart().setChartType(lineType);\n });\n } catch (e) {\n console.log(\"executeActionId error\", e);\n }\n }\n\n public subscribeClick(onClick: any) {\n this._onClick = onClick;\n this._instance?.onChartReady(() => {\n (this._instance as any)?._iFrame.contentDocument?.addEventListener(\n \"click\",\n this._onClick,\n );\n });\n }\n\n public unsubscribeClick() {\n (this._instance as any)?._iFrame.contentDocument?.removeEventListener(\n \"click\",\n this._onClick,\n );\n }\n\n get instance() {\n return this._instance;\n }\n\n private chartHack() {\n this._instance?.onChartReady(() => {\n const iframeDocument = (this._instance as any)._iFrame.contentWindow\n .document;\n new ChartHack({ iframeDocument }).defaultHack();\n });\n }\n\n private debounceSaveChart = debounce(() => {\n try {\n this._instance?.save((chartProps) => {\n if (!Object.is(this._savedData, chartProps)) {\n this._savedData = chartProps;\n saveChartData(\n this._chartKey,\n JSON.stringify(chartProps),\n this._isLoggedIn,\n );\n }\n });\n } catch (e) {\n console.log(\"e\", e);\n }\n }, DEBOUNCE_SAVE_TIME * 2);\n\n private debounceSaveChartAdapterSetting = debounce(() => {\n saveChartAdapterSetting(\n this._chartKey,\n JSON.stringify(this._adapterSetting),\n this._isLoggedIn,\n );\n }, DEBOUNCE_SAVE_TIME);\n\n private subscribeAutoSave() {\n this._instance?.onChartReady(() => {\n this._instance?.subscribe(\"onAutoSaveNeeded\", () => {\n this.debounceSaveChart();\n });\n\n this._instance\n ?.activeChart()\n .onVisibleRangeChanged()\n .subscribe(null, () => {\n // onAutoSaveNeeded won't be triggered in the new version won't be trigger while time scale changes\n this.debounceSaveChart();\n });\n });\n }\n\n private async _create({ options, chartKey, mode, onClick }: WidgetProps) {\n const getBroker = options.getBroker;\n\n const widgetOptions: TradingTerminalWidgetOptions = {\n fullscreen: options.fullscreen ?? true,\n autosize: options.autosize ?? false,\n timezone: options.timezone as TradingTerminalWidgetOptions[\"timezone\"],\n symbol: options.symbol,\n library_path: options.libraryPath,\n interval: options.interval ?? \"1\",\n custom_css_url: options.customCssUrl,\n custom_font_family: options.customFontFamily,\n datafeed: options.datafeed,\n studies_overrides: options.studiesOverrides,\n locale: options.locale as LanguageCode,\n theme: options.theme,\n loading_screen: options.loadingScreen,\n overrides: options.overrides,\n container: options.container,\n favorites: {\n intervals: [\n \"1\",\n \"3\",\n \"5\",\n \"15\",\n \"30\",\n \"60\",\n \"240\",\n \"1D\",\n \"1W\",\n \"1M\",\n ] as ResolutionString[],\n chartTypes: [\"Area\", \"Line\"],\n },\n broker_factory: getBroker\n ? (host) => {\n if (this._broker) {\n this._broker.remove();\n }\n this._broker = getBroker(\n this._instance as IChartingLibraryWidget,\n host,\n );\n return this._broker;\n }\n : undefined,\n };\n\n this._datafeed = options.datafeed;\n\n if (chartKey) {\n this._chartKey = chartKey;\n }\n\n // Get data from remote first. fallback to localstorage if no data on the server yet\n const { savedData, adapterSetting } = await getChartData(\n this._chartKey,\n this._isLoggedIn,\n );\n\n // @ts-ignore\n this._adapterSetting = adapterSetting;\n this._savedData = savedData;\n this._instance = new TradingView.widget({\n ...getOptions(widgetOptions, mode, options.showVolumeInSamePane ?? true),\n interval:\n adapterSetting[\"chart.lastUsedTimeBasedResolution\"] ??\n widgetOptions.interval,\n saved_data: savedData,\n settings_adapter: {\n initialSettings: adapterSetting,\n setValue: (key: string, value: any) => {\n this._adapterSetting = { ...this._adapterSetting, [key]: value };\n this.debounceSaveChartAdapterSetting();\n },\n removeValue: () => {},\n },\n });\n\n this._instance!.onChartReady(() => {\n // console.log('-- options symbol', options.symbol, this._instance?.activeChart().symbol());\n if (\n options.symbol &&\n this._instance?.activeChart().symbol() !==\n withoutExchangePrefix(options!.symbol as string)\n ) {\n this.setSymbol(options.symbol as string);\n }\n });\n this.subscribeAutoSave();\n this.subscribeClick(onClick);\n this.chartHack();\n }\n}\n","import React, { forwardRef } from \"react\";\nimport { useMediaQuery } from \"@kodiak-finance/orderly-hooks\";\nimport { MEDIA_TABLET } from \"@kodiak-finance/orderly-types\";\nimport { Box, cn, Divider, Flex } from \"@kodiak-finance/orderly-ui\";\nimport { IndicatorsIcon, SettingIcon } from \"../icons\";\nimport type { TradingviewUIPropsInterface } from \"../type\";\nimport { NoTradingview } from \"./noTradingview\";\nimport TopBar from \"./topBar\";\n\nconst LazyLineType = React.lazy(() => import(\"./lineType\"));\n\nconst LazyTimeInterval = React.lazy(() =>\n import(\"./timeInterval\").then((mod) => ({ default: mod.TimeInterval })),\n);\n\nconst LazyMobileDisplayControl = React.lazy(() =>\n import(\"./displayControl\").then((mod) => ({\n default: mod.MobileDisplayControl,\n })),\n);\n\nconst LazyDesktopDisplayControl = React.lazy(() =>\n import(\"./displayControl\").then((mod) => ({\n default: mod.DesktopDisplayControl,\n })),\n);\n\nconst OperateButton: React.FC<\n React.PropsWithChildren<{ onClick?: React.MouseEventHandler<HTMLElement> }>\n> = ({ children, onClick }) => {\n return (\n <Box\n onClick={onClick}\n className=\"oui-cursor-pointer oui-w-[18px] oui-h-[18px] oui-text-base-contrast-36 hover:oui-text-base-contrast-80\"\n >\n {children}\n </Box>\n );\n};\n\nexport const ZoomOutIcon: React.FC<React.SVGProps<SVGSVGElement>> = (props) => {\n return (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n width=\"18\"\n height=\"18\"\n viewBox=\"0 0 18 18\"\n fill=\"currentColor\"\n {...props}\n >\n <path d=\"M15.0008 2.24304C14.8088 2.24304 14.6085 2.30755 14.4615 2.4538L11.2508 5.66455V3.74304H9.75079V7.49304C9.75079 7.90704 10.0868 8.24304 10.5008 8.24304H14.2508V6.74304H12.3285L15.54 3.53229C15.8325 3.23904 15.8325 2.74705 15.54 2.4538C15.393 2.30755 15.1928 2.24304 15.0008 2.24304ZM3.7508 9.74303V11.243H5.67231L2.46156 14.4538C2.16906 14.747 2.16906 15.239 2.46156 15.5323C2.75481 15.8248 3.2468 15.8248 3.54005 15.5323L6.7508 12.3215V14.243H8.25079V10.493C8.25079 10.079 7.9148 9.74303 7.5008 9.74303H3.7508Z\" />\n </svg>\n );\n};\n\nexport const ZoomInIcon: React.FC<React.SVGProps<SVGSVGElement>> = (props) => {\n return (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n width=\"18\"\n height=\"18\"\n viewBox=\"0 0 18 18\"\n fill=\"currentColor\"\n {...props}\n >\n <path d=\"M7.49219 9.74304C7.30026 9.74304 7.09964 9.80755 6.95309 9.9538L3.74219 13.1646V11.243H2.24219V14.993C2.24219 15.407 2.57796 15.743 2.99219 15.743H6.74219V14.243H4.82031L8.03121 11.0323C8.32416 10.739 8.32416 10.247 8.03121 9.9538C7.88481 9.80755 7.68404 9.74304 7.49219 9.74304ZM11.2509 2.24304V3.74304H13.1728L9.96186 6.9538C9.66899 7.24705 9.66899 7.73904 9.96186 8.03229C10.2547 8.32479 10.7471 8.32479 11.04 8.03229L14.2509 4.82153V6.74304H15.7509V2.99304C15.7509 2.57904 15.4151 2.24304 15.0009 2.24304H11.2509Z\" />\n </svg>\n );\n};\n\nexport const TradingviewUI = forwardRef<\n HTMLDivElement,\n TradingviewUIPropsInterface\n>((props, ref) => {\n const {\n chartRef,\n interval,\n changeDisplaySetting,\n displayControlState,\n tradingViewScriptSrc,\n changeInterval,\n lineType,\n changeLineType,\n openChartSetting,\n openChartIndicators,\n onFullScreenChange,\n } = props;\n\n const isMobile = useMediaQuery(MEDIA_TABLET);\n\n return (\n <div\n ref={ref}\n className={cn(\"oui-relative oui-size-full\", props.classNames?.root)}\n >\n {!tradingViewScriptSrc ? (\n <NoTradingview />\n ) : (\n <div\n className={cn(\n \"oui-absolute oui-inset-0 oui-z-[1] oui-flex oui-flex-col\",\n props.classNames?.content,\n )}\n >\n <TopBar>\n {isMobile ? (\n <Flex\n gapX={2}\n width=\"100%\"\n justify=\"between\"\n className=\"oui-hide-scrollbar oui-overflow-x-scroll\"\n >\n <React.Suspense fallback={null}>\n <LazyTimeInterval\n interval={interval ?? \"15\"}\n changeInterval={changeInterval}\n />\n </React.Suspense>\n <OperateButton onClick={openChartIndicators}>\n <IndicatorsIcon />\n </OperateButton>\n <React.Suspense fallback={null}>\n <LazyMobileDisplayControl\n displayControlState={displayControlState}\n changeDisplayControlState={changeDisplaySetting}\n />\n </React.Suspense>\n </Flex>\n ) : (\n <Flex justify={\"between\"} itemAlign={\"center\"} width={\"100%\"}>\n <Flex>\n <React.Suspense fallback={null}>\n <LazyTimeInterval\n interval={interval ?? \"1\"}\n changeInterval={changeInterval}\n />\n </React.Suspense>\n <Divider\n direction=\"vertical\"\n className=\"oui-h-4\"\n mx={2}\n intensity={8}\n />\n <Flex justify=\"start\" itemAlign=\"center\" gap={2}>\n <React.Suspense fallback={null}>\n <LazyDesktopDisplayControl\n displayControlState={displayControlState}\n changeDisplayControlState={changeDisplaySetting}\n />\n </React.Suspense>\n <OperateButton onClick={openChartIndicators}>\n <IndicatorsIcon />\n </OperateButton>\n <React.Suspense fallback={null}>\n <LazyLineType\n lineType={lineType}\n changeLineType={changeLineType}\n />\n </React.Suspense>\n <OperateButton onClick={openChartSetting}>\n <SettingIcon />\n </OperateButton>\n </Flex>\n </Flex>\n <Flex>\n {props.fullscreen ? (\n <ZoomOutIcon\n className=\"oui-text-base-contrast-54 hover:oui-text-base-contrast oui-cursor-pointer\"\n onClick={onFullScreenChange}\n />\n ) : (\n <ZoomInIcon\n className=\"oui-text-base-contrast-54 hover:oui-text-base-contrast oui-cursor-pointer\"\n onClick={onFullScreenChange}\n />\n )}\n </Flex>\n </Flex>\n )}\n </TopBar>\n <div ref={chartRef} className=\"oui-size-full oui-overflow-hidden\" />\n </div>\n )}\n </div>\n );\n});\n","import React from \"react\";\nimport { Trans, useTranslation } from \"@kodiak-finance/orderly-i18n\";\n\nconst Link: React.FC<React.PropsWithChildren<{ url: string }>> = (props) => {\n const { url, children } = props;\n return (\n <span\n onClick={() => window.open(url)}\n className=\"oui-cursor-pointer oui-px-0.5 oui-text-primary-light oui-underline\"\n >\n {children}\n </span>\n );\n};\n\nexport const NoTradingview: React.FC = () => {\n const { t } = useTranslation();\n return (\n <div className=\"oui-absolute oui-inset-0 oui-z-0 oui-flex oui-flex-col oui-items-center oui-justify-start oui-p-2 oui-text-base-contrast-80 md:oui-justify-center md:oui-p-10\">\n <div>\n <p className=\"oui-mb-6 oui-text-xs\">{t(\"tradingView.noScriptSrc\")}</p>\n\n <p className=\"oui-mb-3 oui-pl-0 oui-text-2xs oui-text-base-contrast-54 md:oui-pl-2 md:oui-text-base md:oui-text-base-contrast-80\">\n <Trans\n i18nKey=\"tradingView.noScriptSrc.1\"\n components={[\n <Link\n key={\"tradingview-advanced-charts\"}\n url=\"https://www.tradingview.com/advanced-charts\"\n />,\n ]}\n />\n </p>\n <p className=\"oui-pl-0 oui-text-2xs oui-text-base-contrast-54 md:oui-pl-2 md:oui-text-base md:oui-text-base-contrast-80\">\n <Trans\n i18nKey=\"tradingView.noScriptSrc.2\"\n components={[\n <Link\n key={\"tradingview-config\"}\n url=\"https://orderly.network/docs/sdks/react/components/trading#tradingviewconfig\"\n />,\n ]}\n />\n </p>\n </div>\n </div>\n );\n};\n","import React from \"react\";\n\nconst TopBar: React.FC<React.PropsWithChildren> = (props) => {\n return (\n <div className=\"top-toolbar oui-flex oui-h-[44px] oui-justify-between md:oui-justify-start oui-items-center oui-p-2 md:oui-px-3 md:oui-pt-3 md:oui-pb-[14px]\">\n {props.children}\n </div>\n );\n};\n\nexport default TopBar;\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/icons/index.tsx","../src/components/lineType/index.tsx","../src/components/timeInterval/index.tsx","../src/components/displayControl/displayControl.desktop.tsx","../src/components/displayControl/displayControl.mobile.tsx","../src/components/displayControl/index.tsx","../src/components/tradingview.widget.tsx","../src/components/tradingview.script.ts","../src/utils/chart.util.ts","../src/tradingviewAdapter/broker/getBrokerAdapter.ts","../src/tradingviewAdapter/datafeed/helpers.ts","../src/tradingviewAdapter/datafeed/history-provider.ts","../src/tradingviewAdapter/datafeed/requester.ts","../src/tradingviewAdapter/datafeed/symbol-storage.ts","../src/tradingviewAdapter/datafeed/abstract-datafeed.ts","../src/tradingviewAdapter/datafeed/eventBus.ts","../src/utils/common.util.ts","../src/tradingviewAdapter/datafeed/websocket.service.ts","../src/tradingviewAdapter/datafeed/datafeed.ts","../src/tradingviewAdapter/hooks/useBroker.ts","../src/tradingviewAdapter/hooks/useCancelOrder.ts","../src/tradingviewAdapter/renderer/tpsl.util.ts","../src/tradingviewAdapter/hooks/useEditOrder.ts","../src/tradingviewAdapter/hooks/useSendOrder.ts","../src/tradingviewAdapter/hooks/useCreateRenderer.ts","../src/tradingviewAdapter/renderer/execution.service.ts","../src/tradingviewAdapter/broker/utils.ts","../src/tradingviewAdapter/renderer/orderLine.service.ts","../src/tradingviewAdapter/renderer/order.util.ts","../src/tradingviewAdapter/renderer/tpslCal.service.ts","../src/tradingviewAdapter/renderer/positionLine.service.ts","../src/tradingviewAdapter/renderer/tpsl.service.tsx","../src/tradingviewAdapter/renderer/renderer.ts","../src/tradingviewAdapter/renderer/brokerHostHandler.ts","../src/tradingviewAdapter/widget/util.ts","../src/tradingviewAdapter/widget/chart_hack.ts","../src/tradingviewAdapter/widget/option.ts","../src/tradingviewAdapter/widget/persistUtils.ts","../src/tradingviewAdapter/widget/index.ts","../src/components/tradingview.ui.tsx","../src/components/noTradingview/index.tsx","../src/components/topBar/index.tsx"],"names":["useMemo","useState","useTranslation","Box","cn","Flex","Text","jsx","jsxs","React","useMediaQuery","MEDIA_TABLET","DropdownMenuContent","DropdownMenuPortal","DropdownMenuRoot","DropdownMenuTrigger","Fragment","forwardRef","useEffect","useRef","useAccount","useLocalStorage","useOrderEntry_deprecated","useSymbolsInfo","AccountStatusEnum","OrderSide","OrderType","modal","toast","Decimal","symbol","key","useCallback","useOrderStream","OrderStatus","values","i18n","commify","textColor","side"],"mappings":"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","sourcesContent":["import React, { FC, SVGProps } from \"react\";\n\nexport const CaretIcon: FC<SVGProps<SVGSVGElement>> = (props) => (\n <svg\n viewBox=\"0 0 12 12\"\n fill=\"currentColor\"\n xmlns=\"http://www.w3.org/2000/svg\"\n {...props}\n >\n <g id=\"Caret-down\">\n <path\n id=\"Vector\"\n d=\"M3.00349 3.9978C2.59149 3.9978 2.36564 4.4653 2.61289 4.7948C2.98789 5.2948 5.23784 8.29479 5.61289 8.79479C5.81289 9.06128 6.20974 9.06128 6.40974 8.79479L9.40974 4.7948C9.65694 4.4653 9.41554 3.9978 9.00349 3.9978H3.00349Z\"\n />\n </g>\n </svg>\n);\n\nexport const DisplaySettingIcon: FC<SVGProps<SVGSVGElement>> = (props) => (\n <svg\n viewBox=\"0 0 18 18\"\n fill=\"currentColor\"\n xmlns=\"http://www.w3.org/2000/svg\"\n {...props}\n >\n <g id=\"Display settings\">\n <path\n id=\"Union\"\n fillRule=\"evenodd\"\n clipRule=\"evenodd\"\n d=\"M15.0571 10.9856L11.6295 5.06523L8.71377 10.8968C8.38933 11.5456 7.54464 11.7223 6.98733 11.2579L5.75311 10.2294L2.83709 14.7654L1.57532 13.9543L4.49134 9.41824C4.97892 8.65978 6.0207 8.49981 6.71338 9.07705L7.58387 9.80246L10.5991 3.77192C10.9997 2.97082 12.1302 2.93624 12.579 3.71137L14.6517 7.29147C14.7714 7.03643 15.0305 6.85983 15.3309 6.85983C15.7451 6.85983 16.0809 7.19562 16.0809 7.60983C16.0809 8.02405 15.7451 8.35983 15.3309 8.35983C15.31 8.35983 15.2892 8.35897 15.2687 8.35729L16.3553 10.2341L15.0571 10.9856ZM2.58093 6.85983C2.16672 6.85983 1.83093 7.19562 1.83093 7.60983C1.83093 8.02405 2.16672 8.35983 2.58093 8.35983C2.99515 8.35983 3.33093 8.02405 3.33093 7.60983C3.33093 7.19562 2.99515 6.85983 2.58093 6.85983ZM4.83093 6.85983C4.41672 6.85983 4.08093 7.19562 4.08093 7.60983C4.08093 8.02405 4.41672 8.35983 4.83093 8.35983C5.24515 8.35983 5.58093 8.02405 5.58093 7.60983C5.58093 7.19562 5.24515 6.85983 4.83093 6.85983ZM6.33093 7.60983C6.33093 7.19562 6.66672 6.85983 7.08093 6.85983C7.49515 6.85983 7.83093 7.19562 7.83093 7.60983C7.83093 8.02405 7.49515 8.35983 7.08093 8.35983C6.66672 8.35983 6.33093 8.02405 6.33093 7.60983ZM11.5809 6.85983C11.1667 6.85983 10.8309 7.19562 10.8309 7.60983C10.8309 8.02405 11.1667 8.35983 11.5809 8.35983C11.9951 8.35983 12.3309 8.02405 12.3309 7.60983C12.3309 7.19562 11.9951 6.85983 11.5809 6.85983Z\"\n />\n </g>\n </svg>\n);\n\nexport const LineTypeIcon: FC<SVGProps<SVGSVGElement>> = (props) => (\n <svg\n viewBox=\"0 0 18 18\"\n fill=\"currentColor\"\n xmlns=\"http://www.w3.org/2000/svg\"\n {...props}\n >\n <path\n fillRule=\"evenodd\"\n clipRule=\"evenodd\"\n d=\"M6 1.5C5.58579 1.5 5.25 1.83579 5.25 2.25V3.75H4.5C4.08579 3.75 3.75 4.08579 3.75 4.5V13.5C3.75 13.9142 4.08579 14.25 4.5 14.25H5.25V15.75C5.25 16.1642 5.58579 16.5 6 16.5C6.41421 16.5 6.75 16.1642 6.75 15.75V14.25H7.5C7.91421 14.25 8.25 13.9142 8.25 13.5V4.5C8.25 4.08579 7.91421 3.75 7.5 3.75H6.75V2.25C6.75 1.83579 6.41421 1.5 6 1.5ZM5.25 12.75V5.25H6.75V12.75H5.25ZM11.25 12.75V7.5H12.75V12.75H11.25ZM9.75 6.75C9.75 6.33579 10.0858 6 10.5 6H11.25V4.5C11.25 4.08579 11.5858 3.75 12 3.75C12.4142 3.75 12.75 4.08579 12.75 4.5V6H13.5C13.9142 6 14.25 6.33579 14.25 6.75V13.5C14.25 13.9142 13.9142 14.25 13.5 14.25H12.75V15.75C12.75 16.1642 12.4142 16.5 12 16.5C11.5858 16.5 11.25 16.1642 11.25 15.75V14.25H10.5C10.0858 14.25 9.75 13.9142 9.75 13.5V6.75Z\"\n />\n </svg>\n);\n\nexport const IndicatorsIcon: FC<SVGProps<SVGSVGElement>> = (props) => (\n <svg\n viewBox=\"0 0 18 18\"\n fill=\"currentColor\"\n xmlns=\"http://www.w3.org/2000/svg\"\n {...props}\n >\n <g id=\"Indicators\">\n <path\n id=\"Union\"\n fillRule=\"evenodd\"\n clipRule=\"evenodd\"\n d=\"M9.74483 2.25C8.96145 2.25 8.26885 2.76459 8.04549 3.51818L7.46202 5.48254H5.06262V7.08339H6.98652L5.00539 13.7532L4.31554 13.1112L3.22498 14.2831L4.4777 15.4489C5.08739 16.015 6.08317 15.7469 6.32134 14.945L8.65649 7.08339H11.6032V5.48254H9.13198L9.58033 3.97311C9.60167 3.90112 9.66833 3.85084 9.74483 3.85084H11.69V2.25H9.74483ZM10.6234 11.2354L10.2638 11.5172C10.0153 11.712 9.65591 11.6684 9.46115 11.4199C9.26639 11.1713 9.30998 10.812 9.55852 10.6172L10.1451 10.1575C10.5693 9.82514 11.1868 9.94011 11.4642 10.4005L11.4682 10.407L12.1304 11.5752L13.4594 10.3111C13.6882 10.0935 14.05 10.1025 14.2677 10.3313C14.4853 10.5601 14.4763 10.922 14.2475 11.1396L12.7116 12.6006L13.3897 13.797L13.6482 13.4503C13.8369 13.1972 14.1951 13.145 14.4483 13.3337C14.7014 13.5225 14.7536 13.8807 14.5649 14.1338L13.9917 14.9025L13.94 14.9457C13.5178 15.2981 12.8837 15.1886 12.6003 14.7226L12.5958 14.7151L11.8576 13.4129L10.3563 14.841C10.1275 15.0586 9.76561 15.0495 9.54798 14.8208C9.33036 14.592 9.3394 14.2301 9.56819 14.0125L11.2764 12.3875L10.6234 11.2354Z\"\n />\n </g>\n </svg>\n);\n\nexport const SettingIcon: FC<SVGProps<SVGSVGElement>> = (props) => (\n <svg\n viewBox=\"0 0 18 18\"\n fill=\"currentColor\"\n xmlns=\"http://www.w3.org/2000/svg\"\n {...props}\n >\n <g id=\"Setting\">\n <path\n id=\"Vector\"\n d=\"M6.72589 1.84154C5.66239 2.17904 4.74515 2.72954 3.93665 3.48254C3.6869 3.71504 3.6104 4.09604 3.7724 4.39604C4.37315 5.50679 3.74464 6.69554 2.38939 6.76379C2.05789 6.78029 1.76465 7.0263 1.68665 7.34955C1.5524 7.9083 1.49915 8.37629 1.49915 8.98979C1.49915 9.50504 1.55464 10.0885 1.66339 10.6075C1.73089 10.9315 2.0129 11.1648 2.3429 11.1933C3.7064 11.311 4.3814 12.3513 3.7724 13.6773C3.6374 13.972 3.6989 14.3245 3.93665 14.545C4.73315 15.2815 5.64814 15.8013 6.72589 16.1388C7.03339 16.2348 7.38064 16.1185 7.56964 15.8575C8.40364 14.7033 9.6134 14.6995 10.4054 15.8575C10.5921 16.1298 10.9341 16.261 11.2491 16.162C12.2894 15.8343 13.2584 15.277 14.0616 14.545C14.3091 14.3193 14.3744 13.954 14.2259 13.654C13.6019 12.3948 14.3197 11.239 15.6082 11.2165C15.9502 11.2105 16.2547 10.9863 16.3349 10.654C16.4647 10.1163 16.4991 9.64829 16.4991 8.98979C16.4991 8.42429 16.4324 7.86704 16.3116 7.32629C16.2351 6.98354 15.9359 6.74054 15.5849 6.73979C14.3167 6.73754 13.6056 5.49104 14.2259 4.39604C14.3984 4.09154 14.3444 3.71804 14.0849 3.48254C13.2674 2.74004 12.2706 2.15954 11.2259 1.84154C10.9049 1.74404 10.5636 1.86404 10.3821 2.14604C9.65764 3.27179 8.30465 3.29129 7.5929 2.17004C7.41065 1.88204 7.04989 1.73879 6.72589 1.84154ZM11.2844 3.43455C11.7966 3.64905 12.2009 3.8733 12.6651 4.22505C12.1206 5.9478 13.0439 7.73729 14.9564 8.17304C15.0036 8.48279 14.9991 8.67029 14.9991 8.98979C14.9991 9.37154 15.0044 9.50579 14.9609 9.78179C13.0566 10.1763 12.1146 11.9155 12.6449 13.7538C12.1889 14.0845 11.8626 14.314 11.2904 14.5353C9.94639 13.1673 8.0804 13.1073 6.7079 14.5443C6.1724 14.3088 5.76066 14.0995 5.34441 13.7478C5.86041 11.881 4.98815 10.2693 3.05165 9.7803C2.9654 9.4383 2.9999 8.4723 3.0494 8.17905C5.0519 7.69905 5.8409 5.92679 5.34365 4.21979C5.78315 3.88904 6.1784 3.6483 6.69215 3.4398C7.9859 4.75605 9.92839 4.8873 11.2844 3.43455ZM8.99915 5.98979C7.3424 5.98979 5.99915 7.33304 5.99915 8.98979C5.99915 10.6473 7.3424 11.9898 8.99915 11.9898C10.6559 11.9898 11.9991 10.6473 11.9991 8.98979C11.9991 7.33304 10.6559 5.98979 8.99915 5.98979ZM8.99915 7.48979C9.8279 7.48979 10.4991 8.16179 10.4991 8.98979C10.4991 9.81855 9.8279 10.4898 8.99915 10.4898C8.1704 10.4898 7.49915 9.81855 7.49915 8.98979C7.49915 8.16179 8.1704 7.48979 8.99915 7.48979Z\"\n />\n </g>\n </svg>\n);\n\nexport const BarIcon: FC<SVGProps<SVGSVGElement>> = (props) => (\n <svg\n viewBox=\"0 0 20 20\"\n fill=\"currentColor\"\n xmlns=\"http://www.w3.org/2000/svg\"\n {...props}\n >\n <g id=\"Bars\">\n <path\n id=\"Union\"\n fillRule=\"evenodd\"\n clipRule=\"evenodd\"\n d=\"M12.5 15.5C12.5 15.7761 12.7239 16 13 16H14C14.2761 16 14.5 15.7761 14.5 15.5V14H16C16.2761 14 16.5 13.7761 16.5 13.5V12.5C16.5 12.2239 16.2761 12 16 12H14.5V2.5C14.5 2.22386 14.2761 2 14 2H13C12.7239 2 12.5 2.22386 12.5 2.5V4H11C10.7239 4 10.5 4.22386 10.5 4.5V5.5C10.5 5.77614 10.7239 6 11 6H12.5V15.5ZM5.5 17.5C5.5 17.7761 5.72386 18 6 18H7C7.27614 18 7.5 17.7761 7.5 17.5V10H9C9.27614 10 9.5 9.77614 9.5 9.5V8.5C9.5 8.22386 9.27614 8 9 8H7.5V4.5C7.5 4.22386 7.27614 4 7 4H6C5.72386 4 5.5 4.22386 5.5 4.5V14H4C3.72386 14 3.5 14.2239 3.5 14.5V15.5C3.5 15.7761 3.72386 16 4 16H5.5V17.5Z\"\n />\n </g>\n </svg>\n);\n\nexport const CandlesIcon: FC<SVGProps<SVGSVGElement>> = (props) => (\n <svg\n viewBox=\"0 0 20 20\"\n fill=\"currentColor\"\n xmlns=\"http://www.w3.org/2000/svg\"\n {...props}\n >\n <g id=\"Candles\">\n <path\n id=\"Union\"\n fillRule=\"evenodd\"\n clipRule=\"evenodd\"\n d=\"M7.25 2.5V4H8.5C8.77614 4 9 4.22386 9 4.5V15.5C9 15.7761 8.77614 16 8.5 16H7.25V17.5C7.25 17.7761 7.02614 18 6.75 18H6.25C5.97386 18 5.75 17.7761 5.75 17.5V16H4.5C4.22386 16 4 15.7761 4 15.5V4.5C4 4.22386 4.22386 4 4.5 4H5.75V2.5C5.75 2.22386 5.97386 2 6.25 2H6.75C7.02614 2 7.25 2.22386 7.25 2.5ZM5.5 5.5V14.5H7.5V5.5H5.5ZM14.25 4.5V7H15.5C15.7761 7 16 7.22386 16 7.5V15.5C16 15.7761 15.7761 16 15.5 16H14.25V17.5C14.25 17.7761 14.0261 18 13.75 18H13.25C12.9739 18 12.75 17.7761 12.75 17.5V16H11.5C11.2239 16 11 15.7761 11 15.5V7.5C11 7.22386 11.2239 7 11.5 7H12.75V4.5C12.75 4.22386 12.9739 4 13.25 4H13.75C14.0261 4 14.25 4.22386 14.25 4.5ZM12.5 8.5V14.5H14.5V8.5H12.5Z\"\n />\n </g>\n </svg>\n);\n\nexport const HollowCandlesIcon: FC<SVGProps<SVGSVGElement>> = (props) => (\n <svg\n viewBox=\"0 0 20 20\"\n fill=\"currentColor\"\n xmlns=\"http://www.w3.org/2000/svg\"\n {...props}\n >\n <g id=\"Hollow Candles\">\n <path\n id=\"Subtract\"\n fillRule=\"evenodd\"\n clipRule=\"evenodd\"\n d=\"M5.5 14.5V5.5H7.5V14.5H5.5Z\"\n fill=\"white\"\n fillOpacity=\"0.12\"\n />\n <path\n id=\"Union\"\n fillRule=\"evenodd\"\n clipRule=\"evenodd\"\n d=\"M7.25 2.5V4H8.5C8.77614 4 9 4.22386 9 4.5V15.5C9 15.7761 8.77614 16 8.5 16H7.25V17.5C7.25 17.7761 7.02614 18 6.75 18H6.25C5.97386 18 5.75 17.7761 5.75 17.5V16H4.5C4.22386 16 4 15.7761 4 15.5V4.5C4 4.22386 4.22386 4 4.5 4H5.75V2.5C5.75 2.22386 5.97386 2 6.25 2H6.75C7.02614 2 7.25 2.22386 7.25 2.5ZM5.5 5.5V14.5H7.5V5.5H5.5ZM14.25 4.5V7H15.5C15.7761 7 16 7.22386 16 7.5V15.5C16 15.7761 15.7761 16 15.5 16H14.25V17.5C14.25 17.7761 14.0261 18 13.75 18H13.25C12.9739 18 12.75 17.7761 12.75 17.5V16H11.5C11.2239 16 11 15.7761 11 15.5V7.5C11 7.22386 11.2239 7 11.5 7H12.75V4.5C12.75 4.22386 12.9739 4 13.25 4H13.75C14.0261 4 14.25 4.22386 14.25 4.5ZM12.5 8.5V14.5H14.5V8.5H12.5Z\"\n />\n </g>\n </svg>\n);\n\nexport const LineIcon: FC<SVGProps<SVGSVGElement>> = (props) => (\n <svg\n viewBox=\"0 0 20 20\"\n fill=\"currentColor\"\n xmlns=\"http://www.w3.org/2000/svg\"\n {...props}\n >\n <g id=\"Line\">\n <path\n id=\"Vector 16 (Stroke)\"\n fillRule=\"evenodd\"\n clipRule=\"evenodd\"\n d=\"M18.3 2.72288C18.542 2.85596 18.6303 3.15999 18.4972 3.40195L13.495 12.4968C13.0776 13.2557 12.1061 13.5044 11.3754 13.0394L7.19878 10.3816L2.97738 17.558C2.83737 17.796 2.53092 17.8754 2.2929 17.7354L1.43097 17.2284C1.19295 17.0884 1.1135 16.7819 1.25351 16.5439L5.73746 8.92122C6.16792 8.18943 7.1194 7.96045 7.83567 8.41626L11.9995 11.0659L16.7448 2.43811C16.8778 2.19615 17.1819 2.10788 17.4238 2.24096L18.3 2.72288Z\"\n />\n </g>\n </svg>\n);\n\nexport const AreaIcon: FC<SVGProps<SVGSVGElement>> = (props) => (\n <svg\n viewBox=\"0 0 20 20\"\n fill=\"currentColor\"\n xmlns=\"http://www.w3.org/2000/svg\"\n {...props}\n >\n <g id=\"Area\">\n <path\n id=\"Vector 16 (Stroke)\"\n fillRule=\"evenodd\"\n clipRule=\"evenodd\"\n d=\"M18.3 2.72288C18.542 2.85596 18.6303 3.15999 18.4972 3.40195L13.495 12.4968C13.0776 13.2557 12.1061 13.5044 11.3754 13.0394L7.19878 10.3816L2.97738 17.558C2.83737 17.796 2.53092 17.8754 2.2929 17.7354L1.43097 17.2284C1.19295 17.0884 1.1135 16.7819 1.25351 16.5439L5.73746 8.92122C6.16792 8.18943 7.1194 7.96045 7.83567 8.41626L11.9995 11.0659L16.7448 2.43811C16.8778 2.19615 17.1819 2.10788 17.4238 2.24096L18.3 2.72288Z\"\n />\n <path\n id=\"Subtract\"\n fillRule=\"evenodd\"\n clipRule=\"evenodd\"\n d=\"M2.7608 17.7562C2.84602 17.899 3.00106 18 3.19016 18H16.362C17.4665 18 18.362 17.1046 18.362 16V3.94663C18.362 3.86618 18.3453 3.79397 18.3162 3.73108L13.495 12.4968C13.0776 13.2557 12.1061 13.5044 11.3754 13.0394L7.19881 10.3816L2.9774 17.558C2.92465 17.6477 2.84826 17.7148 2.7608 17.7562Z\"\n fill=\"white\"\n fillOpacity=\"0.12\"\n />\n </g>\n </svg>\n);\n\nexport const BaseLineIcon: FC<SVGProps<SVGSVGElement>> = (props) => (\n <svg\n viewBox=\"0 0 20 20\"\n fill=\"currentColor\"\n xmlns=\"http://www.w3.org/2000/svg\"\n {...props}\n >\n <g id=\"Baseline\">\n <path\n id=\"Union\"\n fillRule=\"evenodd\"\n clipRule=\"evenodd\"\n d=\"M6.05938 2.93544C6.55642 1.71198 8.27766 1.68139 8.81785 2.88642L11.4361 8.72723H9.24438L7.4717 4.77279L5.86521 8.72723H3.70647L6.05938 2.93544ZM13.9282 14.2865L13.0051 12.2272H10.8133L12.5586 16.1204C13.088 17.3014 14.7641 17.3026 15.2952 16.1224L17.048 12.2272H14.8549L13.9282 14.2865ZM2.28459 12.2272H4.44333L1.85293 18.6036L0 17.8509L2.28459 12.2272ZM16.4299 8.72723H18.623L19.3384 7.13759L17.5145 6.31686L16.4299 8.72723ZM1.42645 10.2272C1.42645 9.95109 1.65031 9.72723 1.92645 9.72723H2.92645C3.20259 9.72723 3.42645 9.95109 3.42645 10.2272V10.7272C3.42645 11.0034 3.20259 11.2272 2.92645 11.2272H1.92645C1.65031 11.2272 1.42645 11.0034 1.42645 10.7272V10.2272ZM4.42645 10.2272C4.42645 9.95109 4.65031 9.72723 4.92645 9.72723H5.92645C6.20259 9.72723 6.42645 9.95109 6.42645 10.2272V10.7272C6.42645 11.0034 6.20259 11.2272 5.92645 11.2272H4.92645C4.65031 11.2272 4.42645 11.0034 4.42645 10.7272V10.2272ZM7.92645 9.72723C7.65031 9.72723 7.42645 9.95109 7.42645 10.2272V10.7272C7.42645 11.0034 7.65031 11.2272 7.92645 11.2272H8.92645C9.20259 11.2272 9.42645 11.0034 9.42645 10.7272V10.2272C9.42645 9.95109 9.20259 9.72723 8.92645 9.72723H7.92645ZM10.4265 10.2272C10.4265 9.95109 10.6503 9.72723 10.9265 9.72723H11.9265C12.2026 9.72723 12.4265 9.95109 12.4265 10.2272V10.7272C12.4265 11.0034 12.2026 11.2272 11.9265 11.2272H10.9265C10.6503 11.2272 10.4265 11.0034 10.4265 10.7272V10.2272ZM13.9265 9.72723C13.6503 9.72723 13.4265 9.95109 13.4265 10.2272V10.7272C13.4265 11.0034 13.6503 11.2272 13.9265 11.2272H14.9265C15.2026 11.2272 15.4265 11.0034 15.4265 10.7272V10.2272C15.4265 9.95109 15.2026 9.72723 14.9265 9.72723H13.9265ZM16.4265 10.2272C16.4265 9.95109 16.6503 9.72723 16.9265 9.72723H17.9265C18.2026 9.72723 18.4265 9.95109 18.4265 10.2272V10.7272C18.4265 11.0034 18.2026 11.2272 17.9265 11.2272H16.9265C16.6503 11.2272 16.4265 11.0034 16.4265 10.7272V10.2272Z\"\n />\n </g>\n </svg>\n);\n\nexport const UnSelectIcon: FC<SVGProps<SVGSVGElement>> = (props) => (\n <svg\n viewBox=\"0 0 12 12\"\n fill=\"currentColor\"\n xmlns=\"http://www.w3.org/2000/svg\"\n {...props}\n >\n <g id=\"Unselected\">\n <path\n id=\"Vector\"\n d=\"M6.00684 0.999023C3.24544 0.999023 1.00684 3.23752 1.00684 5.99902C1.00684 8.76051 3.24544 10.999 6.00684 10.999C8.76834 10.999 11.0068 8.76051 11.0068 5.99902C11.0068 3.23752 8.76834 0.999023 6.00684 0.999023ZM6.00684 1.99902C8.21584 1.99902 10.0068 3.79002 10.0068 5.99902C10.0068 8.20801 8.21584 9.99901 6.00684 9.99901C3.79769 9.99901 2.00684 8.20801 2.00684 5.99902C2.00684 3.79002 3.79769 1.99902 6.00684 1.99902Z\"\n fill=\"white\"\n fillOpacity=\"0.2\"\n />\n </g>\n </svg>\n);\n\nexport const SelectedIcon: FC<SVGProps<SVGSVGElement>> = (props) => (\n <svg\n viewBox=\"0 0 12 12\"\n fill=\"currentColor\"\n xmlns=\"http://www.w3.org/2000/svg\"\n {...props}\n >\n <g id=\"Selected-Multiple Choices-fill\">\n <path\n id=\"Subtract\"\n fillRule=\"evenodd\"\n clipRule=\"evenodd\"\n d=\"M1.00684 5.99902C1.00684 3.23752 3.24544 0.999023 6.00684 0.999023C8.76834 0.999023 11.0068 3.23752 11.0068 5.99902C11.0068 8.76051 8.76834 10.999 6.00684 10.999C3.24544 10.999 1.00684 8.76051 1.00684 5.99902ZM8.49243 3.65563C8.60602 3.54726 8.76156 3.49957 8.91068 3.49957C9.05981 3.49957 9.21534 3.54726 9.32893 3.65563C9.5567 3.87231 9.5567 4.23649 9.32893 4.45317L5.25362 8.33706C5.02644 8.55374 4.6443 8.55374 4.41712 8.33706L2.67014 6.67253C2.44296 6.45585 2.44296 6.09161 2.67014 5.87499C2.89791 5.65831 3.28004 5.65831 3.50722 5.87499L4.83537 7.1407L8.49243 3.65563Z\"\n fill=\"#608CFF\"\n />\n </g>\n </svg>\n);\n","import React, { useMemo, useState } from \"react\";\nimport { useTranslation } from \"@kodiak-finance/orderly-i18n\";\nimport {\n Box,\n cn,\n DropdownMenuContent,\n DropdownMenuPortal,\n DropdownMenuRoot,\n DropdownMenuTrigger,\n Flex,\n Text,\n} from \"@kodiak-finance/orderly-ui\";\nimport {\n AreaIcon,\n BarIcon,\n BaseLineIcon,\n CandlesIcon,\n HollowCandlesIcon,\n LineIcon,\n} from \"../../icons\";\n\ninterface IProps {\n lineType: string;\n changeLineType: (type: string) => void;\n}\n\nconst LineType: React.FC<IProps> = (props) => {\n const [open, setOpen] = useState(false);\n const { t } = useTranslation();\n const lineTypeList = useMemo(() => {\n return [\n {\n icon: <BarIcon fill=\"currentColor\" className=\"oui-w-5 oui-h-5\" />,\n label: t(\"tradingView.lineType.bars\"),\n value: \"0\",\n },\n {\n icon: <CandlesIcon fill=\"currentColor\" className=\"oui-w-5 oui-h-5\" />,\n label: t(\"tradingView.lineType.candles\"),\n value: \"1\",\n },\n {\n icon: (\n <HollowCandlesIcon fill=\"currentColor\" className=\"oui-w-5 oui-h-5\" />\n ),\n label: t(\"tradingView.lineType.hollowCandles\"),\n value: \"9\",\n },\n {\n icon: <LineIcon fill=\"currentColor\" className=\"oui-w-5 oui-h-5\" />,\n label: t(\"tradingView.lineType.line\"),\n value: \"2\",\n },\n {\n icon: <AreaIcon fill=\"currentColor\" className=\"oui-w-5 oui-h-5\" />,\n label: t(\"tradingView.lineType.area\"),\n value: \"3\",\n },\n {\n icon: <BaseLineIcon fill=\"currentColor\" className=\"oui-w-5 oui-h-5\" />,\n label: t(\"tradingView.lineType.baseline\"),\n value: \"10\",\n },\n ];\n }, [t]);\n\n const currentLineTypeIcon = useMemo(() => {\n const data = lineTypeList.find((item) => item.value === props.lineType);\n if (data) {\n return data.icon;\n }\n return lineTypeList[1].icon;\n }, [props.lineType]);\n\n return (\n <DropdownMenuRoot open={open} onOpenChange={setOpen}>\n <DropdownMenuTrigger asChild>\n <Box\n className={cn(\n \"oui-w-[18px] oui-h-[18px] oui-cursor-pointer oui-text-base-contrast-36 hover:oui-text-base-contrast-80\",\n open && \"oui-text-base-contrast-80\",\n )}\n >\n {currentLineTypeIcon}\n </Box>\n </DropdownMenuTrigger>\n <DropdownMenuPortal>\n <DropdownMenuContent\n onCloseAutoFocus={(e) => e.preventDefault()}\n onClick={(e) => e.stopPropagation()}\n align=\"start\"\n sideOffset={20}\n className=\"oui-bg-base-8\"\n >\n <Flex\n direction=\"column\"\n gap={4}\n px={5}\n py={5}\n width={240}\n justify=\"start\"\n itemAlign=\"start\"\n >\n {lineTypeList.map((item) => (\n <Flex\n key={item.value}\n justify={\"start\"}\n itemAlign={\"center\"}\n gap={2}\n className={cn(\n \"oui-text-base-contrast-36 oui-cursor-pointer oui-w-full hover:oui-text-base-contrast\",\n props.lineType === item.value && \"oui-text-base-contrast\",\n )}\n onClick={() => props.changeLineType(item.value)}\n >\n {item.icon}\n <Text className=\"oui-text-sm\">{item.label}</Text>\n </Flex>\n ))}\n </Flex>\n </DropdownMenuContent>\n </DropdownMenuPortal>\n </DropdownMenuRoot>\n );\n};\n\nexport default LineType;\n","import React, { ReactNode, useMemo } from \"react\";\nimport { useMediaQuery } from \"@kodiak-finance/orderly-hooks\";\nimport { useTranslation, i18n } from \"@kodiak-finance/orderly-i18n\";\nimport { MEDIA_TABLET } from \"@kodiak-finance/orderly-types\";\nimport {\n Box,\n cn,\n DropdownMenuContent,\n DropdownMenuPortal,\n DropdownMenuRoot,\n DropdownMenuTrigger,\n Flex,\n Text,\n} from \"@kodiak-finance/orderly-ui\";\nimport { CaretIcon } from \"../../icons\";\n\ninterface IProps {\n changeInterval: (interval: string) => void;\n interval: string;\n}\n\nconst useMobileTimeIntervalMoreMap = () => {\n const { t } = useTranslation();\n const mobileTimeIntervalMoreMap = useMemo(() => {\n return [\n [\n {\n value: \"3\",\n label: t(\"tradingView.timeInterval.3m\"),\n },\n {\n value: \"5\",\n label: t(\"tradingView.timeInterval.5m\"),\n },\n\n {\n value: \"30\",\n label: t(\"tradingView.timeInterval.30m\"),\n },\n\n {\n value: \"120\",\n label: t(\"tradingView.timeInterval.2h\"),\n },\n ],\n [\n {\n value: \"360\",\n label: t(\"tradingView.timeInterval.6h\"),\n },\n {\n value: \"720\",\n label: t(\"tradingView.timeInterval.12h\"),\n },\n {\n value: \"3d\",\n label: t(\"tradingView.timeInterval.3d\"),\n },\n {\n value: \"1M\",\n label: t(\"tradingView.timeInterval.1M\"),\n },\n ],\n ];\n }, [t]);\n\n return { mobileTimeIntervalMoreMap };\n};\n\nexport const TimeInterval: React.FC<IProps> = (props) => {\n const isMobile = useMediaQuery(MEDIA_TABLET);\n if (isMobile) {\n return <MobileTimeInterval {...props} />;\n }\n return <DesktopTimeInterval {...props} />;\n};\n\nconst DesktopTimeInterval: React.FC<IProps> = (props) => {\n const { t } = useTranslation();\n const timeIntervalMap = useMemo(() => {\n return [\n {\n value: \"1\",\n label: t(\"tradingView.timeInterval.1m\"),\n },\n {\n value: \"3\",\n label: t(\"tradingView.timeInterval.3m\"),\n },\n {\n value: \"5\",\n label: t(\"tradingView.timeInterval.5m\"),\n },\n {\n value: \"15\",\n label: t(\"tradingView.timeInterval.15m\"),\n },\n {\n value: \"30\",\n label: t(\"tradingView.timeInterval.30m\"),\n },\n\n {\n value: \"60\",\n label: t(\"tradingView.timeInterval.1h\"),\n },\n\n {\n value: \"240\",\n label: t(\"tradingView.timeInterval.4h\"),\n },\n\n {\n value: \"720\",\n label: t(\"tradingView.timeInterval.12h\"),\n },\n {\n value: \"1D\",\n label: t(\"tradingView.timeInterval.1d\"),\n },\n\n {\n value: \"1W\",\n label: t(\"tradingView.timeInterval.1w\"),\n },\n {\n value: \"1M\",\n label: t(\"tradingView.timeInterval.1M\"),\n },\n ];\n }, [t]);\n\n return (\n <div\n className={cn(\n \"oui-text-2xs oui-text-base-contrast-36 oui-flex oui-gap-[2px] oui-items-center oui-mr-3 oui-font-semibold\",\n \"oui-overflow-hidden\",\n )}\n >\n {timeIntervalMap.map((item) => (\n <div\n key={item.value}\n className={cn(\n \"oui-cursor-pointer oui-px-2\",\n \"hover:oui-text-base-contrast-80\",\n \"oui-break-normal oui-whitespace-nowrap\",\n props.interval === item.value &&\n \"oui-text-base-contrast-80 oui-bg-white/[.06] oui-rounded\",\n )}\n id={item.value}\n onClick={() => props.changeInterval(item.value)}\n >\n {item.label}\n </div>\n ))}\n </div>\n );\n};\n\nexport const MobileTimeInterval: React.FC<IProps> = (props) => {\n const { t } = useTranslation();\n\n const mobileTimeIntervalDefaultMap = useMemo(() => {\n return [\n {\n value: \"1\",\n label: t(\"tradingView.timeInterval.1m\"),\n },\n {\n value: \"15\",\n label: t(\"tradingView.timeInterval.15m\"),\n },\n {\n value: \"60\",\n label: t(\"tradingView.timeInterval.1h\"),\n },\n {\n value: \"240\",\n label: t(\"tradingView.timeInterval.4h\"),\n },\n {\n value: \"1D\",\n label: t(\"tradingView.timeInterval.1d\"),\n },\n\n {\n value: \"1W\",\n label: t(\"tradingView.timeInterval.1w\"),\n },\n ];\n }, [t]);\n\n const { mobileTimeIntervalMoreMap } = useMobileTimeIntervalMoreMap();\n\n const currentIntervalIsInExpand = useMemo(() => {\n for (const row of mobileTimeIntervalMoreMap) {\n for (const item of row) {\n if (item.value === props.interval) {\n return item.label;\n }\n }\n }\n return null;\n }, [props.interval, mobileTimeIntervalMoreMap]);\n\n return (\n <Flex\n justify=\"start\"\n itemAlign=\"center\"\n gap={3}\n className={cn(\n \"oui-text-2xs oui-text-base-contrast-36\",\n \"oui-overflow-hidden\",\n )}\n >\n <div className=\" oui-flex oui-gap-1 oui-items-center oui-mr-3 oui-font-semibold\">\n {mobileTimeIntervalDefaultMap.map((item) => (\n <div\n className={cn(\n \"oui-px-2\",\n \"oui-break-normal oui-whitespace-nowrap\",\n props.interval === item.value &&\n \"oui-text-base-contrast-80 oui-bg-white/[.06] oui-rounded\",\n )}\n key={item.value}\n onClick={() => props.changeInterval(item.value)}\n >\n {item.label}\n </div>\n ))}\n </div>\n <DropDownTimeInterval {...props}>\n {currentIntervalIsInExpand ? (\n <div className=\"oui-text-base-contrast-80\">\n {currentIntervalIsInExpand}\n </div>\n ) : (\n <Text className=\"oui-break-normal oui-whitespace-nowrap\">\n {t(\"tradingView.timeInterval.more\")}\n </Text>\n )}\n </DropDownTimeInterval>\n </Flex>\n );\n};\n\nconst DropDownTimeInterval: React.FC<React.PropsWithChildren<IProps>> = (\n props,\n) => {\n const [open, setOpen] = React.useState(false);\n const { mobileTimeIntervalMoreMap } = useMobileTimeIntervalMoreMap();\n\n return (\n <DropdownMenuRoot open={open} onOpenChange={setOpen}>\n <DropdownMenuTrigger asChild>\n <div className=\"oui-flex oui-justify-start oui-items-center oui-gap-0.5\">\n {props.children}\n <CaretIcon\n className={cn(\n \"oui-w-3 oui-h-3\",\n open && \"oui-text-base-contrast-80 oui-rotate-180\",\n )}\n />\n </div>\n </DropdownMenuTrigger>\n <DropdownMenuPortal>\n <DropdownMenuContent\n onCloseAutoFocus={(e) => e.preventDefault()}\n onClick={(e) => e.stopPropagation()}\n align=\"start\"\n alignOffset={0}\n sideOffset={0}\n className={cn(\n \"oui-markets-dropdown-menu-content oui-bg-base-9 oui-w-screen oui-flex oui-flex-col oui-gap-2 oui-p-3\",\n )}\n >\n {mobileTimeIntervalMoreMap.map((row, id) => (\n <div className=\"oui-flex oui-gap-2\" key={id}>\n {row.map((item) => (\n <div\n className={cn(\n \"oui-w-full oui-text-2xs oui-flex oui-items-center oui-justify-center oui-h-6 oui-rounded\",\n item.value === props.interval\n ? \"oui-text-base-contrast oui-bg-primary-darken\"\n : \"oui-text-base-contrast-36 oui-bg-base-5\",\n )}\n key={item.value}\n onClick={() => {\n props.changeInterval(item.value);\n }}\n >\n <div>{item.label}</div>\n </div>\n ))}\n </div>\n ))}\n </DropdownMenuContent>\n </DropdownMenuPortal>\n </DropdownMenuRoot>\n );\n};\n","import { useMemo, useState } from \"react\";\nimport { useTranslation } from \"@kodiak-finance/orderly-i18n\";\nimport {\n DropdownMenuContent,\n DropdownMenuPortal,\n DropdownMenuRoot,\n DropdownMenuTrigger,\n Flex,\n Text,\n cn,\n Switch,\n} from \"@kodiak-finance/orderly-ui\";\nimport {\n CaretIcon,\n DisplaySettingIcon,\n SelectedIcon,\n UnSelectIcon,\n} from \"../../icons\";\nimport { DisplayControl, IProps } from \"./common\";\n\nexport const DesktopDisplayControl: React.FC<IProps> = (props) => {\n const { displayControlState, changeDisplayControlState } = props;\n const [open, setOpen] = useState(false);\n const { t } = useTranslation();\n\n const displayControlMap = useMemo<DisplayControl[]>(() => {\n return [\n {\n label: t(\"common.position\"),\n id: \"position\",\n },\n {\n label: t(\"tradingView.displayControl.buySell\"),\n id: \"buySell\",\n },\n {\n label: t(\"tradingView.displayControl.limitOrders\"),\n id: \"limitOrders\",\n },\n {\n label: t(\"tradingView.displayControl.stopOrders\"),\n id: \"stopOrders\",\n },\n {\n label: t(\"common.tpsl\"),\n id: \"tpsl\",\n },\n {\n label: t(\"tpsl.positionTpsl\"),\n id: \"positionTpsl\",\n },\n {\n label: t(\"orderEntry.orderType.trailingStop\"),\n id: \"trailingStop\",\n },\n ];\n }, [t]);\n\n return (\n <>\n <DropdownMenuRoot open={open} onOpenChange={setOpen}>\n <DropdownMenuTrigger asChild>\n <Flex\n justify=\"start\"\n itemAlign=\"center\"\n className=\"oui-gap-[2px] oui-cursor-pointer oui-text-base-contrast-36 hover:oui-text-base-contrast-80\"\n >\n <DisplaySettingIcon\n className={cn(\n \"oui-w-[18px] oui-h-[18px] \",\n open && \"oui-text-base-contrast-80\",\n )}\n />\n <CaretIcon\n className={cn(\n \"oui-w-3 oui-h-3\",\n open && \"oui-text-base-contrast-80 oui-rotate-180\",\n )}\n />\n </Flex>\n </DropdownMenuTrigger>\n <DropdownMenuPortal>\n <DropdownMenuContent\n onCloseAutoFocus={(e) => e.preventDefault()}\n onClick={(e) => e.stopPropagation()}\n align=\"start\"\n className=\"oui-bg-base-8\"\n >\n <Flex\n direction=\"column\"\n gap={4}\n px={5}\n py={5}\n width={240}\n justify=\"start\"\n itemAlign=\"start\"\n >\n {displayControlMap.map((item) => (\n <Flex\n key={item.id}\n justify={\"between\"}\n itemAlign={\"center\"}\n className=\"oui-w-full\"\n >\n <Text\n className={cn(\n \"oui-text-sm oui-text-base-contrast-80\",\n !displayControlState[item.id] &&\n \"oui-text-base-contrast-36\",\n )}\n >\n {item.label}\n </Text>\n <Switch\n className=\"oui-h-4 oui-w-8\"\n checked={displayControlState[item.id]}\n onCheckedChange={(checked) => {\n changeDisplayControlState({\n ...displayControlState,\n [item.id]: checked,\n });\n }}\n />\n </Flex>\n ))}\n </Flex>\n </DropdownMenuContent>\n </DropdownMenuPortal>\n </DropdownMenuRoot>\n </>\n );\n};\n","import { useMemo, useState } from \"react\";\nimport { useTranslation } from \"@kodiak-finance/orderly-i18n\";\nimport {\n DropdownMenuContent,\n DropdownMenuPortal,\n DropdownMenuRoot,\n DropdownMenuTrigger,\n cn,\n} from \"@kodiak-finance/orderly-ui\";\nimport {\n CaretIcon,\n DisplaySettingIcon,\n SelectedIcon,\n UnSelectIcon,\n} from \"../../icons\";\nimport { DisplayControl, IProps } from \"./common\";\n\nexport const MobileDisplayControl: React.FC<IProps> = (props) => {\n const [open, setOpen] = useState(false);\n const { t } = useTranslation();\n\n const mobileDisplayControlMap = useMemo<DisplayControl[][]>(() => {\n return [\n [\n {\n label: t(\"common.position\"),\n id: \"position\",\n },\n\n {\n label: t(\"tradingView.displayControl.limitOrders\"),\n id: \"limitOrders\",\n },\n ],\n [\n {\n label: t(\"tradingView.displayControl.stopOrders\"),\n id: \"stopOrders\",\n },\n {\n label: t(\"common.tpsl\"),\n id: \"tpsl\",\n },\n ],\n [\n {\n label: t(\"tpsl.positionTpsl\"),\n id: \"positionTpsl\",\n },\n {\n label: t(\"tradingView.displayControl.buySell\"),\n id: \"buySell\",\n },\n ],\n [\n {\n label: t(\"orderEntry.orderType.trailingStop\"),\n id: \"trailingStop\",\n },\n // placeholder\n {} as DisplayControl,\n ],\n ];\n }, [t]);\n\n return (\n <DropdownMenuRoot open={open} onOpenChange={setOpen}>\n <DropdownMenuTrigger asChild>\n <div\n className={cn(\n \"oui-flex oui-items-center oui-justify-center oui-gap-0.5 oui-text-base-contrast-36\",\n open && \"oui-text-base-contrast-8\",\n )}\n >\n <DisplaySettingIcon\n className={cn(\n \"oui-size-[18px] \",\n open && \"oui-text-base-contrast-80\",\n )}\n />\n <CaretIcon\n className={cn(\n \"oui-size-3\",\n open && \"oui-rotate-180 oui-text-base-contrast-80\",\n )}\n />\n </div>\n </DropdownMenuTrigger>\n <DropdownMenuPortal>\n <DropdownMenuContent\n onCloseAutoFocus={(e) => e.preventDefault()}\n onClick={(e) => e.stopPropagation()}\n align=\"start\"\n alignOffset={0}\n sideOffset={0}\n className={cn(\n \"oui-tradingview-display-control-dropdown-menu-content oui-flex oui-w-screen oui-flex-col oui-gap-2 oui-bg-base-9 oui-p-3\",\n )}\n >\n {mobileDisplayControlMap.map((row, id) => (\n <div className=\"oui-flex oui-gap-2\" key={id}>\n {row.map((item, index) => {\n return (\n <div\n className={cn(\n \"oui-flex oui-h-6 oui-w-full oui-items-center oui-justify-between\",\n \"oui-rounded oui-px-2 oui-text-2xs\",\n item.id && \"oui-bg-base-5\",\n props.displayControlState[item.id]\n ? \"oui-text-base-contrast\"\n : \"oui-text-base-contrast-36\",\n )}\n key={item.id || index}\n onClick={() => {\n if (!item.id) {\n return;\n }\n props.changeDisplayControlState({\n ...props.displayControlState,\n [item.id]: !props.displayControlState[item.id],\n });\n }}\n >\n {item.id && (\n <>\n <div>{item.label}</div>\n {props.displayControlState[item.id] ? (\n <SelectedIcon className=\"oui-size-3\" />\n ) : (\n <UnSelectIcon className=\"oui-size-3\" />\n )}\n </>\n )}\n </div>\n );\n })}\n </div>\n ))}\n </DropdownMenuContent>\n </DropdownMenuPortal>\n </DropdownMenuRoot>\n );\n};\n","export { DesktopDisplayControl } from \"./displayControl.desktop\";\nexport { MobileDisplayControl } from \"./displayControl.mobile\";\n","import { forwardRef } from \"react\";\nimport type { TradingviewWidgetPropsInterface } from \"../type\";\nimport { useTradingviewScript } from \"./tradingview.script\";\nimport { TradingviewUI } from \"./tradingview.ui\";\n\nexport const TradingviewWidget = forwardRef<\n HTMLDivElement,\n TradingviewWidgetPropsInterface\n>((props, ref) => {\n const state = useTradingviewScript(props);\n return <TradingviewUI {...state} ref={ref} />;\n});\n","import { useEffect, useMemo, useRef, useState } from \"react\";\nimport {\n useAccount,\n useConfig,\n useLocalStorage,\n useMediaQuery,\n useOrderEntry_deprecated,\n useSymbolsInfo,\n useWS,\n} from \"@kodiak-finance/orderly-hooks\";\nimport { LocaleCode, useLocaleCode } from \"@kodiak-finance/orderly-i18n\";\nimport { WS } from \"@kodiak-finance/orderly-net\";\nimport {\n AccountStatusEnum,\n MEDIA_TABLET,\n OrderSide,\n OrderType,\n TradingviewFullscreenKey,\n} from \"@kodiak-finance/orderly-types\";\nimport { modal, toast } from \"@kodiak-finance/orderly-ui\";\nimport { Decimal } from \"@kodiak-finance/orderly-utils\";\nimport getBrokerAdapter from \"../tradingviewAdapter/broker/getBrokerAdapter\";\nimport { Datafeed } from \"../tradingviewAdapter/datafeed/datafeed\";\nimport { WebsocketService } from \"../tradingviewAdapter/datafeed/websocket.service\";\nimport useBroker from \"../tradingviewAdapter/hooks/useBroker\";\nimport useCreateRenderer from \"../tradingviewAdapter/hooks/useCreateRenderer\";\nimport brokerHostHandler from \"../tradingviewAdapter/renderer/brokerHostHandler\";\nimport { Widget, WidgetProps } from \"../tradingviewAdapter/widget\";\nimport {\n DisplayControlSettingInterface,\n TradingviewWidgetPropsInterface,\n} from \"../type\";\nimport {\n getOveriides,\n withExchangePrefix,\n defaultColorConfig,\n chartBG,\n} from \"../utils/chart.util\";\nimport { TradingViewSDKLocalstorageKey } from \"../utils/common.util\";\n\nconst CHART_KEY = \"SDK_Tradingview\";\nconst MOBILE_CHART_KEY = \"SDK_Moblie_Tradingview\";\n\nconst getChartKey = (isMobile?: boolean) => {\n return isMobile ? MOBILE_CHART_KEY : CHART_KEY;\n};\n\nconst defaultLocale = (localeCode: LocaleCode) => {\n return localeCode === \"id\"\n ? \"id_ID\"\n : localeCode === \"tc\"\n ? \"zh_TW\"\n : localeCode;\n};\n\nexport function useTradingviewScript(props: TradingviewWidgetPropsInterface) {\n const {\n scriptSRC: tradingViewScriptSrc,\n libraryPath,\n customCssUrl: tradingViewCustomCssUrl,\n overrides: customerOverrides,\n studiesOverrides: customerStudiesOverrides,\n symbol,\n theme,\n loadingScreen: customerLoadingScreen,\n mode,\n colorConfig: customerColorConfig,\n showVolumeInSamePane,\n locale = defaultLocale,\n classNames,\n } = props;\n\n const localeCode = useLocaleCode();\n\n const chart = useRef<Widget | null>(null);\n const apiBaseUrl: string = useConfig(\"apiBaseUrl\") as string;\n const { state: accountState } = useAccount();\n const [side, setSide] = useState<OrderSide>(OrderSide.SELL);\n const symbolsInfo = useSymbolsInfo();\n const [fullscreen, setFullscreen] = useLocalStorage(\n TradingviewFullscreenKey,\n false,\n );\n\n const { onSubmit, submitting } = useOrderEntry_deprecated(\n {\n symbol: symbol ?? \"\",\n side: side,\n order_type: OrderType.MARKET,\n },\n {\n watchOrderbook: true,\n },\n );\n const [displayControlState, setDisplayControlState] =\n useState<DisplayControlSettingInterface>(() => {\n const displaySettingInfo = localStorage.getItem(\n TradingViewSDKLocalstorageKey.displayControlSetting,\n );\n if (displaySettingInfo) {\n return JSON.parse(displaySettingInfo) as DisplayControlSettingInterface;\n }\n return {\n position: true,\n buySell: true,\n limitOrders: true,\n stopOrders: true,\n tpsl: true,\n positionTpsl: true,\n trailingStop: true,\n };\n });\n\n const [interval, setInterval] = useState<string>(() => {\n const lastUsedInterval = localStorage.getItem(\n TradingViewSDKLocalstorageKey.interval,\n );\n if (!lastUsedInterval) {\n return \"15\";\n }\n return lastUsedInterval;\n });\n\n const [lineType, setLineType] = useState<string>(() => {\n const lastUsedLineType = localStorage.getItem(\n TradingViewSDKLocalstorageKey.lineType,\n );\n if (!lastUsedLineType) {\n return \"1\";\n }\n return lastUsedLineType;\n });\n\n const isMobile = useMediaQuery(MEDIA_TABLET);\n\n const colorConfig = useMemo(\n () => Object.assign({}, defaultColorConfig, customerColorConfig ?? {}),\n [customerColorConfig],\n );\n\n const loadingScreen = useMemo(() => {\n if (typeof customerLoadingScreen === \"object\") {\n return customerLoadingScreen;\n }\n return {\n backgroundColor: chartBG,\n };\n }, [customerLoadingScreen]);\n const ws = useWS();\n const [chartingLibrarySciprtReady, setChartingLibrarySciprtReady] =\n useState<boolean>(false);\n\n const closePositionConfirmCallback = (data: any) => {\n const symbolInfo = symbolsInfo[symbol!];\n if (!symbolInfo) {\n return;\n }\n const side = new Decimal(data.balance).greaterThan(0)\n ? OrderSide.SELL\n : OrderSide.BUY;\n const order: any = {\n // order_price: undefined,\n order_quantity: new Decimal(data.balance).abs().toNumber(),\n symbol: symbol,\n order_type: OrderType.MARKET,\n side,\n reduce_only: true,\n };\n setSide(side);\n modal.show(\"MarketCloseConfirmID\", {\n base: symbolInfo(\"base\"),\n quantity: data.balance,\n onConfirm: async () => {\n return onSubmit(order).catch((error) => {\n if (typeof error === \"string\") {\n toast.error(error);\n } else {\n toast.error(error.message);\n }\n });\n },\n submitting,\n });\n };\n\n const chartRef = useRef<HTMLDivElement>(null);\n const isLoggedIn = useMemo(() => {\n if (\n accountState.status < AccountStatusEnum.EnableTrading &&\n accountState.status !== AccountStatusEnum.EnableTradingWithoutConnected\n ) {\n return false;\n }\n return true;\n }, [accountState]);\n\n const broker = useBroker({\n closeConfirm: closePositionConfirmCallback,\n colorConfig,\n onToast: toast,\n symbol: symbol ?? \"\",\n mode,\n });\n const [createRenderer, removeRenderer] = useCreateRenderer(\n symbol!,\n displayControlState,\n );\n\n const onFullScreenChange = () => {\n if (fullscreen) {\n setFullscreen(false);\n } else {\n setFullscreen(true);\n }\n props.onFullScreenChange?.(!fullscreen);\n };\n\n const changeInterval = (newInterval: string) => {\n if (!chart.current) {\n return;\n }\n localStorage.setItem(TradingViewSDKLocalstorageKey.interval, newInterval);\n setInterval(newInterval);\n chart.current?.setSymbol(symbol ?? \"\", newInterval as any);\n };\n\n const changeLineType = (newLineType: string) => {\n if (!chart.current) {\n return;\n }\n localStorage.setItem(TradingViewSDKLocalstorageKey.lineType, newLineType);\n setLineType(newLineType);\n chart.current?.changeLineType(Number(newLineType));\n };\n\n const changeDisplaySetting = (newSetting: DisplayControlSettingInterface) => {\n localStorage.setItem(\n TradingViewSDKLocalstorageKey.displayControlSetting,\n JSON.stringify(newSetting),\n );\n setDisplayControlState(newSetting);\n };\n\n const openChartSetting = () => {\n if (!chart.current) {\n return;\n }\n chart.current.executeActionById(\"chartProperties\");\n };\n\n const openChartIndicators = () => {\n if (!chart.current) {\n return;\n }\n chart.current.executeActionById(\"insertIndicator\");\n };\n\n useEffect(() => {\n if (!tradingViewScriptSrc) {\n return;\n }\n if (!chartRef.current) {\n return;\n }\n if (!chartingLibrarySciprtReady) {\n const script = document.createElement(\"script\");\n script.setAttribute(\"data-nscript\", \"afterInteractive\");\n script.src = tradingViewScriptSrc;\n script.async = true;\n script.type = \"text/javascript\";\n script.onload = () => {\n setChartingLibrarySciprtReady(true);\n };\n script.onerror = () => {\n console.log(\"trading view path error\");\n };\n chartRef.current.appendChild(script);\n }\n }, [chartRef, chartingLibrarySciprtReady, tradingViewScriptSrc]);\n\n useEffect(() => {\n if (!symbol) {\n return;\n }\n if (!chartingLibrarySciprtReady || !tradingViewScriptSrc) {\n return;\n }\n\n const defaultOverrides = getOveriides(colorConfig, isMobile);\n const overrides = customerOverrides\n ? Object.assign({}, defaultOverrides.overrides, customerOverrides)\n : defaultOverrides.overrides;\n\n console.log(\"-- overides\", overrides, mode);\n // console.log('-- overrides', overrides);\n const studiesOverrides = customerStudiesOverrides\n ? Object.assign(\n {},\n defaultOverrides.studiesOverrides,\n customerStudiesOverrides,\n )\n : defaultOverrides.studiesOverrides;\n if (chartRef.current) {\n // options example: https://www.tradingview.com/widget-docs/widgets/charts/advanced-chart/\n // ChartingLibraryWidgetOptions\n const options: any = {\n // fullscreen: fullscreen ?? false,\n fullscreen: false,\n autosize: true,\n symbol: withExchangePrefix(symbol!),\n locale: typeof locale === \"function\" ? locale(localeCode) : locale,\n timezone: Intl.DateTimeFormat().resolvedOptions().timeZone,\n container: chartRef.current,\n libraryPath: libraryPath,\n customCssUrl: tradingViewCustomCssUrl,\n interval: interval ?? \"1\",\n theme: theme ?? \"dark\",\n loadingScreen: loadingScreen ?? {},\n showVolumeInSamePane,\n overrides: overrides,\n studiesOverrides,\n datafeed: new Datafeed(apiBaseUrl!, ws),\n contextMenu: {\n items_processor: async (defaultItems: any) => {\n return defaultItems;\n },\n },\n // todo broker effect sell/buy\n getBroker: (instance: any, host: any) => {\n console.log(\"-- broker_factory\");\n brokerHostHandler(instance, host);\n return getBrokerAdapter(host, broker);\n },\n // getBroker: undefined,\n };\n\n const chartProps: WidgetProps = {\n options,\n chartKey: getChartKey(isMobile),\n mode,\n onClick: () => {},\n };\n\n chart.current = new Widget(chartProps);\n }\n\n return () => {\n chart.current?.remove();\n };\n }, [\n chartingLibrarySciprtReady,\n isMobile,\n mode,\n chart,\n chartRef,\n chartingLibrarySciprtReady,\n tradingViewScriptSrc,\n colorConfig,\n locale,\n localeCode,\n showVolumeInSamePane,\n ]);\n\n useEffect(() => {\n ws.on(\n \"status:change\",\n (message: any) => {\n if (!message.isPrivate && message.isReconnect) {\n if (\n typeof (window as any).onResetCacheNeededCallback === \"function\"\n ) {\n (window as any).onResetCacheNeededCallback();\n if (chart.current?.instance) {\n chart.current?.instance.activeChart()?.resetData();\n }\n }\n }\n },\n \"tradingview\",\n );\n }, [ws]);\n\n useEffect(() => {\n if (chart.current && chart.current?.instance) {\n chart.current?.instance?.onChartReady(() => {\n if (isLoggedIn && chart.current?.instance) {\n createRenderer(\n chart.current.instance,\n undefined,\n broker,\n chartRef.current!,\n );\n }\n });\n }\n return () => {\n removeRenderer();\n };\n }, [chart.current, isLoggedIn]);\n\n useEffect(() => {\n if (!symbol || !chart.current) {\n return;\n }\n chart.current?.setSymbol(symbol);\n const service = new WebsocketService(ws as WS);\n service.subscribeSymbol(symbol);\n return () => {\n service.unsubscribeKline(symbol);\n };\n }, [symbol]);\n\n return {\n tradingViewScriptSrc,\n chartRef,\n changeDisplaySetting,\n displayControlState,\n interval,\n changeInterval,\n lineType,\n changeLineType,\n openChartSetting,\n openChartIndicators,\n symbol,\n onFullScreenChange,\n classNames,\n fullscreen,\n };\n}\n","import { ColorConfigInterface } from \"../tradingviewAdapter/type\";\n\nconst upColor = \"#008676\";\nconst downColor = \"#D92D6B\";\nexport const chartBG = \"#131519\";\nconst pnlUpColor = \"#00B49E\";\nconst pnlDownColor = \"#FF447C\";\nconst pnlZoreColor = \"#333948\";\nconst textColor = \"#FFFFFF\";\nconst qtyTextColor = \"#F4F7F9\";\nconst font = \"regular 11px Manrope\";\n\nexport const defaultColorConfig: ColorConfigInterface = {\n upColor,\n downColor,\n chartBG,\n pnlUpColor,\n pnlDownColor,\n pnlZoreColor,\n textColor,\n qtyTextColor,\n font,\n volumeUpColor: \"#00E5A0\",\n volumeDownColor: \"#FF6B94\",\n closeIcon: \"rgba(255, 255, 255, 0.8)\",\n};\n\nexport const getOveriides = (\n colorConfig: ColorConfigInterface,\n isMobile?: boolean,\n) => {\n const overrides = {\n \"paneProperties.background\": colorConfig.chartBG,\n // \"paneProperties.background\": \"#ffff00\",\n // \"mainSeriesProperties.style\": 1,\n \"paneProperties.backgroundType\": \"solid\",\n // \"paneProperties.background\": \"#151822\",\n\n \"mainSeriesProperties.candleStyle.upColor\": colorConfig.upColor,\n \"mainSeriesProperties.candleStyle.downColor\": colorConfig.downColor,\n \"mainSeriesProperties.candleStyle.borderColor\": colorConfig.upColor,\n \"mainSeriesProperties.candleStyle.borderUpColor\": colorConfig.upColor,\n \"mainSeriesProperties.candleStyle.borderDownColor\": colorConfig.downColor,\n \"mainSeriesProperties.candleStyle.wickUpColor\": colorConfig.upColor,\n \"mainSeriesProperties.candleStyle.wickDownColor\": colorConfig.downColor,\n \"paneProperties.separatorColor\": \"#2B2833\",\n \"paneProperties.vertGridProperties.color\": \"#26232F\",\n \"paneProperties.horzGridProperties.color\": \"#26232F\",\n \"scalesProperties.fontSize\": isMobile ? 8 : 12,\n \"scalesProperties.textColor\": \"#97969B\",\n \"paneProperties.legendProperties.showSeriesTitle\": isMobile ? false : true,\n \"mainSeriesProperties.statusViewStyle.symbolTextSource\": \"ticker\",\n \"mainSeriesProperties.statusViewStyle.showExchange\": false,\n };\n const studiesOverrides = {\n \"volume.volume.color.0\": colorConfig.volumeDownColor,\n \"volume.volume.color.1\": colorConfig.volumeUpColor,\n };\n\n return {\n overrides,\n studiesOverrides,\n };\n};\n\nexport const EXCHANGE = \"Orderly\";\nexport const EXCHANGE_DISPLAY = \"Kodiak\";\nexport const withoutExchangePrefix = (symbol: string) =>\n symbol.includes(\":\") ? symbol.split(\":\")[1] : symbol;\n\nexport const withExchangePrefix = (symbol: string) =>\n symbol.startsWith(`${EXCHANGE}:`) ? symbol : `${EXCHANGE}:${symbol}`;\n","import {IBrokerConnectionAdapterHost} from '../type';\nimport useBroker from '../hooks/useBroker';\nimport { SideType, AlgoType, OrderCombinationType} from \"../type\";\nimport { withoutExchangePrefix } from '../../utils/chart.util';\nimport { OrderType } from \"@kodiak-finance/orderly-types\";\n\nconst getBrokerAdapter = (host: IBrokerConnectionAdapterHost, broker: ReturnType<typeof useBroker>) => {\n let symbol: string;\n let _symbolInfo: any;\n const getOrderCombinationType = (orderType: any) => {\n return [\n null,\n 'limit',\n OrderCombinationType.MARKET,\n OrderCombinationType.STOP_MARKET,\n OrderCombinationType.STOP_LIMIT,\n ][orderType];\n };\n\n return {\n symbolInfo: async (symbol: string): Promise<any> => {\n _symbolInfo = broker.getSymbolInfo(withoutExchangePrefix(symbol));\n\n return {\n qty: {\n min: _symbolInfo?.baseMin ?? 0,\n max: _symbolInfo?.baseMax ?? 0,\n step: _symbolInfo?.baseTick ?? 0,\n },\n pipValue: 0,\n pipSize: _symbolInfo?.quoteTick ?? 0,\n minTick: _symbolInfo?.quoteTick ?? 0,\n description: '',\n };\n },\n placeOrder: async (order: any) => {\n const side = [SideType.SELL, SideType.BUY][+(order.side > 0)];\n const quantity = order.qty.toString();\n const limitPrice = (order.limitPrice ?? 0).toString();\n const triggerPrice = (order.stopPrice ?? 0).toString();\n const symbol = withoutExchangePrefix(order.symbol);\n const orderCombinationType = getOrderCombinationType(order.type);\n console.log('-- order orderCombinationType ', orderCombinationType);\n console.log('-- side, orderquantity ',side, quantity, limitPrice, triggerPrice, symbol);\n\n if (orderCombinationType === OrderCombinationType.MARKET) {\n console.log('--0 order', order);\n // @ts-ignore\n broker.sendMarketOrder({ side, order_quantity: quantity, symbol, order_type: OrderType.MARKET });\n } else if (orderCombinationType === OrderCombinationType.LIMIT) {\n // broker.sendLimitOrder({ side, orderQuantity: quantity, orderPrice: limitPrice, symbol });\n }\n },\n orders: () => [],\n positions: () => [],\n executions: () => [],\n connectionStatus: () => 1,\n chartContextMenuActions: (context: any) => host.defaultContextMenuActions(context),\n isTradable: async () => true,\n accountManagerInfo: () => ({}),\n currentAccount: () => '1',\n accountsMetainfo: async () => [{ id: '1' }],\n remove: () => host?.silentOrdersPlacement().unsubscribe(),\n }\n}\n\nexport default getBrokerAdapter;","export interface RequestParams {\n [paramName: string]: string | string[] | number;\n}\n\nexport interface UdfResponse {\n s: string;\n}\n\nexport interface UdfOkResponse extends UdfResponse {\n s: \"ok\";\n}\n\nexport interface UdfErrorResponse {\n s: \"error\";\n errmsg: string;\n}\n\n/**\n * If you want to enable logs from datafeed set it to `true`\n */\nconst isLoggingEnabled = false;\n\nexport function logMessage(message: string): void {\n if (isLoggingEnabled) {\n const now = new Date();\n // tslint:disable-next-line:no-console\n console.log(\n `${now.toLocaleTimeString()}.${now.getMilliseconds()}> ${message}`,\n );\n }\n}\n\nexport function getErrorMessage(error: string | Error | undefined): string {\n if (error === undefined) {\n return \"\";\n }\n if (typeof error === \"string\") {\n return error;\n }\n\n return error.message;\n}\n","import { Bar, HistoryMetadata, LibrarySymbolInfo, PeriodParams } from \"../type\";\nimport {\n RequestParams,\n UdfErrorResponse,\n UdfOkResponse,\n UdfResponse,\n getErrorMessage,\n} from \"./helpers\";\nimport { IRequester } from \"./iRequester\";\n\n// tslint:disable: no-any\ninterface HistoryPartialDataResponse extends UdfOkResponse {\n t: any;\n c: any;\n o?: never;\n h?: never;\n l?: never;\n v?: never;\n}\n\ninterface HistoryFullDataResponse extends UdfOkResponse {\n t: any;\n c: any;\n o: any;\n h: any;\n l: any;\n v: any;\n}\n\n// tslint:enable: no-any\ninterface HistoryNoDataResponse extends UdfResponse {\n s: \"no_data\";\n nextTime?: number;\n}\n\ntype HistoryResponse =\n | HistoryFullDataResponse\n | HistoryPartialDataResponse\n | HistoryNoDataResponse;\n\nexport type PeriodParamsWithOptionalCountback = Omit<\n PeriodParams,\n \"countBack\"\n> & { countBack?: number };\n\nexport interface GetBarsResult {\n bars: Bar[];\n meta: HistoryMetadata;\n}\n\nconst HISTORY_PATH = \"tv/history\";\nconst KLINE_HISTORY_PATH = \"v1/tv/kline_history\";\n\nexport interface LimitedResponseConfiguration {\n /**\n * Set this value to the maximum number of bars which\n * the data backend server can supply in a single response.\n * This doesn't affect or change the library behavior regarding\n * how many bars it will request. It just allows this Datafeed\n * implementation to correctly handle this situation.\n */\n maxResponseLength: number;\n /**\n * If the server can't return all the required bars in a single\n * response then `expectedOrder` specifies whether the server\n * will send the latest (newest) or earliest (older) data first.\n */\n expectedOrder: \"latestFirst\" | \"earliestFirst\";\n}\n\nexport class HistoryProvider {\n private _datafeedUrl: string;\n private readonly _requester: IRequester;\n private readonly _limitedServerResponse?: LimitedResponseConfiguration;\n\n private readonly _klinePreference = new Map<string, boolean>();\n\n /**\n * Static mapping table for resolution conversion\n * Maps TradingView resolution format to Kline History API resolution format\n * Key: TradingView resolution, Value: Kline History API resolution\n */\n private static readonly _RESOLUTION_MAP = new Map<string, string>([\n [\"1\", \"1m\"], // 1 minute\n [\"3\", \"3m\"], // 3 minutes\n [\"5\", \"5m\"], // 5 minutes\n [\"15\", \"15m\"], // 15 minutes\n [\"30\", \"30m\"], // 30 minutes\n [\"60\", \"1h\"], // 1 hour\n [\"240\", \"4h\"], // 4 hours\n [\"720\", \"12h\"], // 12 hours\n [\"1D\", \"1d\"], // 1 day\n [\"1W\", \"1w\"], // 1 week\n [\"1M\", \"1mon\"], // 1 month (mapped to 1m)\n ]);\n\n public constructor(\n datafeedUrl: string,\n requester: IRequester,\n limitedServerResponse?: LimitedResponseConfiguration,\n ) {\n this._datafeedUrl = datafeedUrl;\n this._requester = requester;\n this._limitedServerResponse = limitedServerResponse;\n }\n\n /**\n * Build request parameters for history API calls\n * @param symbolInfo - Symbol information\n * @param resolution - Resolution string\n * @param periodParams - Period parameters with optional countback\n * @returns Request parameters object\n */\n private _buildRequestParams(\n symbolInfo: LibrarySymbolInfo,\n resolution: string,\n periodParams: PeriodParamsWithOptionalCountback,\n ): RequestParams {\n const requestParams: RequestParams = {\n symbol: symbolInfo.ticker || \"\",\n resolution: resolution,\n from: periodParams.from,\n to: periodParams.to,\n };\n\n const countBack = Math.min(periodParams.countBack ?? 0, 1000);\n\n if (periodParams.countBack !== undefined) {\n requestParams.countback = countBack;\n }\n\n if (symbolInfo.currency_code !== undefined) {\n requestParams.currencyCode = symbolInfo.currency_code;\n }\n\n if (symbolInfo.unit_id !== undefined) {\n requestParams.unitId = symbolInfo.unit_id;\n }\n\n return requestParams;\n }\n\n public getBars(\n symbolInfo: LibrarySymbolInfo,\n resolution: string,\n periodParams: PeriodParamsWithOptionalCountback,\n ): Promise<GetBarsResult> {\n const requestParams = this._buildRequestParams(\n symbolInfo,\n resolution,\n periodParams,\n );\n\n const preferenceKey = this._getPreferenceKey(symbolInfo, resolution);\n const prefersKline = this._klinePreference.get(preferenceKey) === true;\n const countBack = Math.min(periodParams.countBack ?? 0, 1000);\n\n return new Promise(\n async (\n resolve: (result: GetBarsResult) => void,\n reject: (reason: string) => void,\n ) => {\n try {\n let result: GetBarsResult;\n let usedHistoryResult = false;\n\n if (prefersKline) {\n result = await this._requestKlineHistory(\n this._buildKlineParams(requestParams, countBack),\n );\n } else {\n const initialResponse = await this._requestHistory(requestParams);\n result = this._processHistoryResponse(initialResponse);\n usedHistoryResult = true;\n\n const needsFallback = this._shouldFallbackToKline(\n initialResponse,\n countBack,\n );\n\n if (needsFallback) {\n const klineResult = await this._tryKlineFallback(\n requestParams,\n countBack,\n );\n if (klineResult !== null) {\n result = klineResult;\n usedHistoryResult = false;\n this._klinePreference.set(preferenceKey, true);\n } else {\n this._klinePreference.set(preferenceKey, false);\n }\n } else {\n this._klinePreference.set(preferenceKey, false);\n }\n }\n\n if (usedHistoryResult && this._limitedServerResponse) {\n await this._processTruncatedResponse(result, { ...requestParams });\n }\n\n resolve(result);\n } catch (e: unknown) {\n const error =\n e instanceof Error ? e : typeof e === \"string\" ? e : undefined;\n const reasonString = getErrorMessage(error);\n // tslint:disable-next-line:no-console\n console.warn(\n `HistoryProvider: getBars() failed, error=${reasonString}`,\n );\n reject(reasonString || \"Error\");\n }\n },\n );\n }\n\n /**\n * Request kline history using KLINE_HISTORY_PATH endpoint\n * Handles rate limiting (429 errors) by waiting and retrying\n * @param requestParams - Request parameters\n * @param retryCount - Current retry attempt (internal use)\n * @returns Processed history response\n */\n private async _requestKlineHistory(\n requestParams: RequestParams,\n retryCount: number = 0,\n ): Promise<GetBarsResult> {\n const maxRetries = 5;\n const baseRetryDelay = 2500; // 2.5 seconds base delay (slightly more than 2s to avoid hitting limit)\n const maxRetryDelay = 10000; // Maximum 10 seconds delay\n\n // Build URL with query parameters\n const params: RequestParams = {\n ...requestParams,\n resolution: this._mapToKlineHistoryResolution(\n requestParams.resolution as string,\n ),\n };\n const urlPath = this._buildUrlWithParams(KLINE_HISTORY_PATH, params);\n\n // Make request with fetch to check HTTP status code\n const options: RequestInit = { credentials: \"same-origin\" };\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const requesterWithHeaders = this._requester as any;\n if (requesterWithHeaders._headers !== undefined) {\n options.headers = requesterWithHeaders._headers;\n }\n\n let response: Response;\n try {\n response = await fetch(`${this._datafeedUrl}/${urlPath}`, options);\n } catch (error) {\n // Network error, don't retry for rate limiting\n throw error;\n }\n\n // Check if we hit rate limit (429) - handle this BEFORE any JSON parsing\n if (response.status === 429) {\n if (retryCount >= maxRetries) {\n throw new Error(\n `Rate limit exceeded: Maximum retry attempts (${maxRetries}) reached`,\n );\n }\n\n // Calculate retry delay with exponential backoff\n const retryDelay = Math.min(\n baseRetryDelay * Math.pow(2, retryCount),\n maxRetryDelay,\n );\n\n // Check if response has Retry-After header\n const retryAfter = response.headers.get(\"Retry-After\");\n const delay = retryAfter ? parseInt(retryAfter, 10) * 1000 : retryDelay;\n\n // IMPORTANT: Wait BEFORE retrying to avoid hitting rate limit again\n await new Promise((resolve) => setTimeout(resolve, delay));\n\n // Retry the request after waiting\n return this._requestKlineHistory(requestParams, retryCount + 1);\n }\n\n // Check if response is not OK (but not 429, which we already handled)\n if (!response.ok) {\n const errorData = await response.json().catch(() => ({\n message: response.statusText,\n }));\n throw new Error(\n errorData.message || errorData.errmsg || response.statusText,\n );\n }\n\n // Parse response JSON\n let data: HistoryResponse | UdfErrorResponse;\n try {\n data = await response.json();\n } catch {\n throw new Error(\"Failed to parse response JSON\");\n }\n\n // Process the response (this will handle errors if response.s === \"error\")\n return this._processHistoryResponse(data);\n }\n\n /**\n * Process truncated response by making follow-up requests if needed\n * @param result - Current result with bars\n * @param requestParams - Request parameters\n */\n private async _processTruncatedResponse(\n result: GetBarsResult,\n requestParams: RequestParams,\n ) {\n let lastResultLength = result.bars.length;\n try {\n while (\n this._limitedServerResponse &&\n this._limitedServerResponse.maxResponseLength > 0 &&\n this._limitedServerResponse.maxResponseLength === lastResultLength &&\n requestParams.from < requestParams.to\n ) {\n // adjust request parameters for follow-up request\n if (requestParams.countback) {\n requestParams.countback =\n (requestParams.countback as number) - lastResultLength;\n }\n if (this._limitedServerResponse.expectedOrder === \"earliestFirst\") {\n requestParams.from = Math.round(\n result.bars[result.bars.length - 1].time / 1000,\n );\n } else {\n requestParams.to = Math.round(result.bars[0].time / 1000);\n }\n\n const followupResponse =\n await this._requester.sendRequest<HistoryResponse>(\n this._datafeedUrl,\n HISTORY_PATH,\n requestParams,\n );\n const followupResult = this._processHistoryResponse(followupResponse);\n lastResultLength = followupResult.bars.length;\n // merge result with results collected so far\n if (this._limitedServerResponse.expectedOrder === \"earliestFirst\") {\n if (\n followupResult.bars[0].time ===\n result.bars[result.bars.length - 1].time\n ) {\n // Datafeed shouldn't include a value exactly matching the `to` timestamp but in case it does\n // we will remove the duplicate.\n followupResult.bars.shift();\n }\n result.bars.push(...followupResult.bars);\n } else {\n if (\n followupResult.bars[followupResult.bars.length - 1].time ===\n result.bars[0].time\n ) {\n // Datafeed shouldn't include a value exactly matching the `to` timestamp but in case it does\n // we will remove the duplicate.\n followupResult.bars.pop();\n }\n result.bars.unshift(...followupResult.bars);\n }\n }\n } catch (e: unknown) {\n /**\n * Error occurred during followup request. We won't reject the original promise\n * because the initial response was valid so we will return what we've got so far.\n */\n if (e instanceof Error || typeof e === \"string\") {\n const reasonString = getErrorMessage(e);\n // tslint:disable-next-line:no-console\n console.warn(\n `HistoryProvider: getBars() warning during followup request, error=${reasonString}`,\n );\n }\n }\n }\n\n private _processHistoryResponse(\n response: HistoryResponse | UdfErrorResponse,\n ) {\n if (response.s !== \"ok\" && response.s !== \"no_data\") {\n throw new Error(response.errmsg);\n }\n\n const bars: Bar[] = [];\n const meta: HistoryMetadata = {\n noData: false,\n };\n\n if (response.s === \"no_data\") {\n meta.noData = true;\n meta.nextTime = response.nextTime;\n } else {\n const volumePresent = response.v !== undefined;\n const ohlPresent = response.o !== undefined;\n\n for (let i = 0; i < response.t.length; ++i) {\n const barValue: Bar = {\n time: response.t[i] * 1000,\n close: parseFloat(response.c[i]),\n open: parseFloat(response.c[i]),\n high: parseFloat(response.c[i]),\n low: parseFloat(response.c[i]),\n };\n\n if (ohlPresent) {\n barValue.open = parseFloat(\n (response as HistoryFullDataResponse).o[i],\n );\n barValue.high = parseFloat(\n (response as HistoryFullDataResponse).h[i],\n );\n barValue.low = parseFloat((response as HistoryFullDataResponse).l[i]);\n }\n\n if (volumePresent) {\n const volume = parseFloat((response as HistoryFullDataResponse).v[i]);\n if (volume > 0) {\n barValue.volume = volume;\n } else {\n barValue.volume = 0.0000000001;\n }\n }\n\n bars.push(barValue);\n }\n\n // const firstBarTime = response.t[0] * 1000;\n\n // meta.nextTime = firstBarTime;\n }\n\n return {\n bars: bars,\n meta: meta,\n };\n }\n\n /**\n * Maps TradingView resolution format to Kline History API resolution format\n * @param resolution - TradingView resolution string (e.g., \"1\", \"60\", \"1D\")\n * @returns Kline History API resolution string (e.g., \"1m\", \"1h\", \"1d\")\n */\n private _mapToKlineHistoryResolution(resolution: string): string {\n return HistoryProvider._RESOLUTION_MAP.get(resolution) ?? resolution;\n }\n\n private _buildUrlWithParams(path: string, params?: RequestParams): string {\n if (!params || Object.keys(params).length === 0) {\n return path;\n }\n\n const searchParams = new URLSearchParams();\n Object.keys(params).forEach((key) => {\n const value = params[key];\n if (Array.isArray(value)) {\n value.forEach((item) => searchParams.append(key, item));\n } else {\n searchParams.append(key, value.toString());\n }\n });\n\n const queryString = searchParams.toString();\n return queryString ? `${path}?${queryString}` : path;\n }\n\n private _getPreferenceKey(\n symbolInfo: LibrarySymbolInfo,\n resolution: string,\n ): string {\n return `${symbolInfo.ticker ?? \"\"}|${resolution}`;\n }\n\n private _requestHistory(requestParams: RequestParams) {\n return this._requester.sendRequest<HistoryResponse>(\n this._datafeedUrl,\n HISTORY_PATH,\n requestParams,\n );\n }\n\n private _buildKlineParams(\n requestParams: RequestParams,\n countBack: number,\n ): RequestParams {\n const params: RequestParams = {\n ...requestParams,\n };\n\n delete params.countback;\n if (countBack > 0) {\n params.limit = countBack;\n } else {\n delete params.limit;\n }\n\n return params;\n }\n\n private async _tryKlineFallback(\n requestParams: RequestParams,\n countBack: number,\n ): Promise<GetBarsResult | null> {\n try {\n const result = await this._requestKlineHistory(\n this._buildKlineParams(requestParams, countBack),\n );\n return result.bars.length > 0 ? result : null;\n } catch {\n return null;\n }\n }\n\n private _shouldFallbackToKline(\n response: HistoryResponse | UdfErrorResponse,\n expectedCount: number,\n ): boolean {\n if (response.s !== \"ok\") {\n return false;\n }\n\n const barsCount = response.t.length;\n if (expectedCount > 0 && barsCount < expectedCount) {\n return true;\n }\n\n if (\n this._limitedServerResponse &&\n this._limitedServerResponse.maxResponseLength > 0 &&\n barsCount >= this._limitedServerResponse.maxResponseLength\n ) {\n return true;\n }\n\n return false;\n }\n}\n","/* eslint-disable */\nimport {\n RequestParams,\n UdfErrorResponse,\n UdfResponse,\n logMessage,\n} from \"./helpers\";\n\nexport class Requester {\n private _headers: HeadersInit | undefined;\n\n public constructor(headers?: HeadersInit) {\n if (headers) {\n this._headers = headers;\n }\n }\n\n public sendRequest<T extends UdfResponse>(\n datafeedUrl: string,\n urlPath: string,\n params?: RequestParams,\n ): Promise<T | UdfErrorResponse>;\n public sendRequest<T>(\n datafeedUrl: string,\n urlPath: string,\n params?: RequestParams,\n ): Promise<T>;\n public sendRequest<T>(\n datafeedUrl: string,\n urlPath: string,\n params?: RequestParams,\n ): Promise<T> {\n if (params !== undefined) {\n const paramKeys = Object.keys(params);\n if (paramKeys.length !== 0) {\n urlPath += \"?\";\n }\n\n urlPath += paramKeys\n .map((key: string) => {\n return `${encodeURIComponent(key)}=${encodeURIComponent(\n params[key].toString(),\n )}`;\n })\n .join(\"&\");\n }\n\n logMessage(\"New request: \" + urlPath);\n\n // Send user cookies if the URL is on the same origin as the calling script.\n const options: RequestInit = { credentials: \"same-origin\" };\n\n if (this._headers !== undefined) {\n options.headers = this._headers;\n }\n\n return (\n fetch(`${datafeedUrl}/${urlPath}`, options)\n // .then((response: Response) => response.text())\n .then((response: Response) => response.json())\n .then((data: any) => {\n if (typeof data.success === \"undefined\") {\n return data;\n }\n if (!data.success) {\n throw new Error(data.message);\n }\n return data;\n })\n );\n // .then((responseTest: string) => JSON.parse(responseTest));\n }\n}\n","/* eslint-disable */\nimport {\n LibrarySymbolInfo,\n ResolutionString,\n SearchSymbolResultItem,\n VisiblePlotsSet,\n} from \"../type\";\nimport { getErrorMessage, logMessage } from \"./helpers\";\nimport { IRequester } from \"./iRequester\";\n\ninterface SymbolInfoMap {\n [symbol: string]: LibrarySymbolInfo | undefined;\n}\n\ninterface ExchangeDataResponseSymbolData {\n type: string;\n timezone: LibrarySymbolInfo[\"timezone\"];\n description: string;\n\n \"exchange-listed\": string;\n \"exchange-traded\": string;\n\n \"session-regular\": string;\n corrections?: string;\n \"session-holidays\"?: string;\n\n fractional: boolean;\n\n pricescale: number;\n\n ticker?: string;\n\n minmov2?: number;\n minmove2?: number;\n\n minmov?: number;\n minmovement?: number;\n\n \"supported-resolutions\"?: ResolutionString[];\n \"intraday-multipliers\"?: string[];\n\n \"has-intraday\"?: boolean;\n \"has-daily\"?: boolean;\n \"has-weekly-and-monthly\"?: boolean;\n \"has-empty-bars\"?: boolean;\n \"visible-plots-set\"?: VisiblePlotsSet;\n \"currency-code\"?: string;\n \"original-currency-code\"?: string;\n \"unit-id\"?: string;\n \"original-unit-id\"?: string;\n \"unit-conversion-types\"?: string[];\n\n \"volume-precision\"?: number;\n}\n\n// Here is some black magic with types to get compile-time checks of names and types\ntype PickArrayedObjectFields<T> = Pick<\n T,\n {\n // tslint:disable-next-line:no-any\n [K in keyof T]-?: NonNullable<T[K]> extends any[] ? K : never;\n }[keyof T]\n>;\n\ntype ExchangeDataResponseArrayedSymbolData =\n PickArrayedObjectFields<ExchangeDataResponseSymbolData>;\ntype ExchangeDataResponseNonArrayedSymbolData = Pick<\n ExchangeDataResponseSymbolData,\n Exclude<\n keyof ExchangeDataResponseSymbolData,\n keyof ExchangeDataResponseArrayedSymbolData\n >\n>;\n\ntype ExchangeDataResponse = {\n symbol: string[];\n} & {\n [K in keyof ExchangeDataResponseSymbolData]:\n | ExchangeDataResponseSymbolData[K]\n | NonNullable<ExchangeDataResponseSymbolData[K]>[];\n};\n\nfunction extractField<\n Field extends keyof ExchangeDataResponseNonArrayedSymbolData,\n>(\n data: ExchangeDataResponse,\n field: Field,\n arrayIndex: number,\n): ExchangeDataResponseNonArrayedSymbolData[Field];\nfunction extractField<\n Field extends keyof ExchangeDataResponseArrayedSymbolData,\n>(\n data: ExchangeDataResponse,\n field: Field,\n arrayIndex: number,\n valueIsArray: true,\n): ExchangeDataResponseArrayedSymbolData[Field];\nfunction extractField<Field extends keyof ExchangeDataResponseSymbolData>(\n data: ExchangeDataResponse,\n field: Field,\n arrayIndex: number,\n valueIsArray?: boolean,\n): ExchangeDataResponseSymbolData[Field] {\n const value: ExchangeDataResponse[keyof ExchangeDataResponseSymbolData] =\n data[field];\n\n if (Array.isArray(value) && (!valueIsArray || Array.isArray(value[0]))) {\n return value[arrayIndex] as ExchangeDataResponseSymbolData[Field];\n }\n\n return value as ExchangeDataResponseSymbolData[Field];\n}\n\nfunction symbolKey(symbol: string, currency?: string, unit?: string): string {\n // here we're using a separator that quite possible shouldn't be in a real symbol name\n return (\n symbol +\n (currency !== undefined ? \"_%|#|%_\" + currency : \"\") +\n (unit !== undefined ? \"_%|#|%_\" + unit : \"\")\n );\n}\n\nexport class SymbolsStorage {\n private readonly _exchangesList: string[] = [\"Orderly\"];\n private readonly _symbolsInfo: SymbolInfoMap = {};\n private readonly _symbolsList: string[] = [];\n private readonly _datafeedUrl: string;\n private readonly _readyPromise: Promise<void>;\n private readonly _datafeedSupportedResolutions: ResolutionString[];\n private readonly _requester: IRequester;\n\n public constructor(\n datafeedUrl: string,\n datafeedSupportedResolutions: ResolutionString[],\n requester: IRequester,\n ) {\n this._datafeedUrl = datafeedUrl;\n this._datafeedSupportedResolutions = datafeedSupportedResolutions;\n this._requester = requester;\n this._readyPromise = this._init();\n this._readyPromise.catch((error: Error) => {\n // seems it is impossible\n // tslint:disable-next-line:no-console\n console.error(`SymbolsStorage: Cannot init, error=${error.toString()}`);\n });\n }\n\n // BEWARE: this function does not consider symbol's exchange\n public resolveSymbol(\n symbolName: string,\n currencyCode?: string,\n unitId?: string,\n ): Promise<LibrarySymbolInfo> {\n return this._readyPromise.then(() => {\n const symbolInfo =\n this._symbolsInfo[symbolKey(symbolName, currencyCode, unitId)];\n if (symbolInfo === undefined) {\n return Promise.reject(\"invalid symbol\");\n }\n\n return Promise.resolve(symbolInfo);\n });\n }\n\n public searchSymbols(\n searchString: string,\n exchange: string,\n symbolType: string,\n maxSearchResults: number,\n ): Promise<SearchSymbolResultItem[]> {\n interface WeightedItem {\n symbolInfo: LibrarySymbolInfo;\n weight: number;\n }\n\n return this._readyPromise.then(() => {\n const weightedResult: WeightedItem[] = [];\n const queryIsEmpty = searchString.length === 0;\n\n searchString = searchString.toUpperCase();\n\n for (const symbolName of this._symbolsList) {\n const symbolInfo = this._symbolsInfo[symbolName];\n\n if (symbolInfo === undefined) {\n continue;\n }\n\n if (symbolType.length > 0 && symbolInfo.type !== symbolType) {\n continue;\n }\n\n if (\n exchange &&\n exchange.length > 0 &&\n symbolInfo.exchange !== exchange\n ) {\n continue;\n }\n\n const positionInName = symbolInfo.name\n .toUpperCase()\n .indexOf(searchString);\n const positionInDescription = symbolInfo.description\n .toUpperCase()\n .indexOf(searchString);\n\n if (queryIsEmpty || positionInName >= 0 || positionInDescription >= 0) {\n const alreadyExists = weightedResult.some(\n (item: WeightedItem) => item.symbolInfo === symbolInfo,\n );\n if (!alreadyExists) {\n const weight =\n positionInName >= 0\n ? positionInName\n : 8000 + positionInDescription;\n weightedResult.push({ symbolInfo: symbolInfo, weight: weight });\n }\n }\n }\n\n const result = weightedResult\n .sort(\n (item1: WeightedItem, item2: WeightedItem) =>\n item1.weight - item2.weight,\n )\n .slice(0, maxSearchResults)\n .map((item: WeightedItem) => {\n const symbolInfo = item.symbolInfo;\n return {\n symbol: symbolInfo.name,\n full_name: `${symbolInfo.exchange}:${symbolInfo.name}`,\n description: symbolInfo.description,\n exchange: symbolInfo.exchange,\n params: [],\n type: symbolInfo.type,\n ticker: symbolInfo.name,\n };\n });\n\n return Promise.resolve(result);\n });\n }\n\n private _init(): Promise<void> {\n interface BooleanMap {\n [key: string]: boolean | undefined;\n }\n\n const promises: Promise<void>[] = [];\n const alreadyRequestedExchanges: BooleanMap = {};\n\n for (const exchange of this._exchangesList) {\n if (alreadyRequestedExchanges[exchange]) {\n continue;\n }\n\n alreadyRequestedExchanges[exchange] = true;\n promises.push(this._requestExchangeData(exchange));\n }\n\n return Promise.all(promises).then(() => {\n this._symbolsList.sort();\n logMessage(\"SymbolsStorage: All exchanges data loaded\");\n });\n }\n\n private _requestExchangeData(exchange: string): Promise<void> {\n return new Promise(\n (resolve: () => void, reject: (error: Error) => void) => {\n this._requester\n .sendRequest<ExchangeDataResponse>(\n this._datafeedUrl,\n \"tv/symbol_info\",\n {\n group: exchange,\n },\n )\n .then((response: ExchangeDataResponse) => {\n try {\n this._onExchangeDataReceived(exchange, response);\n } catch (error) {\n reject(\n error instanceof Error\n ? error\n : new Error(`SymbolsStorage: Unexpected exception ${error}`),\n );\n return;\n }\n\n resolve();\n })\n .catch((reason?: string | Error) => {\n logMessage(\n `SymbolsStorage: Request data for exchange '${exchange}' failed, reason=${getErrorMessage(\n reason,\n )}`,\n );\n resolve();\n });\n },\n );\n }\n\n private _onExchangeDataReceived(\n exchange: string,\n data: ExchangeDataResponse,\n ): void {\n let symbolIndex = 0;\n\n try {\n const symbolsCount = data.symbol.length;\n const tickerPresent = data.ticker !== undefined;\n\n for (; symbolIndex < symbolsCount; ++symbolIndex) {\n const symbolName = data.symbol[symbolIndex];\n const listedExchange = extractField(\n data,\n \"exchange-listed\",\n symbolIndex,\n );\n const tradedExchange = extractField(\n data,\n \"exchange-traded\",\n symbolIndex,\n );\n const fullName = tradedExchange + \":\" + symbolName;\n const currencyCode = extractField(data, \"currency-code\", symbolIndex);\n const unitId = extractField(data, \"unit-id\", symbolIndex);\n\n const ticker = tickerPresent\n ? (extractField(data, \"ticker\", symbolIndex) as string)\n : symbolName;\n\n const symbolInfo: LibrarySymbolInfo = {\n ticker: ticker,\n name: symbolName,\n base_name: [listedExchange + \":\" + symbolName],\n listed_exchange: listedExchange,\n exchange: tradedExchange,\n currency_code: currencyCode,\n original_currency_code: extractField(\n data,\n \"original-currency-code\",\n symbolIndex,\n ),\n unit_id: unitId,\n original_unit_id: extractField(data, \"original-unit-id\", symbolIndex),\n unit_conversion_types: extractField(\n data,\n \"unit-conversion-types\",\n symbolIndex,\n true,\n ),\n description: extractField(data, \"description\", symbolIndex),\n has_intraday: definedValueOrDefault(\n extractField(data, \"has-intraday\", symbolIndex),\n false,\n ),\n // show volume at the bottom by default: https://github.com/tradingview/charting_library/issues/8306\n visible_plots_set: definedValueOrDefault(\n extractField(data, \"visible-plots-set\", symbolIndex),\n \"ohlcv\",\n ),\n minmov:\n extractField(data, \"minmovement\", symbolIndex) ||\n extractField(data, \"minmov\", symbolIndex) ||\n 0,\n minmove2:\n extractField(data, \"minmove2\", symbolIndex) ||\n extractField(data, \"minmov2\", symbolIndex),\n fractional: extractField(data, \"fractional\", symbolIndex),\n pricescale: extractField(data, \"pricescale\", symbolIndex),\n type: extractField(data, \"type\", symbolIndex),\n session: extractField(data, \"session-regular\", symbolIndex),\n session_holidays: extractField(data, \"session-holidays\", symbolIndex),\n corrections: extractField(data, \"corrections\", symbolIndex),\n timezone: extractField(data, \"timezone\", symbolIndex),\n supported_resolutions: definedValueOrDefault(\n extractField(data, \"supported-resolutions\", symbolIndex, true),\n this._datafeedSupportedResolutions,\n ),\n\n has_daily: definedValueOrDefault(\n extractField(data, \"has-daily\", symbolIndex),\n true,\n ),\n intraday_multipliers: definedValueOrDefault(\n extractField(data, \"intraday-multipliers\", symbolIndex, true),\n [\"1\", \"5\", \"15\", \"30\", \"60\"],\n ),\n // daily_multipliers:[\"1\"],\n // has_weekly_and_monthly: extractField(\n // data,\n // \"has-weekly-and-monthly\",\n // symbolIndex,\n // ),\n has_weekly_and_monthly: true,\n has_empty_bars: extractField(data, \"has-empty-bars\", symbolIndex),\n volume_precision: definedValueOrDefault(\n extractField(data, \"volume-precision\", symbolIndex),\n 0,\n ),\n format: \"price\",\n };\n\n this._symbolsInfo[ticker] = symbolInfo;\n this._symbolsInfo[symbolName] = symbolInfo;\n this._symbolsInfo[fullName] = symbolInfo;\n if (currencyCode !== undefined || unitId !== undefined) {\n this._symbolsInfo[symbolKey(ticker, currencyCode, unitId)] =\n symbolInfo;\n this._symbolsInfo[symbolKey(symbolName, currencyCode, unitId)] =\n symbolInfo;\n this._symbolsInfo[symbolKey(fullName, currencyCode, unitId)] =\n symbolInfo;\n }\n\n this._symbolsList.push(symbolName);\n }\n } catch (error) {\n throw new Error(\n `SymbolsStorage: API error when processing exchange ${exchange} symbol #${symbolIndex} (${\n data.symbol[symbolIndex]\n }): ${Object(error).message}`,\n );\n }\n }\n}\n\nfunction definedValueOrDefault<T>(value: T | undefined, defaultValue: T): T {\n return value !== undefined ? value : defaultValue;\n}\n","import {\n DatafeedConfiguration,\n ErrorCallback,\n HistoryCallback,\n LibrarySymbolInfo,\n OnReadyCallback,\n QuotesCallback,\n ResolutionString,\n ResolveCallback,\n SearchSymbolResultItem,\n SearchSymbolsCallback,\n SubscribeBarsCallback,\n SymbolResolveExtension,\n} from \"../type\";\nimport { RequestParams, getErrorMessage, logMessage } from \"./helpers\";\nimport {\n GetBarsResult,\n HistoryProvider,\n PeriodParamsWithOptionalCountback,\n} from \"./history-provider\";\nimport { Requester } from \"./requester\";\nimport { SymbolsStorage } from \"./symbol-storage\";\n\nexport interface UdfCompatibleConfiguration extends DatafeedConfiguration {\n // tslint:disable:tv-variable-name\n supports_search?: boolean;\n supports_group_request?: boolean;\n // tslint:enable:tv-variable-name\n}\n\nexport interface ResolveSymbolResponse extends LibrarySymbolInfo {\n s: undefined;\n}\n\n// it is hack to let's TypeScript make code flow analysis\nexport interface UdfSearchSymbolsResponse\n extends Array<SearchSymbolResultItem> {\n s?: undefined;\n}\n\nexport const enum Constants {\n SearchItemsLimit = 30,\n}\n\nexport abstract class AbstractDatafeed {\n protected _configuration: UdfCompatibleConfiguration = defaultConfiguration();\n\n private readonly _datafeedURL: string;\n\n private readonly _configurationReadyPromise: Promise<void>;\n\n private _symbolsStorage: SymbolsStorage | null = null;\n\n private readonly _historyProvider: HistoryProvider;\n\n private readonly _requester: Requester;\n\n private _historyCursor: number | null = null;\n\n constructor(datafeedURL: string) {\n this._datafeedURL = datafeedURL;\n this._requester = new Requester();\n this._historyProvider = new HistoryProvider(datafeedURL, this._requester);\n\n this._configurationReadyPromise = this._requestConfiguration().then(\n (configuration: UdfCompatibleConfiguration | null) => {\n if (configuration === null) {\n configuration = defaultConfiguration();\n }\n\n this._setupWithConfiguration(configuration);\n },\n );\n }\n\n public getBars(\n symbolInfo: LibrarySymbolInfo,\n resolution: ResolutionString,\n periodParams: PeriodParamsWithOptionalCountback,\n onResult: HistoryCallback,\n onError: ErrorCallback,\n ): void {\n const { to, firstDataRequest } = periodParams;\n if (firstDataRequest || this._historyCursor === null) {\n this._historyCursor = to;\n }\n\n const resolutionInSeconds = this._resolutionToSeconds(resolution);\n const cursor = this._historyCursor ?? to;\n const maxBarsPerRequest = 1000;\n\n const shouldUseOriginalRange =\n resolution.toLowerCase?.() === \"1m\" && periodParams.from !== undefined;\n // When using 1m candles we trust the caller's original range to avoid clamping the window to epoch start\n const barsToLoad = shouldUseOriginalRange\n ? (periodParams.countBack ?? maxBarsPerRequest)\n : maxBarsPerRequest;\n const requestTo = shouldUseOriginalRange ? (periodParams.to ?? to) : cursor;\n const requestFrom = shouldUseOriginalRange\n ? periodParams.from!\n : Math.max(requestTo - resolutionInSeconds * barsToLoad, 0);\n\n this._historyProvider\n .getBars(symbolInfo, resolution, {\n ...periodParams,\n countBack: barsToLoad,\n from: requestFrom,\n to: requestTo,\n })\n .then(\n (result: GetBarsResult) => {\n if (result.bars.length > 0) {\n this._historyCursor = Math.floor(result.bars[0].time / 1000) - 1;\n }\n\n onResult(result.bars, result.meta);\n },\n (error) => {\n onError(error);\n },\n )\n .catch((error) => {\n onError(error);\n });\n }\n\n private _resolutionToSeconds(resolution: ResolutionString): number {\n // Handle special time formats first (1D, 3D, 1W, 1M, etc.)\n switch (resolution) {\n case \"1D\":\n return 86400;\n case \"3D\":\n return 86400 * 3;\n case \"1W\":\n return 86400 * 7;\n case \"1M\":\n return 86400 * 30;\n }\n\n // Handle numeric resolutions (minutes)\n const res = parseInt(resolution);\n if (!isNaN(res)) {\n return res * 60;\n }\n\n // Default to 1 minute\n return 60;\n }\n\n // @ts-ignore\n public abstract subscribeBars(\n symbolInfo: LibrarySymbolInfo,\n resolution: ResolutionString,\n onTick: SubscribeBarsCallback,\n listenerGuid: string,\n onResetCacheNeededCallback: () => void,\n );\n\n public onReady(callback: OnReadyCallback): void {\n this._configurationReadyPromise.then(() => {\n callback(this._configuration);\n });\n }\n\n public searchSymbols(\n userInput: string,\n exchange: string,\n symbolType: string,\n onResult: SearchSymbolsCallback,\n ): void {\n if (this._symbolsStorage === null) {\n throw new Error(\"Datafeed: inconsistent configuration (symbols storage)\");\n }\n\n this._symbolsStorage\n .searchSymbols(\n userInput,\n exchange,\n symbolType,\n Constants.SearchItemsLimit,\n )\n .then(onResult)\n .catch(onResult.bind(null, []));\n }\n\n public resolveSymbol(\n symbolName: string,\n onResolve: ResolveCallback,\n onError: ErrorCallback,\n extension?: SymbolResolveExtension,\n ): void {\n const currencyCode = extension && extension.currencyCode;\n const unitId = extension && extension.unitId;\n\n const resolveRequestStartTime = Date.now();\n\n function onResultReady(symbolInfo: LibrarySymbolInfo): void {\n logMessage(`Symbol resolved: ${Date.now() - resolveRequestStartTime}ms`);\n onResolve(symbolInfo);\n }\n\n if (this._symbolsStorage === null) {\n throw new Error(\"Datafeed: inconsistent configuration (symbols storage)\");\n }\n\n this._symbolsStorage\n .resolveSymbol(symbolName, currencyCode, unitId)\n .then(onResultReady)\n .catch(onError);\n }\n\n public abstract unsubscribeBars(listenerGuid: string): void;\n\n public getMarks(): void {\n /* not supported */\n }\n\n public getTimescaleMarks(): void {\n /* not supported */\n }\n\n public getServerTime(): void {\n /* not supported */\n }\n\n public abstract getQuotes(\n symbols: string[],\n onDataCallback: QuotesCallback,\n onErrorCallback: (msg: string) => void,\n ): void;\n\n public abstract subscribeQuotes(\n symbols: string[],\n fastSymbols: string[],\n onRealtimeCallback: QuotesCallback,\n listenerGuid: string,\n ): void;\n\n public abstract unsubscribeQuotes(listenerGuid: string): void;\n\n public abstract remove(): void;\n\n protected _requestConfiguration(): Promise<UdfCompatibleConfiguration | null> {\n return this._send<UdfCompatibleConfiguration>(\"tv/config\").catch(\n (reason?: string | Error) => {\n logMessage(\n `Datafeed: Cannot get datafeed configuration - use default, error=${getErrorMessage(\n reason,\n )}`,\n );\n return null;\n },\n );\n }\n\n private _send<T>(urlPath: string, params?: RequestParams): Promise<T> {\n return this._requester.sendRequest<T>(this._datafeedURL, urlPath, params);\n }\n\n private _setupWithConfiguration(\n configurationData: UdfCompatibleConfiguration,\n ): void {\n this._configuration = configurationData;\n\n if (configurationData.exchanges === undefined) {\n configurationData.exchanges = [];\n }\n\n if (\n !configurationData.supports_search &&\n !configurationData.supports_group_request\n ) {\n throw new Error(\n \"Unsupported datafeed configuration. Must either support search, or support group request\",\n );\n }\n\n if (\n configurationData.supports_group_request ||\n !configurationData.supports_search\n ) {\n this._symbolsStorage = new SymbolsStorage(\n this._datafeedURL,\n configurationData.supported_resolutions || [],\n this._requester,\n );\n }\n\n logMessage(\n `Datafeed: Initialized with ${JSON.stringify(configurationData)}`,\n );\n }\n}\n\nfunction defaultConfiguration(): UdfCompatibleConfiguration {\n return {\n supports_search: false,\n supports_group_request: true,\n supported_resolutions: [\n \"1\" as ResolutionString,\n \"3\" as ResolutionString,\n \"5\" as ResolutionString,\n \"15\" as ResolutionString,\n \"30\" as ResolutionString,\n \"60\" as ResolutionString,\n \"120\" as ResolutionString,\n \"240\" as ResolutionString,\n \"480\" as ResolutionString,\n \"720\" as ResolutionString,\n \"1D\" as ResolutionString,\n \"3D\" as ResolutionString,\n \"1W\" as ResolutionString,\n \"1M\" as ResolutionString,\n ],\n supports_marks: false,\n supports_timescale_marks: false,\n };\n}\n","export class MultiBroadcastEventBus {\n private subscribers: Map<string, Array<(data: any) => void>> = new Map();\n\n subscribe(eventName: string, callback: (data: any) => void): () => void {\n if (!this.subscribers.has(eventName)) {\n this.subscribers.set(eventName, []);\n }\n const callbacks = this.subscribers.get(eventName)!;\n callbacks.push(callback);\n\n return () => {\n this.unsubscribe(eventName, callback);\n };\n }\n\n unsubscribe(eventName: string, callback: (data: any) => void): void {\n if (this.subscribers.has(eventName)) {\n const callbacks = this.subscribers.get(eventName)!;\n this.subscribers.set(\n eventName,\n callbacks.filter((cb) => cb !== callback)\n );\n if (this.subscribers.get(eventName)!.length === 0) {\n this.subscribers.delete(eventName);\n }\n }\n }\n\n publish(eventName: string, data: any): void {\n if (this.subscribers.has(eventName)) {\n const callbacks = this.subscribers.get(eventName)!;\n callbacks.forEach((callback) => {\n callback(data);\n });\n }\n }\n}\n","export enum KlineResolution {\n RESOLUTION_1m = '1',\n RESOLUTION_3m = '3',\n RESOLUTION_5m = '5',\n RESOLUTION_15m = '15',\n RESOLUTION_30m = '30',\n RESOLUTION_60m = '60',\n RESOLUTION_120m = '120',\n RESOLUTION_240m = '240',\n RESOLUTION_480m = '480',\n RESOLUTION_720m = '720',\n RESOLUTION_D = 'D',\n RESOLUTION_1D = '1D',\n RESOLUTION_3D = '3D',\n RESOLUTION_1W = '1W',\n RESOLUTION_1M = '1M',\n}\nexport const mapResolution = (resolution: any) => {\n let time = '1d';\n switch (resolution) {\n case KlineResolution.RESOLUTION_1m:\n time = '1m';\n break;\n case KlineResolution.RESOLUTION_3m:\n time = '3m';\n break;\n case KlineResolution.RESOLUTION_5m:\n time = '5m';\n break;\n case KlineResolution.RESOLUTION_15m:\n time = '15m';\n break;\n case KlineResolution.RESOLUTION_30m:\n time = '30m';\n break;\n case KlineResolution.RESOLUTION_60m:\n time = '1h';\n break;\n case KlineResolution.RESOLUTION_120m:\n time = '2h';\n break;\n case KlineResolution.RESOLUTION_240m:\n time = '4h';\n break;\n case KlineResolution.RESOLUTION_480m:\n time = '8h';\n break;\n case KlineResolution.RESOLUTION_720m:\n time = '12h';\n break;\n case KlineResolution.RESOLUTION_D:\n case KlineResolution.RESOLUTION_1D:\n time = '1d';\n break;\n case KlineResolution.RESOLUTION_3D:\n time = '3d';\n break;\n case KlineResolution.RESOLUTION_1W:\n time = '1w';\n break;\n case KlineResolution.RESOLUTION_1M:\n time = '1M ';\n break;\n default:\n }\n\n return time;\n};\n\nexport const TradingViewSDKLocalstorageKey = {\n interval: \"TradingviewSDK.lastUsedTimeBasedResolution\",\n lineType: \"TradingviewSDK.lastUsedStyle\",\n displayControlSetting: \"TradingviewSDK.displaySetting\",\n};\n","import { mapResolution } from \"../../utils/common.util\";\nimport { WS } from \"@kodiak-finance/orderly-net\";\n\nconst getKlineKey = (symbol: string, type: string) => `${symbol}kline_${type}`;\n\nconst getSymbolTopics = (symbol: string) => {\n const symbolTopics = [\"trade\"];\n return symbolTopics.map((topic) => `${symbol}@${topic}`);\n};\n\nexport class WebsocketService {\n static _created = false;\n static _instance: any = null;\n private klineSubscribeIdMap: Map<string, any> = new Map();\n private klineOnTickCallback = new Map();\n subscribeCachedTopics = new Map<string, any>();\n private wsInstance: WS | null = null;\n\n private klineData = new Map();\n\n constructor(ws: WS) {\n if (!WebsocketService._created) {\n this.wsInstance = ws;\n WebsocketService._instance = this;\n WebsocketService._created = true;\n }\n\n return WebsocketService._instance;\n }\n\n subscribeKline(\n subscribeId: string,\n symbol: any,\n resolution: any,\n onTickCallback: any\n ) {\n const time = mapResolution(resolution);\n\n this.klineSubscribeIdMap.set(subscribeId, { symbol, resolution });\n\n const klineKey = getKlineKey(symbol, time);\n if (this.klineOnTickCallback.has(klineKey)) {\n const value = this.klineOnTickCallback.get(klineKey);\n value[subscribeId] = onTickCallback;\n } else {\n this.klineOnTickCallback.set(klineKey, {\n [subscribeId]: onTickCallback,\n });\n const unsub = this.wsInstance?.subscribe(\n {\n event: \"subscribe\",\n topic: `${symbol}@kline_${time}`,\n id: `${symbol}@kline_${time}`,\n ts: new Date().getTime(),\n },\n {\n onMessage: (data) => {\n const { open, close, high, low, volume, startTime } = data;\n const key = getKlineKey(data.symbol, data.type);\n this.updateKline(key, {\n time: startTime,\n close,\n open,\n high,\n low,\n volume,\n });\n },\n }\n );\n this.subscribeCachedTopics.set(`${symbol}@kline_${time}`, unsub);\n }\n }\n\n unsubscribeKline(subscribeId: string) {\n if (!this.klineSubscribeIdMap.has(subscribeId)) {\n return;\n }\n\n const { symbol, resolution } = this.klineSubscribeIdMap.get(subscribeId);\n const time = mapResolution(resolution);\n const klineKey = getKlineKey(symbol, time);\n if (this.klineOnTickCallback.has(klineKey)) {\n const value = this.klineOnTickCallback.get(klineKey);\n delete value[subscribeId];\n\n if (Object.keys(value).length === 0) {\n this.klineOnTickCallback.delete(klineKey);\n const unsub = this.subscribeCachedTopics.get(`${symbol}@kline_${time}`);\n unsub();\n }\n }\n\n // @ts-ignore\n delete this.klineSubscribeIdMap[subscribeId];\n }\n\n subscribeSymbol(symbol: string) {\n const symbolTopics = getSymbolTopics(symbol);\n symbolTopics.forEach((topic) => {\n // check if subscribed\n if (!this.subscribeCachedTopics.has(topic)) {\n const unsub = this.wsInstance?.subscribe(\n {\n event: \"subscribe\",\n topic: topic,\n id: topic,\n ts: new Date().getTime(),\n },\n {\n onMessage: (data) => {\n this.updateKlineByLastPrice(data.symbol, data.price);\n },\n }\n );\n this.subscribeCachedTopics.set(topic, unsub);\n }\n });\n }\n\n updateKlineByLastPrice(symbol: string, lastPrice: number) {\n this.klineOnTickCallback.forEach((_, key) => {\n if (key.startsWith(symbol)) {\n const klineData = this.klineData.get(key);\n if (klineData) {\n this.updateKline(key, { ...klineData, close: lastPrice });\n }\n }\n });\n }\n\n updateKline(key: string, cbParams: any) {\n const onTickCbs = this.klineOnTickCallback.get(key);\n if (onTickCbs && cbParams) {\n this.klineData.set(key, cbParams);\n\n Object.keys(onTickCbs).forEach((key: any) => {\n const onTickCb = onTickCbs[key];\n if (onTickCb && typeof onTickCb === \"function\") {\n onTickCb(cbParams);\n }\n });\n }\n }\n}\n","import {\n EXCHANGE,\n withExchangePrefix,\n withoutExchangePrefix,\n} from \"../../utils/chart.util\";\nimport {\n LibrarySymbolInfo,\n QuoteData,\n QuotesCallback,\n ResolutionString,\n SubscribeBarsCallback,\n} from \"../type\";\nimport { AbstractDatafeed } from \"./abstract-datafeed\";\nimport { MultiBroadcastEventBus } from \"./eventBus\";\nimport { WebsocketService } from \"./websocket.service\";\n\nconst getAutoIncrementId = (() => {\n let id = 0;\n return () => id++;\n})();\n\nexport class Datafeed extends AbstractDatafeed {\n private _subscribeQuoteMap: Map<string, any>;\n\n private _prefixId: number;\n private _publicWs: WebsocketService;\n\n private bbosMap: Map<string, any> = new Map();\n private tickersMap: Map<string, any> = new Map();\n private eventBus: MultiBroadcastEventBus = new MultiBroadcastEventBus();\n\n constructor(apiUrl: string, ws: any) {\n const datafeedURL = `${apiUrl}`;\n super(datafeedURL);\n\n this._subscribeQuoteMap = new Map();\n this._prefixId = getAutoIncrementId();\n this._publicWs = new WebsocketService(ws);\n\n this.bbosMap = new Map();\n\n ws.on(\"tickers\", (message: any) => {\n for (const ticker of message.data) {\n ticker.change = ticker.close - ticker.open;\n ticker.perChange = ticker.open\n ? +((100 * ticker.change) / ticker.open).toFixed(2)\n : 0;\n this.tickersMap!.set(ticker.symbol, ticker);\n }\n this.eventBus.publish(\"tickerUpdate\", { message: \"ticker\" });\n });\n\n ws.subscribe(\n {\n event: \"subscribe\",\n topic: `bbos`,\n },\n {\n formatter: (message: any) => message,\n onMessage: (message: any) => {\n for (const bbo of message.data) {\n this.bbosMap!.set(bbo.symbol, {\n ask: bbo.ask,\n bid: bbo.bid,\n askSize: bbo.askSize,\n bidSize: bbo.bidSize,\n });\n }\n this.eventBus.publish(\"tickerUpdate\", { message: \"bbos\" });\n },\n },\n );\n }\n\n public remove() {\n Array.from(this._subscribeQuoteMap.values()).forEach((s) => s?.());\n }\n\n private getSubscriptionId(listenerGuid: string) {\n return `${this._prefixId}${listenerGuid}`;\n }\n\n public subscribeBars(\n symbolInfo: LibrarySymbolInfo,\n resolution: ResolutionString,\n onTick: SubscribeBarsCallback,\n listenerGuid: string,\n onResetCacheNeededCallback: () => void,\n ) {\n (window as any).onResetCacheNeededCallback = onResetCacheNeededCallback;\n this._publicWs.subscribeKline(\n `${this._prefixId}${listenerGuid}`,\n symbolInfo.ticker,\n resolution,\n onTick,\n );\n }\n\n public unsubscribeBars(listenerGuid: string): void {\n this._publicWs.unsubscribeKline(`${this._prefixId}${listenerGuid}`);\n }\n\n public getQuotes(symbols: string[], onDataCallback: QuotesCallback): void {\n const subscriptionId = this.getSubscriptionId(\"getQuotes\");\n\n this.unsubscribeQuotes(\"getQuotes\");\n\n const unsub = this.eventBus.subscribe(\"tickerUpdate\", (msg: any) => {\n const dataMap = new Map();\n\n symbols.forEach((symbol) => {\n const bbo = this.bbosMap.get(withoutExchangePrefix(symbol));\n const ticker = this.tickersMap.get(withoutExchangePrefix(symbol));\n if (!bbo || !ticker) {\n return;\n }\n const data = {\n ...ticker,\n ask: bbo.ask,\n bid: bbo.bid,\n };\n dataMap.set(withoutExchangePrefix(symbol), data);\n });\n\n if (!dataMap.size) {\n return;\n }\n onDataCallback(\n Array.from(dataMap.values()).map((symbolData: any) =>\n this._toUDFTicker(symbolData),\n ),\n );\n });\n this._subscribeQuoteMap.set(subscriptionId, unsub);\n }\n\n public subscribeQuotes(\n symbols: string[],\n fastSymbols: string[],\n onRealtimeCallback: QuotesCallback,\n listenerGuid: string,\n ): void {\n const subscriptionId = `${this._prefixId}${listenerGuid}`;\n if (symbols.length > 0) {\n this.unsubscribeQuotes(subscriptionId);\n\n const unsub = this.eventBus.subscribe(\"tickerUpdate\", (msg: any) => {\n const dataMap = new Map();\n symbols.forEach((symbol) => {\n const bbo = this.bbosMap.get(withoutExchangePrefix(symbol));\n const ticker = this.tickersMap.get(withoutExchangePrefix(symbol));\n if (!bbo || !ticker) {\n return;\n }\n const data = {\n ...ticker,\n ask: bbo.ask,\n bid: bbo.bid,\n };\n dataMap.set(withoutExchangePrefix(symbol), data);\n });\n if (!dataMap.size) {\n return;\n }\n onRealtimeCallback(\n Array.from(dataMap.values()).map((symbolData: any) =>\n this._toUDFTicker(symbolData),\n ),\n );\n });\n this._subscribeQuoteMap.set(subscriptionId, unsub);\n }\n }\n\n public unsubscribeQuotes(listenerGuid: string): void {\n const subscriptionId = this.getSubscriptionId(listenerGuid);\n\n const unsub = this._subscribeQuoteMap.get(subscriptionId);\n if (unsub) {\n unsub();\n this._subscribeQuoteMap.delete(subscriptionId);\n }\n }\n\n private _toUDFTicker(t: any): QuoteData {\n return {\n n: withExchangePrefix(t.symbol),\n s: \"ok\",\n v: {\n ask: t.ask,\n bid: t.bid,\n ch: t.change,\n chp: t.perChange / 100,\n description: \"\",\n exchange: EXCHANGE,\n hight_price: t.high,\n low_price: t.low,\n lp: t.close,\n open_price: t.open,\n prev_close_price: 0,\n volume: t.volume,\n },\n };\n }\n}\n","import { useRef, useEffect, useCallback, useMemo } from \"react\";\nimport useCancelOrder from \"../hooks/useCancelOrder\";\nimport useEditOrder from \"./useEditOrder\";\nimport useSenderOrder from \"./useSendOrder\";\nimport { useSymbolsInfo } from \"@kodiak-finance/orderly-hooks\";\nimport { ChartMode, ColorConfigInterface } from \"../type\";\n\nconst createBrokerMethod = <T extends (...args: any) => any>(method: T) => {\n return (params: T) => method(params);\n};\n\nconst useBroker = ({\n closeConfirm,\n colorConfig,\n onToast,\n mode,\n symbol,\n}: {\n closeConfirm: any;\n colorConfig: ColorConfigInterface;\n onToast?: any;\n symbol: string;\n mode?: ChartMode;\n}) => {\n const cancelOrder = useCancelOrder();\n const editOrder = useEditOrder(onToast);\n const symbolData = useSymbolsInfo();\n const closePosition = useCallback(\n (position: any) => closeConfirm && closeConfirm(position),\n [closeConfirm]\n );\n const { sendMarketOrder, sendLimitOrder} = useSenderOrder(symbol);\n\n const getSymbolInfo = useCallback(\n (symbol: string) => {\n if (!symbolData) {\n return;\n }\n return {\n baseMin: symbolData[symbol](\"base_min\"),\n baseMax: symbolData[symbol](\"base_max\"),\n baseTick: symbolData[symbol](\"base_tick\"),\n quoteTick: symbolData[symbol](\"quote_tick\"),\n };\n },\n [symbolData]\n );\n const broker = useRef({\n cancelOrder,\n closePosition,\n editOrder,\n colorConfig,\n sendLimitOrder,\n getSymbolInfo,\n sendMarketOrder: createBrokerMethod(sendMarketOrder),\n mode,\n });\n\n useEffect(() => {\n broker.current.getSymbolInfo = getSymbolInfo;\n }, [symbolData]);\n\n useEffect(() => {\n broker.current.sendLimitOrder = sendLimitOrder;\n broker.current.sendMarketOrder = sendMarketOrder;\n }, [sendLimitOrder, sendMarketOrder]);\n\n useEffect(() => {\n broker.current.closePosition = closePosition;\n }, [closeConfirm]);\n\n useEffect(() => {\n broker.current.cancelOrder = cancelOrder;\n }, [cancelOrder]);\n\n return broker.current;\n};\n\nexport default useBroker;\n","import { useCallback } from \"react\";\nimport { useOrderStream } from \"@kodiak-finance/orderly-hooks\";\nimport { BracketAlgoType, TpslAlgoType } from \"../renderer/tpsl.util\";\nimport { OrderStatus } from \"@kodiak-finance/orderly-types\";\nimport { toast } from \"@kodiak-finance/orderly-ui\";\n\nexport default function useCancelOrder() {\n const [\n pendingOrders,\n { cancelOrder, cancelAlgoOrder, cancelTPSLChildOrder},\n ] = useOrderStream({\n status: OrderStatus.INCOMPLETE,\n });\n return useCallback(\n (order: any) => {\n if (order.algo_order_id) {\n if (TpslAlgoType.includes(order.root_algo_order_algo_type)) {\n // check if tpsl active\n const rootOrder = pendingOrders?.find(\n (item) => item.algo_order_id === order.root_algo_order_id\n );\n const isEditActivated = rootOrder.child_orders.every(\n (item: any) => !!item.trigger_price\n );\n if (isEditActivated) {\n return cancelTPSLChildOrder(\n order.algo_order_id,\n order.root_algo_order_id\n );\n }\n return cancelAlgoOrder(rootOrder.algo_order_id, order.symbol).then();\n }\n return cancelAlgoOrder(order.algo_order_id, order.symbol).then();\n }\n return cancelOrder(order.order_id, order.symbol).then();\n },\n [cancelOrder, pendingOrders]\n );\n}\n","import { Decimal } from \"@kodiak-finance/orderly-utils\";\nimport { AlgoType, OrderInterface, OrderType, SideType } from \"../type\";\nimport { i18n } from \"@kodiak-finance/orderly-i18n\";\n\nexport const EST_TPSL_PNL_DECIMAL = 2;\n\nexport const textDash = \"--\";\n\nexport const BracketAlgoType = [AlgoType.BRACKET, AlgoType.STOP_BRACKET];\nexport const TpslAlgoType = [AlgoType.POSITIONAL_TP_SL, AlgoType.TP_SL];\nexport const isTpOrder = (order: OrderInterface) =>\n order.root_algo_order_id !== order.algo_order_id &&\n order.algo_type === AlgoType.TAKE_PROFIT;\n\nexport const isSlOrder = (order: OrderInterface) =>\n order.root_algo_order_id !== order.algo_order_id &&\n order.algo_type === AlgoType.STOP_LOSS;\n\nexport const isTpslOrder = (order: OrderInterface) =>\n order.root_algo_order_id !== order.algo_order_id &&\n (order.algo_type === AlgoType.TAKE_PROFIT ||\n order.algo_type === AlgoType.STOP_LOSS);\n\nexport const isBracketAlgoType = (algoType: AlgoType | undefined | null) =>\n !!algoType && BracketAlgoType.includes(algoType);\n\nexport const formatOrderNo = (orderNo?: number) => {\n return orderNo ? String(orderNo).padStart(2, \"0\") : \"\";\n};\n\nexport const isPositionTpsl = (order: OrderInterface) =>\n order.type === OrderType.CLOSE_POSITION;\nexport const isActivatedPositionTpsl = (order: OrderInterface) =>\n isPositionTpsl(order) && order.is_activated;\n\nexport const isActivatedTpslOrder = (order: OrderInterface) =>\n isTpslOrder(order) && order.is_activated;\n\nexport const isActivatedQuantityTpsl = (order: OrderInterface) =>\n order.root_algo_order_algo_type === AlgoType.TP_SL ||\n (isBracketAlgoType(order.root_algo_order_algo_type) && order.is_activated);\n\nexport const getTpslTag = (\n order: OrderInterface,\n quantityTpslNoMap: Map<number, number>\n) => {\n const algoType = order.algo_type;\n // @ts-ignore\n const suffix = {\n [AlgoType.TAKE_PROFIT]: i18n.t(\"tpsl.takeProfit\"),\n [AlgoType.STOP_LOSS]: i18n.t(\"tpsl.stopLoss\"),\n }[algoType];\n\n if (!suffix) {\n return null;\n }\n\n return suffix;\n};\n\nexport const buildQuantityTpslNoMap = (orders: OrderInterface[]) => {\n const quantityTpslNoMap = new Map<number, number>();\n\n let idx = 1;\n [...orders]\n .reverse()\n .filter(isActivatedQuantityTpsl)\n .forEach((order) => {\n if (\n order.root_algo_order_id &&\n !quantityTpslNoMap.has(order.root_algo_order_id)\n ) {\n quantityTpslNoMap.set(order.root_algo_order_id, idx++);\n }\n });\n\n return quantityTpslNoMap;\n};\n\nexport const getTpslEstPnl = (tpslOrder: OrderInterface, position: any) => {\n const quantity = Math.abs(\n tpslOrder.type === OrderType.CLOSE_POSITION\n ? position.balance\n : tpslOrder.quantity\n );\n const sideFlag = tpslOrder.side === SideType.SELL ? 1 : -1;\n\n const openPrice = position.open.toString();\n const estPnl = new Decimal(tpslOrder.trigger_price)\n .minus(openPrice ?? 0)\n .times(quantity)\n .times(sideFlag)\n .toString();\n\n return { estPnl, quantity, openPrice };\n};\n\nexport const formatPnl = (pnl: number | string | undefined) => {\n return pnl !== undefined && pnl !== \"\"\n ? new Decimal(pnl).todp(EST_TPSL_PNL_DECIMAL, Decimal.ROUND_FLOOR)\n : textDash;\n};\n","import { useCallback } from \"react\";\nimport { useEventEmitter, useOrderStream } from \"@kodiak-finance/orderly-hooks\";\nimport { OrderStatus } from \"@kodiak-finance/orderly-types\";\nimport { Decimal } from \"@kodiak-finance/orderly-utils\";\nimport { BracketAlgoType, TpslAlgoType } from \"../renderer/tpsl.util\";\n\nexport default function useEditOrder(onToast: any) {\n const ee = useEventEmitter();\n const [, { updateOrder, cancelAlgoOrder, updateAlgoOrder, updateTPSLOrder }] =\n useOrderStream({\n status: OrderStatus.INCOMPLETE,\n });\n return useCallback(\n (order: any, lineValue: any) => {\n if (order.algo_order_id) {\n if (TpslAlgoType.includes(order.root_algo_order_algo_type)) {\n const algoParams = [\n {\n order_id: order.algo_order_id,\n trigger_price: new Decimal(lineValue.value).toString(),\n },\n ];\n\n // @ts-ignore\n return updateTPSLOrder(order.root_algo_order_id, algoParams)\n .then((res) => {})\n .catch((e) => {\n if (onToast) {\n onToast.error(e.message);\n }\n });\n } else if (BracketAlgoType.includes(order.algo_type)) {\n // @ts-ignore\n return updateAlgoOrder(order.algo_order_id, {\n order_price: new Decimal(lineValue.value).toString(),\n })\n .then((res) => {})\n .catch((e) => {\n if (onToast) {\n onToast.error(e.message);\n }\n });\n } else {\n const values: any = {\n quantity: order.quantity,\n trigger_price: order.trigger_price,\n symbol: order.symbol,\n price: order.price,\n // order_type: order.type,\n // side: order.side,\n // reduce_only: Boolean(order.reduce_only),\n algo_order_id: order.algo_order_id,\n };\n if (order.order_tag) {\n values.order_tag = order.order_tag;\n }\n if (order.client_order_id) {\n values.client_order_id = order.client_order_id;\n }\n if (lineValue.type === \"price\") {\n values.price = new Decimal(lineValue.value).toString();\n }\n if (lineValue.type === \"trigger_price\") {\n values.trigger_price = new Decimal(lineValue.value).toString();\n }\n\n // @ts-ignore\n return updateAlgoOrder(order.algo_order_id, values)\n .then((res) => {})\n .catch((e) => {\n if (onToast) {\n onToast.error(e.message);\n }\n });\n }\n }\n const values: any = {\n order_price: order.price?.toString(),\n order_quantity: order.quantity.toString(),\n symbol: order.symbol,\n order_type: order.type,\n side: order.side,\n visible_quantity: 0,\n reduce_only: order.reduce_only,\n };\n if (\n new Decimal(order.visible_quantity ?? order.visible ?? 0).eq(\n order.quantity,\n )\n ) {\n delete values.visible_quantity;\n }\n if (!Object.keys(order).includes(\"reduce_only\")) {\n delete values.reduce_only;\n }\n if (order.order_tag) {\n values.order_tag = order.order_tag;\n }\n if (order.client_order_id) {\n values.client_order_id = order.client_order_id;\n }\n if (lineValue.type === \"price\") {\n values.order_price = new Decimal(lineValue.value).toString();\n }\n return updateOrder(order.order_id, values)\n .then((res) => {})\n .catch((e) => {\n onToast.error(e.message);\n });\n },\n [updateOrder],\n );\n}\n","import { useOrderEntry_deprecated } from \"@kodiak-finance/orderly-hooks\";\nimport { OrderSide, OrderType } from \"@kodiak-finance/orderly-types\";\nimport { Decimal } from \"@kodiak-finance/orderly-utils\";\nimport { toast } from \"@kodiak-finance/orderly-ui\";\n\nexport default function useSendOrder(symbol: string) {\n const { onSubmit: _sendMarketOrder } = useOrderEntry_deprecated(\n {\n symbol,\n side: OrderSide.BUY,\n order_type: OrderType.MARKET,\n },\n {\n watchOrderbook: true,\n }\n );\n const _sendOrder = () => {};\n\n const sendLimitOrder = () => {};\n\n const sendMarketOrder = (data: any) => {\n console.log(\"-order DAta\", data);\n data.reduce_only = false;\n return _sendMarketOrder(data).catch((e) => {\n console.log(\"--- e\", e);\n toast.error(e);\n });\n };\n\n return {\n sendLimitOrder,\n sendMarketOrder,\n };\n}\n","import { useEffect, useRef, useState } from \"react\";\nimport {\n useAccount,\n useLocalStorage,\n useOrderStream,\n usePositionStream,\n useSymbolsInfo,\n} from \"@kodiak-finance/orderly-hooks\";\nimport { AccountStatusEnum, OrderStatus } from \"@kodiak-finance/orderly-types\";\nimport { DisplayControlSettingInterface } from \"../../type\";\nimport { Renderer } from \"../renderer/renderer\";\nimport { AlgoType } from \"../type\";\n\nexport default function useCreateRenderer(\n symbol: string,\n displayControlSetting?: DisplayControlSettingInterface,\n) {\n const [renderer, setRenderer] = useState<Renderer>();\n const rendererRef = useRef<Renderer>();\n const { state } = useAccount();\n const [unPnlPriceBasis] = useLocalStorage(\"unPnlPriceBasis\", \"markPrice\");\n const [{ rows: positions }, positionsInfo] = usePositionStream(symbol, {\n calcMode: unPnlPriceBasis,\n });\n const [pendingOrders] = useOrderStream({\n status: OrderStatus.INCOMPLETE,\n symbol: symbol,\n });\n\n const config = useSymbolsInfo();\n const symbolInfo = config?.[symbol];\n const quote_dp = symbolInfo(\"quote_dp\");\n\n const [fillOrders] = useOrderStream({\n symbol: symbol,\n status: OrderStatus.FILLED,\n size: 500,\n });\n\n const createRenderer = useRef(\n (instance: any, host: any, broker: any, container: HTMLDivElement) => {\n if (rendererRef.current) {\n rendererRef.current.remove();\n }\n rendererRef.current = new Renderer(instance, host, broker);\n setRenderer(rendererRef.current);\n },\n );\n const removeRenderer = useRef(() => {\n rendererRef.current?.remove();\n rendererRef.current = undefined;\n });\n\n useEffect(() => {\n if (\n state.status < AccountStatusEnum.EnableTrading &&\n state.status !== AccountStatusEnum.EnableTradingWithoutConnected\n ) {\n renderer?.renderPositions([]);\n return;\n }\n\n if (!displayControlSetting || !displayControlSetting.position) {\n renderer?.renderPositions([]);\n return;\n }\n const positionList = (positions ?? [])\n .filter((_) => _.symbol === symbol)\n .map((item) => {\n return {\n symbol: item.symbol,\n open: item.average_open_price,\n balance: item.position_qty,\n closablePosition: 9999,\n // @ts-ignore\n unrealPnl: item.unrealized_pnl ?? 0,\n interest: 0,\n unrealPnlDecimal: 2,\n basePriceDecimal: 4,\n };\n });\n renderer?.renderPositions(positionList);\n }, [renderer, positions, symbol, displayControlSetting, state]);\n\n useEffect(() => {\n if (!displayControlSetting || !displayControlSetting.buySell) {\n renderer?.renderFilledOrders([], 6);\n return;\n }\n const currentSymbolFillOrders = fillOrders?.filter(\n (item) => item.symbol === symbol,\n );\n renderer?.renderFilledOrders(currentSymbolFillOrders ?? [], quote_dp ?? 6);\n }, [renderer, fillOrders, symbol, quote_dp, displayControlSetting]);\n\n useEffect(() => {\n let tpslOrder: any = [];\n let positionTpsl: any = [];\n let limitOrder: any = [];\n let stopOrder: any = [];\n let bracketOrder: any = [];\n let trailingStopOrder: any = [];\n\n if (\n state.status < AccountStatusEnum.EnableTrading &&\n state.status !== AccountStatusEnum.EnableTradingWithoutConnected\n ) {\n renderer?.renderPendingOrders([]);\n return;\n }\n\n const symbolPosition = (positions ?? []).find(\n (item) => item.symbol === symbol,\n );\n pendingOrders?.forEach((order) => {\n if (symbol !== order.symbol) {\n return;\n }\n if (!order.algo_order_id) {\n limitOrder.push(order);\n } else if (order.algo_order_id) {\n if (order.algo_type === AlgoType.POSITIONAL_TP_SL) {\n for (const child_order of order.child_orders) {\n child_order.root_algo_order_algo_type = order.algo_type;\n if (\n child_order.trigger_price &&\n child_order.status !== OrderStatus.FILLED\n ) {\n positionTpsl.push(child_order);\n }\n }\n } else if (order.algo_type === AlgoType.TP_SL) {\n if (symbolPosition) {\n for (const child_order of order.child_orders) {\n child_order.root_algo_order_algo_type = order.algo_type;\n child_order.position_qty = symbolPosition.position_qty;\n if (\n child_order.trigger_price &&\n child_order.status !== OrderStatus.FILLED\n ) {\n tpslOrder.push(child_order);\n }\n }\n }\n } else if (\n order.algo_type === AlgoType.STOP_LOSS ||\n order.algo_type === AlgoType.TAKE_PROFIT\n ) {\n stopOrder.push(order);\n } else if (order.algo_type === AlgoType.BRACKET) {\n bracketOrder.push(order);\n } else if (order.algo_type === AlgoType.TRAILING_STOP) {\n if (order.is_activated && order.extreme_price) {\n trailingStopOrder.push(order);\n }\n }\n }\n });\n if (displayControlSetting) {\n if (!displayControlSetting.positionTpsl) {\n positionTpsl = [];\n }\n if (!displayControlSetting.tpsl) {\n tpslOrder = [];\n }\n if (!displayControlSetting.limitOrders) {\n limitOrder = [];\n bracketOrder = [];\n }\n if (!displayControlSetting.stopOrders) {\n stopOrder = [];\n }\n if (!displayControlSetting.trailingStop) {\n trailingStopOrder = [];\n }\n }\n\n renderer?.renderPendingOrders(\n tpslOrder\n .concat(positionTpsl)\n .concat(limitOrder)\n .concat(stopOrder)\n .concat(bracketOrder)\n .concat(trailingStopOrder),\n );\n }, [\n renderer,\n pendingOrders,\n symbol,\n displayControlSetting,\n positions,\n state.status,\n ]);\n\n return [createRenderer.current, removeRenderer.current] as const;\n}\n","import {\n IChartingLibraryWidget,\n IExecutionLineAdapter,\n ResolutionString,\n} from \"../charting_library\";\nimport { OrderInterface, SideType } from \"../type\";\nimport useBroker from \"../hooks/useBroker\";\nimport { commify, Decimal } from \"@kodiak-finance/orderly-utils\";\nimport { limitOrdersByInterval } from \"../broker/utils\";\nimport { i18n } from \"@kodiak-finance/orderly-i18n\";\n\nexport class ExecutionService {\n private instance: IChartingLibraryWidget;\n private interval = \"1D\";\n private executions: IExecutionLineAdapter[];\n private filledOrders: OrderInterface[];\n private basePriceDecimal: number;\n private broker: ReturnType<typeof useBroker>;\n\n constructor(\n instance: IChartingLibraryWidget,\n broker: ReturnType<typeof useBroker>\n ) {\n this.instance = instance;\n this.executions = [];\n this.filledOrders = [];\n this.basePriceDecimal = 0;\n this.broker = broker;\n\n this.subscribeIntervalChange();\n }\n\n async subscribeIntervalChange() {\n this.interval = this.instance.symbolInterval().interval;\n\n const changeInterval = this.changeInterval;\n this.instance\n .activeChart()\n .onIntervalChanged()\n .subscribe(null, changeInterval);\n }\n\n changeInterval = (interval: ResolutionString) => {\n const rerenderExecutions = () => {\n this.renderExecutions(this.filledOrders, this.basePriceDecimal);\n this.instance\n .activeChart()\n .onDataLoaded()\n .unsubscribe(null, rerenderExecutions);\n };\n\n this.interval = interval;\n this.instance\n .activeChart()\n .onDataLoaded()\n .subscribe(null, rerenderExecutions);\n };\n\n renderExecutions(filledOrders: OrderInterface[], basePriceDecimal: number) {\n this.filledOrders = filledOrders;\n this.basePriceDecimal = basePriceDecimal;\n\n if (!this.interval) {\n return;\n }\n\n this.removeAll();\n\n limitOrdersByInterval(filledOrders, this.interval).forEach((order) => {\n this.executions.push(this.drawExecution(order, basePriceDecimal));\n });\n }\n removeAll() {\n this.executions.forEach((execution) => execution.remove());\n this.executions = [];\n }\n\n static getExecutionInfo(order: OrderInterface, basePriceDecimal: number) {\n const side = order.side;\n const avgExecPrice =\n order.average_executed_price ||\n order.child_orders?.find((child) => !!child.average_executed_price)\n ?.average_executed_price ||\n 0;\n\n const excutedNumber = new Decimal(avgExecPrice)\n .todp(basePriceDecimal, Decimal.ROUND_FLOOR)\n .toString();\n return `${\n side === SideType.BUY ? i18n.t(\"common.buy\") : i18n.t(\"common.sell\")\n } ${order.total_executed_quantity} @${commify(excutedNumber)}`;\n }\n\n drawExecution(order: OrderInterface, basePriceDecimal: number) {\n const side = order.side;\n const avgExecPrice =\n order.average_executed_price ||\n order.child_orders?.find((child) => !!child.average_executed_price)\n ?.average_executed_price ||\n 0;\n\n const timestamp = new Date(order.updated_time).getTime() / 1000;\n // const timestamp = new Date(order.updated_time).getTime();\n const colorConfig = this.broker.colorConfig;\n // console.log('-- avag exec price',{\n // avgExecPrice,\n // timestamp: new Date(order.updated_time).toLocaleString(),\n // tooltips: ExecutionService.getExecutionInfo(order, basePriceDecimal),\n // });\n\n return this.instance\n .activeChart()\n .createExecutionShape()\n .setArrowHeight(9)\n .setTooltip(ExecutionService.getExecutionInfo(order, basePriceDecimal))\n .setTime(timestamp)\n .setPrice(avgExecPrice)\n .setArrowColor(\n side === SideType.BUY ? colorConfig.upColor! : colorConfig.downColor!\n )\n .setDirection(side === SideType.BUY ? \"buy\" : \"sell\");\n }\n\n unsubscribeIntervalChange() {\n const changeInterval = this.changeInterval;\n\n try {\n this.instance\n .activeChart()\n .onIntervalChanged()\n .unsubscribe(null, changeInterval);\n } catch (e: unknown) {\n if (\n e instanceof Error &&\n e.message ===\n \"Cannot read properties of null (reading 'tradingViewApi')\"\n ) {\n // ignore when it's triggered by hot reloaded\n } else {\n console.error(e);\n }\n }\n }\n\n destroy() {\n this.removeAll();\n this.unsubscribeIntervalChange();\n }\n}\n","import { OrderInterface, SideType } from \"../type\";\nimport { OrderStatus } from \"@kodiak-finance/orderly-types\";\nimport {startOfSecond, startOfMinute, startOfHour, startOfDay, startOfYear, startOfWeek, startOfMonth} from 'date-fns';\n\nconst IntervalMap: { [interval: string]: { startOf: string; period: number } } = {\n 1: { startOf: 'minute', period: 0 },\n 3: { startOf: 'hour', period: 3 * 60 * 1000 },\n 5: { startOf: 'hour', period: 5 * 60 * 1000 },\n 15: { startOf: 'hour', period: 15 * 60 * 1000 },\n 30: { startOf: 'hour', period: 30 * 60 * 1000 },\n 60: { startOf: 'hour', period: 0 },\n 120: { startOf: 'day', period: 2 * 60 * 60 * 1000 },\n 240: { startOf: 'day', period: 4 * 60 * 60 * 1000 },\n 480: { startOf: 'day', period: 8 * 60 * 60 * 1000 },\n 720: { startOf: 'day', period: 12 * 60 * 60 * 1000 },\n D: { startOf: 'day', period: 0 }, // default day interval shown as D instead of 1D\n '1D': { startOf: 'day', period: 0 },\n '3D': { startOf: 'year', period: 3 * 24 * 60 * 60 * 1000 },\n '5D': { startOf: 'year', period: 5 * 24 * 60 * 60 * 1000 },\n '1W': { startOf: 'week', period: 0 },\n '1M': { startOf: 'month', period: 0 },\n};\n\nfunction collectionOrders(order: OrderInterface, collection:any,interval: string, orderList: any[], ) {\n const { startOf, period } = IntervalMap[interval];\n\n const time = new Date(order.updated_time).getTime();\n let base = startOfSecond(time).getTime();\n if (startOf === 'minute') {\n base = startOfMinute(time).getTime();\n } else if (startOf === 'hour') {\n base =startOfHour(time).getTime();\n } else if (startOf === 'day') {\n base = startOfDay(time).getTime();\n } else if (startOf === 'month') {\n base = startOfMonth(time).getTime();\n } else if (startOf === 'year') {\n base = startOfYear(time).getTime();\n } else if (startOf === 'week') {\n base = startOfWeek(time).getTime();\n } else if (startOf === 'month'){\n base = startOfMonth(time).getTime();\n }\n\n\n const group = period === 0 ? base : Math.floor((time - base) / period) * period + base;\n\n if (!collection[group]) {\n collection[group] = { [SideType.BUY]: [], [SideType.SELL]: [] };\n }\n\n if (collection[group][order.side].length < 5) {\n collection[group][order.side].push(order);\n orderList.push(order);\n }\n}\n\nexport const limitOrdersByInterval = (orders: OrderInterface[], interval: string) => {\n const res: OrderInterface[] = [];\n const collection: any = {};\n\n if (!IntervalMap[interval]) {\n return [];\n }\n\n orders.forEach((order) => {\n if (order.child_orders) {\n for (const child of order.child_orders) {\n if (child.is_activated && child.algo_status=== OrderStatus.FILLED) {\n collectionOrders(child, collection, interval, res);\n\n }\n }\n } else {\n collectionOrders(order, collection, interval, res);\n }\n\n });\n\n\n return res;\n};\n","import { i18n } from \"@kodiak-finance/orderly-i18n\";\nimport { Decimal, commify, getTrailingStopPrice } from \"@kodiak-finance/orderly-utils\";\nimport { IChartingLibraryWidget, IOrderLineAdapter } from \"../charting_library\";\nimport useBroker from \"../hooks/useBroker\";\nimport {\n SideType,\n AlgoType,\n OrderCombinationType,\n OrderType,\n OrderInterface,\n ChartPosition,\n ChartMode,\n} from \"../type\";\nimport { CHART_QTY_DECIMAL, getOrderId } from \"./order.util\";\nimport {\n getTpslTag,\n isActivatedPositionTpsl,\n isActivatedQuantityTpsl,\n isPositionTpsl,\n isTpslOrder,\n} from \"./tpsl.util\";\nimport { TpslCalService } from \"./tpslCal.service\";\n\nexport class OrderLineService {\n private instance: IChartingLibraryWidget;\n private pendingOrderLineMap: Map<number, IOrderLineAdapter>;\n private pendingOrders: any[];\n private broker: ReturnType<typeof useBroker>;\n private tpslCalService: TpslCalService;\n\n constructor(\n instance: IChartingLibraryWidget,\n broker: ReturnType<typeof useBroker>,\n ) {\n this.instance = instance;\n this.pendingOrderLineMap = new Map();\n this.pendingOrders = [];\n this.broker = broker;\n this.tpslCalService = new TpslCalService();\n }\n\n renderPendingOrders(newPendingOrders: any[]) {\n if (newPendingOrders) {\n this.pendingOrders = newPendingOrders;\n }\n this.cleanOldPendingOrders(this.pendingOrders);\n this.tpslCalService.prepareTpslPnlMap(this.pendingOrders);\n this.tpslCalService.prepareQuantityTpslNoMap(this.pendingOrders);\n this.pendingOrders.forEach((order) => this.renderPendingOrder(order));\n }\n\n updatePositions(positions: ChartPosition[] | null) {\n const changed = this.tpslCalService.recalculatePnl(\n positions,\n this.pendingOrders,\n );\n\n this.pendingOrders\n .filter((order) => changed.includes(getOrderId(order)!))\n .forEach((order) => this.renderPendingOrder(order));\n }\n\n renderPendingOrder(order: any) {\n const orderId = OrderLineService.getOrderId(order);\n if (!orderId) {\n return;\n }\n const orderLine = this.drawOrderLine(orderId, order);\n\n if (orderLine) {\n this.pendingOrderLineMap.set(orderId, orderLine);\n }\n }\n\n cleanOldPendingOrders(newPendingOrders: any[]) {\n const newOrderIdSet = new Set(\n newPendingOrders.map((order) => OrderLineService.getOrderId(order)),\n );\n\n this.pendingOrderLineMap.forEach(\n (_, orderId) =>\n !newOrderIdSet.has(orderId) && this.removePendingOrder(orderId),\n );\n }\n\n removePendingOrder(orderId: number | undefined) {\n if (orderId === undefined) {\n return;\n }\n\n const orderLine = this.pendingOrderLineMap.get(orderId);\n\n if (orderLine) {\n this.pendingOrderLineMap.delete(orderId);\n orderLine.remove();\n }\n }\n getBaseOrderLine() {\n const colorConfig = this.broker.colorConfig;\n return this.instance\n .activeChart()\n .createOrderLine()\n .setCancelTooltip(i18n.t(\"orders.cancelOrder\"))\n .setQuantityTextColor(colorConfig.qtyTextColor!)\n .setQuantityBackgroundColor(colorConfig.chartBG!)\n .setBodyBackgroundColor(colorConfig.chartBG!)\n .setCancelButtonBackgroundColor(colorConfig.chartBG!)\n .setLineStyle(1)\n .setBodyFont(colorConfig.font!)\n .setQuantityFont(colorConfig.font!);\n }\n\n static getCombinationType(order: any): OrderCombinationType {\n const { algo_type: algoType, type } = order;\n\n if (\n (algoType === AlgoType.STOP_LOSS ||\n algoType === AlgoType.TAKE_PROFIT ||\n algoType === AlgoType.STOP) &&\n type === OrderType.LIMIT\n ) {\n return OrderCombinationType.STOP_LIMIT;\n }\n if (\n (algoType === AlgoType.STOP_LOSS ||\n algoType === AlgoType.TAKE_PROFIT ||\n algoType === AlgoType.STOP) &&\n type === OrderType.MARKET\n ) {\n return OrderCombinationType.STOP_MARKET;\n }\n if (algoType === AlgoType.BRACKET) {\n if (type === OrderType.LIMIT) {\n return OrderCombinationType.BRACKET_LIMIT;\n }\n if (type === OrderType.MARKET) {\n return OrderCombinationType.BRACKET_MARKET;\n }\n }\n\n if (algoType === AlgoType.TRAILING_STOP) {\n return OrderCombinationType.TRAILING_STOP;\n }\n\n return OrderCombinationType.LIMIT;\n }\n\n static getText(pendingOrder: any) {\n const orderCombinationType =\n OrderLineService.getCombinationType(pendingOrder);\n if (\n orderCombinationType === OrderCombinationType.STOP_LIMIT ||\n orderCombinationType === OrderCombinationType.STOP_MARKET ||\n orderCombinationType === OrderCombinationType.STOP_BRACKET_LIMIT ||\n orderCombinationType === OrderCombinationType.STOP_BRACKET_MARKET\n ) {\n if (pendingOrder.type === OrderType.LIMIT) {\n return `${i18n.t(\"orderEntry.orderType.stopLimit\")} ${commify(\n pendingOrder.price,\n )}`;\n }\n return i18n.t(\"orderEntry.orderType.stopMarket\");\n }\n if (orderCombinationType === OrderCombinationType.TRAILING_STOP) {\n return i18n.t(\"orderEntry.trailing\");\n }\n return i18n.t(\"orderEntry.orderType.limit\");\n }\n\n static getOrderPrice(pendingOrder: any) {\n if (pendingOrder.algo_type === AlgoType.TRAILING_STOP) {\n return getTrailingStopPrice(pendingOrder);\n }\n\n return pendingOrder.trigger_price || pendingOrder.price;\n }\n\n static getOrderId = (order: any) => {\n if (order === null || order === undefined) {\n return undefined;\n }\n return order.algo_order_id || order.order_id;\n };\n\n getTPSLTextWithTpsl(text: string, pendingOrder: OrderInterface) {\n const orderId = getOrderId(pendingOrder);\n if (!orderId) {\n return text;\n }\n\n // first hiden pnl\n // const unrealPnl = this.tpslCalService.getTpslPnlMap().get(orderId);\n // if (unrealPnl) {\n // return `${text} | PnL ${unrealPnl}`;\n // }\n\n return text;\n }\n\n getTPSLText(pendingOrder: any) {\n const tpslTypeText = getTpslTag(\n pendingOrder,\n this.tpslCalService.getQuantityTpslNoMap(),\n );\n\n if (tpslTypeText) {\n return this.getTPSLTextWithTpsl(tpslTypeText, pendingOrder);\n }\n\n return null;\n }\n\n getOrderQuantity(pendingOrder: OrderInterface) {\n if (pendingOrder.algo_order_id) {\n if (\n isActivatedPositionTpsl(pendingOrder) ||\n isPositionTpsl(pendingOrder)\n ) {\n return \"100%\";\n }\n if (isActivatedQuantityTpsl(pendingOrder)) {\n const qty = new Decimal(pendingOrder.quantity).minus(\n pendingOrder.executed ?? 0,\n );\n const per = qty\n .div(new Decimal(pendingOrder.position_qty!))\n .mul(100)\n .todp(2)\n .toNumber();\n return `${Math.min(Math.abs(per), 100).toString()}%`;\n }\n }\n return commify(new Decimal(pendingOrder.quantity).toString());\n }\n\n drawOrderLine(orderId: number, pendingOrder: any) {\n // const text = OrderLineService.getText(pendingOrder);\n const text = isTpslOrder(pendingOrder)\n ? this.getTPSLText(pendingOrder)\n : OrderLineService.getText(pendingOrder);\n if (text === null) {\n return null;\n }\n\n const colorConfig = this.broker.colorConfig;\n const orderLine =\n this.pendingOrderLineMap.get(orderId) ?? this.getBaseOrderLine();\n const color =\n pendingOrder.side === SideType.BUY\n ? colorConfig.upColor\n : colorConfig.downColor;\n const borderColor =\n pendingOrder.side === SideType.BUY\n ? colorConfig.pnlUpColor\n : colorConfig.pnlDownColor;\n const price = OrderLineService.getOrderPrice(pendingOrder);\n const lineLength = 100;\n const quantity = this.getOrderQuantity(pendingOrder);\n const textColor = colorConfig.textColor;\n\n orderLine\n .setText(text)\n .setCancelButtonIconColor(colorConfig.closeIcon!)\n .setCancelButtonBorderColor(color!)\n .setBodyTextColor(textColor!)\n .setBodyBorderColor(color!)\n .setQuantityBorderColor(color!)\n .setQuantityTextColor(color!)\n // .setBodyBackgroundColor(color)\n .setLineColor(color!)\n .setLineLength(lineLength)\n .setQuantity(quantity ?? \"\")\n .setPrice(price);\n\n if (this.broker.mode !== ChartMode.MOBILE) {\n orderLine.onCancel(null, () => this.broker.cancelOrder(pendingOrder));\n this.applyEditOnMove(orderLine, pendingOrder);\n } else {\n orderLine.setEditable(false).setCancellable(false);\n }\n // orderLine.onCancel(null, () => this.broker.cancelOrder(pendingOrder));\n // this.applyEditOnMove(orderLine, pendingOrder);\n\n return orderLine;\n }\n\n static getOrderEditKey(pendingOrder: any) {\n const orderCombinationType = this.getCombinationType(pendingOrder);\n\n if (\n [OrderCombinationType.LIMIT, OrderCombinationType.BRACKET_LIMIT].includes(\n orderCombinationType,\n )\n ) {\n return \"price\";\n }\n\n if (\n orderCombinationType === OrderCombinationType.STOP_LIMIT ||\n orderCombinationType === OrderCombinationType.STOP_MARKET ||\n pendingOrder.rootAlgoOrderAlgoType === AlgoType.POSITIONAL_TP_SL ||\n pendingOrder.rootAlgoOrderAlgoType === AlgoType.TP_SL ||\n pendingOrder.rootAlgoOrderAlgoType === AlgoType.BRACKET ||\n pendingOrder.rootAlgoOrderAlgoType === AlgoType.STOP_BRACKET\n ) {\n return \"trigger_price\";\n }\n }\n\n applyEditOnMove(orderLine: IOrderLineAdapter, pendingOrder: any) {\n const editKey = OrderLineService.getOrderEditKey(pendingOrder);\n if (!editKey) {\n return;\n }\n orderLine.onMove(() => {\n this.broker\n .editOrder(pendingOrder, {\n type: editKey,\n value: `${orderLine.getPrice()}`,\n })\n .then((res: any) => {\n if (!res.success) {\n this.renderPendingOrder(pendingOrder); // go back to the original price\n }\n })\n .catch(() => this.renderPendingOrder(pendingOrder));\n });\n }\n\n removeAll() {\n this.pendingOrderLineMap.forEach((orderLine) => orderLine.remove());\n this.pendingOrderLineMap.clear();\n this.pendingOrders = [];\n this.tpslCalService.clear();\n }\n}\n","import { OrderInterface } from \"../type\";\n\nexport const CHART_QTY_DECIMAL = 4;\n\nexport const getOrderId = (order: OrderInterface | null | undefined) => {\n if (order === null || order === undefined) {\n return undefined;\n }\n return order.algo_order_id || order.order_id;\n};\n","import { ChartPosition, OrderInterface } from \"../type\";\nimport { getOrderId } from \"./order.util\";\nimport {\n buildQuantityTpslNoMap,\n formatPnl,\n getTpslEstPnl,\n isActivatedTpslOrder,\n} from \"./tpsl.util\";\n\nexport class TpslCalService {\n private quantityTpslNoMap: Map<number, number>;\n private tpslPnlMap: Map<number, string>;\n private positions: ChartPosition[] | null;\n\n constructor() {\n this.quantityTpslNoMap = new Map();\n this.tpslPnlMap = new Map();\n this.positions = null;\n }\n\n getQuantityTpslNoMap() {\n return this.quantityTpslNoMap;\n }\n\n getTpslPnlMap() {\n return this.tpslPnlMap;\n }\n\n getFormattedEstPnl(tpslOrder: OrderInterface) {\n if (this.positions === null) {\n return \"\";\n }\n\n const position = this.positions[0];\n\n if (!position) {\n return \"\";\n }\n\n const { estPnl } = getTpslEstPnl(tpslOrder, position);\n\n return formatPnl(estPnl);\n }\n\n prepareTpslPnlMap(newPendingOrders: OrderInterface[]) {\n const changed: number[] = [];\n\n newPendingOrders.forEach((order) => {\n const orderId = getOrderId(order);\n\n if (orderId && isActivatedTpslOrder(order)) {\n const prevPnl = this.tpslPnlMap.get(orderId);\n const newPnl = this.getFormattedEstPnl(order);\n if (prevPnl !== newPnl) {\n changed.push(orderId);\n // @ts-ignore\n this.tpslPnlMap.set(orderId, newPnl);\n }\n }\n });\n\n return changed;\n }\n\n prepareQuantityTpslNoMap(newPendingOrders: OrderInterface[]) {\n this.quantityTpslNoMap = buildQuantityTpslNoMap(newPendingOrders);\n }\n\n recalculatePnl(\n positions: ChartPosition[] | null,\n pendingOrders: OrderInterface[]\n ) {\n this.positions = positions;\n\n return this.prepareTpslPnlMap(pendingOrders);\n }\n\n clear() {\n this.positions = null;\n this.quantityTpslNoMap.clear();\n this.tpslPnlMap.clear();\n }\n}\n","import { i18n } from \"@kodiak-finance/orderly-i18n\";\nimport { Decimal, commify } from \"@kodiak-finance/orderly-utils\";\nimport {\n IChartingLibraryWidget,\n IOrderLineAdapter,\n IPositionLineAdapter,\n} from \"../charting_library\";\nimport useBroker from \"../hooks/useBroker\";\nimport { ChartMode, ChartPosition } from \"../type\";\n\nexport class PositionLineService {\n private instance: IChartingLibraryWidget;\n private positionLines: Record<number, IPositionLineAdapter>;\n private currentSymbol: string;\n private broker: ReturnType<typeof useBroker>;\n private lastPositions: ChartPosition[] | null;\n\n constructor(\n instance: IChartingLibraryWidget,\n broker: ReturnType<typeof useBroker>,\n ) {\n this.instance = instance;\n this.currentSymbol = \"\";\n this.broker = broker;\n this.positionLines = {};\n this.lastPositions = null;\n }\n\n renderPositions(positions: ChartPosition[] | null) {\n if (positions === null || positions.length === 0) {\n this.removePositions();\n return;\n }\n\n if (this.lastPositions?.length !== positions.length) {\n this.removePositions();\n }\n\n if (positions[0].symbol !== this.currentSymbol) {\n this.removePositions();\n this.currentSymbol = positions[0].symbol;\n }\n\n positions.forEach((position, idx) => this.drawPositionLine(position, idx));\n this.lastPositions = positions;\n }\n\n getBasePositionLine() {\n return this.instance\n .activeChart()\n .createPositionLine()\n .setTooltip(i18n.t(\"positions.closePosition\"))\n .setQuantityBackgroundColor(this.broker.colorConfig.chartBG!)\n .setCloseButtonBackgroundColor(this.broker.colorConfig.chartBG!)\n .setBodyTextColor(this.broker.colorConfig.textColor!)\n .setQuantityTextColor(this.broker.colorConfig.qtyTextColor!)\n .setBodyFont(this.broker.colorConfig.font!)\n .setQuantityFont(this.broker.colorConfig.font!)\n .setLineLength(100)\n .setLineStyle(1);\n }\n\n static getPositionQuantity(balance: number) {\n return commify(new Decimal(balance).todp(4, Decimal.ROUND_DOWN).toString());\n }\n\n static getPositionPnL(unrealPnl: number, decimal: number) {\n const text = i18n.t(\"tpsl.pnl\");\n const pnl = new Decimal(unrealPnl).toFixed(decimal, Decimal.ROUND_DOWN);\n if (new Decimal(unrealPnl).eq(0)) {\n return `${text} 0`;\n }\n if (new Decimal(unrealPnl).greaterThan(0)) {\n return `${text} +${commify(pnl)}`;\n }\n return `${text} ${commify(pnl)}`;\n }\n\n removePositions() {\n Object.keys(this.positionLines).forEach((lineId) => {\n this.positionLines[Number(lineId)].remove();\n delete this.positionLines[Number(lineId)];\n });\n }\n\n drawPositionLine(position: ChartPosition, idx: number) {\n const colorConfig = this.broker.colorConfig;\n const isPositiveUnrealPnl = position.unrealPnl >= 0;\n const isPositiveBalance = position.balance >= 0;\n\n let pnlColor = colorConfig.pnlZoreColor;\n const pnlDecimal = new Decimal(position.unrealPnl);\n if (pnlDecimal.greaterThan(0)) {\n pnlColor = colorConfig.upColor;\n } else if (pnlDecimal.lessThan(0)) {\n pnlColor = colorConfig.downColor;\n }\n const borderColor = isPositiveUnrealPnl\n ? colorConfig.pnlUpColor\n : colorConfig.pnlDownColor;\n const sideColor = isPositiveBalance\n ? colorConfig.upColor\n : colorConfig.downColor;\n const price = new Decimal(position.open).toNumber();\n\n this.positionLines[idx] =\n this.positionLines[idx] ?? this.getBasePositionLine();\n this.positionLines[idx]\n .setQuantity(PositionLineService.getPositionQuantity(position.balance))\n .setPrice(price)\n .setCloseButtonIconColor(colorConfig.closeIcon!)\n .setCloseButtonBorderColor(sideColor!)\n .setBodyBackgroundColor(pnlColor!)\n .setQuantityTextColor(sideColor!)\n .setBodyBorderColor(pnlColor!)\n .setLineColor(sideColor!)\n .setQuantityBorderColor(sideColor!)\n .setText(\n PositionLineService.getPositionPnL(\n position.unrealPnl,\n position.unrealPnlDecimal,\n ),\n );\n\n if (this.broker.mode !== ChartMode.MOBILE) {\n this.positionLines[idx].onClose(null, () => {\n this.broker.closePosition(position);\n });\n }\n // this.positionLines[idx].onClose(null, () => {\n // this.broker.closePosition(position);\n // });\n }\n}\n","/* eslint-disable @typescript-eslint/no-unused-vars */\n/* eslint-disable no-console */\nimport React, { useRef } from \"react\";\nimport { useSymbolsInfo, utils } from \"@kodiak-finance/orderly-hooks\";\nimport { i18n, useTranslation } from \"@kodiak-finance/orderly-i18n\";\nimport { useOrderEntryFormErrorMsg } from \"@kodiak-finance/orderly-react-app\";\nimport {\n Box,\n cn,\n convertValueToPercentage,\n Flex,\n Input,\n inputFormatter,\n modal,\n Slider,\n Text,\n} from \"@kodiak-finance/orderly-ui\";\nimport { Decimal } from \"@kodiak-finance/orderly-utils\";\nimport type {\n CrossHairMovedEventParams,\n EntityId,\n IChartingLibraryWidget,\n ILineDataSourceApi,\n IOrderLineAdapter,\n} from \"../charting_library\";\nimport useBroker from \"../hooks/useBroker\";\nimport type { ChartPosition } from \"../type\";\n\nconst DEFAULT_THRESHOLD = 10;\n\nenum MouseInteractiveMode {\n NONE,\n START_TP_SL,\n TP_SL_DRAGGING,\n // END_TP_SL,\n}\n\nconst maskLayerStore = new WeakMap<\n IChartingLibraryWidget,\n { maskLayer: HTMLDivElement }\n>();\n\nexport class TPSLService {\n private instance: IChartingLibraryWidget;\n private broker: ReturnType<typeof useBroker>;\n private lastPositions: ChartPosition[] | null;\n\n private interactiveMode: MouseInteractiveMode = MouseInteractiveMode.NONE;\n\n private tpslElRemoveTimer: ReturnType<typeof setTimeout> | null = null;\n\n private currentPosition: ChartPosition | null = null;\n private tpslOrderLine: IOrderLineAdapter | null = null;\n private tpslPnLVerticalLineEntityId: EntityId | null = null;\n private tpslVerticalLineTime: number | null = null;\n private tpslStartCircleEntityId: EntityId | null = null;\n private tpslEndCircleEntityId: EntityId | null = null;\n private threshold: number = 10;\n private lastArgs: CrossHairMovedEventParams | null = null;\n\n constructor(\n instance: IChartingLibraryWidget,\n broker: ReturnType<typeof useBroker>,\n // onUpdate\n ) {\n this.instance = instance;\n this.broker = broker;\n this.lastPositions = null;\n // this.positionLineService = positionLineService;\n this.tpslElRemoveTimer = null;\n this.currentPosition = null;\n\n this.bindEvent();\n }\n\n private bindEvent() {\n // console.log(\"******* TPSL bindEvent *******\", this.container);\n // this.chart.setScrollEnabled(false);\n\n // this.instance.subscribe()\n\n this.chart.crossHairMoved().subscribe(null, (args) => {\n this.lastArgs = args;\n\n if (this.interactiveMode === MouseInteractiveMode.TP_SL_DRAGGING) {\n this.clearTpslElRemoveTimer();\n return;\n }\n const position = this.getIntersectantPosition(args);\n\n if (\n this.currentPosition &&\n position &&\n this.currentPosition.symbol === position.symbol\n ) {\n // console.log(\"no change\");\n return;\n }\n if (!position) {\n this.clearTPSLElements();\n return;\n }\n\n if (position) {\n this.clearTpslElRemoveTimer();\n this.currentPosition = position;\n\n this.createTPSLTriggerButton(args);\n }\n });\n }\n\n private clearTpslElRemoveTimer() {\n if (this.tpslElRemoveTimer) {\n clearTimeout(this.tpslElRemoveTimer);\n this.tpslElRemoveTimer = null;\n }\n }\n\n private showTPSLDialog(params: { price: number }) {\n const pnl = new Decimal(params.price)\n .minus(this.currentPosition!.open)\n .mul(this.currentPosition?.balance ?? 0);\n modal\n .show(\"TPSLSimpleDialogId\", {\n title: pnl.gt(0)\n ? i18n.t(\"tpsl.TPOrderConfirm\")\n : i18n.t(\"tpsl.SLOrderConfirm\"),\n triggerPrice: params.price,\n type: pnl.gt(0) ? \"tp\" : \"sl\",\n symbol: this.currentPosition!.symbol,\n onComplete: () => {\n this.clearTPSLElements();\n this.chart.setScrollEnabled(true);\n this.chart.setZoomEnabled(true);\n this.interactiveMode = MouseInteractiveMode.NONE;\n },\n showAdvancedTPSLDialog: (options: { qty: number }) => {\n this.showAdvancedTPSLDialog({\n type: pnl.gt(0) ? \"tp\" : \"sl\",\n triggerPrice: params.price,\n qty: options.qty,\n });\n },\n })\n .then(\n () => {\n console.log(\"completate\");\n },\n (err) => {\n console.log(err);\n },\n )\n .finally(() => {\n this.clearTPSLElements();\n this.chart.setScrollEnabled(true);\n this.chart.setZoomEnabled(true);\n this.interactiveMode = MouseInteractiveMode.NONE;\n });\n }\n\n private showAdvancedTPSLDialog({\n type,\n triggerPrice,\n qty,\n }: {\n type: \"tp\" | \"sl\";\n triggerPrice: number;\n qty: number;\n }) {\n console.log(\"showAdvancedTPSLDialog\", type, triggerPrice);\n modal\n .show(\"TPSLDialogId\", {\n withTriggerPrice: true,\n type,\n triggerPrice,\n symbol: this.currentPosition?.symbol,\n qty,\n onComplete: () => {\n this.clearTPSLElements();\n this.chart.setScrollEnabled(true);\n this.chart.setZoomEnabled(true);\n this.interactiveMode = MouseInteractiveMode.NONE;\n },\n })\n .then(\n () => {\n console.log(\"completate\");\n },\n (err) => {\n console.log(\"show advanced tpsl dialog error\", err);\n },\n )\n .finally(() => {\n this.clearTPSLElements();\n this.chart.setScrollEnabled(true);\n this.chart.setZoomEnabled(true);\n this.interactiveMode = MouseInteractiveMode.NONE;\n });\n }\n\n updatePositions(positions: ChartPosition[] | null) {\n this.lastPositions = positions;\n this.threshold = this.generateThreshold();\n }\n\n /**\n * Generates a threshold value for position intersection detection.\n * The threshold is calculated as 2% of the visible price range but is capped\n * to ensure it never exceeds the actual price range (highest - lowest price).\n *\n * @returns The calculated threshold value, or DEFAULT_THRESHOLD if calculation fails\n */\n private generateThreshold() {\n // return new Decimal(position.open).mul(0.01).abs().toNumber();\n // const priceRange = this.chart.get\n const priceScale = this.chart.getPanes()[0]?.getRightPriceScales()[0];\n if (!priceScale) {\n return DEFAULT_THRESHOLD;\n }\n\n try {\n // TradingView's getVisiblePriceRange() can throw \"Value is null\" error\n // when the price scale is initializing or recalculating\n const priceRange = priceScale.getVisiblePriceRange();\n if (!priceRange) {\n return DEFAULT_THRESHOLD;\n }\n\n // Calculate the visible price range\n const priceWidth = priceRange.to - priceRange.from;\n\n // Calculate threshold as 2% of the visible price range\n const calculatedThreshold = priceWidth * 0.02;\n\n // Ensure threshold doesn't exceed the actual price range\n // This prevents threshold from being larger than the chart's price range\n const threshold = Math.min(calculatedThreshold, priceWidth);\n\n return threshold;\n } catch (error) {\n // Handle TradingView internal errors gracefully\n // This can occur during chart initialization, symbol switching, or price scale updates\n // console.error('Error getting visible price range:', error);\n return DEFAULT_THRESHOLD;\n }\n }\n\n private drawTPSL(params: { price: number }) {\n const { price } = params;\n const pnl = new Decimal(price)\n .minus(this.currentPosition!.open)\n .mul(this.currentPosition?.balance ?? 0);\n\n const { tpslOrderLine, verticalLine } = this.ensureTPSLElements({\n price,\n pnl,\n });\n const direction = pnl.gt(0) ? i18n.t(\"tpsl.tp\") : i18n.t(\"tpsl.sl\");\n\n const color = pnl.gt(0)\n ? this.broker.colorConfig.upColor\n : this.broker.colorConfig.downColor;\n tpslOrderLine\n ?.setText(`${direction} ${pnl.toDecimalPlaces(2).toNumber()}`)\n .setBodyTextColor(color!)\n .setBodyBorderColor(color!)\n .setLineColor(color!);\n\n if (this.tpslVerticalLineTime) {\n verticalLine?.setPoints([\n { price: this.currentPosition?.open, time: this.tpslVerticalLineTime },\n { time: this.tpslVerticalLineTime, price: price },\n ]);\n }\n }\n\n private ensureTPSLElements(params: { price: number; pnl: Decimal }) {\n const tpslOrderLine = this.tpslOrderLine;\n let verticalLine;\n let tpslStartCircle;\n let tpslEndCircle;\n // if (this.tpslPnLLabelEntityId) {\n // tpslPnLLabel = this.chart.getShapeById(this.tpslPnLLabelEntityId);\n // }\n if (!tpslOrderLine) {\n this.tpslOrderLine = this.createTPSLOrderLine();\n }\n\n if (this.tpslPnLVerticalLineEntityId) {\n verticalLine = this.chart.getShapeById(this.tpslPnLVerticalLineEntityId);\n }\n\n if (!verticalLine) {\n if (!this.currentPosition || !this.tpslVerticalLineTime) {\n return {};\n }\n\n this.tpslPnLVerticalLineEntityId = this.chart.createMultipointShape(\n [\n {\n price: this.currentPosition.open,\n time: this.tpslVerticalLineTime,\n },\n { time: this.tpslVerticalLineTime, price: params.price },\n ],\n {\n shape: \"trend_line\",\n // shape: \"parallel_channel\",\n lock: true,\n disableSave: true,\n disableSelection: true,\n disableUndo: true,\n zOrder: \"top\",\n overrides: {\n linecolor: \"rgba(255,255,255, 0.2)\",\n linewidth: 1,\n rightEnd: 1,\n leftEnd: 1,\n },\n },\n );\n }\n verticalLine?.setProperties({\n linecolor: params.pnl.gt(0)\n ? this.broker.colorConfig.upColor\n : this.broker.colorConfig.downColor,\n linewidth: 1,\n });\n\n return {\n tpslOrderLine,\n verticalLine,\n };\n }\n\n private createTPSLTriggerButton(params: CrossHairMovedEventParams) {\n if (!this.tpslOrderLine) {\n this.tpslOrderLine = this.createTPSLOrderLine();\n }\n this.tpslOrderLine.onMove(() => {\n const price = this.tpslOrderLine?.getPrice();\n this.showTPSLDialog({ price: price ?? 0 });\n });\n this.tpslOrderLine.onMoving(() => {\n this.interactiveMode = MouseInteractiveMode.TP_SL_DRAGGING;\n const price = this.tpslOrderLine?.getPrice();\n this.verticalLineTime();\n this.drawTPSL({ price: price ?? 0 });\n });\n }\n\n private createTPSLOrderLine() {\n return (\n this.chart\n .createOrderLine()\n // .setEditable(false)\n .setCancellable(false)\n .setExtendLeft(true)\n .setTooltip(i18n.t(\"tpsl.dragToSet\"))\n .setPrice(this.currentPosition!.open)\n .setLineLength(-200, \"pixel\")\n .setText(i18n.t(\"common.tpsl\"))\n .setQuantity(\"\")\n .setBodyTextColor(this.broker.colorConfig.textColor!)\n .setBodyBackgroundColor(this.broker.colorConfig.chartBG!)\n .setBodyBorderColor(this.broker.colorConfig.pnlZoreColor!)\n .setQuantityBackgroundColor(this.broker.colorConfig.chartBG!)\n .setQuantityBorderColor(this.broker.colorConfig.pnlZoreColor!)\n .setQuantityTextColor(this.broker.colorConfig.qtyTextColor!)\n .setBodyFont(this.broker.colorConfig.font!)\n .setQuantityFont(this.broker.colorConfig.font!)\n .setLineStyle(3)\n // .setLineColor(\"rgba(255,255,255,0)\")\n );\n }\n\n private verticalLineTime() {\n const range = this.chart.getVisibleRange();\n\n // const timeScaler = this.chart.getTimeScale();\n // // console.log(timeScaler.width());\n // const width = timeScaler.width();\n // console.log(width);\n\n // const time = timeScaler.coordinateToTime(width - 100);\n this.tpslVerticalLineTime = this.getTimeAtPercentage(\n range.from,\n range.to,\n 90,\n );\n }\n\n private clearTPSLElements() {\n if (this.tpslElRemoveTimer) {\n return;\n }\n // check area\n this.tpslElRemoveTimer = setTimeout(() => {\n this.currentPosition = null;\n if (this.tpslOrderLine) {\n this.tpslOrderLine.remove();\n this.tpslOrderLine = null;\n }\n\n if (this.tpslPnLVerticalLineEntityId) {\n this.chart.removeEntity(this.tpslPnLVerticalLineEntityId);\n this.tpslPnLVerticalLineEntityId = null;\n }\n this.tpslElRemoveTimer = null;\n }, 100);\n // this.tpslVerticalLineTime = null;\n }\n\n private getIntersectantPosition(params: CrossHairMovedEventParams) {\n if (!Array.isArray(this.lastPositions) || this.lastPositions.length === 0) {\n return null;\n }\n\n // this.lastPositions.forEach((position) => {\n // console.log(position);\n // });\n const { price, time } = params;\n let intersectantPosition: ChartPosition | null = null;\n\n // console.log('params', params);\n // console.log('xxx lastPositions', this.lastPositions, this.threshold, price);\n for (const position of this.lastPositions) {\n if (position) {\n if (Math.abs(position.open - price) < this.threshold) {\n intersectantPosition = position;\n break;\n }\n }\n }\n\n return intersectantPosition;\n }\n\n private get chart() {\n return this.instance.activeChart();\n }\n\n private getTimeAtPercentage(\n startTime: number,\n endTime: number,\n percentage: number,\n ) {\n // --- 1. Input Validation (Very Important) ---\n if (\n typeof startTime !== \"number\" ||\n typeof endTime !== \"number\" ||\n typeof percentage !== \"number\"\n ) {\n console.error(\n \"Input Error: startTime, endTime, and percentage must all be numbers.\",\n );\n return null;\n }\n if (percentage < 0 || percentage > 100) {\n console.error(\n `Input Error: Percentage (${percentage}) must be between 0 and 100.`,\n );\n return null;\n }\n if (startTime > endTime) {\n console.error(\n `Input Error: Start time (${startTime}) cannot be later than end time (${endTime}).`,\n );\n return null;\n }\n\n // --- 2. Core Algorithm ---\n // Calculate total duration\n const duration = endTime - startTime;\n\n // Convert percentage to decimal (e.g., 50 -> 0.5)\n const factor = percentage / 100.0;\n\n // Calculate offset\n const offset = duration * factor;\n\n // Calculate final time\n const targetTime = startTime + offset;\n\n // --- 3. Return Result ---\n // Timestamps are usually integers, round to nearest integer\n return Math.round(targetTime);\n }\n}\n","import {\n IChartingLibraryWidget,\n IBrokerConnectionAdapterHost,\n} from \"../charting_library\";\nimport useBroker from \"../hooks/useBroker\";\nimport { ChartPosition } from \"../type\";\nimport { ExecutionService } from \"./execution.service\";\nimport { OrderLineService } from \"./orderLine.service\";\nimport { PositionLineService } from \"./positionLine.service\";\nimport { TPSLService } from \"./tpsl.service\";\n\nexport class Renderer {\n private instance: IChartingLibraryWidget;\n private positionLineService: PositionLineService;\n private orderLineService: OrderLineService;\n private executionService: ExecutionService;\n private tpslService: TPSLService;\n\n constructor(\n instance: IChartingLibraryWidget,\n host: IBrokerConnectionAdapterHost,\n broker: ReturnType<typeof useBroker>,\n ) {\n this.instance = instance;\n this.positionLineService = new PositionLineService(instance, broker);\n this.orderLineService = new OrderLineService(instance, broker);\n this.executionService = new ExecutionService(instance, broker);\n this.tpslService = new TPSLService(instance, broker);\n }\n\n async renderPositions(positions: ChartPosition[] | null) {\n await this.chartReady();\n await this.onDataLoaded();\n this.positionLineService.renderPositions(positions);\n this.orderLineService.updatePositions(positions);\n this.tpslService.updatePositions(positions);\n }\n\n async renderPendingOrders(pendingOrders: any) {\n await this.chartReady();\n this.orderLineService.renderPendingOrders(pendingOrders);\n }\n\n async renderFilledOrders(filledOrders: any, basePriceDecimal: number) {\n await this.chartReady();\n await this.onDataLoaded();\n\n this.executionService.renderExecutions(filledOrders, basePriceDecimal);\n }\n\n remove() {\n this.orderLineService.removeAll();\n this.positionLineService.removePositions();\n this.executionService.destroy();\n }\n\n onDataLoaded(): Promise<void> {\n if (this.instance.activeChart().symbolExt()) {\n return Promise.resolve();\n }\n\n return new Promise((resolve) =>\n this.instance\n .activeChart()\n .onDataLoaded()\n .subscribe(\n null,\n () => {\n resolve();\n },\n true,\n ),\n );\n }\n\n chartReady(): Promise<void> {\n return new Promise((resolve) =>\n this.instance.onChartReady(() => {\n try {\n this.instance.activeChart().dataReady(() => resolve());\n } catch (err: any) {\n if (err!.toString().includes(\"tradingViewApi\")) {\n // hot reload error will be silent\n } else {\n console.log(\"-- chartReady error\", err);\n // throw err;\n }\n }\n }),\n );\n }\n}\n","import {\n IBrokerConnectionAdapterHost,\n IChartingLibraryWidget,\n} from \"../charting_library\";\n\nfunction preventDefaultRenderHack(host: IBrokerConnectionAdapterHost) {\n (host as any).setBrokerConnectionAdapter = function (adapter: any) {\n const delegate = {\n subscribe: () => {},\n unsubscribe: () => {},\n unsubscribeAll: () => {},\n };\n\n Object.defineProperty(adapter, \"_ordersCache\", {\n get: function () {\n return {\n start: () => {},\n stop: () => {},\n update: () => {},\n partialUpdate: () => {},\n fullUpdate: () => {},\n getObjects: async () => [],\n updateDelegate: delegate,\n partialUpdateDelegate: delegate,\n };\n },\n set: () => {},\n });\n adapter._waitForOrderModification = async () => true;\n this._adapter = adapter;\n };\n}\n\nfunction forceSilentOrdersPlacement(\n instance: IChartingLibraryWidget,\n host: IBrokerConnectionAdapterHost\n) {\n instance.onChartReady(() => {\n // Apply default teamplate makes the silentOrdersPlacement disabled, need to set it back\n host.silentOrdersPlacement().subscribe((val: any) => {\n if (!val) {\n host.silentOrdersPlacement().setValue(true);\n if (instance) {\n (instance as any)._iFrame.contentDocument.querySelector(\n \".wrapper-3X2QgaDd\"\n ).className = \"wrapper-3X2QgaDd highButtons-3X2QgaDd\";\n }\n\n // The block can only be executed while \"Apply default teamplate\".\n // We don't wnat to show btn buy defualt, so close it.\n host.sellBuyButtonsVisibility()?.setValue(false);\n }\n });\n });\n}\n\nexport default function brokerHostHandler(\n instance: IChartingLibraryWidget,\n host: IBrokerConnectionAdapterHost\n) {\n preventDefaultRenderHack(host);\n forceSilentOrdersPlacement(instance, host);\n}\n","const waitForElm = (\n iframeDocument: HTMLElement,\n selector: string\n): Promise<Element | null> => {\n return new Promise((resolve) => {\n const initialIframe = iframeDocument.querySelector(selector);\n if (initialIframe) {\n resolve(initialIframe);\n }\n\n const observer = new MutationObserver(() => {\n const iframe = iframeDocument.querySelector(selector);\n if (iframe) {\n resolve(iframe);\n observer.disconnect();\n }\n });\n\n observer.observe(iframeDocument, {\n childList: true,\n subtree: true,\n });\n });\n};\n\n\nexport { waitForElm };\n","import { waitForElm } from \"./util\";\n\nexport class ChartHack {\n private iframeDocument: any;\n\n constructor({ iframeDocument }: { iframeDocument: any }) {\n this.iframeDocument = iframeDocument;\n }\n\n public defaultHack() {\n this.showFavoriteStarByDefault();\n }\n\n private showFavoriteStarByDefault() {\n waitForElm(this.iframeDocument, \".dropdown-2R6OKuTS\").then(() => {\n const items = this.iframeDocument.querySelectorAll(\n \".toolbox-2IihgTnv.showOnHover-2IihgTnv\"\n );\n items.forEach((item: HTMLElement) => {\n item.style.opacity = \"1\";\n });\n });\n }\n}\n","import { ChartMode, TradingTerminalWidgetOptions } from \"../type\";\n\nconst getDisabledFeatures = (mode: ChartMode) => {\n let disabledFeatures = [\n \"header_symbol_search\",\n \"volume_force_overlay\",\n \"trading_account_manager\",\n \"drawing_templates\",\n \"open_account_manager\",\n \"right_toolbar\",\n \"support_multicharts\",\n \"header_layouttoggle\",\n \"order_panel\",\n \"order_info\",\n \"trading_notifications\",\n \"display_market_status\",\n \"broker_button\",\n \"add_to_watchlist\",\n \"chart_crosshair_menu\",\n \"header_fullscreen_button\",\n \"header_widget\",\n ];\n\n if (mode === ChartMode.MOBILE) {\n disabledFeatures = [\n ...disabledFeatures,\n \"left_toolbar\",\n \"timeframes_toolbar\",\n \"go_to_date\",\n \"timezone_menu\",\n // add volume back\n \"create_volume_indicator_by_default\",\n \"buy_sell_buttons\",\n ];\n }\n if (mode === ChartMode.BASIC) {\n disabledFeatures = [\n ...disabledFeatures,\n \"header_widget\",\n \"left_toolbar\",\n \"timeframes_toolbar\",\n \"buy_sell_buttons\",\n ];\n } else if (mode === ChartMode.ADVANCED) {\n disabledFeatures = [\n ...disabledFeatures,\n \"left_toolbar\",\n \"timeframes_toolbar\",\n \"buy_sell_buttons\",\n ];\n }\n\n return disabledFeatures;\n};\n\n/**\n * Merges options and returns TradingTerminal widget configuration\n * @param options - Base widget options\n * @param mode - Chart mode (BASIC, ADVANCED, MOBILE)\n * @param showVolumeInSamePane - Kodiak-specific: If true, removes volume_force_overlay from disabled features\n * @param externalEnabledFeatures - Additional enabled features from external props\n * @param externalDisabledFeatures - Additional disabled features from external props\n */\nexport default function getOptions(\n options: any,\n mode: any,\n showVolumeInSamePane: boolean = true,\n externalEnabledFeatures?: string[],\n externalDisabledFeatures?: string[],\n): TradingTerminalWidgetOptions {\n // Default internal enabled features\n const defaultEnabledFeatures = [\n \"hide_left_toolbar_by_default\",\n \"order_panel_close_button\",\n \"iframe_loading_compatibility_mode\",\n ];\n\n // Merge enabled features: combine defaults with external, remove duplicates\n const mergedEnabledFeatures = Array.from(\n new Set([...defaultEnabledFeatures, ...(externalEnabledFeatures || [])]),\n );\n\n // Get default disabled features based on mode\n const defaultDisabledFeatures = getDisabledFeatures(mode);\n\n // Merge disabled features: combine defaults with external, remove duplicates\n let mergedDisabledFeatures = Array.from(\n new Set([...defaultDisabledFeatures, ...(externalDisabledFeatures || [])]),\n );\n\n // Kodiak-specific: Handle showVolumeInSamePane parameter\n // If showVolumeInSamePane is true, remove volume_force_overlay from disabled features\n // so that volume is displayed in the same pane as the price chart\n if (showVolumeInSamePane) {\n mergedDisabledFeatures = mergedDisabledFeatures.filter(\n (feature) => feature !== \"volume_force_overlay\",\n );\n }\n\n return {\n ...options,\n disabled_features: mergedDisabledFeatures,\n enabled_features: mergedEnabledFeatures,\n auto_save_delay: 0.1,\n broker_config: {\n configFlags: {\n supportStopLimitOrders: true,\n supportReversePosition: false,\n },\n },\n };\n}\n","export const SETTING_CHAR_LIMIT = 300_000;\nexport const getChartSettingAdapterKey = (chartKey: string) =>\n `${chartKey}_adapter`;\n\nexport const defaultSettings = {\n \"trading.chart.proterty\": JSON.stringify({\n showSellBuyButtons: 0,\n noConfirmEnabled: 1,\n qweqrq: 0,\n showPricesWithZeroVolume: 1,\n showSpread: 1,\n orderExecutedSoundParams: '{\"enabled\":0,\"name\":\"alert/alarm_clock\"}',\n }),\n \"hint.startFocusedZoom\": \"true\",\n};\n\nconst chartCacheMap = new Map<string, string>();\n\nexport const clearChartCache = () => chartCacheMap.clear();\n\nconst parseAndCacheChartData = (\n chartKey: string,\n savedDataString: string,\n adapterSettingString: string\n) => {\n const settingAdapterKey = getChartSettingAdapterKey(chartKey);\n try {\n const transformedSavedDataString = savedDataString;\n\n const savedData = transformedSavedDataString\n ? JSON.parse(transformedSavedDataString)\n : undefined;\n const adapterSetting = adapterSettingString\n ? JSON.parse(adapterSettingString)\n : defaultSettings;\n\n if (transformedSavedDataString) {\n chartCacheMap.set(chartKey, transformedSavedDataString);\n }\n if (adapterSettingString) {\n chartCacheMap.set(settingAdapterKey, adapterSettingString);\n }\n\n return { savedData, adapterSetting };\n } catch (e) {\n console.error(e);\n }\n\n return { savedData: undefined, adapterSetting: defaultSettings };\n};\n\n// 1. Try to fetch data from cache first.\n// - That make the copying the chart synchronously. cause new chart will find the data from cache\n// - This causes the request only happen 1 time before refreshing the page.\n// 2. If there is no data in cache, try to fetch it from api\n// 3. If there is no data from backend, try to fetch it from local storage (it's a transition mechanism between localstorage way and beckend storage)\n// 4. If data format is not a valid json format or api call failed, it fallback to the default one.\nexport const getChartData = async (chartKey: string, isLoggedIn: boolean) => {\n const settingAdapterKey = getChartSettingAdapterKey(chartKey);\n\n const localStorageSavedData = localStorage.getItem(chartKey) || \"\";\n const localStorageAdapterSetting =\n localStorage.getItem(settingAdapterKey) || \"\";\n\n try {\n if (chartCacheMap.has(chartKey) && chartCacheMap.has(settingAdapterKey)) {\n return {\n savedData: JSON.parse(chartCacheMap.get(chartKey)!),\n adapterSetting: JSON.parse(chartCacheMap.get(settingAdapterKey)!),\n };\n }\n } catch (e) {\n console.error(e);\n }\n\n return parseAndCacheChartData(\n chartKey,\n localStorageSavedData,\n localStorageAdapterSetting\n );\n};\n\nexport const saveChartData = async (\n chartKey: string,\n setting: string,\n isLoggedIn: boolean\n) => {\n if (setting) {\n localStorage.setItem(chartKey, setting);\n chartCacheMap.set(chartKey, setting);\n }\n};\n\nexport const saveChartAdapterSetting = async (\n chartKey: string,\n setting: string,\n isLoggedIn: boolean\n) => {\n const settingAdapterKey = getChartSettingAdapterKey(chartKey);\n\n if (setting) {\n localStorage.setItem(settingAdapterKey, setting);\n chartCacheMap.set(settingAdapterKey, setting);\n }\n};\n\nexport const deleteChartData = async (\n chartKeys: string[],\n isLoggedIn: boolean\n) => {\n const allKeys = chartKeys.concat(chartKeys.map(getChartSettingAdapterKey));\n\n allKeys.forEach((key) => {\n if (localStorage.getItem(key)) {\n localStorage.removeItem(key);\n }\n if (chartCacheMap.has(key)) {\n chartCacheMap.delete(key);\n }\n });\n};\n\nexport const copyChartData = async (\n fromChartKey: string,\n toChartKey: string,\n isLoggedIn: boolean\n) => {\n const fromSettingAdapterKey = getChartSettingAdapterKey(fromChartKey);\n const chartData = chartCacheMap.get(fromChartKey);\n const adapterSettingData = chartCacheMap.get(fromSettingAdapterKey);\n\n if (chartData && adapterSettingData) {\n saveChartData(toChartKey, chartData, isLoggedIn);\n saveChartAdapterSetting(toChartKey, adapterSettingData, isLoggedIn);\n }\n};\n","import { withoutExchangePrefix } from \"../../utils/chart.util\";\nimport {\n ChartActionId,\n LoadingScreenOptions,\n Overrides,\n ThemeName,\n} from \"../charting_library\";\nimport type { AbstractDatafeed } from \"../datafeed/abstract-datafeed\";\nimport type {\n ChartMode,\n IBrokerConnectionAdapterHost,\n IBrokerTerminal,\n IBrokerWithoutRealtime,\n IChartingLibraryWidget,\n LanguageCode,\n ResolutionString,\n TradingTerminalWidgetOptions,\n} from \"../type\";\nimport { ChartHack } from \"./chart_hack\";\nimport getOptions from \"./option\";\nimport {\n defaultSettings,\n getChartData,\n saveChartAdapterSetting,\n saveChartData,\n} from \"./persistUtils\";\n\nconst debounce = (func: any, delay: any) => {\n let timer: ReturnType<typeof setTimeout> | null = null;\n const debounced = (...args: any[]) => {\n timer && window.clearTimeout(timer);\n timer = setTimeout(() => {\n func(...args);\n }, delay);\n };\n debounced.cancel = () => {\n timer && window.clearTimeout(timer);\n timer = null;\n };\n return debounced;\n};\n\ndeclare let TradingView: any;\n\nconst DEFAULT_SETTINGS_KEY = \"chartProp_default\";\nconst DEBOUNCE_SAVE_TIME = 300;\n\nexport interface WidgetOptions {\n fullscreen?: TradingTerminalWidgetOptions[\"fullscreen\"];\n autosize?: TradingTerminalWidgetOptions[\"autosize\"];\n symbol: TradingTerminalWidgetOptions[\"symbol\"];\n overrides?: Overrides;\n studiesOverrides?: Overrides;\n theme?: ThemeName;\n loadingScreen?: LoadingScreenOptions;\n interval: ResolutionString;\n locale: string;\n timezone?: string;\n container: TradingTerminalWidgetOptions[\"container\"];\n libraryPath: TradingTerminalWidgetOptions[\"library_path\"];\n customCssUrl: TradingTerminalWidgetOptions[\"custom_css_url\"];\n customFontFamily: TradingTerminalWidgetOptions[\"custom_font_family\"];\n datafeed: AbstractDatafeed;\n positionControlCallback: (...args: any[]) => void;\n showVolumeInSamePane?: boolean;\n getBroker?(\n instance: IChartingLibraryWidget,\n host: IBrokerConnectionAdapterHost,\n ): IBrokerWithoutRealtime | IBrokerTerminal;\n}\n\nexport interface WidgetProps {\n options: WidgetOptions;\n chartKey?: string;\n mode?: ChartMode;\n onClick?: (e: any) => void;\n /** External enabled features to merge with defaults */\n enabled_features?: string[];\n /** External disabled features to merge with defaults */\n disabled_features?: string[];\n}\n\nexport class Widget {\n private _instance: IChartingLibraryWidget | null = null;\n\n private _onClick = null;\n\n private _broker: any;\n\n private _datafeed: AbstractDatafeed | null = null;\n\n private _chartKey: string = DEFAULT_SETTINGS_KEY;\n\n private _adapterSetting: any = defaultSettings;\n\n private _savedData: any = null;\n\n private _isLoggedIn: boolean = false;\n\n constructor(props: WidgetProps) {\n this._create(props);\n }\n\n public remove() {\n this.unsubscribeClick();\n this._datafeed?.remove();\n this._broker?.remove();\n this._instance?.remove();\n this.debounceSaveChart.cancel();\n this.debounceSaveChartAdapterSetting.cancel();\n }\n\n public updateOverrides(overrides: Overrides) {\n if (!this.instance) {\n return;\n }\n this.instance.applyOverrides(overrides);\n }\n\n public setSymbol(symbol: string, interval?: number, callback?: any) {\n try {\n this._instance?.onChartReady(() => {\n let currentInterval =\n interval ?? this._instance?.symbolInterval()?.interval;\n if (!currentInterval) {\n currentInterval = 1;\n }\n this._instance?.setSymbol(symbol, currentInterval as any, callback);\n });\n } catch (e) {\n console.log(\"set symbol error\", e);\n }\n }\n\n setResolution(resolution: string) {\n if (this._instance) {\n this._instance\n .activeChart()\n .setResolution(resolution as ResolutionString);\n }\n }\n\n public executeActionById(actionId: ChartActionId) {\n try {\n this._instance?.onChartReady(() => {\n // this._instance?.activeChart().showPropertiesDialog(this._instance.activeChart().getAllShapes()[0].id);\n\n this._instance?.activeChart().executeActionById(actionId);\n });\n } catch (e) {\n console.log(\"executeActionId error\", e);\n }\n }\n public changeLineType(lineType: any) {\n try {\n this._instance?.onChartReady(() => {\n // this._instance?.activeChart().showPropertiesDialog(this._instance.activeChart().getAllShapes()[0].id);\n\n this._instance?.activeChart().setChartType(lineType);\n });\n } catch (e) {\n console.log(\"executeActionId error\", e);\n }\n }\n\n public subscribeClick(onClick: any) {\n this._onClick = onClick;\n this._instance?.onChartReady(() => {\n (this._instance as any)?._iFrame.contentDocument?.addEventListener(\n \"click\",\n this._onClick,\n );\n });\n }\n\n public unsubscribeClick() {\n (this._instance as any)?._iFrame.contentDocument?.removeEventListener(\n \"click\",\n this._onClick,\n );\n }\n\n get instance() {\n return this._instance;\n }\n\n private chartHack() {\n this._instance?.onChartReady(() => {\n const iframeDocument = (this._instance as any)._iFrame.contentWindow\n .document;\n new ChartHack({ iframeDocument }).defaultHack();\n });\n }\n\n private debounceSaveChart = debounce(() => {\n try {\n this._instance?.save((chartProps) => {\n if (!Object.is(this._savedData, chartProps)) {\n this._savedData = chartProps;\n saveChartData(\n this._chartKey,\n JSON.stringify(chartProps),\n this._isLoggedIn,\n );\n }\n });\n } catch (e) {\n console.log(\"e\", e);\n }\n }, DEBOUNCE_SAVE_TIME * 2);\n\n private debounceSaveChartAdapterSetting = debounce(() => {\n saveChartAdapterSetting(\n this._chartKey,\n JSON.stringify(this._adapterSetting),\n this._isLoggedIn,\n );\n }, DEBOUNCE_SAVE_TIME);\n\n private subscribeAutoSave() {\n this._instance?.onChartReady(() => {\n this._instance?.subscribe(\"onAutoSaveNeeded\", () => {\n this.debounceSaveChart();\n });\n\n this._instance\n ?.activeChart()\n .onVisibleRangeChanged()\n .subscribe(null, () => {\n // onAutoSaveNeeded won't be triggered in the new version won't be trigger while time scale changes\n this.debounceSaveChart();\n });\n });\n }\n\n private async _create({\n options,\n chartKey,\n mode,\n onClick,\n enabled_features,\n disabled_features,\n }: WidgetProps) {\n const getBroker = options.getBroker;\n\n const widgetOptions: TradingTerminalWidgetOptions = {\n fullscreen: options.fullscreen ?? true,\n autosize: options.autosize ?? false,\n timezone: options.timezone as TradingTerminalWidgetOptions[\"timezone\"],\n symbol: options.symbol,\n library_path: options.libraryPath,\n interval: options.interval ?? \"1\",\n custom_css_url: options.customCssUrl,\n custom_font_family: options.customFontFamily,\n datafeed: options.datafeed,\n studies_overrides: options.studiesOverrides,\n locale: options.locale as LanguageCode,\n theme: options.theme,\n loading_screen: options.loadingScreen,\n overrides: options.overrides,\n container: options.container,\n favorites: {\n intervals: [\n \"1\",\n \"3\",\n \"5\",\n \"15\",\n \"30\",\n \"60\",\n \"240\",\n \"1d\",\n \"1W\",\n \"1M\",\n ] as ResolutionString[],\n chartTypes: [\"Area\", \"Line\"],\n },\n broker_factory: getBroker\n ? (host) => {\n if (this._broker) {\n this._broker.remove();\n }\n this._broker = getBroker(\n this._instance as IChartingLibraryWidget,\n host,\n );\n return this._broker;\n }\n : undefined,\n };\n\n this._datafeed = options.datafeed;\n\n if (chartKey) {\n this._chartKey = chartKey;\n }\n\n // Get data from remote first. fallback to localstorage if no data on the server yet\n const { savedData, adapterSetting } = await getChartData(\n this._chartKey,\n this._isLoggedIn,\n );\n\n // @ts-ignore\n this._adapterSetting = adapterSetting;\n this._savedData = savedData;\n // Pass showVolumeInSamePane and external enabled_features/disabled_features to getOptions\n this._instance = new TradingView.widget({\n ...getOptions(\n widgetOptions,\n mode,\n options.showVolumeInSamePane ?? true,\n enabled_features,\n disabled_features,\n ),\n interval:\n adapterSetting[\"chart.lastUsedTimeBasedResolution\"] ??\n widgetOptions.interval,\n saved_data: savedData,\n settings_adapter: {\n initialSettings: adapterSetting,\n setValue: (key: string, value: any) => {\n this._adapterSetting = { ...this._adapterSetting, [key]: value };\n this.debounceSaveChartAdapterSetting();\n },\n removeValue: () => {},\n },\n });\n\n this._instance!.onChartReady(() => {\n // console.log('-- options symbol', options.symbol, this._instance?.activeChart().symbol());\n if (\n options.symbol &&\n this._instance?.activeChart().symbol() !==\n withoutExchangePrefix(options!.symbol as string)\n ) {\n this.setSymbol(options.symbol as string);\n }\n });\n this.subscribeAutoSave();\n this.subscribeClick(onClick);\n this.chartHack();\n }\n}\n","import React, { forwardRef } from \"react\";\nimport { useMediaQuery } from \"@kodiak-finance/orderly-hooks\";\nimport { MEDIA_TABLET } from \"@kodiak-finance/orderly-types\";\nimport { Box, cn, Divider, Flex } from \"@kodiak-finance/orderly-ui\";\nimport { IndicatorsIcon, SettingIcon } from \"../icons\";\nimport type { TradingviewUIPropsInterface } from \"../type\";\nimport { NoTradingview } from \"./noTradingview\";\nimport TopBar from \"./topBar\";\n\nconst LazyLineType = React.lazy(() => import(\"./lineType\"));\n\nconst LazyTimeInterval = React.lazy(() =>\n import(\"./timeInterval\").then((mod) => ({ default: mod.TimeInterval })),\n);\n\nconst LazyMobileDisplayControl = React.lazy(() =>\n import(\"./displayControl\").then((mod) => ({\n default: mod.MobileDisplayControl,\n })),\n);\n\nconst LazyDesktopDisplayControl = React.lazy(() =>\n import(\"./displayControl\").then((mod) => ({\n default: mod.DesktopDisplayControl,\n })),\n);\n\nconst OperateButton: React.FC<\n React.PropsWithChildren<{ onClick?: React.MouseEventHandler<HTMLElement> }>\n> = ({ children, onClick }) => {\n return (\n <Box\n onClick={onClick}\n className=\"oui-cursor-pointer oui-w-[18px] oui-h-[18px] oui-text-base-contrast-36 hover:oui-text-base-contrast-80\"\n >\n {children}\n </Box>\n );\n};\n\nexport const ZoomOutIcon: React.FC<React.SVGProps<SVGSVGElement>> = (props) => {\n return (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n width=\"18\"\n height=\"18\"\n viewBox=\"0 0 18 18\"\n fill=\"currentColor\"\n {...props}\n >\n <path d=\"M15.0008 2.24304C14.8088 2.24304 14.6085 2.30755 14.4615 2.4538L11.2508 5.66455V3.74304H9.75079V7.49304C9.75079 7.90704 10.0868 8.24304 10.5008 8.24304H14.2508V6.74304H12.3285L15.54 3.53229C15.8325 3.23904 15.8325 2.74705 15.54 2.4538C15.393 2.30755 15.1928 2.24304 15.0008 2.24304ZM3.7508 9.74303V11.243H5.67231L2.46156 14.4538C2.16906 14.747 2.16906 15.239 2.46156 15.5323C2.75481 15.8248 3.2468 15.8248 3.54005 15.5323L6.7508 12.3215V14.243H8.25079V10.493C8.25079 10.079 7.9148 9.74303 7.5008 9.74303H3.7508Z\" />\n </svg>\n );\n};\n\nexport const ZoomInIcon: React.FC<React.SVGProps<SVGSVGElement>> = (props) => {\n return (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n width=\"18\"\n height=\"18\"\n viewBox=\"0 0 18 18\"\n fill=\"currentColor\"\n {...props}\n >\n <path d=\"M7.49219 9.74304C7.30026 9.74304 7.09964 9.80755 6.95309 9.9538L3.74219 13.1646V11.243H2.24219V14.993C2.24219 15.407 2.57796 15.743 2.99219 15.743H6.74219V14.243H4.82031L8.03121 11.0323C8.32416 10.739 8.32416 10.247 8.03121 9.9538C7.88481 9.80755 7.68404 9.74304 7.49219 9.74304ZM11.2509 2.24304V3.74304H13.1728L9.96186 6.9538C9.66899 7.24705 9.66899 7.73904 9.96186 8.03229C10.2547 8.32479 10.7471 8.32479 11.04 8.03229L14.2509 4.82153V6.74304H15.7509V2.99304C15.7509 2.57904 15.4151 2.24304 15.0009 2.24304H11.2509Z\" />\n </svg>\n );\n};\n\nexport const TradingviewUI = forwardRef<\n HTMLDivElement,\n TradingviewUIPropsInterface\n>((props, ref) => {\n const {\n chartRef,\n interval,\n changeDisplaySetting,\n displayControlState,\n tradingViewScriptSrc,\n changeInterval,\n lineType,\n changeLineType,\n openChartSetting,\n openChartIndicators,\n onFullScreenChange,\n } = props;\n\n const isMobile = useMediaQuery(MEDIA_TABLET);\n\n return (\n <div\n ref={ref}\n className={cn(\"oui-relative oui-size-full\", props.classNames?.root)}\n >\n {!tradingViewScriptSrc ? (\n <NoTradingview />\n ) : (\n <div\n className={cn(\n \"oui-absolute oui-inset-0 oui-z-[1] oui-flex oui-flex-col\",\n props.classNames?.content,\n )}\n >\n <TopBar>\n {isMobile ? (\n <Flex\n gapX={2}\n width=\"100%\"\n justify=\"between\"\n className=\"oui-hide-scrollbar oui-overflow-x-scroll\"\n >\n <React.Suspense fallback={null}>\n <LazyTimeInterval\n interval={interval ?? \"15\"}\n changeInterval={changeInterval}\n />\n </React.Suspense>\n <OperateButton onClick={openChartIndicators}>\n <IndicatorsIcon />\n </OperateButton>\n <React.Suspense fallback={null}>\n <LazyMobileDisplayControl\n displayControlState={displayControlState}\n changeDisplayControlState={changeDisplaySetting}\n />\n </React.Suspense>\n </Flex>\n ) : (\n <Flex justify={\"between\"} itemAlign={\"center\"} width={\"100%\"}>\n <Flex>\n <React.Suspense fallback={null}>\n <LazyTimeInterval\n interval={interval ?? \"1\"}\n changeInterval={changeInterval}\n />\n </React.Suspense>\n <Divider\n direction=\"vertical\"\n className=\"oui-h-4\"\n mx={2}\n intensity={8}\n />\n <Flex justify=\"start\" itemAlign=\"center\" gap={2}>\n <React.Suspense fallback={null}>\n <LazyDesktopDisplayControl\n displayControlState={displayControlState}\n changeDisplayControlState={changeDisplaySetting}\n />\n </React.Suspense>\n <OperateButton onClick={openChartIndicators}>\n <IndicatorsIcon />\n </OperateButton>\n <React.Suspense fallback={null}>\n <LazyLineType\n lineType={lineType}\n changeLineType={changeLineType}\n />\n </React.Suspense>\n <OperateButton onClick={openChartSetting}>\n <SettingIcon />\n </OperateButton>\n </Flex>\n </Flex>\n <Flex>\n {props.fullscreen ? (\n <ZoomOutIcon\n className=\"oui-text-base-contrast-54 hover:oui-text-base-contrast oui-cursor-pointer\"\n onClick={onFullScreenChange}\n />\n ) : (\n <ZoomInIcon\n className=\"oui-text-base-contrast-54 hover:oui-text-base-contrast oui-cursor-pointer\"\n onClick={onFullScreenChange}\n />\n )}\n </Flex>\n </Flex>\n )}\n </TopBar>\n <div ref={chartRef} className=\"oui-size-full oui-overflow-hidden\" />\n </div>\n )}\n </div>\n );\n});\n","import React from \"react\";\nimport { Trans, useTranslation } from \"@kodiak-finance/orderly-i18n\";\n\nconst Link: React.FC<React.PropsWithChildren<{ url: string }>> = (props) => {\n const { url, children } = props;\n return (\n <span\n onClick={() => window.open(url)}\n className=\"oui-cursor-pointer oui-px-0.5 oui-text-primary-light oui-underline\"\n >\n {children}\n </span>\n );\n};\n\nexport const NoTradingview: React.FC = () => {\n const { t } = useTranslation();\n return (\n <div className=\"oui-absolute oui-inset-0 oui-z-0 oui-flex oui-flex-col oui-items-center oui-justify-start oui-p-2 oui-text-base-contrast-80 md:oui-justify-center md:oui-p-10\">\n <div>\n <p className=\"oui-mb-6 oui-text-xs\">{t(\"tradingView.noScriptSrc\")}</p>\n\n <p className=\"oui-mb-3 oui-pl-0 oui-text-2xs oui-text-base-contrast-54 md:oui-pl-2 md:oui-text-base md:oui-text-base-contrast-80\">\n <Trans\n i18nKey=\"tradingView.noScriptSrc.1\"\n components={[\n <Link\n key={\"tradingview-advanced-charts\"}\n url=\"https://www.tradingview.com/advanced-charts\"\n />,\n ]}\n />\n </p>\n <p className=\"oui-pl-0 oui-text-2xs oui-text-base-contrast-54 md:oui-pl-2 md:oui-text-base md:oui-text-base-contrast-80\">\n <Trans\n i18nKey=\"tradingView.noScriptSrc.2\"\n components={[\n <Link\n key={\"tradingview-config\"}\n url=\"https://orderly.network/docs/sdks/react/components/trading#tradingviewconfig\"\n />,\n ]}\n />\n </p>\n </div>\n </div>\n );\n};\n","import React from \"react\";\n\nconst TopBar: React.FC<React.PropsWithChildren> = (props) => {\n return (\n <div className=\"top-toolbar oui-flex oui-h-[44px] oui-justify-between md:oui-justify-start oui-items-center oui-p-2 md:oui-px-3 md:oui-pt-3 md:oui-pb-[14px]\">\n {props.children}\n </div>\n );\n};\n\nexport default TopBar;\n"]}
|