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命令行唱歌

自动读取虚拟币ETC行情并语音提醒的小工具(mac OSX)的更多相关文章

  1. 快速读取csv平面文件,并导入数据库,简单小工具

    using DataToDeal; using LumenWorks.Framework.IO.Csv; using Microsoft.Win32; using System; using Syst ...

  2. 语音转文字小工具开发Python

    # -*- coding: utf- -*- import requests import re import os import time from aip import AipSpeech fro ...

  3. Java生鲜电商平台-电商虚拟币的充值与消费思考

    Java生鲜电商平台-电商虚拟币的充值与消费思考 项目背景 最近由于项目业务原因,需要为系统设计虚拟币的充值及消费功能.公司内已经有成熟的支付网关服务,所以重点变成了如何设计项目内虚拟币的充值流程,让 ...

  4. 程序员的自我救赎---12.2.3: 虚拟币交易平台(区块链) 下 【C#与以太坊通讯】

    <前言> (一) Winner2.0 框架基础分析 (二)PLSQL报表系统 (三)SSO单点登录 (四) 短信中心与消息中心 (五)钱包系统 (六)GPU支付中心 (七)权限系统 (八) ...

  5. 【PHP】算法进阶,获取给定值的最优组合:虚拟币抵扣问题解决方案

    商城里边.虚拟币抵扣问题解决方案 虚拟币抵扣规则,按照以下规则执行: 1.如果一个订单包含多款商品,且均支持虚拟币抵扣时:   优先按照最大化使用虚拟币进行全额抵扣原则进行抵扣,若抵扣后用户虚拟币账号 ...

  6. Android自动读取短信验证码

    Android自动读取短信验证码  extends:http://www.cnblogs.com/jiayaguang/p/4366384.html,http://blog.csdn.net/yung ...

  7. iOS:自动读取图片插件KSImageNamed-Xcode-master的使用

    gitHub链接:https://github.com/ksuther/KSImageNamed-Xcode   KSImageNamed-Xcode是一个Xcode插件,可以帮助开发者在Xcode中 ...

  8. 对于exacoin虚拟币以及其他虚拟币乱象的思考

    今天晚上12点正,我帮两个朋友购买exacoin虚拟币,当然我也购买,为了购买我做了充分的准备,包括使用多个浏览器和准备良好的***代理,并转如足量BTC以支持购买,但是通过三天晚上的奋战,让我感觉这 ...

  9. React会自动把虚拟DOM数组展开

    React会自动把虚拟DOM数组展开,放在父级虚拟DOM中,这个特性还是我同事帮我解决一个问题的时候,偶然发现的. 如何将一个数据数组转换为一个虚拟DOM的数组,需要使用map,如下: const n ...

随机推荐

  1. Vue.js常用指令:v-bind

    一.什么是v-bind指令 v-bind指令用于响应更新HTML特性,允许将一个或多个属性动态绑定到表达式.v-bind是应用在动态属性上面的. 二.语法 v-bind语法如下: v-bind:动态属 ...

  2. Cisco NTP配置

    Windows 或 Linux 系统配置成NTP服务器,思科交换机配置成NTP客户端 ##创建VLAN 10 SW01>enable SW01#vlan database SW01(vlan)# ...

  3. 和我一起学Effective Java之创建和销毁对象

    前言 主要学习创建和销毁对象: 1.何时以及如何创建对象 2.何时以及如何避免创建对象 3.如何确保它们能够适时地销毁 4.如何管理对象销毁之前必须进行的清理动作 正文 一.用静态工厂方法代替构造器 ...

  4. spring quartz1.8.6集群结算服务定时任务与appserver独立分开

    1.quartz集群如何处理同一个数据库,同一套sqtz表的lock问题,否则会导致打架. 思路如下: 1.com.xxx.quartz.BeanInvokingJobDetailFactoryBea ...

  5. OpenGL 太阳系行星拾取例子(GL_SELECT) VS2008 + glut实现

    太阳系:Solar System 以太阳(Sun)为中心,由内到外分别是: 水星(Mercury) 金星(Venus) 地球(Earth) 火星(Mars) 木星(Jupiter) 土星(Saturn ...

  6. [Localization] MobileNet with SSD

    先来一波各版本性能展览: Pre-trained Models Choose the right MobileNet model to fit your latency and size budget ...

  7. SpringBoot------个性化启动Banner设置

    1.添加Banner.txt文件 . ____ _ __ _ _ /\\ / ___'_ __ _ _(_)_ __ __ _ \ \ \ \ ( ( )\___ | '_ | '_| | '_ \/ ...

  8. ASP.NET MVC 4 (十三) 基于表单的身份验证

    在前面的章节中我们知道可以在MVC应用程序中使用[Authorize]特性来限制用户对某些网址(控制器/控制器方法)的访问,但这都是在对用户认证之后,而用户的认证则依然是使用ASP.NET平台的认证机 ...

  9. WebKit最新特性srcset简介(转)

    WebKit内核最新新增了对srcset属性的支持(参考:https://www.webkit.org/blog/2910/improved-support-for-high-resolution-d ...

  10. GDI+绘制五星红旗

    五星红旗是由红色背景,加5个黄色五角星组成.绘制一个五星红旗的思路,就是先定义一个五角星的自定义控件,然后通过设置五角星的大小.位置.旋转角度等属性,组合成一个五星红旗. 五角星自定义控件代码: pu ...