/** * Chart contructor * */ var fmChart = (function(){ var mp = {}; mp.imgPath = "../images/"; mp.chart = {}; mp.instrument = '3969'; mp.time_span = '1Y'; mp.webservice = rootSite + 'datachart.html'; mp.divId = {line: "line", column: "rent"}; mp.colors = { line: "#AAAAAA", column: "#ff0000", rsi: "#d88704", macd: { hist: "#8BC112", macd: "#B47B00", signal: "#BD419B" }, volume: "#FD5D1E" }; mp.colorsCompare = ["#AAAAAA", "#00A1FF", "#4ACEBC", "#FFC637", "#D98243"]; mp.rawData = []; mp.rawData1Y = []; mp.DataCompare = []; mp.colorStyle = ''; mp.colorLinea = ''; mp.colorTextosEjes = ''; mp.colorGrilla = ''; mp.colorEjes = ''; mp.mainDataChart = []; mp.customDates = false; mp.customDateIni = ''; mp.customDateFin = ''; mp.selectedActive = false; /** * Constructor gráfico lineal * */ mp.stockChart = function(_div, _instrument, _fromData, _periodChart){ if(_fromData) mp.webservice = rootSite + _fromData + '.html'; if(_periodChart) mp.time_span = _periodChart; //Color ejes if( styleUsed.length > 0 ){ if(styleUsed == 'dark'){ mp.colorStyle = '#000000'; mp.colorLinea = '#AAAAAA'; mp.colorTextosEjes = '#ffffff'; mp.colorGrilla = '#000000'; mp.colorEjes = "#ffffff"; }else if(styleUsed == 'clear'){ mp.colorStyle = '#333d47'; mp.colorLinea = '#AAAAAA'; mp.colorTextosEjes = '#333d47'; mp.colorGrilla = '#5C646C'; mp.colorEjes = "#536374"; } } var self = this; self.div = _div; self.id = _instrument; self.compareId = false; self.compareQlt = 1; var chart = new AmCharts.AmStockChart(); chart.syncDataTimestamps = true; self.graph = {}; this.chart = chart; this.MainData = []; chart.pathToImages = mp.imgPath; AmCharts.monthNames=["Enero","Febrero","Marzo","Abril","Mayo","Junio","Julio","Agosto","Septiembre","Octubre","Noviembre","Diciembre"]; AmCharts.shortMonthNames=["Ene","Feb","Mar","Abr","May","Jun","Jul","Ago","Sep","Oct","Nov","Dic"]; AmCharts.dayNames=["Domingo","Lunes","Martes","Miercoles","Jueves","Viernes","Sabado"]; AmCharts.shortDayNames=["Dom","Lun","Mar","Mie","Jue","Vie","Sab"]; /** * Propiedades leyenda eje X * */ var categoryAxesSettings = new AmCharts.CategoryAxesSettings(); categoryAxesSettings.equalSpacing = true; categoryAxesSettings.fillAlpha = 0; categoryAxesSettings.fontSize = 11; categoryAxesSettings.maxSeries = 1500; categoryAxesSettings.minPeriod = 'mm'; categoryAxesSettings.gridColor = mp.colorGrilla; categoryAxesSettings.inside = false; categoryAxesSettings.color = mp.colorTextosEjes; //Color texto eje X categoryAxesSettings.axisAlpha = 0.45; categoryAxesSettings.axisColor = mp.colorEjes; //categoryAxesSettings.minorGridEnabled = true; chart.categoryAxesSettings = categoryAxesSettings; /** * Propiedades leyenda eje Y * */ //chart.valueAxesSettings.position = "right"; chart.valueAxesSettings.inside = false; chart.valueAxesSettings.fontSize = 11; chart.valueAxesSettings.gridColor = mp.colorGrilla; chart.valueAxesSettings.color = mp.colorTextosEjes; //Color texto eje Y chart.valueAxesSettings.axisAlpha = 0.45; chart.valueAxesSettings.axisColor = mp.colorEjes; chart.panelsSettings.marginRight = 10; chart.panelsSettings.marginLeft = 50; /** * Objeto de datos "DataSet" * */ var dataSet = new AmCharts.DataSet(); dataSet.fieldMappings = [ {fromField:"open", toField:"open"}, {fromField:"close", toField:"close"}, {fromField:"high", toField:"high"}, {fromField:"low", toField:"low"}, {fromField:"rsi", toField:"rsi"}, {fromField:"macdSignal", toField:"macdSignal"}, {fromField:"macd", toField:"macd"}, {fromField:"macdHist", toField:"macdHist"}, {fromField:"sma", toField:"sma"}, {fromField:"ema", toField:"ema"}, {fromField:"bbandUp", toField:"bbandUp"}, {fromField:"bbandDown", toField:"bbandDown"}, {fromField:"wolume", toField:"volume"} ]; dataSet.compared = false; dataSet.color = mp.colorLinea; dataSet.categoryField = "date"; var dataSet2 = new AmCharts.DataSet(); dataSet2.fieldMappings = [{fromField: "close", toField: "close"}]; dataSet2.compared = false; dataSet2.color = '#00A1FF'; dataSet2.categoryField = "date"; var dataSet3 = new AmCharts.DataSet(); dataSet3.fieldMappings = [{fromField: "close", toField: "close"}]; dataSet3.compared = false; dataSet3.color = '#4ACEBC'; dataSet3.categoryField = "date"; var dataSet4 = new AmCharts.DataSet(); dataSet4.fieldMappings = [{fromField: "close", toField: "close"}]; dataSet4.compared = false; dataSet4.color = '#FFC637'; dataSet4.categoryField = "date"; var dataSet5 = new AmCharts.DataSet(); dataSet5.fieldMappings = [{fromField: "close", toField: "close"}]; dataSet5.compared = false; dataSet5.color = '#D98243'; dataSet5.categoryField = "date"; chart.dataSets = [dataSet, dataSet2, dataSet3, dataSet4, dataSet5]; chart.dataDateFormat = "YYYY-MM-DD HH:NN"; chart.zoomOutOnDataUpdate = true; /** * Crea grafico Stock * */ self.graph = new AmCharts.StockGraph(); self.graph.title = "Chart Larrainvial"; self.graph.id = "LVChart"; self.graph.type = "line"; self.graph.lineColor = mp.colorLinea; self.graph.valueField = "close"; self.graph.balloonText = "[[value]]"; self.graph.lineAlpha = 1; self.graph.lineThickness = 1.85; self.graph.comparable = true; //self.graph.fillAlphas = 0; self.graph.showBalloon = true; self.graph.useDataSetColors = true; self.graph.fontFamily = "Open Sans"; self.graph.fontSize = 12; // self.graph.compareGraphBalloonText = "[[percents.value]]%"; /** * Propiedades para datos en eje X Textos * */ var stockPanel = new AmCharts.StockPanel(); stockPanel.color = mp.colorTextosEjes; stockPanel.fontFamily = "Open Sans"; stockPanel.thousandsSeparator = '.'; stockPanel.decimalSeparator = ','; stockPanel.drawingIconsEnabled = false; stockPanel.fillAlphas = 0; stockPanel.addStockGraph(self.graph); //SMA var graph2 = new AmCharts.StockGraph(); graph2.title = "Grafico: SMA"; graph2.valueField = "sma"; graph2.balloonText = "SMA: [[value]]"; graph2.type = "line"; graph2.lineColor = "#FF5C64"; graph2.useDataSetColors = false; graph2.balloon = { fillAlpha: 1, fillColor: "#FF5C64" }; stockPanel.addStockGraph(graph2); //EMA var graph3 = new AmCharts.StockGraph(); graph3.title = "Grafico: EMA"; graph3.valueField = "ema"; graph3.balloonText = "EMA: [[value]]"; graph3.type = "line"; graph3.lineColor = "#369100"; graph3.useDataSetColors = false; graph3.balloon = { fillAlpha: 1, fillColor: "#369100" }; stockPanel.addStockGraph(graph3); //BBands Up var graph4 = new AmCharts.StockGraph(); graph4.title = "Grafico: BBAnds Up"; graph4.valueField = "bbandUp"; graph4.balloonText = "BBands Up: [[value]]"; graph4.type = "line"; graph4.lineColor = "#AE9508"; graph4.useDataSetColors = false; graph4.balloon = { fillAlpha: 1, fillColor: "#AE9508" }; stockPanel.addStockGraph(graph4); //BBands Down var graph5 = new AmCharts.StockGraph(); graph5.title = "Grafico: BBands Down"; graph5.valueField = "bbandDown"; graph5.balloonText = "BBands Down: [[value]]"; graph5.type = "line"; graph5.lineColor = "#A64B00"; graph5.useDataSetColors = false; graph5.balloon = { fillAlpha: 1, fillColor: "#A64B00" }; stockPanel.addStockGraph(graph5); chart.panels = [stockPanel]; /** * Propiedades tooltips sobre punto y en eje X * */ var balloon = chart.balloon; balloon.color = "#ffffff"; balloon.fontSize = 11; balloon.fillColor = "#5e6c77"; balloon.cornerRadius = 4; balloon.borderColor = "#5e6c77"; balloon.borderAlpha = 0; balloon.pointerWidth = 4; balloon.fixedPosition = true; balloon.pointerOrientation = "down"; /** * Scroll bajo el gráfico, se activa con enabled true/false * */ var scrollbar = new AmCharts.ChartScrollbarSettings(); scrollbar.graph = self.graph; scrollbar.enabled = false; chart.chartScrollbarSettings = scrollbar; /** * Cursor para fecha bajo gráfico * */ var cursorSettings = new AmCharts.ChartCursorSettings(); cursorSettings.enabled = true; cursorSettings.leaveAfterTouch = true; cursorSettings.leaveCursor = false; cursorSettings.bulletsEnabled = true; cursorSettings.bulletSize = 8; // cursorSettings.categoryBalloonAlpha = 0; // cursorSettings.categoryBalloonColor = "#536374"; cursorSettings.cursorColor = "#AA011B"; cursorSettings.color = "#ffffff"; cursorSettings.categoryBalloonEnabled = true; cursorSettings.valueBalloonsEnabled = true; cursorSettings.categoryBalloonDateFormats = [ {period:"YYYY", format:"DD/MM/YYYY"}, {period:"MM", format:"DD/MM/YYYY"}, {period:"WW", format:"DD/MM/YYYY"}, {period:"DD", format:"DD/MM/YYYY"}, {period:"hh", format:"DD/MM/YYYY • JJ:NN"}, {period:"mm", format:" DD/MM/YYYY • JJ:NN"}, {period:"ss", format:"DD/MM/YYYY • JJ:NN:SS"}, {period:"fff", format:"JJ:NN:SS"} ]; /** * Habilita selector de rango de fechas en el gráfico para calcular la rentabilidad según lo seleccionado. * */ cursorSettings.zoomable = false; //True to enable selectale cursorSettings.pan = false; //Set false & zoomable = true para que seleccione sin hacer zoom cursorSettings.cursorPosition = "middle"; cursorSettings.selectWithoutZooming = true; cursorSettings.listeners = [{ "event": "selected", "method": function(event) { mp.selectedActive = event.startIndex; if(mp.selectedActive == 0) mp.selectedActive = 1; //Si event.start || event.end son más cortas que timestamp lenght > 5 es porque está con selección de periodo por calendario if(parseInt(event.start) > 100000 && parseInt(event.end) > 100000){ var _start = new Date(event.start); _start = _start.toLocaleDateString(); _start = _start.replace(/-/g, "/"); var _end = new Date(event.end); _end = _end.toLocaleDateString(); _end = _end.replace(/-/g, "/"); }else{ var _start = chart.dataSets[0].dataProvider[event.start]['date']; _start = _start.toLocaleDateString(); _start = _start.replace(/-/g, "/"); var _end = chart.dataSets[0].dataProvider[event.end]['date']; _end = _end.toLocaleDateString(); _end = _end.replace(/-/g, "/"); } var __priceIni = chart.dataSets[0].dataProvider[event.startIndex]['close']; var __priceEnd = chart.dataSets[0].dataProvider[event.endIndex]['close']; var __rentVal = ((__priceEnd / __priceIni)-1)*100; var __class = 'apagado'; if (__rentVal > 0.0) __class = 'arriba'; else if (__rentVal < 0.0) __class = 'abajo'; var _xini = parseInt(event.startX*100); var _xend = parseInt(event.endX*100); if(_xend>100) _xend = 100; if(_xini <= 3) _xini = 4; //min var _mpos = parseInt(((_xini + _xend)/2)); var _mselected = parseInt(_xend - _xini); //si seleccion es más pequeña que el tamaño cuadro ubicamos en _xini if(_mselected <= 20){ _mpos = _xini; if(_xini >= 40) _mpos = _mpos - 5; if(_xini >= 80) _mpos = _xend - 15; if(_xini >= 95 || _xend >= 95) _mpos = _xend - 25; if(_xini >= 85 && _xend >= 95) _mpos = _xend - 20; } else if(_mselected > 20){ var _midle = parseInt((_mselected*50)/100); _mpos = parseInt(_midle + _xini)-10; if(_xini >= 50) _mpos = _mpos - 2; if(_xini >= 70 && _xend >= 95) _mpos = _xend - 27; } var __tmpDec = 2; if( $('#defaultDecimalPrice').length > 0 ) __tmpDec = $('#defaultDecimalPrice').val(); var __priceIniView = formatNumber(parseFloat(__priceIni), __tmpDec); var __priceEndView = formatNumber(parseFloat(__priceEnd), __tmpDec); var __tmpHtml = ''; __tmpHtml += '
' + _start + ' al ' + _end + '
'; __tmpHtml += '
' + __priceIniView + ' - ' + __priceEndView + '
'; __tmpHtml += '' + formatNumPCT(__rentVal, '%') + '  
'; $('#blkRentabilidadSelectText').html(__tmpHtml); $('#blkRentabilidadSelect').css('left', _mpos + '%'); $('#blkRentabilidadSelect').css('display', 'block'); } }]; chart.chartCursorSettings = cursorSettings; chart.responsive = { "enabled": true }; /** * Listener to clic over chart Div * */ /*chart.listeners = [{ "event": "init", "method": function(ev) { jQuery(ev.chart.panels[0].chartDiv).on("click", function(e) { if( $('#blkAlertSelectRent').length == 0 && !$('#blkAlertSelectRent').is(":visible") ) notifyAlertBig('Arrastre cursor para calcular rentabilidad del período.', 'info', 'ok', 'blkAlertSelectRent', 4); setTimeout(function() { if( !mp.selectedActive && $('#blkRentabilidadSelect').length > 0 && $('#blkRentabilidadSelect').is(":visible") ){ $('#blkRentabilidadSelect').hide(); }else{ mp.selectedActive = false; } }, 100); }); } }];*/ //chart.addListener("zoomed", addListCompare); chart.write(_div); mp.chart = chart; this.getWorkingDay = function (additionalDays) { // Check if parameter 'daysFromToday' is correct type if(!isNaN(parseInt(additionalDays))) days = parseInt(additionalDays); else days = 0; // Get today's date and set new date based on parameter value var today = new Date(); today.setDate(today.getDate() + days); // Sun, minus two days to get to Friday if (today.getDay() == 0) { today.setDate(today.getDate() - 2); } // Sat, minus one day to get to Friday else if (today.getDay() == 6) { today.setDate(today.getDate() - 1); } today.setHours(0,0,0,0); // Return required date string return today; } /** * Carga data según instrumento, periodo * * @params _id Integer * @params _time String * @params _cb Function */ this.loadData = function(_id, _time, _cb){ $('#loadingChart').show(); mp.DataCompare = []; mp.customDates = false; mp.customDateIni = ''; mp.customDateFin = ''; /** * maxSeries default * */ if(_time != '5Y'){ chart.categoryAxesSettings.maxSeries = 1500; } //Según _time (Periodo) switch(_time){ case '1D': break; case '5D': var _fDateChartView = this.getWorkingDay(-5); break; case '1Y': var _fDateChartView = new Date(); _fDateChartView.setFullYear(_fDateChartView.getFullYear()-1); _fDateChartView.setHours(0,0,0,0); break; case '3Y': var _fDateChartView = new Date(); _fDateChartView.setFullYear(_fDateChartView.getFullYear()-5); _fDateChartView.setHours(0,0,0,0); chart.categoryAxesSettings.minPeriod = 'DD'; chart.categoryAxesSettings.maxSeries = 3000; break; case '5Y': var _fDateChartView = new Date(); _fDateChartView.setFullYear(_fDateChartView.getFullYear()-5); _fDateChartView.setHours(0,0,0,0); chart.categoryAxesSettings.minPeriod = 'DD'; chart.categoryAxesSettings.maxSeries = 3000; break; } getJson(_id, _time, null, null, function(_json){ var tmpDate = ""; if (_time == "1D"){ var nowDate = new Date(); nowDate.setHours(0,0,0,0); var swNowDate = false; for (var i = 0; i < _json.length; i++) { if (new Date(_json[i].date.getFullYear(), _json[i].date.getMonth(), _json[i].date.getDate()).getTime() == nowDate.getTime()){ swNowDate = true; break; } } if (swNowDate){ for (var i = 0; i < _json.length; i++) { if (new Date(_json[i].date.getFullYear(), _json[i].date.getMonth(), _json[i].date.getDate()).getTime() >= nowDate.getTime()){ tmpDate = _json[i].date; break; } } } else { tmpDate = new Date(_json[_json.length-1].date.getFullYear(), _json[_json.length-1].date.getMonth(), _json[_json.length-1].date.getDate()); for (var i = 0; i < _json.length; i++) { if (new Date(_json[i].date.getFullYear(), _json[i].date.getMonth(), _json[i].date.getDate()).getTime() >= tmpDate.getTime()){ tmpDate = _json[i].date; break; } } } } else { for (var i = 0; i < _json.length; i++) { if (new Date(_json[i].date.getFullYear(), _json[i].date.getMonth(), _json[i].date.getDate()).getTime() >= _fDateChartView.getTime()){ break; } } } var dataChartView = _json.slice(i, _json.length); if($('#1D').length > 0) $('#1D').show(); if($('#5D').length > 0) $('#5D').show(); self.graph.balloonText = "[[value]]"; /** * Si es FFMM II no muestra 1D * */ if( $('#inptTypeInstrument').length > 0 && $('#inptTypeInstrument').val() == 2 ){ $('#1D').hide(); self.graph.balloonText = "Valor Cuota: [[value]]"; } /** * Es IPC * */ if( _id == 409 || _id == 411 ) { self.graph.balloonText = "Var.%: [[value]]"; } self.id = _id; mp.time_span = _time; /** * Limpia dataSets de todos los comparados * */ for (r = 1; r <= 4; r++) { chart.dataSets[r].dataProvider = []; chart.dataSets[r].compared = false; $('#caja_' + r).addClass('d-none'); } /** * Evento para caja 0 (intrumento principal en comparación) * */ var tmpCaja0 = $('#globalName').val() + ' '; $('#caja_0').css('color', mp.colorsCompare[0]); $('#caja_0').removeClass('d-none'); $('#caja_0').html(tmpCaja0); $('#optCaja_0').on('click', function() { //Chequeamos que no exsista el mínimo = "1" if(mp.DataCompare.length == 1){ notifyAlert('Para eliminarlo debe primero agregar otro elemento.', 'danger', 'warning'); return false; } else { self.removeCompare(0); $('#caja_0').addClass('d-none'); $('#caja_0').html(''); } }); /** * Modifica algunas propiedades del gráfico según periodo * */ if (_time == '5D'){ chart.categoryAxesSettings.equalSpacing = true; } else if (_time == '1D') { var openTrade = ''; var closeTrade = ''; if(openTrade != '' && closeTrade != '') { var tIni = openTrade.replace(" ", "T"); var tFin = closeTrade.replace(" ", "T"); chart.categoryAxesSettings.equalSpacing = false; chart.categoryAxesSettings.parseDates = true; chart.categoryAxesSettings.dashLength = 1; chart.categoryAxesSettings.minorGridEnabled = false; chart.categoryAxesSettings.minimumDate = tIni; chart.categoryAxesSettings.maximumDate = tFin; AmCharts.datePaddingProcess(chart); } } else { chart.categoryAxesSettings.equalSpacing = false; } /** * Verifica data obtenida si es vacía o no * */ if( _json.length <= 0 ){ var dataPoint = { dummyValue: 0 }; dataPoint[chart.dataSets[0].categoryField] = ''; chart.dataSets[0].dataProvider = [dataPoint]; chart.panels[0].addLabel(0, '50%', 'Sin información.', 'center', '', '#e5e5e5', 0, 1, '', ''); chart.panels[0].chartDiv.style.opacity = 0.3; } else { chart.panels[0].clearLabels(); chart.panels[0].chartDiv.style.opacity = 1; var tmpCloseP = dataChartView[parseInt(dataChartView.length)-1]['close']; var tmpCloseLenght = String(parseInt(tmpCloseP)).length; var _tmpMarginRight = 45; if( tmpCloseLenght >= 7 ){ _tmpMarginRight = 60; }else if( tmpCloseLenght == 6){ _tmpMarginRight = 55; }else if( tmpCloseLenght == 5){ _tmpMarginRight = 50; }else if( tmpCloseLenght == 4 ){ _tmpMarginRight = 45; }else if( tmpCloseLenght < 4 ){ _tmpMarginRight = 40; } chart.panelsSettings.marginLeft = _tmpMarginRight; chart.dataSets[0].dataProvider = dataChartView; // self.mainData = dataChartView; mp.mainDataChart = dataChartView; mp.rawData = _json; mp.rawData1Y = _json; //Data 1Y por siempre sin recorte se sobreescritura de periodo de fechas. /** * Data para Comparador * */ mp.DataCompare[0] = [ _json, _id, $('#globalName').val(), mp.colorsCompare[0], mp.customDates ]; //Set valores para el comparador 0 que corresponde al dato principal $('#compareId0').val(_id); $('#compareName0').val($('#globalName').val()); if( $('#blkListaCompararUno').length > 0 ) { setTimeout(function () { $('#blkListaCompararUno').html(''); addListCompare(chart); }, 1200); } } //rebuildTech(); chart.validateNow(true, false); chart.zoomOut(); if (_time == '1Y') self.MainData = dataChartView; $('#loadingChart').hide(); if (_cb) _cb(); }); }; /** * Carga data según fechas inicio y fin * */ this.loadDataCustom = function(_dateIni, _dateFin, _cb){ mp.customDateIni = _dateIni; mp.customDateFin = _dateFin; $('#loadingChart').show(); /** * Si hay data comparada debemos obtener el id de instrumento del indice 0 porque es el primero * y depende de el * */ if(mp.DataCompare.length > 1){ self.id = mp.DataCompare[0][1]; } getJson(self.id, false, _dateIni, _dateFin, function(_json){ if( _json.length <= 0 ) { var dataPoint = {dummyValue: 0}; dataPoint[chart.dataSets[0].categoryField] = ''; chart.dataSets[0].dataProvider = [dataPoint]; chart.panels[0].addLabel(0, '50%', 'Sin información.', 'center', '', '#e5e5e5', 0, 1, '', ''); chart.panels[0].chartDiv.style.opacity = 0.3; } else { mp.customDates = true; chart.panels[0].clearLabels(); chart.panels[0].chartDiv.style.opacity = 1; chart.categoryAxesSettings.equalSpacing = true; chart.categoryAxesSettings.minPeriod = 'DD'; mp.time_span = '1Y'; /** * Si estamos usando datachart.php traeremos más data de la normal, es decir un % más para el AT * */ var dataChartView = _json; var nowDate = new Date(_dateIni+'T08:00:00'); nowDate.setHours(0,0,0,0); $_iniIndex = false; if(_fromData == 'datachart'){ $_maxDias = 0; while($_iniIndex == false){ for (var i = 0; i < _json.length; i++) { if( new Date(_json[i].date.getFullYear(), _json[i].date.getMonth(), _json[i].date.getDate()).getTime() == nowDate.getTime() ){ $_iniIndex = i; break; } } if(parseInt($_maxDias) > 6) $_iniIndex = true; if($_iniIndex == false){ $_maxDias++; nowDate = nowDate.setDate(nowDate.getDate() + 1); nowDate = new Date(nowDate); } } } if($_iniIndex >= 0){ var dataChartView = _json.slice($_iniIndex, _json.length); } chart.dataSets[0].dataProvider = dataChartView; mp.rawData = _json; } //rebuildTech(); chart.validateNow(true, false); /** * Si tiene comparador * */ if( $('#optComparando').length > 0 || mp.DataCompare.length > 1 ) { //Si hay comparador para cada uno excepto el 0 sacamos la data por fecha (rango) if(mp.DataCompare.length > 1){ $.each(mp.DataCompare, function (_ind, val) { if(_ind > 0) { getJson(val[1], false, _dateIni, _dateFin, function (_json) { chart.dataSets[_ind].dataProvider = _json; }); } }); } setTimeout(function () { //syncDataSets(chart); chart.validateData(); chart.zoomOut(); addListCompare(chart, _dateIni, _dateFin); $('#loadingChart').hide(); }, 2000); }else{ chart.zoomOut(); $('#loadingChart').hide(); } if (_cb) _cb(); }); }; /** * Autocarga el gráfico (default) * */ this.loadData(_instrument, mp.time_span, function(){ /*chart.validateData();*/ }); /** * Cuando hace zoom pasa por aquí y aquí se valida periodo y hace la recarga desde el inicio. * se comenta porque al pasar desde periodo calendario a periodos definidos se recargaba todo * perdiendo las comparaciones, SOLO APLICAR UN VALIDATEDATA CUANDO SE ESTÁ COMPARANDO. * */ this.is3y = function (_cb){ //Comprobamos que haya comparados, porque en ese caso debemos considerar que al cambiar se vean. if(mp.DataCompare.length > 1){ chart.dataSets[0].compared = true; } //Si no es 1Y (5Y; 1W; 1D) y no se está comparando se obtiene la data de 1 año y se recarga if ( mp.time_span != '1Y' && mp.DataCompare.length == 1 ) { this.loadData(idNotation, '1Y', _cb); mp.time_span = '1Y'; } else { _cb(); chart.validateData(); } }; /** * Zoom by default & by click on period * */ this.zoom = function(_time){ var _hasCustomDates = mp.customDates; if($('#blkRentabilidadSelect').length > 0) $('#blkRentabilidadSelect').css('display', 'none'); mp.customDates = false; mp.customDateIni = ''; mp.customDateFin = ''; $('#loadingChart').show(); var actual = new Date(); var addDays = actual.getDate()+2; //Sumamos 2 dias para endDate chart.categoryAxesSettings.equalSpacing = true; //Chequeamos que haya data para el dataset 1 - 4 y lo seteamos, esto en caso de hacer un cambio de periodo comparando (entre 5Y a <). if( mp.DataCompare.length > 1 ) { $.when( self.setDataCompareToDatasets() ).then(function(){ syncDataSets(chart); }); }else{ chart.dataSets[0].dataProvider = self.MainData; mp.rawData = mp.rawData1Y; //Seteamos a rawData la original } /** * Reconstruir AT en caso de haber estado en fechas custom */ if( _hasCustomDates ){ //rebuildTech(); } switch(_time){ case '1D': case '5D': mp.time_span = _time; this.loadData(self.id, _time, function(){ chart.validateData(); chart.zoomOut(); }); if (_time == '1D'){ chart.categoryAxesSettings.equalSpacing = false; chart.categoryAxesSettings.minPeriod = 'mm'; }else{ chart.categoryAxesSettings.equalSpacing = true; chart.categoryAxesSettings.minPeriod = 'mm'; } $('#loadingChart').hide(); break; case 'CY': this.is3y( function(){ $.when( chart.categoryAxesSettings.minPeriod = 'DD', chart.categoryAxesSettings.equalSpacing = false, chart.zoomOut(), chart.startDate = new Date(actual.getFullYear(), (0), 1, 0, 0, 0), chart.endDate = new Date(actual.getFullYear(), actual.getMonth(), addDays, 0, 0, 0), chart.validateNow() ).then(function(){ chart.validateData(); $('#loadingChart').hide(); }); }); break; case '1M': this.is3y( function(){ $.when( chart.categoryAxesSettings.minPeriod = 'DD', chart.categoryAxesSettings.equalSpacing = false, chart.zoomOut(), chart.startDate = new Date(actual.getFullYear(), (actual.getMonth() - 1), actual.getDate(), 0, 0, 0), chart.endDate = new Date(actual.getFullYear(), actual.getMonth(), addDays, 0, 0, 0), chart.validateNow() ).then(function(){ chart.validateData(); $('#loadingChart').hide(); }); }); break; case '3M': this.is3y( function(){ $.when( chart.categoryAxesSettings.minPeriod = 'DD', chart.categoryAxesSettings.equalSpacing = false, chart.zoomOut(), chart.startDate = new Date(actual.getFullYear(), (actual.getMonth() - 3), actual.getDate(), 0, 0, 0), chart.endDate = new Date(actual.getFullYear(), actual.getMonth(), addDays, 0, 0, 0), chart.validateNow() ).then(function(){ chart.validateData(); $('#loadingChart').hide(); }); }); break; case '6M': this.is3y( function(){ $.when( chart.categoryAxesSettings.equalSpacing = false, chart.zoomOut(), chart.startDate = new Date(actual.getFullYear(), (actual.getMonth() - 6), actual.getDate(), 0, 0, 0), chart.endDate = new Date(actual.getFullYear(), actual.getMonth(), addDays, 0, 0, 0), chart.validateNow() ).then(function(){ chart.validateData(); $('#loadingChart').hide(); }); }); break; case '1Y': this.is3y( function(){ $.when( chart.categoryAxesSettings.equalSpacing = false, chart.zoomOut(), chart.startDate = new Date((actual.getFullYear() - 1), actual.getMonth(), actual.getDate(), 0, 0, 0), chart.endDate = new Date(actual.getFullYear(), actual.getMonth(), addDays, 0, 0, 0), chart.validateNow() ).then(function(){ chart.validateData(); $('#loadingChart').hide(); }); }); break; case '3Y': //Si se está Comparando if ( chart.dataSets[1].dataProvider.length > 0 || chart.dataSets[2].dataProvider.length > 0 || chart.dataSets[3].dataProvider.length > 0 || chart.dataSets[4].dataProvider.length > 0 ){ $('#loadingChart').show(); $.when( getJson(self.id, _time, false, false, function (_json) { chart.dataSets[0].dataProvider = _json; mp.rawData = _json; chart.validateData(); //chart.zoomOut(); }), self.getDataCompare(1, _time), self.getDataCompare(2, _time), self.getDataCompare(3, _time), self.getDataCompare(4, _time) ).then(function(){ syncDataSets(chart); setTimeout(function () { chart.validateData(); chart.zoomOut(); if( $('#optComparando').length > 0 ){ addListCompare(chart); } $('#loadingChart').hide(); }, 3000) }); } else { this.loadData(self.id, _time, function(){ //if (_vol) self.showVolumen(); chart.categoryAxesSettings.equalSpacing = false; chart.zoomOut(); if( $('#optComparando').length > 0 ) { setTimeout(function () { addListCompare(chart); }, 1000); } }); } break; case '5Y': //Si se está Comparando if ( chart.dataSets[1].dataProvider.length > 0 || chart.dataSets[2].dataProvider.length > 0 || chart.dataSets[3].dataProvider.length > 0 || chart.dataSets[4].dataProvider.length > 0 ){ $('#loadingChart').show(); $.when( getJson(self.id, _time, false, false, function (_json) { chart.dataSets[0].dataProvider = _json; mp.rawData = _json; chart.validateData(); //chart.zoomOut(); }), self.getDataCompare(1, _time), self.getDataCompare(2, _time), self.getDataCompare(3, _time), self.getDataCompare(4, _time) ).then(function(){ syncDataSets(chart); setTimeout(function () { chart.validateData(); chart.zoomOut(); if( $('#optComparando').length > 0 ){ addListCompare(chart); } $('#loadingChart').hide(); }, 3000) }); } else { this.loadData(self.id, _time, function(){ //if (_vol) self.showVolumen(); chart.categoryAxesSettings.equalSpacing = false; chart.zoomOut(); if( $('#optComparando').length > 0 ) { setTimeout(function () { addListCompare(chart); }, 1000); } }); } break; }; $('.periodosChart').removeClass('active'); if($('#' + _time).length > 0) $('#' + _time).addClass('active'); /** * Si se esta comparando refrescar la lista * */ mp.customDates = false; if( _time != '5Y' || _time != '3Y' ){ setTimeout(function () { addListCompare(chart); }, 610); } }; /** * Get data for Compare dataset * * @params _index Integer * @params _time String */ this.getDataCompare = function(_index, _time){ if( typeof mp.DataCompare[_index] != 'undefined' ) { $.when( getJson($('#compareId' + _index).val(), _time, false, false, function (_json) { chart.dataSets[_index].dataProvider = _json; chart.validateData(); chart.zoomOut(); mp.DataCompare[_index][0] = _json; mp.DataCompare[_index][4] = false; }) ).then(function(){ return true; }); } } /** * Set DataCompare to datasets * */ this.setDataCompareToDatasets = function(){ for (h = 0; h <= 4; h++) { if( mp.DataCompare[h] !== undefined ) { chart.dataSets[h].dataProvider = mp.DataCompare[h][0]; } } setTimeout(function () { return true; }, 800); } /** * Zoom con fechas fijas * */ this.customZoom = function(_ini, _fin){ // if (mp.time_span == '1Y' && +_ini >= +chart.dataSets[0].dataProvider[0].date){ // chart.zoom(_ini, _fin); // }else{ _ini = _formatDate(_ini, "-", true); _fin = _formatDate(_fin, "-", true); this.loadDataCustom(_ini, _fin); // } } /** * Clear selection marker (Period) * */ this.clearSelectionRent = function(){ chart.chartCursors[0].clearSelection(); return true; } /** * Construyendo comparados que están en cookie * */ this.createCompare = function(_dataComp, _period){ $('#loadingChart').show(); var _dateIni = false; var _dateFin = false; var _periodData = '1Y'; if(_period == '5Y') _periodData = '5Y'; var tmpTime = $('#fechas-tablas').find('.active').attr('id'); //Periodo activo var fns = [], ids = [], qlts = [], tims = []; var compareDataSet = parseInt(mp.DataCompare.length); var timeEnd = 1; $.each(_dataComp, function(i, _obj) { if(i==0) return; qlts[i] = _obj[1]; ids[i] = parseInt(_obj[0]); tims[i] = parseInt(1350 * i); timeEnd = tims[i]; fns[i] = setTimeout(function () { getJson(ids[i], _periodData, _dateIni, _dateFin, function (_json) { var _tmpColor = mp.colorsCompare[compareDataSet]; var _name1 = $.trim(_obj[2]); var _idTmp = ids[i]; if ($.trim(_name1) == '') _name1 = $.trim(_obj[2]); if (_idTmp) { if ($('#1D').length > 0) $('#1D').hide(); if ($('#5D').length > 0) $('#5D').hide(); if (tmpTime == '5Y') { $('.periodosChart').removeClass('active'); if ($('#5Y').length > 0) $('#5Y').addClass('active'); } $('#compareId' + compareDataSet).val(_idTmp); $('#compareName' + compareDataSet).val(_name1); self.graph.balloonText = $('#compareName0').val() + ": [[percents.value]]%"; //chart.dataSets[0].compared = true; //Provoca problema en Globo chart.dataSets[compareDataSet].dataProvider = _json; chart.dataSets[compareDataSet].compared = true; $.when( chart.validateData(), chart.validateNow() ).then(function () { mp.DataCompare[compareDataSet] = [ _json, _idTmp, _name1, _tmpColor, mp.customDates ]; compareDataSet = parseInt(mp.DataCompare.length); syncDataSets(chart); }); chart.panels[0].graphs[compareDataSet].balloonText = _name1 + ": [[percents.value]]%"; chart.panels[0].graphs[compareDataSet].balloon.fillColor = _tmpColor; chart.panels[0].graphs[compareDataSet].balloon.borderColor = _tmpColor; self.compareId = ids[i]; self.compareQlt = qlts[i]; setTimeout(function () { self.generaComparados(false); }, 650); } }); }, parseInt(tims[i])); }); var setEnd = setTimeout(function () { setTimeout(function () { if (tmpTime == '1Y') chart.zoomOut(); self.zoom(tmpTime); $('#loadingChart').hide(); }, 100); }, parseInt(timeEnd + 600)); } /** * Function comparar instrumentos, soporta hasta 5 comparadores * * @params _id Integer */ this.compare = function(_id, _qlt) { $('#blkCompare').show(); $('#loadingChart').show(); chart.chartCursorSettings.zoomable = false; /** * Comprobamos que instrumento no exista * */ var _existe = $.grep(mp.DataCompare, function (indicador) { return indicador[1] == _id }); if(_existe.length > 0){ notifyAlert('Indicador ya existe.', 'danger', 'warning'); $('#loadingChart').hide(); return false; } else { //Compara máximo 5 indicadores var compareDataSet = parseInt(mp.DataCompare.length); if (compareDataSet == null || compareDataSet > 4) { $('#spnMaxComparador').show(); notifyAlert('Se pueden comparar un máximo de 5 instrumentos.', 'danger', 'warning'); $('#loadingChart').hide(); return false; }else{ $('#spnMaxComparador').hide(); } var tmpTime = $('#fechas-tablas').find('.active').attr('id'); //Periodo activo global_qlt = _qlt; /** * Si NO se está comparando por fechas obtenemos default 1Y * */ var _dateIni = false; var _dateFin = false; var _periodData = '1Y'; if( mp.customDates == true) { _dateIni = mp.customDateIni; _dateFin = mp.customDateFin; _periodData = false; } getJson(_id, _periodData, _dateIni, _dateFin, function (_json) { var _tmpColor = mp.colorsCompare[compareDataSet]; var _name1 = $("#instrumento_simbolo").val(); var _idTmp = (_id) ? _id : $("#instrumento_id").val(); if ($.trim(_name1) == '') _name1 = $("#instrumento_nombre").val(); if (_idTmp) { //$('.periodosChart').removeClass('active'); if ($('#1D').length > 0) $('#1D').hide(); if ($('#5D').length > 0) $('#5D').hide(); if (tmpTime == '5Y' || tmpTime == '3Y') { $('.periodosChart').removeClass('active'); if ($('#1Y').length > 0) $('#1Y').addClass('active'); } $('#compareId' + compareDataSet).val(_idTmp); $('#compareName' + compareDataSet).val(_name1); self.graph.balloonText = $('#compareName0').val() + ": [[percents.value]]%"; //chart.dataSets[0].compared = true; //Provoca problema en Globo chart.dataSets[compareDataSet].dataProvider = _json; chart.dataSets[compareDataSet].compared = true; /** * Sync datasets * */ $.when( chart.validateData(), chart.validateNow() ).then(function () { /** * Arrray con data comparada si se ha pedido fecha fija se obtiene 1Y para almacenar en DataCompare * */ mp.DataCompare[compareDataSet] = [ _json, _idTmp, _name1, _tmpColor, mp.customDates ]; if(_periodData == false){ getJson(_id, '1Y', false, false, function (_json) { mp.DataCompare[compareDataSet][0] = _json; }); } syncDataSets(chart); }); chart.panels[0].graphs[compareDataSet].balloonText = _name1 + ": [[percents.value]]%"; chart.panels[0].graphs[compareDataSet].balloon.fillColor = _tmpColor; chart.panels[0].graphs[compareDataSet].balloon.borderColor = _tmpColor; self.compareId = _id; self.compareQlt = _qlt; /** * Reconstruye globos de instrumentos comparados * */ setTimeout(function () { self.generaComparados(true); }, 2450); $(".inptBuscadorComparador").val(''); setTimeout(function () { if (tmpTime == '1Y') chart.zoomOut(); $('#loadingChart').hide(); self.zoom('1Y'); }, 1200); /** * Agrega Instrumento a la lista comparados * */ /*setTimeout(function () { addListCompare(chart); }, 800);*/ } }); } } /** * Reconstruye globos y listado de instrumentos comparados * * @params _index Integer */ this.generaComparados = function(_saveCookie){ for(r=0;r<=4;r++){ $('#caja_' + r).html(''); $('#caja_' + r).addClass('d-none'); } /** * Recorrido de datos comparados * */ var tmpCaja = ''; var tmpIdsComparadosCookie = []; chart.chartCursorSettings.zoomable = false; $.each(mp.DataCompare, function(_index, val) { _index = parseInt(_index); tmpCaja = val[2] + ' '; $('#caja_' + _index).html(''); $('#caja_' + _index).removeClass('d-none'); $('#caja_' + _index).css('color', mp.colorsCompare[_index]); $('#caja_' + _index).html(tmpCaja); $('#optCaja_' + _index).on('click', function() { //Chequeamos que no exsista el mínimo = "1" if(mp.DataCompare.length == 1){ notifyAlert('No se puede quitar.', 'danger', 'warning'); return false; } else { var tmpC = this.id.split('_'); self.removeCompare(tmpC[1]); //$('#caja_' + tmpC[1]).addClass('d-none'); //$('#caja_' + tmpC[1]).html(''); } }); //tmpIdsComparadosCookie[_index] = [$.trim(val[1]), 1, $.trim(val[2])]; }); /** * Guarda cookie con instrumentos comparados */ /*if( _saveCookie ){ //console.log("-------------- Guardando Cookie Comparados ----------------"); //console.log(tmpIdsComparadosCookie); //saveCookie('OPTINSTRUMENTOSCOMPARADOS', tmpIdsComparadosCookie, 1); }*/ return true; } /** * Quitar el comparador (x) en cabecera grafico * * @params _index Integer */ this.removeCompare = function(_index){ if ( _index >= 0 ){ //$('#spnMaxComparador').hide(); //Quitamos desde Array mp.DataCompare.splice(_index, 1); //Si he llegado al mínimo de instrumentos cargamos por defecto if(mp.DataCompare.length === 1) { changeChart(mp.DataCompare[0][1], 2); chart.chartCursorSettings.zoomable = false; }else { //Reseteamos todos los dataSet y Textos de balloons for (r = 0; r <= 4; r++) { chart.dataSets[r].compared = false; chart.dataSets[r].dataProvider = []; chart.panels[0].graphs[r].balloonText = ""; chart.panels[0].graphs[r].balloon.fillColor = ""; chart.panels[0].graphs[r].balloon.borderColor = ""; $('#compareId' + r).val(''); $('#compareName' + r).val(''); if ($('#cajalista_' + r).length > 0) $('#cajalista_' + r).remove(); } //Recorremos el array y seteamos los datos nuevamente $.each(mp.DataCompare, function (_ind, val) { chart.dataSets[_ind].compared = true; chart.dataSets[_ind].dataProvider = val[0]; chart.panels[0].graphs[_ind].balloonText = val[2] + ": [[percents.value]]%"; chart.panels[0].graphs[_ind].balloon.fillColor = mp.colorsCompare[_ind]; chart.panels[0].graphs[_ind].balloon.borderColor = mp.colorsCompare[_ind]; $('#compareId' + _ind).val(val[1]); $('#compareName' + _ind).val(val[2]); }); var tmpTime = $('#fechas-tablas').find('.active').attr('id'); var tmpTimeCompare = tmpTime; if(tmpTime == '5Y' || tmpTime == '3Y') tmpTimeCompare = '1Y'; setTimeout(function() { /** * Si se está comparando periodo de fechas, se recarga el loadCustom con las fechas. * */ if(mp.customDates == true){ var _dateIni = mp.customDateIni; var _dateFin = mp.customDateFin; self.loadDataCustom(_dateIni, _dateFin); } else { syncDataSets(chart); } $.when( self.generaComparados(true), $('#blkLC_' + _index).hide(), addListCompare(chart) ).then(function(){ chart.validateNow(false, true); chart.validateData(); }); if(tmpTime == '5Y' || tmpTime == '3Y') { $('.periodosChart').removeClass('active'); $('#1Y').addClass('active'); } self.zoom('1Y'); }, 1200); //Si el índice quitado es 0 regereno header para el instrumneto que queda como principal if(_index == 0){ self.id = mp.DataCompare[0][1]; $.when( getHeadInstrumento(mp.DataCompare[0][1], 2) ).then(function(){ if($('#1D').length > 0) $('#1D').hide(); if($('#5D').length > 0) $('#5D').hide(); }); //saveCookie('LASTINSTRUMENTS', mp.DataCompare[0][1], 2); //$('#lnkVerDetalleComparador').attr('href', rootSite + 'detalles.html?ID_NOTATION=' + mp.DataCompare[0][1]); } } } } /** * Remove all compare data * */ this.clearCompare = function(){ $('#spnMaxComparador').hide(); var tmpId = mp.DataCompare[0][1]; self.id = mp.DataCompare[0][1]; mp.DataCompare = []; mp.customDates = false; changeChart(tmpId, 2, false); chart.chartCursorSettings.zoomable = false; //Banner $('.clsAdsBanners').addClass('d-none'); $('#blkPublicidad-255x205').fadeIn(200, function (){ $('#blkPublicidad-255x205').removeClass('d-none'); initAds('255x205'); }); } /** * Agrega Analisis Técnico * */ this.addAnalisis = function(_type, _args){ switch(_type){ case 'sma': case 'ema': case 'bbands': this.addIndicator(_type, _args.period, _args.deviation); break; case 'rsi': case 'roc': case 'mfi': case 'wr': case 'stochastic': this.AnalisisLine(_type, _args); break; case 'volume': case 'volma': case 'macd': this.addPanelColumn(_type, _args); break; } }; /** * Construye gráfico Stock según argumentos (MACD) * */ this.createGraph = function(args){ var _g = new AmCharts.StockGraph(); _g.valueField = args.value; _g.type = args.type; _g.title = args.title; _g.lineColor = args.color; _g.fillAlphas = 0; _g.useDataSetColors = false; _g.balloon = { fillAlpha: 1, fillColor: args.color }; return _g; }; /** * Agrega grafico para volume, macd * */ this.addPanelColumn = function(_type, _args){ var panel = new AmCharts.StockPanel(); panel.allowTurningOff = false; if(_type == 'macd') panel.title = 'Moving Average Convergence Divergence'; else panel.title = _type; panel.showCategoryAxis = false; //Remove panel if(typeof mp.chart.panels[_type] != 'undefined') { mp.removeFromArray([_type]); this.removePanel(_type); } switch (_type){ case "volume": var opt = {value: "volume", type: "column", title: "volume", color: mp.colors.volume}; panel.title = 'Volumen en Acciones'; panel.marginTop = 60; panel.percentHeight = 40; panel.autoMargins = false; panel.marginBottom = 50; panel.height = '80%'; panel.prefixesOfBigNumbers = [{number:1e+3,prefix:"M"},{number:1e+6,prefix:"MM"},{number:1e+9,prefix:"MMM"},{number:1e+12,prefix:"MMMM"},{number:1e+15,prefix:"P"},{number:1e+18,prefix:"E"},{number:1e+21,prefix:"Z"},{number:1e+24,prefix:"Y"}]; panel.usePrefixes = true; var graph = this.createGraph(opt); graph.fillAlphas = 1; panel.addStockGraph(graph); break; case "macd": mp.analisis.macd(mp.rawData, _args.slow_period, _args.fast_period, _args.signal_period); panel.marginTop = 60; panel.percentHeight = 80; panel.autoMargins = false; panel.marginBottom = 50; panel.height = '90%'; var opt = {value: "macdHist", type: "column", title: "Divergence", color: mp.colors.macd.hist}; var graph = this.createGraph(opt); graph.fillAlphas = 1; opt = {value: "macd", type: "line", title: "macd", color: mp.colors.macd.macd}; var graph2 = this.createGraph(opt); opt = {value: "macdSignal", type: "line", title: "ema", color: mp.colors.macd.signal}; var graph3 = this.createGraph(opt); panel.addStockGraph(graph); panel.addStockGraph(graph2); panel.addStockGraph(graph3); break; } panel.stockLegend = new AmCharts.StockLegend(); panel.stockLegend.color = "#5C646C"; mp.chart.addPanelAt(panel, 1); mp.chart.validateNow(); mp.chart.validateData(); mp.chart.panels[_type] = panel; switch(_type){ case 'macd': $('#atMACD').css('background-color', '#A64B00'); break; case 'volume': $('#atVolume').css('background-color', '#FD5D1E'); break; } }; /** * Construye data segun _type (rsi) * */ this.AnalisisLine = function(_type, _args){ if (_type.match('stoch')) { var st = ""; switch(_args.type){ case 'fast': st = "stochFast";break; case 'slow': st = "stochSlow";break; } if (mp.rawData[mp.rawData.length - 1][st+'K']){ mp.removeFromArray([st+'K', st+'D']); this.removePanel(st); } mp.analisis[_type](mp.rawData, _args.k_period, _args.d_period, _args.k_smoothing_period, _args.type); _type = st; } else { if(typeof mp.chart.panels[_type] != 'undefined') { mp.removeFromArray([_type]); this.removePanel(_type); } mp.analisis[_type](mp.rawData, _args); } this.addPanelLine(_type); }; /** * Agrega indicador ema, sma , Bandas de Bollinger * * @params _type String * @params _period Integer * @params _deviation Integer */ this.addIndicator = function(_type, _period, _deviation){ if(_deviation == 'undefined'){ _deviation = false; } if(_deviation){ if (mp.rawData[mp.rawData.length - 1].bbandUp) mp.removeFromArray(['bbandUp', 'bbandDown']); mp.analisis[_type](mp.rawData, _period, _deviation); }else{ if (!mp.rawData[mp.rawData.length - 1][_type]) mp.removeFromArray([_type]); mp.analisis[_type](mp.rawData, _period); } mp.chart.validateData(); switch(_type){ case 'sma': $('#atSMA').css('background-color', '#FF5C64'); break; case 'ema': $('#atEMA').css('background-color', '#369100'); break; case 'bbands': $('#atBBands').css('background-color', '#AE9508'); break; } }; /** * Agrega los paneles al gráfico RSI * */ this.addPanelLine = function(_type){ var panel = new AmCharts.StockPanel(); panel.allowTurningOff = false; panel.showCategoryAxis = false; var _gTitle = _type; if(_type == 'rsi'){ _gTitle = 'RSI'; panel.title = 'Relative Strength '; }else{ panel.title = _type + ': '; } var graph = this.createGraph({value: _type, type: "line", title: _gTitle, color: mp.colors[_type]}); if (_type.match('stoch')){ graph.valueField = _type + 'K'; graph.title = "%K"; graph.lineColor = mp.colors.stochK; var graph2 = this.createGraph({value: _type+'D', type: "line", title: "%D", color: mp.colors.stochD}); panel.addStockGraph(graph2); } panel.marginTop = 60; panel.percentHeight = 60; panel.autoMargins = false; panel.marginBottom = 50; panel.height = '85%'; panel.addStockGraph(graph); panel.stockLegend = new AmCharts.StockLegend(); panel.stockLegend.color = "#5C646C"; chart.addPanelAt(panel, 2); chart.validateNow(); chart.validateData(); chart.panels[_type] = panel; switch(_type){ case 'rsi': $('#atRSI').css('background-color', '#FFA007'); break; } }; /** * Quita indicador Bandas de Bollinger * * @params _type String */ this.removeIndicator = function(_type){ switch(_type){ case 'sma': mp.removeFromArray([_type]); break; case 'ema': mp.removeFromArray([_type]); break; case 'bbands': mp.removeFromArray(['bbandUp', 'bbandDown']); break; case 'rsi': mp.removeFromArray([_type]); break; case 'macd': mp.removeFromArray([_type]); break; } mp.chart.validateData(); }; /** * Quita un panel especifico a través de nombre * */ this.removePanel = function (_name){ mp.chart.removePanel(chart.panels[_name]); mp.chart.validateNow(); }; /** * Remove all Analisis * */ this.removeAllAnalisis = function (){ $.when( mp.chart.removePanel(chart.panels['rsi']), mp.chart.removePanel(chart.panels['macd']), mp.chart.removePanel(chart.panels['volume']), mp.removeFromArray(['sma']), mp.removeFromArray(['ema']), mp.removeFromArray(['bbandUp', 'bbandDown']) ).then(function(){ mp.chart.validateNow(), mp.chart.validateData() }); //Además limpiamos Maindata que contiene la data 1Y a mostrar var i, j, item; var _ele = ['sma','ema','bbandUp','bbandDown']; for (i = 0, len = self.MainData.length; i < len; i++){ for (j = 0, total = _ele.length; j < len; j++){ item = _ele[j]; delete self.MainData[i][item]; } } }; /** * Change colors axis * * @params _toColor String */ this.changeColors = function(_toColor){ if(_toColor == 'dark'){ mp.colorStyle = '#1DB069'; mp.colorLinea = '#AAAAAA'; mp.colorTextosEjes = '#ffffff'; mp.colorGrilla = '#000000'; mp.colorEjes = "#ffffff"; }else if(_toColor == 'clear'){ mp.colorStyle = '#333d47'; mp.colorLinea = '#AAAAAA'; mp.colorTextosEjes = '#333d47'; mp.colorGrilla = '#5C646C'; mp.colorEjes = "#536374"; } mp.chart.valueAxesSettings.color = mp.colorTextosEjes; mp.chart.valueAxesSettings.axisColor = mp.colorEjes; mp.chart.valueAxesSettings.gridColor = mp.colorGrilla; mp.chart.categoryAxesSettings.gridColor = mp.colorGrilla; mp.chart.categoryAxesSettings.axisColor = mp.colorEjes; mp.chart.categoryAxesSettings.color = mp.colorTextosEjes; self.graph.lineColor = mp.colorLinea; mp.chart.panels[0].color = mp.colorTextosEjes; mp.chart.dataSets[0].color = mp.colorLinea; mp.chart.validateNow(); } return; }; //Fin StockChart /** * Constructor gráfico columnas Rentabilidad * */ mp.columnChart = function(_instr){ var self = this; var chart = new AmCharts.AmSerialChart(); chart.pathToImages = mp.imgPath; chart.numberFormatter = {precision:2, decimalSeparator:',', thousandsSeparator:'.'}; chart.autoMargins = false; chart.marginTop = 10; chart.marginRight = 15; chart.marginLeft = 40; chart.marginBottom = 25; chart.fontSize = 10; chart.borderAlpha = 0; chart.borderColor = "#CCCCCC"; chart.backgroundAlpha = 0; chart.backgroundColor = "#333333"; chart.color = mp.colorStyle; //Color textos Ejes chart.categoryField = "date"; chart.angle = 10; chart.depth3D = 2; chart.fontFamily = "Titillium Web, sans-serif"; chart.categoryAxis = { "axisAlpha": 0.45, "axisColor": "#5C646C", "gridColor": "#5C646C", "gridAlpha": 0.14 }; var graph1 = new AmCharts.AmGraph(); graph1.labelText = "[[value]]%"; graph1.showAllValueLabels = true; graph1.labelPosition = "top"; graph1.bulletSize = 20; graph1.valueField = "p_pct"; graph1.type = "column"; graph1.lineAlpha = 0; graph1.fillAlphas = 1; graph1.fillColors = "#638F38"; graph1.negativeFillColors = "#E60D2E"; graph1.balloonText = "[[category]]: [[value]]%"; chart.addGraph(graph1); var valAxis = new AmCharts.ValueAxis(); valAxis.includeGuidesInMinMax = true; valAxis.axisAlpha = 0.45; valAxis.axisColor = "#5C646C"; valAxis.gridColor = "#5C646C"; valAxis.gridAlpha = 0.14; chart.addValueAxis(valAxis); chart.write(mp.divId.column); self.loadData = function(_instr){ loadingLine = true; if ( $('#' + mp.divId.column).is(':visible') ){ $('#' + mp.divId.column).fadeTo("slow", 0.4); } //Obteniendo data Columna getJson(_instr, 'RENT', false, false, function(_json){ chart.dataProvider = _json; if (_json.length > 1){ var _minMax = getMaxMin(_json, 1.5); valAxis.maximum = _minMax.max; valAxis.minimum = _minMax.min; } chart.validateData(); loadingLine = false; if ( $('#' + mp.divId.column).is(':visible') ){ $('#' + mp.divId.column).fadeTo("slow", 1); // $('#' + mp.divId.column).show(); } }); }; self.getChart = function (){ return chart; } self.chart = chart; self.loadData(_instr); /** * Change colors axis * * @params _toColor String */ this.changeColors = function(_toColor){ mp.colorStyle = _toColor; chart.color = mp.colorStyle; self.chart.validateNow(); } }; //Fin Columnas /** * Bandas de Bollinger (SMA, BBANDS, EMA, RSI, MACD, AVERAGE, STANDARD_DEVIATION) * */ mp.analisis = {}; mp.analisis.util = {}; /* SMA */ mp.analisis.sma = function(_data, _period){ var acum = []; _period = _period - 1; for (var i = 0, len = _data.length; i < len; i++){ acum.push(_data[i].close); if (i >= _period){ _data[i].sma = (mp.analisis.util.average(acum)).toFixed(2); acum.splice(0,1); } } return _data; }; /* EMA */ mp.analisis.ema = function(_data, _period){ var acum = []; var _lastEma = 0; //var multi = 2 / _period; var multi = 2/(_period+1); var last = 0; var _period = _period - 1; for (var i = 0, len = _data.length; i < len; i++){ last = _data[i].close; acum.push(last); if (i >= _period){ if (i == _period){ _lastEma = mp.analisis.util.average(acum); _data[i].ema = (_lastEma).toFixed(2); acum.splice(0,1); }else{ _lastEma = multi * ( last - _lastEma) + _lastEma; _data[i].ema = (_lastEma).toFixed(2); } } } return _data; }; /* BBANDS */ mp.analisis.bbands = function(_data, _period, _deviation){ var acum = []; var avg = 0; var sd = 0; var _period = _period - 1; for (var i = 0, len = _data.length; i < len; i++){ acum.push( _data[i].close ); if (i >= _period){ avg = mp.analisis.util.average(acum); sd = mp.analisis.util.standard_deviation(acum, avg); _data[i].bbandUp = (avg + ( sd * _deviation )).toFixed(2); _data[i].bbandDown = (avg - ( sd * _deviation )).toFixed(2); acum.splice(0,1); } } return _data; }; /* RSI */ mp.analisis.rsi = function(_data, _period){ var acum = [], gain = [], currentGain = 0, averageGain = 0, loss = [], currentLoss = 0, averageLoss = 0, RS = 0, now = 0, prev = 0; for (var i = 0, len = _data.length; i < len; i++) { now = _data[i].close; acum.push( now ); if (i > 0){ prev = _data[i - 1].close; currentGain = 0; currentLoss = 0; if ( now > prev ) currentGain = now - prev; else if (now < prev) currentLoss = prev - now; gain.push( currentGain ); loss.push( currentLoss ); if (i >= _period){ if (i == _period){ averageGain = mp.analisis.util.average(gain); averageLoss = mp.analisis.util.average(loss); loss.splice(0,1); gain.splice(0,1); }else{ averageGain = ( averageGain * (_period - 1) + currentGain ) / _period; averageLoss = ( averageLoss * (_period - 1) + currentLoss ) / _period; } if (averageGain == 0) _data[i].rsi = 100; else{ RS = averageGain / averageLoss; _data[i].rsi = (100 - ( 100 / (1 + RS ) )).toFixed(2); } } } } return _data; }; /* MACD */ mp.analisis.macd = function(_data, _slow, _fast, _signal){ var acum = [], prevEma = 0, prevEma2 = 0, prevEma3 = 0, EMA2 = 0, last = 0, MACD = [], _macd = 0; //_fast = _fast - 1; _slow = _slow - 1; for (var i = 0, len = _data.length; i < len; i++){ last = _data[i].close; acum.push(last); if (i >= _fast){ if (i == _fast){ prevEma2 = mp.analisis.util.average(acum); } prevEma2 = (2 / (_fast + 1)) * (last - prevEma2) + prevEma2; EMA2 = prevEma2; } if (i >= _slow){ if (i == _slow){ prevEma = mp.analisis.util.average(acum); } prevEma = (2 / (_slow + 2)) * (last - prevEma) + prevEma; EMA1 = prevEma; _macd = EMA2 - EMA1; MACD.push(_macd); if (MACD.length >= _signal){ if (MACD.length == _signal){ prevEma3 = mp.analisis.util.average(MACD); MACD.splice(0,1); } prevEma3 = (2 / (_signal + 1)) * (_macd - prevEma3) + prevEma3; _data[i].macd = (_macd).toFixed(2); _data[i].macdSignal = (prevEma3).toFixed(2); _data[i].macdHist = (_macd - prevEma3).toFixed(2); } } } return _data; }; /* UTIL */ mp.analisis.util.average = function(_arr){ var prom = 0, i = 0, length = _arr.length; while(i < length){ prom += _arr[i]; i++; } return prom / length; }; /* DESV. STRD */ mp.analisis.util.standard_deviation = function(_arr, _avg){ var sd = 0, len = _arr.length; _avg = parseInt(_avg); for (var i = 0; i < len; i++){ sd += Math.pow( (_arr[i] - _avg), 2 ); } return Math.sqrt(sd / len); }; /** * Quita elemento específico desde array * */ mp.removeFromArray = function(_ele){ var i, j, item; for (i = 0, len = mp.rawData.length; i < len; i++){ for (j = 0, total = _ele.length; j < len; j++){ item = _ele[j]; delete mp.rawData[i][item]; } } }; /** * Obtiene data para graficar * * @params _instr Integer * @params _time String * @params _dateIni Date * @params _dateFin Date * @params _callback Function * @return function callback */ function getJson(_instr, _time, _dateIni, _dateFin, _callback){ var args = {ID_NOTATION: _instr}; if (_time) args.TIME_SPAN = _time; if (_dateIni) args.DATEINI = _dateIni; if (_dateFin) args.DATEFIN = _dateFin; if (global_qlt) args.QUALITY = global_qlt; args.VOLUME = true; $.get(mp.webservice, args, function (_datos){ var __resp = eval('(' + _datos + ');'); _callback( __resp ); }); }; /** * Buscamos fecha anterior a la propuesta en caso de no tener para la fecha que me envía (_date1) * esto porque el gráfico considera dato anterior al que se busca en caso de no existir * si no existen datos en el intervalo de -7 dias y +7 dias debemos buscar el principio de la data * esto porque puede que hayan instrumentos que hayan comenzado a transar durante el periodo que se selecciona y * no necesariamente tienen data para 1Y * */ function findDateIniPrev(_data, _date1){ var res = ''; var tmpDate1 = new Date(_date1.getTime()); var t2I = dateToString(tmpDate1); $.each( _data, function( index, value ){ var t1 = dateToString(value.date); if( t1 == t2I && typeof value.close != 'undefined' ) { return res = { date: value.date, close: value.close }; } }); //Si no encontramos en la data restaremos -1 (7 veces) para tratar de tomar el día anterior, una vez que se encuentra se retorna. if(res == ''){ for(p=1;p<=7;p++){ var t2 = tmpDate1.setDate(tmpDate1.getDate() - 1); t2 = new Date(t2); t2 = dateToString(t2); $.each( _data, function( index, value ){ var t1 = dateToString(value.date); if( t1 == t2 && typeof value.close != 'undefined' ) { res = { date: value.date, close: value.close }; return false; } }); if(res != '') break; } } //Si no encontramos en la data sumares +1 (20 veces) para tratar de tomar el día siguiente if(res == ''){ for(p=1;p<=20;p++){ var t2 = tmpDate1.setDate(tmpDate1.getDate() + 1); t2 = new Date(t2); t2 = dateToString(t2); $.each( _data, function( index, value ){ var t1 = dateToString(value.date); if( t1 == t2 && typeof value.close != 'undefined' ) { res = { date: value.date, close: value.close }; return false; } }); if(res != '') break; } } /** * Si todavía no hemos encontrado data en los intervalos -7 y +20 verificaremos que el inicio de la data sea mayor a la fecha solicitada y se considerará el * primer punto como el dato válido * **/ if(res == ''){ if(_data[0]) { var ti = new Date(_data[0].date.getTime()); ti = dateToString(ti); if (ti > t2I && typeof _data[0].close != 'undefined') { res = { date: _data[0].date, close: _data[0].close }; } } } return res; } /** * Buscamos en la data los valores de la fecha que se envía y si no hay se busca hacia adelanta * esto porque cuando se compara por fechas fijas lo hace así el gráfico * */ function findDateIniNext(_data, _date1){ var res = ''; var tmpDate1 = new Date(_date1.getTime()); var t2I = dateToString(tmpDate1); $.each( _data, function( index, value ){ var t1 = dateToString(value.date); if( t1 == t2I ) { return res = { date: value.date, close: value.close }; } }); //Si no encontramos en la data sumares +1 (20 veces) para tratar de tomar el día siguiente if(res == ''){ for(p=1;p<=20;p++){ var t2 = tmpDate1.setDate(tmpDate1.getDate() + 1); t2 = new Date(t2); t2 = dateToString(t2); $.each( _data, function( index, value ){ var t1 = dateToString(value.date); if( t1 == t2 ) { res = { date: value.date, close: value.close }; return false; } }); if(res != '') break; } } //Si no encontramos en la data restaremos -1 (7 veces) para tratar de tomar el día anterior, una vez que se encuentra se retorna. if(res == ''){ for(p=1;p<=7;p++){ var t2 = tmpDate1.setDate(tmpDate1.getDate() - 1); t2 = new Date(t2); t2 = dateToString(t2); $.each( _data, function( index, value ){ var t1 = dateToString(value.date); if( t1 == t2 ) { res = { date: value.date, close: value.close }; return false; } }); if(res != '') break; } } /** * Si todavía no hemos encontrado data en los intervalos -7 y +20 verificaremos que el inicio de la data sea mayor a la fecha solicitada y se considerará el * primer punto como el dato válido * **/ if(res == ''){ if(_data[0]) { var ti = new Date(_data[0].date.getTime()); ti = dateToString(ti); if (ti > t2I) { res = { date: _data[0].date, close: _data[0].close }; } } } return res; } /** * Busca la fecha final según la que se solicita, si no encuentra busca hacia atrás, sino hacia arriba. * */ function findDateEnd(_data, _date1){ var res = {}; var tmpDti = new Date(_date1.getTime()); var ti = dateToString(tmpDti); for (var i = (_data.length - 1); i >= 0; i--){ var tmpDt = new Date(_data[i].date.getTime()); var t1 = dateToString(tmpDt); if ( t1 <= ti && typeof _data[i].close != 'undefined' ){ return { date: _data[i].date, close: _data[i].close }; } } return res; } /** * Convert Date to String (Y-m-d) * */ function dateToString(t1){ var _Y = t1.getFullYear(); var _tm = (t1.getMonth()+1); var _m = (_tm < 10) ? '0'+_tm : _tm; var _d = (t1.getDate()<10) ? '0'+t1.getDate() : t1.getDate(); return _Y + '-' + _m + '-' + _d; } /** * Convert Date to String (Y-m-d) * */ function datetimeToString(t1){ var _Y = t1.getFullYear(); var _tm = (t1.getMonth()+1); var _m = (_tm < 10) ? '0'+_tm : _tm; var _d = (t1.getDate()<10) ? '0'+t1.getDate() : t1.getDate(); return _Y + '-' + _m + '-' + _d + 'T09:00:00'; } function findDateIni(_data, _date1){ var res = {}; for (var i = 0, len = _data.length; i < len; i++){ if (+_data[i].date >= +_date1){ return { date: _data[i].date, close: _data[i].close }; } } return res; } function performanceAndDateSpan(obj){ /*if (mp.time_span == '1D'){ $('#period-performance-bar').css("visibility", "hidden"); }else{ var _data = obj.chart.dataSets[0].dataProvider; var _points = { ini: findDateIni(_data, obj.startDate), end: findDateEnd(_data, obj.endDate) }; var performancePeriod = ((_points.end.close / _points.ini.close) - 1) * 100; $('#period-start').html( _formatDate(_points.ini.date) ); $('#period-end').html( _formatDate(_points.end.date) ); $('#period-performance').html( _formatNum(performancePeriod, 2, true, ",",".") ); if ($('#period-performance-bar').css("visibility") == "hidden") $('#period-performance-bar').css("visibility", "visible"); }*/ } function _formatDate(_date, _decorator, _reverse){ if (!_decorator) _decorator = "/"; if(typeof _date != "undefined") { var dd = _date.getDate(); var mm = _date.getMonth() + 1; var yy = _date.getFullYear(); if (dd < 10) dd = '0' + dd; if (mm < 10) mm = '0' + mm; if (_reverse) return yy + _decorator + mm + _decorator + dd; else return dd + _decorator + mm + _decorator + yy; }else{ return; } } function _formatNum(numero, decimales, bSing, separador_decimal, separador_miles) { var sign = ''; var numero = parseFloat(numero); if (isNaN(numero)) { return ""; } if (bSing) { if (numero > 0) sign = '+'; } if (decimales !== undefined) { var pot = Math.pow(10, decimales); numero = Math.round(numero * pot) / pot; var num = numero.toString().split('.'); if (num[1] === undefined || num[1].length < decimales) { if (num[1] === undefined) { i = decimales; numero = numero + '.'; } else { i = decimales - num[1].length; } for (n=1; n <= i; n++) { numero = numero + '0'; } } } var tmp = numero.toString().split('.'); numero = tmp[0]; deci = tmp[1]; if (separador_decimal == undefined) separador_decimal = ","; if (separador_miles) { var miles = new RegExp("(-?[0-9]+)([0-9]{3})"); while (miles.test(numero)) { numero = numero.replace(miles, "$1" + separador_miles + "$2"); } } return sign + '' + numero + separador_decimal + deci; } /** * Obtiene máximo y mínimo desde data * */ function getMaxMin(_data, _amplificator){ var min = false var max = false for (var i = 0, len = _data.length; i < len; i++){ if (min == false && max == false){ min = _data[i].p_pct; max = _data[i].p_pct; } if (max < _data[i].p_pct) max = _data[i].p_pct; if (min > _data[i].p_pct) min = _data[i].p_pct; } min = min * _amplificator; max = max * _amplificator; if (min > -30) min = -30; return {min: min, max: max}; } /** * Agrega intrumento Comparado a listado y calcula Var % Periodo * * @params _obj Object chart * @params _dIni; _dFin Dates */ function addListCompare(_obj, _dIni, _dFin){ if( $('#blkListaCompararUno').length > 0 ) push.unsubscribeAll(document.getElementById('blkListaCompararUno')); var tmpHash = generateToken(32); var dataComparados = []; var performancePeriod = ''; var timeActive = $('#fechas-tablas').find('.active').attr('id'); var _tmpStart = _obj.startDate; var _tmpEnd = _obj.endDate; if(typeof _dIni !== 'undefined'){ _tmpStart = new Date(_dIni + 'T09:00:00'); } if(typeof _dFin !== 'undefined'){ _tmpEnd = new Date(_dFin + 'T09:00:00'); } //console.log(dateToString(_tmpStart)+' a '+dateToString(_tmpEnd)); var _customDateIni = _tmpStart; //Para Custom $.each(mp.DataCompare, function (_ind, val) { performancePeriod = ''; var _ini = 0; var _fin = 0; var _data = _obj.dataSets[_ind].dataProvider; /** * En caso de Custom dates la fecha se debe obtener hacia adelante * Y considerando la fecha que encontró en el "primer dato", es decir, si pido 01 y pilló 05 debe continuar con 05 para los indices 1;2;3;4 * */ if(mp.customDates == true) { //console.log("INI: " + _customDateIni); _ini = findDateIniNext(_data, _customDateIni); if(_ind == 0) _customDateIni = _ini.date; _fin = findDateEnd(_data, _tmpEnd); }else { _ini = findDateIniPrev(_data, _tmpStart); _fin = findDateEnd(_data, _tmpEnd); } var _points = { ini: _ini, end: _fin }; performancePeriod = ((parseFloat(_points.end.close) / parseFloat(_points.ini.close)) - 1) * 100; //console.log(_ind + ' : INICIO: '+ dateToString(_points.ini.date) + ' > ' + _points.ini.close + ' | FIN: ' + dateToString(_points.end.date) + ' > ' + _points.end.close + ' = ' + performancePeriod); dataComparados[_ind] = [ val[1], val[2], performancePeriod ]; //console.log("------------------------------------------------------------"); }); var largoComparados = dataComparados.length; var dataTo = []; dataTo[0] = dataComparados; //Separa data en el caso de construir 2 tablas como listado /*if( dataComparados.length > 5 ) { dataTo[0] = dataComparados.slice(0, 3); dataTo[1] = dataComparados.slice(3, 5); }*/ var _timeSpan = $('#fechas-tablas').find('.active').attr('id'); var textTimeSpan = ''; var fIni = $('#chartFechaIni').val(); var fFin = $('#chartFechaFin').val(); if( $('#fechaLastSimple').length > 0 ){ var tmpfFin = $('#fechaLastSimple').val(); var fFinTS = new Date(fFin); var fFinTS2 = new Date(tmpfFin); if( fFinTS.getTime() > fFinTS2.getTime() ){ fFin = $('#fechaLastSimple').val(); } } if(fIni != '' && fFin != ''){ textTimeSpan = fIni + ' a ' + fFin; } if(typeof _timeSpan != 'undefined') { textTimeSpan = _timeSpan; if (_timeSpan == 'CY') textTimeSpan = 'YTD'; if (_timeSpan == '5D') textTimeSpan = '1W'; if (_timeSpan == '3Y') textTimeSpan = '3A'; if (_timeSpan == '1Y') textTimeSpan = '1A'; } $.each(dataTo, function (_ind, val) { $.ajax({ url: rootSite + 'v2/global/listadocomparar.html', type: "POST", data: { HASH: tmpHash, DATA: val, PERIOD: _timeSpan, FINI: fIni, FFIN: fFin }, dataType: "html", beforeSend: function (a) { $('#loadingListaComparando').fadeIn('100', function(){}); }, success: function (datoHtml) { if (datoHtml) { if( largoComparados > 1) $('#blkPeriodoComparando').html('Comparando Periodo ' + textTimeSpan + ' '); if ( _ind == 0 && $('#blkListaCompararUno').length > 0 ) { $('#blkListaCompararUno').html(datoHtml); push.subscribeObj(document.getElementById('blkListaCompararUno')); } } $('#loadingListaComparando').fadeOut('100', function(){}); }, error: function (p) { $('#loadingListaComparando').fadeOut('100', function(){}); } }); }); return true; } /** * process your data and will add missing "empty" data points to main data set so that all data points from all data sets are shown, * even if their timestamps do not overlap * */ function syncDataSets(_obj) { if (_obj.syncDataTimestamps === true) { //Fecha final para data que dependera de CAS //var _length = parseInt(_obj.dataSets[0].dataProvider.length-1); //var _dateTop = dateToString(_obj.dataSets[0].dataProvider[_length].date); //Para dataset > 0 debemos quitar el dato > a la fecha del original /*for (var i = 1; i < _obj.dataSets.length; i++) { if(mp.DataCompare[i] === undefined){ continue; } else { var ds = _obj.dataSets[i]; for (var x = 0; x < ds.dataProvider.length; x++) { var date = dateToString(ds.dataProvider[x][ds.categoryField]); if (date > _dateTop) { ds.dataProvider.splice(x, 1); _obj.validateData(); } } } }*/ // go thorugh all data sets and collect all the different timestamps var dates = {}; for (var i = 0; i < _obj.dataSets.length; i++) { var ds = _obj.dataSets[i]; if(mp.DataCompare[i] === undefined){ continue; } else { for (var x = 0; x < ds.dataProvider.length; x++) { var date = ds.dataProvider[x][ds.categoryField]; //Obtenemos la fecha como Y-m-d H:i:s para poder agrupar por día (se asigna 09:00:00) var _tmpDate = new Date(date); var _tmpDate2 = datetimeToString(_tmpDate); _tmpDate = new Date(_tmpDate2); if (dates[_tmpDate.getTime()] === undefined) { dates[_tmpDate.getTime()] = {}; } dates[_tmpDate.getTime()][i] = ds.dataProvider[x]; } } } // iterate through data sets again and fill in the blanks for (var i = 0; i < _obj.dataSets.length; i++) { var ds = _obj.dataSets[i]; if(mp.DataCompare[i] === undefined){ continue; } else { var dp = []; for (var ts in dates) { if (!dates.hasOwnProperty(ts)) continue; var row = dates[ts]; if (row[i] === undefined) { row[i] = {}; var d = new Date(); d.setTime(ts); row[i][ds.categoryField] = d; } dp.push(row[i]); } dp.sort(function (a, b) { return new Date(a[ds.categoryField]) - new Date(b[ds.categoryField]); }); ds.dataProvider = dp; } } //Iterar datasets para rellenar con la data anterior de cada punto que no tenga datos for (var i = 0; i < _obj.dataSets.length; i++) { var ds = _obj.dataSets[i]; if(mp.DataCompare[i] === undefined){ continue; } else { var prevData = ds.dataProvider[0]['close']; for (var x = 0; x < ds.dataProvider.length; x++) { var tmpClose = ds.dataProvider[x]['close']; if (tmpClose === undefined) { ds.dataProvider[x]['close'] = prevData; ds.dataProvider[x]['high'] = prevData; ds.dataProvider[x]['low'] = prevData; ds.dataProvider[x]['open'] = prevData; }else{ prevData = ds.dataProvider[x]['close']; } } } } setTimeout(function () { _obj.validateData(); }, 800); } } return mp; })();