自动读取虚拟币ETC行情并语音提醒的小工具(mac OSX)

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL;

public class Price {

    //默认配置无需修改
    public static String API_DOMAIN = "http://api.chbtc.com";
    public static String WIN_STR = "你发财了,你发财了,你发财了,你发财了,你发财了,你发财了";
    public static String LOSE_STR = "要赔哭了,要赔哭了,要赔哭了,要赔哭了,要赔哭了,要赔哭了";
    public static String CUR_PRICE_STR = "当前价格";
    public static String PRICE_UP_STR = "上涨突破";
    public static String PRICE_DOWN_STR = "下跌突破";
    public static String YUAN_STR = "元";
    public static String[] bollNotice = new String[]{"b o l l跌破最低值", "b o l l处于低位", "b o l l处于高位", "b o l l突破最高值",};
    public static String[] bollName = new String[]{"最低","低","高","最高"};
    public static String BTC = "btc_cny";
    public static String LTC = "ltc_cny";
    public static String ETC = "etc_cny";
    public static String ETH = "eth_cny";

    //程序动态使用数值
    public static int reawrd = 0;
    public static float etcPrice = 0;
    public static int lastPriceInt = 0;
    public static float mb = 0;
    public static float up = 0;
    public static float dn = 0;

    public static int state = 0;

    //用户配置数值
    public static float coinCount = 742.103f;//持币数量
    public static float sourceMoney = 33200;//总成本
    public static float max_price = 5000;//超过此价格,提醒发财
    public static float min_price = 0;//跌破此价格,提醒赔哭
    public static int sleepTime = 5000;//查询刷新间隔,建议不要太快,单位毫秒

    public static void main(String[] args) {
        if (args != null) {
            if (args.length >= 2) {
                min_price = Float.valueOf(args[0]);
                max_price = Float.valueOf(args[1]);
            } else if (args.length == 1) {
                max_price = Float.valueOf(args[0]);
            }
        }

        try {
            while (true) {
                testTicker(BTC);
                testTicker(LTC);
                getKline();
                testTicker(ETC);
                testTicker(ETH);
                reawrd = (int) (coinCount * etcPrice - sourceMoney);

                //价格提醒
                if (max_price != 0 && etcPrice > max_price) say(WIN_STR);
                else if (min_price != 0 && etcPrice < min_price) say(LOSE_STR);

                //boll提醒
                int lastState = state;
                if (etcPrice < dn) {
                    state = 0;
                } else if (etcPrice > dn && etcPrice < mb) {
                    state = 1;
                } else if (etcPrice > mb && etcPrice < up) {
                    state = 2;
                } else if (etcPrice > up) {
                    state = 3;
                }

                System.out.println("boll " + bollName[state]);

                if (state != lastState) {
                    say(bollNotice[state]);
                }
                Thread.sleep(sleepTime);

            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    /**
     * 获取行情
     */
    public static void testTicker(String currency) {
        try {
            // String currency = "btc_cny";
            // 请求地址
            String url = API_DOMAIN + "/data/v1/ticker?currency=" + currency;
            // 请求测试
            String callback = get(url, "UTF-8");
            int start = callback.indexOf("\"buy\":\"");
            int end = callback.indexOf("\",\"high\"");

            System.out.print(currency.substring(0, 3) + " " + callback.substring(start + 7, end) + "\t");
            // System.out.print(currency.substring(0, 3) + " " + callback.substring(start + 7, end) + "\t" + ", mb " + mb + ", up " + up + " , dn " + dn);

            if (currency.equals(ETC)) {
                float curPrice = Float.valueOf(callback.substring(start + 7, end));
                if (lastPriceInt == 0) {
                    say(CUR_PRICE_STR + curPrice + YUAN_STR);
                    lastPriceInt = (int) curPrice;
                } else if ((int) curPrice > lastPriceInt) {
                    say(CUR_PRICE_STR + PRICE_UP_STR + curPrice + YUAN_STR);
                    lastPriceInt = (int) curPrice;
                } else if ((int) curPrice < lastPriceInt) {
                    say(CUR_PRICE_STR + PRICE_DOWN_STR + curPrice + YUAN_STR);
                    lastPriceInt = (int) curPrice;
                }
                etcPrice = curPrice;
            }
        } catch (Exception ex) {
            ex.printStackTrace();
        }
    }

    /**
     * @param urlAll  :请求接口
     * @param charset :字符编码
     * @return 返回json结果
     */
    public static String get(String urlAll, String charset) {
        BufferedReader reader = null;
        String result = null;
        StringBuffer sbf = new StringBuffer();
        String userAgent = "Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/29.0.1547.66 Safari/537.36";// 模拟浏览器
        try {
            URL url = new URL(urlAll);
            HttpURLConnection connection = (HttpURLConnection) url.openConnection();
            connection.setRequestMethod("GET");
            connection.setReadTimeout(30000);
            connection.setConnectTimeout(30000);
            connection.setRequestProperty("User-agent", userAgent);
            connection.connect();
            InputStream is = connection.getInputStream();
            reader = new BufferedReader(new InputStreamReader(is, charset));
            String strRead = null;
            while ((strRead = reader.readLine()) != null) {
                sbf.append(strRead);
                sbf.append("\r\n");
            }
            reader.close();
            result = sbf.toString();

        } catch (Exception e) {
            e.printStackTrace();
        }
        return result;
    }

    public static void say(String content) {
        try {
            //执行命令    
            Runtime.getRuntime().exec("say \"" + content + "\"");
        } catch (IOException e) {
            e.printStackTrace();
        }
    }


    public static void countBOLL(float[] cs) {
        int n = 20;
        int k = 2;
        float endSum = 0;
        for (int i = 0; i < cs.length; i++) {
            endSum += cs[i];
        }
        float ma = endSum / n;

        float mdSum = 0;
        for (int i = 0; i < cs.length; i++) {
            mdSum += (cs[i] - ma) * (cs[i] - ma);
        }
        float md = (float) Math.sqrt(mdSum / n);

        float mb = (endSum - cs[n - 1]) / (n - 1);
        float up = mb + k * md;
        float dn = mb - k * md;

        Price.mb = mb;
        Price.up = up;
        Price.dn = dn;

//        System.out.println("up " + up + " ,mb" + mb + " ,dn " + dn);
    }

    public static void getKline() {
        try {
            String currency = "btc_cny";
            // 请求地址
            String url = "http://api.chbtc.com/data/v1/kline?currency=etc_cny&type=5min&size=20";
            // 请求测试
            String callback = get(url, "UTF-8");
            String[] split = callback.split(",");
            int offsex = 0;
            int index = 0;
            float cs[] = new float[20];
            for (int i = 0; i < split.length; i++) {
                if (i == 0) {
                    offsex += 4;
                } else {
                    offsex += 6;
                }
                if (offsex < split.length) {
                    cs[index] = Float.valueOf(split[offsex]);
                    index++;
                }

            }
            countBOLL(cs);
        } catch (Exception ex) {
            ex.printStackTrace();
        }
    }

}

 

 

使用chbtn的API,整数价格变化自动语音提醒,可以自行配置价格语音提醒。
使用时直接

javac Price.java

java Price

 

 

 

更多say命令的使用方式请搜索 mac命令行唱歌

posted @ 2017-05-06 15:49  带狗狗带  Views(1178)  Comments(0Edit  收藏  举报