/*
 * Copyright (C) 2019 Lucas Meyer
 *
 * This program is free software: you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation, either version 3 of the License, or
 * (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program.  If not, see <http://www.gnu.org/licenses/>.
 */
package mierclasses;

//classe para interpretacao de informacoes json recebidas pelo IEX api

import org.json.JSONArray;
import org.json.JSONObject;

//https://iextrading.com/developer/docs/#getting-started
/**
 *
 * @author lucasmeyer
 */
public class mcstocksapicomms
{
    //classe utilizada para comunicacao web
    mcwebcomms mwcomms;
    
    public mcstocksapicomms()
    {
        mwcomms = new mcwebcomms();
    }
    
    // <editor-fold defaultstate="collapsed" desc="Alpha Vantage API">
    String av_chave = "";
    public void av_alterarchaveapi(String novachaveav)
    {
        av_chave = novachaveav;
    }
    
    public String av_retornarchaveapi()
    {
        return av_chave;
    }
    
    public void av_testarcomms()
    {
        String conteudopagina = mwcomms.receberconteudopagina("https://www.alphavantage.co/query?function=TIME_SERIES_DAILY&symbol=MSFT&apikey=" + av_chave);
        mierclasses.mcfuncoeshelper.mostrarmensagem(conteudopagina);
    }
    
    public java.util.List<String> av_procurarsimbolo(String parametrobusca)
    {
        String jsonconteudo = "";
        jsonconteudo = mwcomms.receberconteudopagina("https://www.alphavantage.co/query?function=SYMBOL_SEARCH&keywords="+parametrobusca+"&apikey=" + av_chave);
        //mierclasses.mcfuncoeshelper.mostrarmensagem(jsonconteudo);
        //mierclasses.mcfuncoeshelper.setarclipboard(jsonconteudo);
        
        JSONObject obj = new JSONObject(jsonconteudo);
        
        JSONArray matchesarray = obj.getJSONArray("bestMatches");
        
        java.util.List<String> listasimbolosencontrada = new java.util.ArrayList<>();
        for (int i = 0; i < matchesarray.length(); i++) 
        {
            String bm_symbol = matchesarray.getJSONObject(i).getString("1. symbol");
            String bm_name = matchesarray.getJSONObject(i).getString("2. name");
            String bm_type = matchesarray.getJSONObject(i).getString("3. type");
            String bm_region = matchesarray.getJSONObject(i).getString("4. region");
            String bm_marketopen = matchesarray.getJSONObject(i).getString("5. marketOpen");
            String bm_marketclose = matchesarray.getJSONObject(i).getString("6. marketClose");
            String bm_timezone = matchesarray.getJSONObject(i).getString("7. timezone");
            String bm_currency = matchesarray.getJSONObject(i).getString("8. currency");
            String bm_matchscore = matchesarray.getJSONObject(i).getString("9. matchScore");
            
            //mierclasses.mcfuncoeshelper.mostrarmensagem(bm_symbol + " - " + bm_name + " (" + bm_type + ")");
            if ((bm_symbol.toLowerCase()).contains(parametrobusca.toLowerCase()))
            {
                String simboloadd = "AVS:" + bm_symbol + " - " + bm_name + " (" + bm_type + ")";
                listasimbolosencontrada.add(simboloadd);
            }
            else if ((bm_name.toLowerCase()).contains(parametrobusca.toLowerCase()))
            {
                String simboloadd = "AVS:" + bm_symbol + " - " + bm_name + " (" + bm_type + ")";
                listasimbolosencontrada.add(simboloadd);
            }
        }

        return listasimbolosencontrada;
    }
    
    // <editor-fold defaultstate="collapsed" desc="Stock Time Series">
    public java.util.List<mccandle> av_receberstockcandlesintraday(String simbolo, String intervalo, String outputsize)
    {
                    /*
        {
    "Meta Data": {
        "1. Information": "Daily Prices (open, high, low, close) and Volumes",
        "2. Symbol": "MSFT",
        "3. Last Refreshed": "2018-12-21",
        "4. Output Size": "Compact",
        "5. Time Zone": "US/Eastern"
    },
    "Time Series (Daily)": {
        "2018-12-21": {
            "1. open": "101.6300",
            "2. high": "103.0000",
            "3. low": "97.4600",
            "4. close": "98.2300",
            "5. volume": "111242070"
        },
        "2018-12-20": {
            "1. open": "103.0500",
            "2. high": "104.3100",
            "3. low": "98.7800",
            "4. close": "101.5100",
            "5. volume": "70334184"
        },
        */
        
        String urlquery = "https://www.alphavantage.co/query?function=TIME_SERIES_INTRADAY&symbol="+simbolo+"&interval="+intervalo+"&outputsize="+outputsize+"&apikey=" + av_chave;
        //mierclasses.mcfuncoeshelper.setarclipboard(urlquery);
        //mierclasses.mcfuncoeshelper.mostrarmensagem(urlquery);
        String jsonconteudo = mwcomms.receberconteudopagina(urlquery);
        
        JSONObject obj = new JSONObject(jsonconteudo);
        
        String md_information = obj.getJSONObject("Meta Data").getString("1. Information");
        String md_symbol = obj.getJSONObject("Meta Data").getString("2. Symbol");
        String md_lastrefreshed = obj.getJSONObject("Meta Data").getString("3. Last Refreshed");
        String md_interval = obj.getJSONObject("Meta Data").getString("4. Interval");
        String md_outputsize = obj.getJSONObject("Meta Data").getString("5. Output Size");
        String md_timezone = obj.getJSONObject("Meta Data").getString("6. Time Zone");


        JSONObject candlesjson = obj.getJSONObject("Time Series (" +intervalo+ ")");
        JSONArray candlesjsontimestamparray = candlesjson.names();
        
        
        java.util.List<mccandle> listacandlesretornar = new java.util.ArrayList<>();
        
        for (int i = 0; i < candlesjsontimestamparray.length(); i++)
        {
            String timestampcandleoriginal = candlesjsontimestamparray.getString(i);
            
            //System.out.println(timestampcandle);
            
            String opencandle = candlesjson.getJSONObject(timestampcandleoriginal).getString("1. open");
            //System.out.println(opencandle);
            String highcandle = candlesjson.getJSONObject(timestampcandleoriginal).getString("2. high");
            String lowcandle = candlesjson.getJSONObject(timestampcandleoriginal).getString("3. low");
            String closecandle = candlesjson.getJSONObject(timestampcandleoriginal).getString("4. close");
            String volumecandle = candlesjson.getJSONObject(timestampcandleoriginal).getString("5. volume");
            
            String data = timestampcandleoriginal.split(" ")[0];
            String ano = data.split("-")[0];
            String mes = data.split("-")[1];
            String dia = data.split("-")[2];
            
            String horario = timestampcandleoriginal.split(" ")[1];
            String hora = horario.split(":")[0];
            String minuto = horario.split(":")[1];
            String segundo = horario.split(":")[2];
            
            String timestampcandleparaclasse = ano + "-" + mes + "-" + dia + "-" + hora + "-" + minuto + "-" + segundo;
            
            // public mccandle(String tsstr, String ostr, String hstr, String cstr, String lstr, String vstr)
            mccandle candleatual = new mccandle(timestampcandleparaclasse,opencandle,highcandle,closecandle,lowcandle,volumecandle);
            listacandlesretornar.add(candleatual);
        }
   
        //reordernar lista de candles antes de retornar
        java.util.Collections.sort(listacandlesretornar, new java.util.Comparator<mierclasses.mccandle>() 
        {
            public int compare(mierclasses.mccandle candleone, mierclasses.mccandle candletwo) 
            {
                return candleone.timestampdate.compareTo(candletwo.timestampdate);
            }
        });
        if (math_tirarzeros == true)
            listacandlesretornar = math_retirarzeroscandles(listacandlesretornar);

        return listacandlesretornar;
    }
    
