我花了些时间研究策略,对照各种情况下的K线路,走了一圈,理论上都没有问题,那就开始动手做,开发前我请教了下老聂和表格,说PHP也可以写得出来,OKCOIN有调用接口,PHP我会点,写程序我比半瓶水还半瓶水,什么都会点,但什么又都不会,两个字,我会买,我会改, 呵呵
我学语言都是为了解决问题去学,只要解决问题就好, BTC每个交易所都提供API, 无论是现货交易,还是合约,都有接口和方法调用 , OKCOIN的API调用文档
,目前支持C#、C++、JAVA、PHP、Python 版本, 再看其它交易所接口,基本上都提供这几个语言的开发接口,PHP用得顺手我就先来PHP了.
有了代码样例好解决问题,我需要实现的功能
- 读取K线数据
- 计算阳线和阴线,买和卖 (如何买和卖在策略已写,低吸高抛,有小赚就可以)
- 交易记录 (我用到MYSQL存储和查询每笔交易,如果是高频交易这个表也可以不建,只要调OKCOIN的交易记录再用来分析)
在程序开发前,先要申请个API KEY,每个交易所都有API KEY, 据说这些交易所以前经常出问题,API的开发人员都是调教出来的,所以现在调用都稳定了, 呵呵
样例代码PHP Example.php有各种调用方法,把样例的API KEY,换成自己的,OKCOIN有国际站和中文站,读出的K线数据价格一个是美元,一个是人民币, 在文档中修改调用的网址为 http://www.okcoin.cn, 调出的是中文站数据.
1.) 读取K线
//获取比特币或莱特币的K线数据
$params = array('symbol' => 'btc_cny', 'type' => '5min', 'size' => 5);
$result = $client -> klineDataApi($params);
得到的结果
Array ( [0] => Array ( [0] => 1487075700000 [1] => 6753.9 [2] => 6753.9 [3] => 6726 [4] => 6753.9 [5] => 14.441 ) [1] => Array ( [0] => 1487076000000 [1] => 6749.1 [2] => 6753.9 [3] => 6733.33 [4] => 6733.55 [5] => 32.414 ) [2] => Array ( [0] => 1487076300000 [1] => 6735 [2] => 6748 [3] => 6720.32 [4] => 6720.41 [5] => 17.753 ) [3] => Array ( [0] => 1487076600000 [1] => 6748 [2] => 6748 [3] => 6718.8 [4] => 6718.8 [5] => 135.998 ) [4] => Array ( [0] => 1487076900000 [1] => 6718.8 [2] => 6730 [3] => 6718.8 [4] => 6730 [5] => 0.699 ) )
这组数据 解析很简单, 会写程序的都懂, 解释下每根K线
[1] => Array (
[0] => 1485102600000 时间戳
[1] => 6262.6 开 KK
[2] => 6272.53 高 KH
[3] => 6258.1 低 KL
[4] => 6267.17 收 KS
[5] => 839.07 交易量) )
每根K线的高点,低点,收盘价也有,交易量也有, 有这些数据就好办, 剩下的就是怎样处理.
我需要从这组数据提取5根K线的最高点或者最低点
这需要用到PHP数组的一些方法,我花了几分钟找了一个案例
不懂的GOOGLE 搜呀,会关键字搜就什么都有了, php multidimensional-array max / min
http://stackoverflow.com/questions/17339421/find-highest-value-in-multidimensional-array
解决了问题
改成自己需要的代码:
/* 获取最KH值 */
$max = -9999999; //will hold max val
$found_item = null; //will hold item with max val;
foreach($result as $k=>$v)
{
if($v['2']>$max)
{
$max = $v['2'];
$found_item = $v;
}
}
echo "max value is $max
";
print_r($found_item);
最大值出来了,5根,10根,100根最大值都可计算出来, 最小值的方法相反.
/* 获取最KL值 */
$min = 9999999; //will hold max val
$found_min_item = null; //will hold item with max val;
foreach($result as $k=>$v) { if($v['3']<$min)
{
$min = $v['3'];
$found_min_item = $v;}
}
echo "min value is $min
";
print_r($found_min_item);
有了这两个重要的参数, 剩下的就好办了, 就是 if then else 解决的问题.
2. 计算阳线和阴线
这个比较容易,找出高低点,就知道每根线的是阳线,还是阴线 方法如下
if ($k1_item[4]>$k1_item[1]) {$k1=0;} else {$k1=1;}if ($k2_item[4]>$k2_item[1]) {$k2=0;} else {$k2=1;}
if ($k3_item[4]>$k3_item[1]) {$k3=0;} else {$k3=1;}
if ($k4_item[4]>$k4_item[1]) {$k4=0;} else {$k4=1;}
if ($k5_item[4]>$k5_item[1]) {$k5=0;} else {$k5=1;}
有了阴线和阳线,剩下的往策略里面套
买入点计算 (对照上一篇文章中的策略)
if (($k4_item[2]-$k4_item[3])>100) //大跌时的买入
{
$type=0;
echo '
K4单根下跌100点
';
$buy_price=$min-50;
$buyorder; // 这是一段函数,执行买入并写入mysql数据记录的一段程序
} else
//if ((($k10) && (($k21)&&($k31)&&($k41)))&&(($max-$min)>=50))
if (((($k10) && (($k21)&&($k31)&&($k41)))&&(($max-$min)>=50))&&($k2k1==0)) //小跌V型反弹的买入, 跌幅必须于50点以上, K2的低点必须低于K1的低点(上涨的假跌)
{
$type=1;
echo '
符合条件买入V线
';
$buy_price=$min-10;
$buyorder;
} else
if (($max-$min)>=100) // 5根K线或者30根K线最高点到最底点跌超过100点的买入
{
$type=2;
echo '
符合条件买入线100点
';
$buy_price=$min-50;
$buyorder;
}
有买就有卖
买的过程有个等待时间,现在不能主动,主动吃单收费,相当于少20个点,这样做就少赚钱了,
每笔交易买入成功后,立即进入卖出程序, 卖出加多少点,也要根据上面三个策略类型决定, BTC经常很疯 快速下跌100, 几分钟内快速回收50-80点,甚至完全吃掉这根阴线也时有发生.
但为了每笔记录都安全, 没买到就放弃,等到下一次机会
代码比较多, 有兴趣讨论我会继续, 目前实时工作表现良好,我抓了几张今天下午跑的截图 (如果改进一下,可以自动截图,存到服务器上)
这根K线突然大跌,超过100点,程序启动
if (($k4_item[2]-$k4_item[3])>100) //大跌时的买入
买入价格是最低价-50点
但K6并没有继续往下跌,而是完全吃掉这根阴线,几分钟就是100多点,没买到,程序等待1800秒,就放弃了
但更多的情况会连续下跌, 越跌越赚,很容易就买到了, 下一次继续等
这是最新的BTC 5分钟,K线图,程序会执行买入的是1和2, 其它的也是K1阳线,K2,K3,K4阴线,但都不符合买入条件,红圈下跌幅度不够,都不执行, 蓝色 1执行K4单根下跌100点, 蓝色2执行 if (($max-$min)>=100) , 5根K线最高点到最底点跌超过100点的买入
孩子们都睡了,继续优化K线,有兴趣的朋友,或者已经做过的大王们,欢迎多指教