/**
* 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;
})();