    public java.util.List<mccandle> av_receberstockcandlesdaily(String simbolo, String outputsize)
    {
        String urlquery = "https://www.alphavantage.co/query?function=TIME_SERIES_DAILY&symbol="+simbolo+"&outputsize="+outputsize+"&apikey=" + av_chave;
        //mierclasses.mcfuncoeshelper.setarclipboard(urlquery);
        //mierclasses.mcfuncoeshelper.mostrarmensagem(urlquery);
        String jsonconteudo = mwcomms.receberconteudopagina(urlquery);
        
        JSONObject obj = new JSONObject(jsonconteudo);
        
        String md_information = obj.getJSONObject("Meta Data").getString("1. Information");
        String md_symbol = obj.getJSONObject("Meta Data").getString("2. Symbol");
        String md_lastrefreshed = obj.getJSONObject("Meta Data").getString("3. Last Refreshed");
        String md_outputsize = obj.getJSONObject("Meta Data").getString("4. Output Size");
        String md_timezone = obj.getJSONObject("Meta Data").getString("5. Time Zone");


        JSONObject candlesjson = obj.getJSONObject("Time Series (Daily)");
        JSONArray candlesjsontimestamparray = candlesjson.names();
        
        
        java.util.List<mccandle> listacandlesretornar = new java.util.ArrayList<>();
        
        for (int i = 0; i < candlesjsontimestamparray.length(); i++)
        {
            String timestampcandle = candlesjsontimestamparray.getString(i);
            
            String opencandle = candlesjson.getJSONObject(timestampcandle).getString("1. open");
            String highcandle = candlesjson.getJSONObject(timestampcandle).getString("2. high");
            String lowcandle = candlesjson.getJSONObject(timestampcandle).getString("3. low");
            String closecandle = candlesjson.getJSONObject(timestampcandle).getString("4. close");
            String volumecandle = candlesjson.getJSONObject(timestampcandle).getString("5. volume");
            
            mccandle candleatual = new mccandle(timestampcandle,opencandle,highcandle,closecandle,lowcandle,volumecandle);
            listacandlesretornar.add(candleatual);
        }
   
        //reordernar lista de candles antes de retornar
        java.util.Collections.sort(listacandlesretornar, new java.util.Comparator<mierclasses.mccandle>() 
        {
            public int compare(mierclasses.mccandle candleone, mierclasses.mccandle candletwo) 
            {
                return candleone.timestampdate.compareTo(candletwo.timestampdate);
            }
        });
        if (math_tirarzeros == true)
            listacandlesretornar = math_retirarzeroscandles(listacandlesretornar);
        
        return listacandlesretornar;
    }
    
    public java.util.List<mccandle> av_receberstockcandlesweekly(String simbolo)
    {

        String urlquery = "https://www.alphavantage.co/query?function=TIME_SERIES_WEEKLY&symbol="+simbolo+"&apikey=" + av_chave;
        //mierclasses.mcfuncoeshelper.setarclipboard(urlquery);
        //mierclasses.mcfuncoeshelper.mostrarmensagem(urlquery);
        String jsonconteudo = mwcomms.receberconteudopagina(urlquery);
        
        JSONObject obj = new JSONObject(jsonconteudo);
        
        String md_information = obj.getJSONObject("Meta Data").getString("1. Information");
        String md_symbol = obj.getJSONObject("Meta Data").getString("2. Symbol");
        String md_lastrefreshed = obj.getJSONObject("Meta Data").getString("3. Last Refreshed");
        String md_timezone = obj.getJSONObject("Meta Data").getString("4. Time Zone");


        JSONObject candlesjson = obj.getJSONObject("Weekly Time Series");
        JSONArray candlesjsontimestamparray = candlesjson.names();
        
        
        java.util.List<mccandle> listacandlesretornar = new java.util.ArrayList<>();
        
        for (int i = 0; i < candlesjsontimestamparray.length(); i++)
        {
            String timestampcandle = candlesjsontimestamparray.getString(i);
            
            String opencandle = candlesjson.getJSONObject(timestampcandle).getString("1. open");
            String highcandle = candlesjson.getJSONObject(timestampcandle).getString("2. high");
            String lowcandle = candlesjson.getJSONObject(timestampcandle).getString("3. low");
            String closecandle = candlesjson.getJSONObject(timestampcandle).getString("4. close");
            String volumecandle = candlesjson.getJSONObject(timestampcandle).getString("5. volume");
            
            mccandle candleatual = new mccandle(timestampcandle,opencandle,highcandle,closecandle,lowcandle,volumecandle);
            listacandlesretornar.add(candleatual);
        }
   
        //reordernar lista de candles antes de retornar
        java.util.Collections.sort(listacandlesretornar, new java.util.Comparator<mierclasses.mccandle>() 
        {
            public int compare(mierclasses.mccandle candleone, mierclasses.mccandle candletwo) 
            {
                return candleone.timestampdate.compareTo(candletwo.timestampdate);
            }
        });
        if (math_tirarzeros == true)
            listacandlesretornar = math_retirarzeroscandles(listacandlesretornar);
        
        return listacandlesretornar;
    }
    
