diff --git a/notebooks/Indicators.ipynb b/notebooks/Indicators.ipynb new file mode 100644 index 0000000..9aec4ff --- /dev/null +++ b/notebooks/Indicators.ipynb @@ -0,0 +1,8929 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 2, + "id": "5c63d04f", + "metadata": {}, + "outputs": [], + "source": [ + "import pandas as pd\n", + "import datetime\n", + "import numpy as np\n", + "#import plotly as pl\n", + "\n", + "#import plotly.graph_objs as go\n", + "#from plotly.offline import init_notebook_mode, iplot\n", + "#from plotly.subplots import make_subplots\n", + "#init_notebook_mode()\n", + "\n", + "import CoreTraidMath \n", + "import CoreDraw\n" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "id": "1ad5c45d", + "metadata": {}, + "outputs": [], + "source": [ + "class coreIndicator():\n", + " def __init__(self,\n", + " data=pd.DataFrame(),\n", + " options={},\n", + " showMode='None',\n", + " ):\n", + " '''\n", + " showMode = None/Ind/PartOf \n", + " '''\n", + " self.data=data\n", + " self.showMode=showMode\n", + " self.options=options\n", + " self.overlayInd=None #True/False\n", + " self.ans=None\n", + " self.figDict=None\n", + " \n", + " def getAns(self,data=None):\n", + " if type(data)!=type(None):\n", + " self.data=data\n", + " self.ans=self.getCalculate()\n", + " if self.showMode=='Ind' or self.showMode=='PartOf':\n", + " self.figDict=self.getFigDict()\n", + " if self.showMode=='Ind':\n", + " self.getFig()\n", + " return self.ans\n", + " def getFig(self,row=1):\n", + " CoreDraw.coreDraw(self.figDict,True)\n", + " def getCalculate(self):\n", + " return \"Error\"\n", + " def getFigDict(self):\n", + " return \"Error\"\n", + "\n", + "class indicatorAgrigator():\n", + " '''\n", + " Тема чисто для отладки\n", + " jj=indicatorAgrigator().runAll([o1,o2],df_candle[:30])\n", + " #jj.createIndFromList([o1,o2])\n", + " #jj.calculateInd(df_candle[:30])\n", + " \n", + " '''\n", + " def __init__(self):\n", + " self.indList=None\n", + " self.data=None\n", + " def createInd(self,classDict):\n", + " return classDict['name'](\n", + " options=classDict['params'],\n", + " showMode=classDict['showMode']\n", + " )\n", + " \n", + " \n", + " def createIndFromList(self,indList):\n", + " self.indList=indList\n", + " ans=[]\n", + " for i in self.indList:\n", + " ans.append(self.createInd(i))\n", + " self.indList=ans\n", + " return ans\n", + " \n", + " def calculateInd(self,data):\n", + " self.data=data\n", + " for i in self.indList:\n", + " #i.getAns(data)\n", + " i.data=self.data\n", + " i.ans=i.getCalculate()\n", + " i.figDict=i.getFigDict()\n", + " #i.getFig()\n", + " def agrigateFig(self):\n", + " req=[[]]\n", + " \n", + " for i in self.indList:\n", + " if i.overlayInd==True:\n", + " req[0].append(i)\n", + " else:\n", + " req.append([i])\n", + " CoreDraw.agrigateFig(req,True)\n", + " def runAll(self,indList,df,needDraw=False):\n", + " self.createIndFromList(indList)\n", + " self.calculateInd(df)\n", + " if needDraw:\n", + " self.agrigateFig()\n", + "\n", + " \n", + " " + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "id": "15a63ff4", + "metadata": {}, + "outputs": [], + "source": [ + "class ind_BB(coreIndicator):\n", + " \n", + " def getCalculate(self):\n", + " self.overlayInd=True\n", + " ans={}\n", + " opMA={'dataType':'ohcl',\n", + " 'action':'findMean',\n", + " 'actionOptions':{\n", + " 'MeanType':self.options['MeanType'],\n", + " 'valueType':self.options['valueType'],\n", + " 'window':self.options['window']\n", + " }\n", + " }\n", + " ans['BB']=CoreTraidMath.CoreMath(self.data,opMA).ans\n", + " opSTD={'dataType':'ohcl',\n", + " 'action':'findSTD',\n", + " 'actionOptions':{'valueType':self.options['valueType'],'window':self.options['window']}\n", + " }\n", + " ans['STD']=CoreTraidMath.CoreMath(self.data,opSTD).ans\n", + " ans['pSTD']=ans['BB']+ans['STD']*self.options['kDev']\n", + " ans['mSTD']=ans['BB']-ans['STD']*self.options['kDev']\n", + " ans['x']=np.array(self.data['date'][self.options['window']-1:].to_list())\n", + " return ans\n", + " def getFigDict(self,row=1):\n", + " req=[]\n", + " \n", + " req.append({\n", + " 'vtype':'Scatter',\n", + " 'df':pd.DataFrame(\n", + " {'value':self.ans['BB'],'date':self.ans['x']}) ,\n", + " 'row':row,\n", + " 'col':1,\n", + " 'name':'BB'\n", + " \n", + " })\n", + " req.append({\n", + " 'vtype':'Scatter',\n", + " 'df':pd.DataFrame(\n", + " {'value':self.ans['pSTD'],'date':self.ans['x']}) ,\n", + " 'row':row,\n", + " 'col':1,\n", + " 'name':'pSTD'\n", + " \n", + " })\n", + " req.append({\n", + " 'vtype':'Scatter',\n", + " 'df':pd.DataFrame(\n", + " {'value':self.ans['mSTD'],'date':self.ans['x']}) ,\n", + " 'row':row,\n", + " 'col':1,\n", + " 'name':'mSTD'\n", + " \n", + " })\n", + " \n", + " return req" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "id": "4fcf359d", + "metadata": {}, + "outputs": [], + "source": [ + "class ind_OCHL(coreIndicator):\n", + " def getCalculate(self):\n", + " self.overlayInd=True\n", + " def getFigDict(self,row=1):\n", + " req=[]\n", + " \n", + " req.append({\n", + " 'vtype':'OCHL',\n", + " 'df':self.data,\n", + " 'row':1,\n", + " 'col':1,\n", + " 'name':'OHCL'\n", + "\n", + " })\n", + " return req" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "id": "f2ff80ce", + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
| \n", + " | date | \n", + "open | \n", + "close | \n", + "high | \n", + "low | \n", + "
|---|---|---|---|---|---|
| 0 | \n", + "2020-09-01 03:00:00+03:00 | \n", + "1.19370 | \n", + "1.19388 | \n", + "1.19391 | \n", + "1.19368 | \n", + "
| 1 | \n", + "2020-09-01 03:00:05+03:00 | \n", + "1.19387 | \n", + "1.19388 | \n", + "1.19391 | \n", + "1.19383 | \n", + "
| 2 | \n", + "2020-09-01 03:00:10+03:00 | \n", + "1.19387 | \n", + "1.19384 | \n", + "1.19389 | \n", + "1.19382 | \n", + "
| 3 | \n", + "2020-09-01 03:00:15+03:00 | \n", + "1.19384 | \n", + "1.19384 | \n", + "1.19386 | \n", + "1.19382 | \n", + "
| 4 | \n", + "2020-09-01 03:00:20+03:00 | \n", + "1.19387 | \n", + "1.19390 | \n", + "1.19391 | \n", + "1.19383 | \n", + "
| ... | \n", + "... | \n", + "... | \n", + "... | \n", + "... | \n", + "... | \n", + "
| 99995 | \n", + "2020-09-06 21:52:55+03:00 | \n", + "1.18382 | \n", + "1.18382 | \n", + "1.18393 | \n", + "1.18371 | \n", + "
| 99996 | \n", + "2020-09-06 21:53:00+03:00 | \n", + "1.18382 | \n", + "1.18382 | \n", + "1.18393 | \n", + "1.18371 | \n", + "
| 99997 | \n", + "2020-09-06 21:53:05+03:00 | \n", + "1.18382 | \n", + "1.18382 | \n", + "1.18393 | \n", + "1.18371 | \n", + "
| 99998 | \n", + "2020-09-06 21:53:10+03:00 | \n", + "1.18382 | \n", + "1.18382 | \n", + "1.18393 | \n", + "1.18371 | \n", + "
| 99999 | \n", + "2020-09-06 21:53:15+03:00 | \n", + "1.18382 | \n", + "1.18382 | \n", + "1.18393 | \n", + "1.18371 | \n", + "
100000 rows × 5 columns
\n", + "| \n", + " | date | \n", + "open | \n", + "close | \n", + "high | \n", + "low | \n", + "
|---|---|---|---|---|---|
| 0 | \n", + "2020-09-01 03:00:00+03:00 | \n", + "1.19370 | \n", + "1.19388 | \n", + "1.19391 | \n", + "1.19368 | \n", + "
| 1 | \n", + "2020-09-01 03:00:05+03:00 | \n", + "1.19387 | \n", + "1.19388 | \n", + "1.19391 | \n", + "1.19383 | \n", + "
| 2 | \n", + "2020-09-01 03:00:10+03:00 | \n", + "1.19387 | \n", + "1.19384 | \n", + "1.19389 | \n", + "1.19382 | \n", + "
| 3 | \n", + "2020-09-01 03:00:15+03:00 | \n", + "1.19384 | \n", + "1.19384 | \n", + "1.19386 | \n", + "1.19382 | \n", + "
| 4 | \n", + "2020-09-01 03:00:20+03:00 | \n", + "1.19387 | \n", + "1.19390 | \n", + "1.19391 | \n", + "1.19383 | \n", + "
| ... | \n", + "... | \n", + "... | \n", + "... | \n", + "... | \n", + "... | \n", + "
| 99995 | \n", + "2020-09-06 21:52:55+03:00 | \n", + "1.18382 | \n", + "1.18382 | \n", + "1.18393 | \n", + "1.18371 | \n", + "
| 99996 | \n", + "2020-09-06 21:53:00+03:00 | \n", + "1.18382 | \n", + "1.18382 | \n", + "1.18393 | \n", + "1.18371 | \n", + "
| 99997 | \n", + "2020-09-06 21:53:05+03:00 | \n", + "1.18382 | \n", + "1.18382 | \n", + "1.18393 | \n", + "1.18371 | \n", + "
| 99998 | \n", + "2020-09-06 21:53:10+03:00 | \n", + "1.18382 | \n", + "1.18382 | \n", + "1.18393 | \n", + "1.18371 | \n", + "
| 99999 | \n", + "2020-09-06 21:53:15+03:00 | \n", + "1.18382 | \n", + "1.18382 | \n", + "1.18393 | \n", + "1.18371 | \n", + "
100000 rows × 5 columns
\n", + "| \n", + " | date | \n", + "open | \n", + "close | \n", + "high | \n", + "low | \n", + "
|---|---|---|---|---|---|
| 0 | \n", + "2020-09-01 03:00:00+03:00 | \n", + "1.19370 | \n", + "1.19388 | \n", + "1.19391 | \n", + "1.19368 | \n", + "
| 1 | \n", + "2020-09-01 03:00:05+03:00 | \n", + "1.19387 | \n", + "1.19388 | \n", + "1.19391 | \n", + "1.19383 | \n", + "
| 2 | \n", + "2020-09-01 03:00:10+03:00 | \n", + "1.19387 | \n", + "1.19384 | \n", + "1.19389 | \n", + "1.19382 | \n", + "
| 3 | \n", + "2020-09-01 03:00:15+03:00 | \n", + "1.19384 | \n", + "1.19384 | \n", + "1.19386 | \n", + "1.19382 | \n", + "
| 4 | \n", + "2020-09-01 03:00:20+03:00 | \n", + "1.19387 | \n", + "1.19390 | \n", + "1.19391 | \n", + "1.19383 | \n", + "
| ... | \n", + "... | \n", + "... | \n", + "... | \n", + "... | \n", + "... | \n", + "
| 99995 | \n", + "2020-09-06 21:52:55+03:00 | \n", + "1.18382 | \n", + "1.18382 | \n", + "1.18393 | \n", + "1.18371 | \n", + "
| 99996 | \n", + "2020-09-06 21:53:00+03:00 | \n", + "1.18382 | \n", + "1.18382 | \n", + "1.18393 | \n", + "1.18371 | \n", + "
| 99997 | \n", + "2020-09-06 21:53:05+03:00 | \n", + "1.18382 | \n", + "1.18382 | \n", + "1.18393 | \n", + "1.18371 | \n", + "
| 99998 | \n", + "2020-09-06 21:53:10+03:00 | \n", + "1.18382 | \n", + "1.18382 | \n", + "1.18393 | \n", + "1.18371 | \n", + "
| 99999 | \n", + "2020-09-06 21:53:15+03:00 | \n", + "1.18382 | \n", + "1.18382 | \n", + "1.18393 | \n", + "1.18371 | \n", + "
100000 rows × 5 columns
\n", + "0?[0]:[]);if(o.enter().append(\"g\").classed(f.containerClassName,!0).style(\"cursor\",\"pointer\"),o.exit().each((function(){n.select(this).selectAll(\"g.\"+f.headerGroupClassName).each(a)})).remove(),0!==r.length){var l=o.selectAll(\"g.\"+f.headerGroupClassName).data(r,p);l.enter().append(\"g\").classed(f.headerGroupClassName,!0);for(var u=s.ensureSingle(o,\"g\",f.dropdownButtonGroupClassName,(function(t){t.style(\"pointer-events\",\"all\")})),c=0;c 90&&i.log(\"Long binary search...\"),h-1},e.sorterAsc=function(t,e){return t-e},e.sorterDes=function(t,e){return e-t},e.distinctVals=function(t){var r,n=t.slice();for(n.sort(e.sorterAsc),r=n.length-1;r>-1&&n[r]===o;r--);for(var i,a=n[r]-n[0]||1,s=a/(r||1)/1e4,l=[],u=0;u<=r;u++){var c=n[u],f=c-i;void 0===i?(l.push(c),i=c):f>s&&(a=Math.min(a,f),l.push(c),i=c)}return{vals:l,minDiff:a}},e.roundUp=function(t,e,r){for(var n,i=0,a=e.length-1,o=0,s=r?0:1,l=r?1:0,u=r?Math.ceil:Math.floor;i0&&(n=1),r&&n)return t.sort(e)}return n?t:t.reverse()},e.findIndexOfMin=function(t,e){e=e||a;for(var r,n=1/0,i=0;il?r.y-l:0;return Math.sqrt(u*u+f*f)}for(var p=h(u);p;){if((u+=p+r)>f)return;p=h(u)}for(p=h(f);p;){if(u>(f-=p+r))return;p=h(f)}return{min:u,max:f,len:f-u,total:c,isClosed:0===u&&f===c&&Math.abs(n.x-i.x)<.1&&Math.abs(n.y-i.y)<.1}},e.findPointOnPath=function(t,e,r,n){for(var i,a,o,s=(n=n||{}).pathLength||t.getTotalLength(),l=n.tolerance||.001,u=n.iterationLimit||30,c=t.getPointAtLength(0)[r]>t.getPointAtLength(s)[r]?-1:1,f=0,h=0,p=s;f0?p=i:h=i,f++}return a}},81697:function(t,e,r){\"use strict\";var n=r(92770),i=r(84267),a=r(25075),o=r(21081),s=r(22399).defaultLine,l=r(73627).isArrayOrTypedArray,u=a(s);function c(t,e){var r=t;return r[3]*=e,r}function f(t){if(n(t))return u;var e=a(t);return e.length?e:u}function h(t){return n(t)?t:1}t.exports={formatColor:function(t,e,r){var n,i,s,p,d,v=t.color,g=l(v),y=l(e),m=o.extractOpts(t),x=[];if(n=void 0!==m.colorscale?o.makeColorScaleFuncFromTrace(t):f,i=g?function(t,e){return void 0===t[e]?u:a(n(t[e]))}:f,s=y?function(t,e){return void 0===t[e]?1:h(t[e])}:h,g||y)for(var b=0;b
/i;e.BR_TAG_ALL=/
/gi;var _=/(^|[\\s\"'])style\\s*=\\s*(\"([^\"]*);?\"|'([^']*);?')/i,w=/(^|[\\s\"'])href\\s*=\\s*(\"([^\"]*)\"|'([^']*)')/i,T=/(^|[\\s\"'])target\\s*=\\s*(\"([^\"\\s]*)\"|'([^'\\s]*)')/i,k=/(^|[\\s\"'])popup\\s*=\\s*(\"([\\w=,]*)\"|'([\\w=,]*)')/i;function A(t,e){if(!t)return null;var r=t.match(e),n=r&&(r[3]||r[4]);return n&&L(n)}var M=/(^|;)\\s*color:/;e.plainText=function(t,e){for(var r=void 0!==(e=e||{}).len&&-1!==e.len?e.len:1/0,n=void 0!==e.allowedTags?e.allowedTags:[\"br\"],i=t.split(m),a=[],o=\"\",s=0,l=0;l
\"+l;e.text=u}(t,o,r,u):\"log\"===c?function(t,e,r,n,a){var o=t.dtick,l=e.x,u=t.tickformat,c=\"string\"==typeof o&&o.charAt(0);if(\"never\"===a&&(a=\"\"),n&&\"L\"!==c&&(o=\"L3\",c=\"L\"),u||\"L\"===c)e.text=bt(Math.pow(10,l),t,a,n);else if(i(o)||\"D\"===c&&s.mod(l+.01,1)<.1){var f=Math.round(l),h=Math.abs(f),p=t.exponentformat;\"power\"===p||mt(p)&&xt(f)?(e.text=0===f?1:1===f?\"10\":\"10\"+(f>1?\"\":P)+h+\"\",e.fontSize*=1.25):(\"e\"===p||\"E\"===p)&&h>2?e.text=\"1\"+p+(f>0?\"+\":P)+h:(e.text=bt(Math.pow(10,l),t,\"\",\"fakehover\"),\"D1\"===o&&\"y\"===t._id.charAt(0)&&(e.dy-=e.fontSize/6))}else{if(\"D\"!==c)throw\"unrecognized dtick \"+String(o);e.text=String(Math.round(Math.pow(10,s.mod(l,1)))),e.fontSize*=.75}if(\"D1\"===t.dtick){var d=String(e.text).charAt(0);\"0\"!==d&&\"1\"!==d||(\"y\"===t._id.charAt(0)?e.dx-=e.fontSize/4:(e.dy+=e.fontSize/2,e.dx+=(t.range[1]>t.range[0]?1:-1)*e.fontSize*(l<0?.5:.25)))}}(t,o,0,u,v):\"category\"===c?function(t,e){var r=t._categories[Math.round(e.x)];void 0===r&&(r=\"\"),e.text=String(r)}(t,o):\"multicategory\"===c?function(t,e,r){var n=Math.round(e.x),i=t._categories[n]||[],a=void 0===i[1]?\"\":String(i[1]),o=void 0===i[0]?\"\":String(i[0]);r?e.text=o+\" - \"+a:(e.text=a,e.text2=o)}(t,o,r):Dt(t)?function(t,e,r,n,i){if(\"radians\"!==t.thetaunit||r)e.text=bt(e.x,t,i,n);else{var a=e.x/180;if(0===a)e.text=\"0\";else{var o=function(t){function e(t,e){return Math.abs(t-e)<=1e-6}var r=function(t){for(var r=1;!e(Math.round(t*r)/r,t);)r*=10;return r}(t),n=t*r,i=Math.abs(function t(r,n){return e(n,0)?r:t(n,r%n)}(n,r));return[Math.round(n/i),Math.round(r/i)]}(a);if(o[1]>=100)e.text=bt(s.deg2rad(e.x),t,i,n);else{var l=e.x<0;1===o[1]?1===o[0]?e.text=\"π\":e.text=o[0]+\"π\":e.text=[\"\",o[0],\"\",\"⁄\",\"\",o[1],\"\",\"π\"].join(\"\"),l&&(e.text=P+e.text)}}}}(t,o,r,u,v):function(t,e,r,n,i){\"never\"===i?i=\"\":\"all\"===t.showexponent&&Math.abs(e.x/t.dtick)<1e-6&&(i=\"hide\"),e.text=bt(e.x,t,i,n)}(t,o,0,u,v),n||(t.tickprefix&&!d(t.showtickprefix)&&(o.text=t.tickprefix+o.text),t.ticksuffix&&!d(t.showticksuffix)&&(o.text+=t.ticksuffix)),t.labelalias&&t.labelalias.hasOwnProperty(o.text)){var g=t.labelalias[o.text];\"string\"==typeof g&&(o.text=g)}if(\"boundaries\"===t.tickson||t.showdividers){var y=function(e){var r=t.l2p(e);return r>=0&&r<=t._length?e:null};o.xbnd=[y(o.x-.5),y(o.x+t.dtick-.5)]}return o},q.hoverLabelText=function(t,e,r){r&&(t=s.extendFlat({},t,{hoverformat:r}));var n=Array.isArray(e)?e[0]:e,i=Array.isArray(e)?e[1]:void 0;if(void 0!==i&&i!==n)return q.hoverLabelText(t,n,r)+\" - \"+q.hoverLabelText(t,i,r);var a=\"log\"===t.type&&n<=0,o=q.tickText(t,t.c2l(a?-n:n),\"hover\").text;return a?0===n?\"0\":P+o:o};var yt=[\"f\",\"p\",\"n\",\"μ\",\"m\",\"\",\"k\",\"M\",\"G\",\"T\"];function mt(t){return\"SI\"===t||\"B\"===t}function xt(t){return t>14||t<-15}function bt(t,e,r,n){var a=t<0,o=e._tickround,l=r||e.exponentformat||\"B\",u=e._tickexponent,c=q.getTickFormat(e),f=e.separatethousands;if(n){var h={exponentformat:l,minexponent:e.minexponent,dtick:\"none\"===e.showexponent?e.dtick:i(t)&&Math.abs(t)||1,range:\"none\"===e.showexponent?e.range.map(e.r2d):[0,t||1]};vt(h),o=(Number(h._tickround)||0)+4,u=h._tickexponent,e.hoverformat&&(c=e.hoverformat)}if(c)return e._numFormat(c)(t).replace(/-/g,P);var p,d=Math.pow(10,-o)/2;if(\"none\"===l&&(u=0),(t=Math.abs(t))
\")):x=h.textLabel;var L={x:h.traceCoordinate[0],y:h.traceCoordinate[1],z:h.traceCoordinate[2],data:_._input,fullData:_,curveNumber:_.index,pointNumber:T};d.appendArrayPointValue(L,_,T),t._module.eventData&&(L=_._module.eventData(L,h,_,{},T));var C={points:[L]};if(e.fullSceneLayout.hovermode){var P=[];d.loneHover({trace:_,x:(.5+.5*m[0]/m[3])*s,y:(.5-.5*m[1]/m[3])*l,xLabel:k.xLabel,yLabel:k.yLabel,zLabel:k.zLabel,text:x,name:c.name,color:d.castHoverOption(_,T,\"bgcolor\")||c.color,borderColor:d.castHoverOption(_,T,\"bordercolor\"),fontFamily:d.castHoverOption(_,T,\"font.family\"),fontSize:d.castHoverOption(_,T,\"font.size\"),fontColor:d.castHoverOption(_,T,\"font.color\"),nameLength:d.castHoverOption(_,T,\"namelength\"),textAlign:d.castHoverOption(_,T,\"align\"),hovertemplate:f.castOption(_,T,\"hovertemplate\"),hovertemplateLabels:f.extendFlat({},L,k),eventData:[L]},{container:n,gd:r,inOut_bbox:P}),L.bbox=P[0]}h.distance<5&&(h.buttons||w)?r.emit(\"plotly_click\",C):r.emit(\"plotly_hover\",C),this.oldEventData=C}else d.loneUnhover(n),this.oldEventData&&r.emit(\"plotly_unhover\",this.oldEventData),this.oldEventData=void 0;e.drawAnnotations(e)},k.recoverContext=function(){var t=this;t.glplot.dispose();var e=function(){t.glplot.gl.isContextLost()?requestAnimationFrame(e):t.initializeGLPlot()?t.plot.apply(t,t.plotArgs):f.error(\"Catastrophic and unrecoverable WebGL error. Context lost.\")};requestAnimationFrame(e)};var M=[\"xaxis\",\"yaxis\",\"zaxis\"];function S(t,e,r){for(var n=t.fullSceneLayout,i=0;i<3;i++){var a=M[i],o=a.charAt(0),s=n[a],l=e[o],u=e[o+\"calendar\"],c=e[\"_\"+o+\"length\"];if(f.isArrayOrTypedArray(l))for(var h,p=0;p<(c||l.length);p++)if(f.isArrayOrTypedArray(l[p]))for(var d=0;d
\");b.text(T).attr(\"data-unformatted\",T).call(f.convertToTspans,t),_=c.bBox(b.node())}b.attr(\"transform\",a(-3,8-_.height)),x.insert(\"rect\",\".static-attribution\").attr({x:-_.width-6,y:-_.height-3,width:_.width+6,height:_.height+3,fill:\"rgba(255, 255, 255, 0.75)\"});var k=1;_.width+6>w&&(k=w/(_.width+6));var A=[n.l+n.w*h.x[1],n.t+n.h*(1-h.y[0])];x.attr(\"transform\",a(A[0],A[1])+o(k))}},e.updateFx=function(t){for(var e=t._fullLayout,r=e._subplots[p],n=0;n
\")}(e,r,n,i):v.getValue(s.text,r),v.coerceString(m,o)}(C,n,i,T,M);w=function(t,e){var r=v.getValue(t.textposition,e);return v.coerceEnumerated(x,r)}(O,i);var z=\"stack\"===g.mode||\"relative\"===g.mode,R=n[i],F=!z||R._outmost;if(D&&\"none\"!==w&&(!R.isBlank&&s!==u&&f!==p||\"auto\"!==w&&\"inside\"!==w)){var B=C.font,N=d.getBarColor(n[i],O),j=d.getInsideTextFont(O,i,B,N),U=d.getOutsideTextFont(O,i,B),V=r.datum();I?\"log\"===T.type&&V.s0<=0&&(s=T.range[0]