    public java.util.List<mccandle> av_receberstockcandlesmonthly(String simbolo)
    {

        String urlquery = "https://www.alphavantage.co/query?function=TIME_SERIES_MONTHLY&symbol="+simbolo+"&apikey=" + av_chave;
        //mierclasses.mcfuncoeshelper.setarclipboard(urlquery);
        //mierclasses.mcfuncoeshelper.mostrarmensagem(urlquery);
        String jsonconteudo = mwcomms.receberconteudopagina(urlquery);
        
        JSONObject obj = new JSONObject(jsonconteudo);
        
        String md_information = obj.getJSONObject("Meta Data").getString("1. Information");
        String md_symbol = obj.getJSONObject("Meta Data").getString("2. Symbol");
        String md_lastrefreshed = obj.getJSONObject("Meta Data").getString("3. Last Refreshed");
        String md_timezone = obj.getJSONObject("Meta Data").getString("4. Time Zone");


        JSONObject candlesjson = obj.getJSONObject("Monthly Time Series");
        JSONArray candlesjsontimestamparray = candlesjson.names();
        
        
        java.util.List<mccandle> listacandlesretornar = new java.util.ArrayList<>();
        
        for (int i = 0; i < candlesjsontimestamparray.length(); i++)
        {
            String timestampcandle = candlesjsontimestamparray.getString(i);
            
            String opencandle = candlesjson.getJSONObject(timestampcandle).getString("1. open");
            String highcandle = candlesjson.getJSONObject(timestampcandle).getString("2. high");
            String lowcandle = candlesjson.getJSONObject(timestampcandle).getString("3. low");
            String closecandle = candlesjson.getJSONObject(timestampcandle).getString("4. close");
            String volumecandle = candlesjson.getJSONObject(timestampcandle).getString("5. volume");
            
            mccandle candleatual = new mccandle(timestampcandle,opencandle,highcandle,closecandle,lowcandle,volumecandle);
            listacandlesretornar.add(candleatual);
        }
   
        //reordernar lista de candles antes de retornar
        java.util.Collections.sort(listacandlesretornar, new java.util.Comparator<mierclasses.mccandle>() 
        {
            public int compare(mierclasses.mccandle candleone, mierclasses.mccandle candletwo) 
            {
                return candleone.timestampdate.compareTo(candletwo.timestampdate);
            }
        });
        if (math_tirarzeros == true)
            listacandlesretornar = math_retirarzeroscandles(listacandlesretornar);
        
        return listacandlesretornar;
    }
    // </editor-fold>
    
    // <editor-fold defaultstate="collapsed" desc="Forex Time Series">
    public java.util.List<mccandle> av_receberforexcandlesintraday(String fromsimbolo, String tosimbolo, String intervalo, String outputsize)
    {
        /*
        {
            "Meta Data": 
            {
                "1. Information": "FX Intraday (5min) Time Series",
                "2. From Symbol": "USD",
                "3. To Symbol": "BRL",
                "4. Last Refreshed": "2019-02-12 17:55:00",
                "5. Interval": "5min",
                "6. Output Size": "Compact",
                "7. Time Zone": "UTC"
            },
            "Time Series FX (5min)": 
            {
                "2019-02-12 17:55:00": 
                {
                    "1. open": "3.7119",
                    "2. high": "3.7128",
                    "3. low": "3.7114",
                    "4. close": "3.7124"
                },
                "2019-02-12 17:50:00": 
                {
                    "1. open": "3.7154",
                    "2. high": "3.7161",
                    "3. low": "3.7116",
                    "4. close": "3.7125"
                },
        */
        
        String urlquery = "https://www.alphavantage.co/query?function=FX_INTRADAY&from_symbol="+fromsimbolo+"&to_symbol="+tosimbolo+"&interval="+intervalo+"&outputsize="+outputsize+"&apikey=" + av_chave;
        //mierclasses.mcfuncoeshelper.setarclipboard(urlquery);
        //mierclasses.mcfuncoeshelper.mostrarmensagem(urlquery);
        String jsonconteudo = mwcomms.receberconteudopagina(urlquery);
        
        JSONObject obj = new JSONObject(jsonconteudo);
        
        String md_information = obj.getJSONObject("Meta Data").getString("1. Information");
        String md_fromsymbol = obj.getJSONObject("Meta Data").getString("2. From Symbol");
        String md_tosymbol = obj.getJSONObject("Meta Data").getString("3. To Symbol");
        String md_lastrefreshed = obj.getJSONObject("Meta Data").getString("4. Last Refreshed");
        String md_interval = obj.getJSONObject("Meta Data").getString("5. Interval");
        String md_outputsize = obj.getJSONObject("Meta Data").getString("6. Output Size");
        String md_timezone = obj.getJSONObject("Meta Data").getString("7. Time Zone");


        JSONObject candlesjson = obj.getJSONObject("Time Series FX (" +intervalo+ ")");
        JSONArray candlesjsontimestamparray = candlesjson.names();
        
        
        java.util.List<mccandle> listacandlesretornar = new java.util.ArrayList<>();
        
        for (int i = 0; i < candlesjsontimestamparray.length(); i++)
        {
            String timestampcandleoriginal = candlesjsontimestamparray.getString(i);
            
            //System.out.println(timestampcandle);
            
            String opencandle = candlesjson.getJSONObject(timestampcandleoriginal).getString("1. open");
            //System.out.println(opencandle);
            String highcandle = candlesjson.getJSONObject(timestampcandleoriginal).getString("2. high");
            String lowcandle = candlesjson.getJSONObject(timestampcandleoriginal).getString("3. low");
            String closecandle = candlesjson.getJSONObject(timestampcandleoriginal).getString("4. close");
            
            String data = timestampcandleoriginal.split(" ")[0];
            String ano = data.split("-")[0];
            String mes = data.split("-")[1];
            String dia = data.split("-")[2];
            
            String horario = timestampcandleoriginal.split(" ")[1];
            String hora = horario.split(":")[0];
            String minuto = horario.split(":")[1];
            String segundo = horario.split(":")[2];
            
            String timestampcandleparaclasse = ano + "-" + mes + "-" + dia + "-" + hora + "-" + minuto + "-" + segundo;
            
            // public mccandle(String tsstr, String ostr, String hstr, String cstr, String lstr, String vstr)
            mccandle candleatual = new mccandle(timestampcandleparaclasse,opencandle,highcandle,closecandle,lowcandle,"0");
            listacandlesretornar.add(candleatual);
        }
   
        //reordernar lista de candles antes de retornar
        java.util.Collections.sort(listacandlesretornar, new java.util.Comparator<mierclasses.mccandle>() 
        {
            public int compare(mierclasses.mccandle candleone, mierclasses.mccandle candletwo) 
            {
                return candleone.timestampdate.compareTo(candletwo.timestampdate);
            }
        });
        if (math_tirarzeros == true)
            listacandlesretornar = math_retirarzeroscandles(listacandlesretornar);
        
        return listacandlesretornar;
    }
    
    public java.util.List<mccandle> av_receberforexcandlesdaily(String fromsimbolo, String tosimbolo, String outputsize)
    {
        String urlquery = "https://www.alphavantage.co/query?function=FX_DAILY&from_symbol="+fromsimbolo+"&to_symbol="+tosimbolo+"&outputsize="+outputsize+"&apikey=" + av_chave;
        //mierclasses.mcfuncoeshelper.setarclipboard(urlquery);
        //mierclasses.mcfuncoeshelper.mostrarmensagem(urlquery);
        String jsonconteudo = mwcomms.receberconteudopagina(urlquery);
        
        JSONObject obj = new JSONObject(jsonconteudo);
        
        String md_information = obj.getJSONObject("Meta Data").getString("1. Information");
        String md_fromsymbol = obj.getJSONObject("Meta Data").getString("2. From Symbol");
        String md_tosymbol = obj.getJSONObject("Meta Data").getString("3. To Symbol");
        String md_outputsize = obj.getJSONObject("Meta Data").getString("4. Output Size");
        String md_lastrefreshed = obj.getJSONObject("Meta Data").getString("5. Last Refreshed");
        String md_timezone = obj.getJSONObject("Meta Data").getString("6. Time Zone");

        JSONObject candlesjson = obj.getJSONObject("Time Series FX (Daily)");
        JSONArray candlesjsontimestamparray = candlesjson.names();
        
        
        java.util.List<mccandle> listacandlesretornar = new java.util.ArrayList<>();
        
        for (int i = 0; i < candlesjsontimestamparray.length(); i++)
        {
            String timestampcandle = candlesjsontimestamparray.getString(i);
            
            String opencandle = candlesjson.getJSONObject(timestampcandle).getString("1. open");
            String highcandle = candlesjson.getJSONObject(timestampcandle).getString("2. high");
            String lowcandle = candlesjson.getJSONObject(timestampcandle).getString("3. low");
            String closecandle = candlesjson.getJSONObject(timestampcandle).getString("4. close");
            
            mccandle candleatual = new mccandle(timestampcandle,opencandle,highcandle,closecandle,lowcandle,"0");
            listacandlesretornar.add(candleatual);
        }
   
        //reordernar lista de candles antes de retornar
        java.util.Collections.sort(listacandlesretornar, new java.util.Comparator<mierclasses.mccandle>() 
        {
            public int compare(mierclasses.mccandle candleone, mierclasses.mccandle candletwo) 
            {
                return candleone.timestampdate.compareTo(candletwo.timestampdate);
            }
        });
        if (math_tirarzeros == true)
            listacandlesretornar = math_retirarzeroscandles(listacandlesretornar);
        
        return listacandlesretornar;
    }
    
    public java.util.List<mccandle> av_receberforexcandlesweekly(String fromsimbolo, String tosimbolo)
    {
        String urlquery = "https://www.alphavantage.co/query?function=FX_WEEKLY&from_symbol="+fromsimbolo+"&to_symbol="+tosimbolo+"&apikey=" + av_chave;
        //mierclasses.mcfuncoeshelper.setarclipboard(urlquery);
        //mierclasses.mcfuncoeshelper.mostrarmensagem(urlquery);
        String jsonconteudo = mwcomms.receberconteudopagina(urlquery);
        
        JSONObject obj = new JSONObject(jsonconteudo);
        
        String md_information = obj.getJSONObject("Meta Data").getString("1. Information");
        String md_fromsymbol = obj.getJSONObject("Meta Data").getString("2. From Symbol");
        String md_tosymbol = obj.getJSONObject("Meta Data").getString("3. To Symbol");
        String md_lastrefreshed = obj.getJSONObject("Meta Data").getString("4. Last Refreshed");
        String md_timezone = obj.getJSONObject("Meta Data").getString("5. Time Zone");

        JSONObject candlesjson = obj.getJSONObject("Time Series FX (Weekly)");
        JSONArray candlesjsontimestamparray = candlesjson.names();
        
        
        java.util.List<mccandle> listacandlesretornar = new java.util.ArrayList<>();
        
        for (int i = 0; i < candlesjsontimestamparray.length(); i++)
        {
            String timestampcandle = candlesjsontimestamparray.getString(i);
            
            String opencandle = candlesjson.getJSONObject(timestampcandle).getString("1. open");
            String highcandle = candlesjson.getJSONObject(timestampcandle).getString("2. high");
            String lowcandle = candlesjson.getJSONObject(timestampcandle).getString("3. low");
            String closecandle = candlesjson.getJSONObject(timestampcandle).getString("4. close");
            
            mccandle candleatual = new mccandle(timestampcandle,opencandle,highcandle,closecandle,lowcandle,"0");
            listacandlesretornar.add(candleatual);
        }
   
        //reordernar lista de candles antes de retornar
        java.util.Collections.sort(listacandlesretornar, new java.util.Comparator<mierclasses.mccandle>() 
        {
            public int compare(mierclasses.mccandle candleone, mierclasses.mccandle candletwo) 
            {
                return candleone.timestampdate.compareTo(candletwo.timestampdate);
            }
        });
        if (math_tirarzeros == true)
            listacandlesretornar = math_retirarzeroscandles(listacandlesretornar);
        
        return listacandlesretornar;
    }
    
    public java.util.List<mccandle> av_receberforexcandlesmonthly(String fromsimbolo, String tosimbolo)
    {
        String urlquery = "https://www.alphavantage.co/query?function=FX_MONTHLY&from_symbol="+fromsimbolo+"&to_symbol="+tosimbolo+"&apikey=" + av_chave;
        //mierclasses.mcfuncoeshelper.setarclipboard(urlquery);
        //mierclasses.mcfuncoeshelper.mostrarmensagem(urlquery);
        String jsonconteudo = mwcomms.receberconteudopagina(urlquery);
        
        JSONObject obj = new JSONObject(jsonconteudo);
        
        String md_information = obj.getJSONObject("Meta Data").getString("1. Information");
        String md_fromsymbol = obj.getJSONObject("Meta Data").getString("2. From Symbol");
        String md_tosymbol = obj.getJSONObject("Meta Data").getString("3. To Symbol");
        String md_lastrefreshed = obj.getJSONObject("Meta Data").getString("4. Last Refreshed");
        String md_timezone = obj.getJSONObject("Meta Data").getString("5. Time Zone");

        JSONObject candlesjson = obj.getJSONObject("Time Series FX (Monthly)");
        JSONArray candlesjsontimestamparray = candlesjson.names();
        
        
        java.util.List<mccandle> listacandlesretornar = new java.util.ArrayList<>();
        
        for (int i = 0; i < candlesjsontimestamparray.length(); i++)
        {
            String timestampcandle = candlesjsontimestamparray.getString(i);
            
            String opencandle = candlesjson.getJSONObject(timestampcandle).getString("1. open");
            String highcandle = candlesjson.getJSONObject(timestampcandle).getString("2. high");
            String lowcandle = candlesjson.getJSONObject(timestampcandle).getString("3. low");
            String closecandle = candlesjson.getJSONObject(timestampcandle).getString("4. close");
            
            mccandle candleatual = new mccandle(timestampcandle,opencandle,highcandle,closecandle,lowcandle,"0");
            listacandlesretornar.add(candleatual);
        }
   
        //reordernar lista de candles antes de retornar
        java.util.Collections.sort(listacandlesretornar, new java.util.Comparator<mierclasses.mccandle>() 
        {
            public int compare(mierclasses.mccandle candleone, mierclasses.mccandle candletwo) 
            {
                return candleone.timestampdate.compareTo(candletwo.timestampdate);
            }
        });
        if (math_tirarzeros == true)
            listacandlesretornar = math_retirarzeroscandles(listacandlesretornar);
        
        return listacandlesretornar;
    }
    
    // </editor-fold>
    
    // </editor-fold>

    // <editor-fold defaultstate="collapsed" desc="CryptoCompare API">
    String crycom_chave = "";
    public void crycom_alterarchaveapi(String novachavecc)
    {
        crycom_chave = novachavecc;
    }
    public String crycom_retornarchaveapi()
    {
        return crycom_chave;
    }
    
     public java.util.List<String> crycom_procurarsimbolo(String parametrobusca)
    {
        /*
        {
            "Response": "Success",
            "Message": "Coin list succesfully returned!",
            "Data": {
                "42": {
                    "Id": "4321",
                    "Url": "/coins/42/overview",
                    "ImageUrl": "/media/12318415/42.png",
                    "Name": "42",
                    "Symbol": "42",
                    "CoinName": "42 Coin",
                    "FullName": "42 Coin (42)",
                    "Algorithm": "Scrypt",
                    "ProofType": "PoW/PoS",
                    "FullyPremined": "0",
                    "TotalCoinSupply": "42",
                    "BuiltOn": "N/A",
                    "SmartContractAddress": "N/A",
                    "PreMinedValue": "N/A",
                    "TotalCoinsFreeFloat": "N/A",
                    "SortOrder": "34",
                    "Sponsored": false,
                    "IsTrading": true,
                    "TotalCoinsMined": 41.99995653,
                    "BlockNumber": 0,
                    "NetHashesPerSecond": 0,
                    "BlockReward": 0,
                    "BlockTime": 0
                },
                "ETH": {
                    "Id": "7605",
                    "Url": "/coins/eth/overview",
                    "ImageUrl": "/media/20646/eth_logo.png",
                    "Name": "ETH",
                    "Symbol": "ETH",
                    "CoinName": "Ethereum",
                    "FullName": "Ethereum (ETH)",
                    "Algorithm": "Ethash",
                    "ProofType": "PoW",
                    "FullyPremined": "0",
                    "TotalCoinSupply": "0",
                    "BuiltOn": "N/A",
                    "SmartContractAddress": "N/A",
                    "PreMinedValue": "N/A",
                    "TotalCoinsFreeFloat": "N/A",
                    "SortOrder": "2",
                    "Sponsored": false,
                    "IsTrading": true,
                    "TotalCoinsMined": 104716377.6866,
                    "BlockNumber": 7174858,
                    "NetHashesPerSecond": 140129872071527,
                    "BlockReward": 3,
                    "BlockTime": 15
                }
            },
            "BaseImageUrl": "https://www.cryptocompare.com",
            "BaseLinkUrl": "https://www.cryptocompare.com",
            "RateLimit": {},
            "HasWarning": false,
            "Type": 100
        }
        */
        
        String jsonconteudo = "";
        jsonconteudo = mwcomms.receberconteudopagina("https://min-api.cryptocompare.com/data/all/coinlist");
        //mierclasses.mcfuncoeshelper.mostrarmensagem(jsonconteudo);
        //mierclasses.mcfuncoeshelper.setarclipboard(jsonconteudo);
        
        JSONObject obj = new JSONObject(jsonconteudo);
        
        JSONObject todossimbolos = obj.getJSONObject("Data");
        JSONArray todossimbolosarray = todossimbolos.names();
        
        java.util.List<String> listasimbolosencontrada = new java.util.ArrayList<>();
        for (int i = 0; i < todossimbolosarray.length(); i++)
        {
            String simboloatual = todossimbolosarray.getString(i);
            //System.out.println(timestampcandle);

            String symbol = todossimbolos.getJSONObject(simboloatual).getString("Symbol");
            String name = todossimbolos.getJSONObject(simboloatual).getString("CoinName");
            
            if ((symbol.toLowerCase()).contains(parametrobusca.toLowerCase()))
            {
                String simboloadd = "CRYCOM:" + symbol + " - " + name + " (USD)";
                listasimbolosencontrada.add(simboloadd);
            }
            else if ((name.toLowerCase()).contains(parametrobusca.toLowerCase()))
            {
                String simboloadd = "CRYCOM:" + symbol + " - " + name+ " (USD)";
                listasimbolosencontrada.add(simboloadd);
            }
        }
        
        return listasimbolosencontrada;
    }
    
    public java.util.List<mccandle> crycom_recebercryptocandles(String simbolo, String limite, String periodo)
    {
        
        String caminhourl = "";
        if (periodo.equals("Daily"))
            caminhourl = "https://min-api.cryptocompare.com/data/histoday?fsym="+simbolo.toUpperCase()+"&tsym=USD&limit=" + limite + "&api_key=" + crycom_chave;
        else if (periodo.equals("Hourly"))
            caminhourl = "https://min-api.cryptocompare.com/data/histohour?fsym="+simbolo.toUpperCase()+"&tsym=USD&limit=" + limite + "&api_key=" + crycom_chave;
        else if (periodo.equals("Minute"))
            caminhourl = "https://min-api.cryptocompare.com/data/histominute?fsym="+simbolo.toUpperCase()+"&tsym=USD&limit=" + limite + "&api_key=" + crycom_chave;
        
        //mierclasses.mcfuncoeshelper.setarclipboard(caminhourl);
        //mierclasses.mcfuncoeshelper.mostrarmensagem(caminhourl);
        
        String jsonconteudo = mwcomms.receberconteudopagina(caminhourl);
        //mierclasses.mcfuncoeshelper.mostrarmensagem(jsonconteudo);
        mierclasses.mcfuncoeshelper.setarclipboard(jsonconteudo);
        JSONObject obj = new JSONObject(jsonconteudo);
        
        JSONArray datacandles = obj.getJSONArray("Data");
        java.util.List<mccandle> listacandlesretornar = new java.util.ArrayList<>();
        for (int i = 0; i < datacandles.length(); i++)
        {
            JSONObject candleobjectatual = datacandles.getJSONObject(i);
            String cjson_date = String.valueOf(candleobjectatual.getLong("time"));
            String cjson_open = String.valueOf(candleobjectatual.getDouble("open"));
            String cjson_high = String.valueOf(candleobjectatual.getDouble("high"));
            String cjson_close = String.valueOf(candleobjectatual.getDouble("close"));
            String cjson_low = String.valueOf(candleobjectatual.getDouble("low"));
            String cjson_volume = String.valueOf(candleobjectatual.getDouble("volumefrom"));
            
            
            java.util.Date timestampdate = new java.util.Date(Long.parseLong(cjson_date) * 1000);
            //mierclasses.mcfuncoeshelper.mostrarmensagem(timestampdate.toString());
            
            String timestampcandle = 
                    (timestampdate.getYear()+1900) + "-" +
                    (timestampdate.getMonth()+1) + "-" +
                    (timestampdate.getDate()) + "-" +
                    (timestampdate.getHours()) + "-" +
                    (timestampdate.getMinutes()) + "-" +
                    (timestampdate.getSeconds()); 
            

            
            mierclasses.mccandle candleadd = new mierclasses.mccandle
        (timestampcandle, cjson_open, cjson_high, cjson_close, cjson_low, cjson_volume);
            
            listacandlesretornar.add(candleadd);
            
        }
        
        //reordernar lista de candles antes de retornar
        java.util.Collections.sort(listacandlesretornar, new java.util.Comparator<mierclasses.mccandle>() 
        {
            public int compare(mierclasses.mccandle candleone, mierclasses.mccandle candletwo) 
            {
                return candleone.timestampdate.compareTo(candletwo.timestampdate);
            }
        });
        if (math_tirarzeros == true)
            listacandlesretornar = math_retirarzeroscandles(listacandlesretornar);
        
        return listacandlesretornar;
        
    }
    //</editor-fold>
    
    // <editor-fold defaultstate="collapsed" desc="IEX API (Obsolete)">
    
    public void iex_testarcomms()
    {
        String conteudopagina = mwcomms.receberconteudopagina("https://api.iextrading.com/1.0/stock/aapl/chart/5y");
        mierclasses.mcfuncoeshelper.mostrarmensagem(conteudopagina);
    }
    
    public java.util.List<String> iex_procurarsimbolo(String parametrobusca)
    {
        //funcao para retornar uma lista de simbolos encontrados para o parametro de busca em questao
        
        /*
        
        [
            {
                "symbol": "A",
                "name": "Agilent Technologies Inc.",
                "date": "2019-01-04",
                "isEnabled": true,
                "type": "cs",
                "iexId": "2"
            },
            {
                "symbol": "AA",
                "name": "Alcoa Corporation",
                "date": "2019-01-04",
                "isEnabled": true,
                "type": "cs",
                "iexId": "12042"
            },
            {
                "symbol": "AAAU",
                "name": "Perth Mint Physical Gold",
                "date": "2019-01-04",
                "isEnabled": true,
                "type": "N/A",
                "iexId": "14924"
            },
            {
                "symbol": "AABA",
                "name": "Altaba Inc.",
                "date": "2019-01-04",
                "isEnabled": true,
                "type": "cs",
                "iexId": "7653"
            },
            {
                "symbol": "AAC",
                "name": "AAC Holdings Inc.",
                "date": "2019-01-04",
                "isEnabled": true,
                "type": "cs",
                "iexId": "9169"
            },
            {
                "symbol": "AADR",
                "name": "AdvisorShares Dorsey Wright ADR",
                "date": "2019-01-04",
                "isEnabled": true,
                "type": "et",
                "iexId": "5"
            },
            {
                "symbol": "AAL",
                "name": "American Airlines Group Inc.",
                "date": "2019-01-04",
                "isEnabled": true,
                "type": "cs",
                "iexId": "8148"
            },
            {
                "symbol": "AAMC",
                "name": "Altisource Asset Management Corp Com",
                "date": "2019-01-04",
                "isEnabled": true,
                "type": "cs",
                "iexId": "7760"
            },
            {
                "symbol": "AAME",
                "name": "Atlantic American Corporation",
                "date": "2019-01-04",
                "isEnabled": true,
                "type": "cs",
                "iexId": "7"
            },
            {
                "symbol": "AAN",
                "name": "Aaron's Inc.",
                "date": "2019-01-04",
                "isEnabled": true,
                "type": "cs",
                "iexId": "8"
            },
            {
                "symbol": "AAOI",
                "name": "Applied Optoelectronics Inc.",
                "date": "2019-01-04",
                "isEnabled": true,
                "type": "cs",
                "iexId": "7790"
            },
            {
                "symbol": "AAON",
                "name": "AAON Inc.",
                "date": "2019-01-04",
                "isEnabled": true,
                "type": "cs",
                "iexId": "9"
            },
            {
                "symbol": "AAP",
                "name": "Advance Auto Parts Inc W/I",
                "date": "2019-01-04",
                "isEnabled": true,
                "type": "cs",
                "iexId": "10"
            },
            {
                "symbol": "AAPL",
                "name": "Apple Inc.",
                "date": "2019-01-04",
                "isEnabled": true,
                "type": "cs",
                "iexId": "11"
            },
            {
                "symbol": "AAT",
                "name": "American Assets Trust Inc.",
                "date": "2019-01-04",
                "isEnabled": true,
                "type": "cs",
                "iexId": "12"
            },
            {
                "symbol": "AAU",
                "name": "Almaden Minerals Ltd.",
                "date": "2019-01-04",
                "isEnabled": true,
                "type": "cs",
                "iexId": "13"
            }
        ]
        
        */
        
        String jsonconteudo = mwcomms.receberconteudopagina("https://api.iextrading.com/1.0/ref-data/symbols");
        
        JSONArray simbolosjson = new JSONArray(jsonconteudo);
        java.util.List<String> listasimbolosencontrada = new java.util.ArrayList<>();
        for (int i = 0; i < simbolosjson.length(); i++)
        {
            JSONObject candleobjectatual = simbolosjson.getJSONObject(i);
            
            String s_symbol = candleobjectatual.getString("symbol");
            String s_name = candleobjectatual.getString("name");
            //String s_date = candleobjectatual.getString("date");
            //String s_isenabled = String.valueOf(candleobjectatual.getBoolean("isEnabled"));
            String s_type = candleobjectatual.getString("type");
            //String s_iedid = candleobjectatual.getString("iexId");
            
            if ((s_symbol.toLowerCase()).contains(parametrobusca.toLowerCase()))
            {
                String simboloadd = "IEX:" + s_symbol + " - " + s_name + " (" + s_type + ")";
                listasimbolosencontrada.add(simboloadd);
            }
            else if ((s_name.toLowerCase()).contains(parametrobusca.toLowerCase()))
            {
                String simboloadd = "IEX:" + s_symbol + " - " + s_name + " (" + s_type + ")";
                listasimbolosencontrada.add(simboloadd);
            }
            
        }
        
        return listasimbolosencontrada;
    }
    
    // <editor-fold defaultstate="collapsed" desc="Stocks - Chart">
    
    public java.util.List<mccandle> iex_receberstockcandleswithoutminutes(String simbolo, String periodo)
    {
        /*
        [
            {
                "date": "2014-01-06",
                "open": 70.4653,
                "high": 71.6912,
                "low": 69.9605,
                "close": 71.3149,
                "volume": 103359151,
                "unadjustedVolume": 14765593,
                "change": 0.386777,
                "changePercent": 0.545,
                "vwap": 70.9303,
                "label": "Jan 6, 14",
                "changeOverTime": 0
            },
            {
                "date": "2014-01-07",
                "open": 71.366,
                "high": 71.5811,
                "low": 70.5276,
                "close": 70.8046,
                "volume": 79432766,
                "unadjustedVolume": 11347538,
                "change": -0.510346,
                "changePercent": -0.716,
                "vwap": 71.7785,
                "label": "Jan 7, 14",
                "changeOverTime": -0.007155587401791223
            },
            {
                "date": "2014-01-08",
                "open": 70.6436,
                "high": 71.5286,
                "low": 70.6279,
                "close": 71.2533,
                "volume": 64686685,
                "unadjustedVolume": 9240955,
                "change": 0.448723,
                "changePercent": 0.634,
                "vwap": 71.2531,
                "label": "Jan 8, 14",
                "changeOverTime": -0.000863774610915791
            },
            {
                "date": "2014-01-09",
                "open": 71.6912,
                "high": 71.6991,
                "low": 70.19,
                "close": 70.3432,
                "volume": 69905199,
                "unadjustedVolume": 9986457,
                "change": -0.910039,
                "changePercent": -1.277,
                "vwap": 70.8314,
                "label": "Jan 9, 14",
                "changeOverTime": -0.013625483594592414
            }
        ]
        
        
        */
        
        String jsonconteudo = mwcomms.receberconteudopagina("https://api.iextrading.com/1.0/stock/"+simbolo+"/chart/"+periodo);
        
        JSONArray candlesjson = new JSONArray(jsonconteudo);
        java.util.List<mccandle> listacandlesretornar = new java.util.ArrayList<>();
        for (int i = 0; i < candlesjson.length(); i++)
        {
            JSONObject candleobjectatual = candlesjson.getJSONObject(i);
            String cjson_date = candleobjectatual.getString("date");
            //mierclasses.mcfuncoeshelper.mostrarmensagem(cjson_date);
            String cjson_open = String.valueOf(candleobjectatual.getDouble("open"));
            //mierclasses.mcfuncoeshelper.mostrarmensagem(cjson_open);
            String cjson_high = String.valueOf(candleobjectatual.getDouble("high"));
            //mierclasses.mcfuncoeshelper.mostrarmensagem(cjson_high);
            String cjson_close = String.valueOf(candleobjectatual.getDouble("close"));
            //mierclasses.mcfuncoeshelper.mostrarmensagem(cjson_close);
            String cjson_low = String.valueOf(candleobjectatual.getDouble("low"));
            //mierclasses.mcfuncoeshelper.mostrarmensagem(cjson_low);
            String cjson_volume = String.valueOf(candleobjectatual.getDouble("volume"));
            //mierclasses.mcfuncoeshelper.mostrarmensagem(cjson_volume);
            
            String timestampcandle = 
                    cjson_date.split("-")[0] + "-" +
                    cjson_date.split("-")[1] + "-" +
                    cjson_date.split("-")[2] + "-" +
                    "00" + "-" +
                    "00" + "-" +
                    "00"; 
            
            mierclasses.mccandle candleadd = new mierclasses.mccandle
        (timestampcandle, cjson_open, cjson_high, cjson_close, cjson_low, cjson_volume);
            
            listacandlesretornar.add(candleadd);
            
        }
        
        //reordernar lista de candles antes de retornar
        java.util.Collections.sort(listacandlesretornar, new java.util.Comparator<mierclasses.mccandle>() 
        {
            public int compare(mierclasses.mccandle candleone, mierclasses.mccandle candletwo) 
            {
                return candleone.timestampdate.compareTo(candletwo.timestampdate);
            }
        });
        if (math_tirarzeros == true)
            listacandlesretornar = math_retirarzeroscandles(listacandlesretornar);
        
        return listacandlesretornar;
    }
    
    public java.util.List<mccandle> iex_receberstockcandleswithminutes(String simbolo, String periodo)
    {
        /*
        [
            {
                "date": "20190104",
                "minute": "09:30",
                "label": "09:30 AM",
                "high": 144.54,
                "low": 144.07,
                "average": 144.356,
                "volume": 9329,
                "notional": 1346694.07,
                "numberOfTrades": 95,
                "marketHigh": 144.58,
                "marketLow": 144.06,
                "marketAverage": 144.451,
                "marketVolume": 2029196,
                "marketNotional": 293119046.0123,
                "marketNumberOfTrades": 3799,
                "open": 144.42,
                "close": 144.48,
                "marketOpen": 144.58,
                "marketClose": 144.51,
                "changeOverTime": 0,
                "marketChangeOverTime": 0
            },
            {
                "date": "20190104",
                "minute": "09:31",
                "label": "09:31 AM",
                "high": 144.49,
                "low": 143.82,
                "average": 144.162,
                "volume": 14569,
                "notional": 2100302.925,
                "numberOfTrades": 79,
                "marketHigh": 144.54,
                "marketLow": 143.6,
                "marketAverage": 144.035,
                "marketVolume": 472509,
                "marketNotional": 68058023.4464,
                "marketNumberOfTrades": 3741,
                "open": 144.49,
                "close": 143.91,
                "marketOpen": 144.509,
                "marketClose": 143.95,
                "changeOverTime": -0.0013438998032640722,
                "marketChangeOverTime": -0.0028798692982395196
            }
        ]
        
        */
        
        String jsonconteudo = mwcomms.receberconteudopagina("https://api.iextrading.com/1.0/stock/"+simbolo+"/chart/"+periodo);
        //mierclasses.mcfuncoeshelper.setarclipboard(jsonconteudo);
        //mierclasses.mcfuncoeshelper.mostrarmensagem(jsonconteudo);
        
        JSONArray candlesjson = new JSONArray(jsonconteudo);
        java.util.List<mccandle> listacandlesretornar = new java.util.ArrayList<>();
        for (int i = 0; i < candlesjson.length(); i++)
        {
            JSONObject candleobjectatual = candlesjson.getJSONObject(i);
            String cjson_date = candleobjectatual.getString("date");
            //mierclasses.mcfuncoeshelper.mostrarmensagem(cjson_date);
            String cjson_minute = candleobjectatual.getString("minute");
            //mierclasses.mcfuncoeshelper.mostrarmensagem(cjson_minute);
            String cjson_open = String.valueOf(candleobjectatual.getDouble("open"));
            //mierclasses.mcfuncoeshelper.mostrarmensagem(cjson_open);
            String cjson_high = String.valueOf(candleobjectatual.getDouble("high"));
            //mierclasses.mcfuncoeshelper.mostrarmensagem(cjson_high);
            String cjson_close = String.valueOf(candleobjectatual.getDouble("close"));
            //mierclasses.mcfuncoeshelper.mostrarmensagem(cjson_close);
            String cjson_low = String.valueOf(candleobjectatual.getDouble("low"));
            //mierclasses.mcfuncoeshelper.mostrarmensagem(cjson_low);
            String cjson_volume = String.valueOf(candleobjectatual.getDouble("volume"));
            //mierclasses.mcfuncoeshelper.mostrarmensagem(cjson_volume);
            
            String anotimestamp = mierclasses.mcfuncoeshelper.retornarSubstringIndices(cjson_date, 0, 3);
            //mierclasses.mcfuncoeshelper.mostrarmensagem(anotimestamp);
            String mestimestamp = mierclasses.mcfuncoeshelper.retornarSubstringIndices(cjson_date, 4, 5);
            //mierclasses.mcfuncoeshelper.mostrarmensagem(mestimestamp);
            String diatimestamp = mierclasses.mcfuncoeshelper.retornarSubstringIndices(cjson_date, 6, 7);
            //mierclasses.mcfuncoeshelper.mostrarmensagem(diatimestamp);
            String horatimestamp = cjson_minute.split(":")[0];
            //mierclasses.mcfuncoeshelper.mostrarmensagem(horatimestamp);
            String minutotimestamp = cjson_minute.split(":")[1];
            //mierclasses.mcfuncoeshelper.mostrarmensagem(minutotimestamp);
            
            String timestampcandle = 
                    anotimestamp + "-" +
                    mestimestamp + "-" +
                    diatimestamp + "-" +
                    horatimestamp + "-" +
                    minutotimestamp + "-" +
                    "00"; 
            
            mierclasses.mccandle candleadd = new mierclasses.mccandle
        (timestampcandle, cjson_open, cjson_high, cjson_close, cjson_low, cjson_volume);
            
            listacandlesretornar.add(candleadd);
            
        }

        //reordernar lista de candles antes de retornar
        java.util.Collections.sort(listacandlesretornar, new java.util.Comparator<mierclasses.mccandle>() 
        {
            public int compare(mierclasses.mccandle candleone, mierclasses.mccandle candletwo) 
            {
                return candleone.timestampdate.compareTo(candletwo.timestampdate);
            }
        });     
        if (math_tirarzeros == true)
            listacandlesretornar = math_retirarzeroscandles(listacandlesretornar);
        
        return listacandlesretornar;
    }
    
    // </editor-fold>

    // </editor-fold> 
    
    // <editor-fold defaultstate="collapsed" desc="IEX Cloud (to implement)">
    //</editor-fold>
    
    // <editor-fold defaultstate="collapsed" desc="OFFLINE VALUES">
    
    //the values returned by these functions are not real and used for offline trading and testing only 
    public java.util.List<mccandle> offline_receberstockcandlessample()
    {
        //funcao para entregar lista de cadles de exemplo
        String rootjar = mierclasses.mcfuncoeshelper.retornarpathbaseprograma();
        String samplejson = rootjar + "/outfiles/samples/apple5y.json";
        String jsonconteudo = mierclasses.mcfuncoeshelper.retornarStringArquivo(samplejson);
        
        JSONArray candlesjson = new JSONArray(jsonconteudo);
        java.util.List<mccandle> listacandlesretornar = new java.util.ArrayList<>();
        for (int i = 0; i < candlesjson.length(); i++)
        {
            JSONObject candleobjectatual = candlesjson.getJSONObject(i);
            String cjson_date = candleobjectatual.getString("date");
            String cjson_open = String.valueOf(candleobjectatual.getDouble("open"));
            String cjson_high = String.valueOf(candleobjectatual.getDouble("high"));
            String cjson_close = String.valueOf(candleobjectatual.getDouble("close"));
            String cjson_low = String.valueOf(candleobjectatual.getDouble("low"));
            String cjson_volume = String.valueOf(candleobjectatual.getDouble("volume"));
            
            String timestampcandle = 
                    cjson_date.split("-")[0] + "-" +
                    cjson_date.split("-")[1] + "-" +
                    cjson_date.split("-")[2] + "-" +
                    "00" + "-" +
                    "00" + "-" +
                    "00"; 
            
            mierclasses.mccandle candleadd = new mierclasses.mccandle
        (timestampcandle, cjson_open, cjson_high, cjson_close, cjson_low, cjson_volume);
            
            listacandlesretornar.add(candleadd);
            
        }
        
        //reordernar lista de candles antes de retornar
        java.util.Collections.sort(listacandlesretornar, new java.util.Comparator<mierclasses.mccandle>() 
        {
            public int compare(mierclasses.mccandle candleone, mierclasses.mccandle candletwo) 
            {
                return candleone.timestampdate.compareTo(candletwo.timestampdate);
            }
        });
        if (math_tirarzeros == true)
            listacandlesretornar = math_retirarzeroscandles(listacandlesretornar);
        
        return listacandlesretornar;
    }
    
    public java.util.List<Double> offline_simularbidaskcandles(java.util.List<mierclasses.mccandle> candlesatual)
    {
        //funcao para estimar um valor de ask e bid para o simbolo atual, para testar o trader bot
        //mierclasses.mcquote quote = receberquote(simbolo);
        //double ultimoclose = quote.closed;
        //double rangebidaskestimado = 0.0025;
        java.util.List<mierclasses.mccandle> candlessample = candlesatual;
        mierclasses.mccandle ultimacandlesample = candlessample.get(candlessample.size()-1);
        double ultimoclose = ultimacandlesample.closed;
        double rangebidaskestimado = 0.0000025;
        
        double variacao = ultimoclose*rangebidaskestimado;
        double bidestimado = ultimoclose - variacao;
        double askestimado = ultimoclose + variacao;

        //https://stackoverflow.com/questions/20039098/issue-creating-a-double-array-list
        java.util.List<Double> retorno = new java.util.ArrayList<>();
        retorno.add(bidestimado);
        retorno.add(askestimado);
        
        return retorno;
    }
    // </editor-fold>

    // <editor-fold defaultstate="collapsed" desc="MATH SUPPORT FUNCTIONS">
    public boolean math_tirarzeros = false; //variavel para dizer se devem ser retirados zeros das candles

    public java.util.List<mccandle> math_retirarzeroscandles(java.util.List<mccandle> candles)
    {
        java.util.List<mccandle> candlessemzeros = new java.util.ArrayList<>();
        
        //funcao para retirar candles que possuem valor 0, seja em open, high, low ou close
        for (int i = 0; i < candles.size(); i++)
        {
            mccandle candleatual = candles.get(i);
            
            boolean adicionarsemzeros = true;
            if (candleatual.opend == 0.0)
                adicionarsemzeros = false;
            else if (candleatual.highd == 0.0)
                adicionarsemzeros = false;
            else if (candleatual.lowd == 0.0)
                adicionarsemzeros = false;
            else if (candleatual.closed == 0.0)
                adicionarsemzeros = false;
            
            if (adicionarsemzeros == true)
                candlessemzeros.add(candleatual);
        }
        
        return candlessemzeros;
    }
    //</editor-fold>
}