|

分享源码
界面截图: |
- |
是否带模块: |
- |
备注说明: |
- |
本帖最后由 易造轮 于 2025-3-25 17:26 编辑
|
K线_判断K线形态 | 整数型 | | |
_现行下标 | 整数型 | | | | 参_开盘价数组 | 双精度小数型 | | | | 参_最高价数组 | 双精度小数型 | | | | 参_最低价数组 | 双精度小数型 | | | | 参_收盘价数组 | 双精度小数型 | | | |
变量名 | 类 型 | 静态 | 数组 | 备 注 | 实体大小 | 双精度小数型 | | | 上影线长度 | 双精度小数型 | | | 下影线长度 | 双精度小数型 | | | 比较 | 整数型 | | | 总长度 | 双精度小数型 | | |
如果真 (参_开盘价数组 [_现行下标 ] = 参_收盘价数组 [_现行下标 ]) 返回 ( #K形_普通形 )实体大小 = 取绝对值 (参_开盘价数组 [_现行下标] - 参_收盘价数组 [_现行下标])比较 = 双精度比较_ASM (参_开盘价数组 [_现行下标 ], 参_收盘价数组 [_现行下标 ])上影线长度 = 参_最高价数组 [_现行下标 ] - 选择 (比较 = #比较_大于, 参_开盘价数组 [_现行下标 ], 参_收盘价数组 [_现行下标 ])下影线长度 = 选择 (比较 = #比较_小于, 参_开盘价数组 [_现行下标 ], 参_收盘价数组 [_现行下标 ]) - 参_最低价数组 [_现行下标 ]总长度 = 参_最高价数组 [_现行下标 ] - 参_最低价数组 [_现行下标 ]总长度 = 上影线长度 + 实体大小 + 下影线长度 如果真 (实体大小 < 总长度 × 0.03 且 取绝对值 (上影线长度 - 下影线长度 ) < 总长度 × 0.03 且 上影线长度 + 下影线长度 > 总长度 × 0.6 ) 返回 ( #K形_十字形 ) 如果真 (实体大小 < 总长度 × 0.06 ) 判断 (下影线长度 > 总长度 × 0.4 且 上影线长度 < 总长度 × 0.03 )  返回 ( #K形_锤子形 )   如果真 (上影线长度 > 总长度 × 0.4 且 下影线长度 < 总长度 × 0.03 )    返回 ( #K形_倒锤子形 )     返回 ( #K形_普通形 )
还有php版
[PHP] 纯文本查看 复制代码 <?php
//定义一个函数,用来计算一根K线的斜率
function get_slope($kline) {
//参数为一个数组,表示一根K线的数据
//返回一个数值,表示K线的斜率
//计算实体大小和影线长度
$实体大小 = abs($kline["open"] - $kline["close"]); //实体大小
$上影线长度 = $kline["high"] - max($kline["open"], $kline["close"]); //上影线长度
$下影线长度 = min($kline["open"], $kline["close"]) - $kline["low"]; //下影线长度
//计算斜率
//斜率等于实体大小除以影线长度之和
//如果影线长度之和为零,则斜率为无穷大
if ($上影线长度 + $下影线长度 == 0) {
return INF; //返回无穷大的常量
} else {
return $实体大小 / ($上影线长度 + $下影线长度); //返回斜率值
}
}
//定义一个函数,用来计算一根K线的斜率
function get_slope($kline) {
//参数为一个数组,表示一根K线的数据
//返回一个数值,表示K线的斜率
//计算实体大小和影线长度
$实体大小 = abs($kline[“open”] - kline["close"]);
//实体大小上影线长度 = $kline[“high”] - max($kline[“open”], kline["close"]);
//上影线长度下影线长度 = min($kline[“open”], $kline[“close”]) - $kline[“low”];
//下影线长度
//计算斜率
//斜率等于实体大小除以影线长度之和
//如果影线长度之和为零,则斜率为无穷大
if (上影线长度+下影线长度 == 0) {
return INF; //返回无穷大的常量
} else {
return 实体大小/(上影线长度 + $下影线长度); //返回斜率值
}
}
//定义一个函数,用来计算近30根K线的收盘价斜率
function get_close_slope($klines) {
//参数为一个数组,表示近30根K线的数据
//返回一个数值,表示收盘价斜率
//获取近30根K线的收盘价数组
$close_prices = array();
foreach ($klines as $kline) {
array_push($close_prices, $kline[“close”]);
}
//计算收盘价斜率
//收盘价斜率等于最后一根K线的收盘价减去第一根K线的收盘价,再除以29
return ($close_prices[29] - $close_prices[0]) / 29; //返回收盘价斜率值
}
function get_shape($kline) {
//计算实体大小和影线长度
$实体大小 = abs($kline["open"] - $kline["close"]); //实体大小
$上影线长度 = $kline["high"] - max($kline["open"], $kline["close"]); //上影线长度
$下影线长度 = min($kline["open"], $kline["close"]) - $kline["low"]; //下影线长度
$总长度 = $上影线长度 + $实体大小 + $下影线长度; //总长度
//判断是否是十字星
//十字星的条件是:实体大小占总长度的比例接近于零,上下影线长度相近且较长
if ($实体大小 / $总长度 < 0.03 && abs($上影线长度 - $下影线长度) / $总长度 < 0.03 && ($上影线长度 + $下影线长度) / $总长度 > 0.6) {
return DOJI; //返回十字星的常量
}
if ($实体大小 / $总长度 < 0.06) {
if ($下影线长度 / $总长度 > 0.4 && $上影线长度 / $总长度 < 0.03) {
return HAMMER; //返回锤子线的常量
} elseif ($上影线长度 / $总长度 > 0.4 && $下影线长度 / $总长度 < 0.03) {
return INVERTED_HAMMER; //返回倒锤子线的常量
}
}
//如果都不是以上的形态,返回-1
return -1;
}
//定义一个函数,用来判断是否是锤子线或倒锤子线
function is_hammer_or_inverted_hammer($kline) {
//计算实体大小和影线长度
$实体大小 = abs($kline["open"] - $kline["close"]); //实体大小
$上影线长度 = $kline["high"] - max($kline["open"], $kline["close"]); //上影线长度
$下影线长度 = min($kline["open"], $kline["close"]) - $kline["low"]; //下影线长度
$总长度 = $上影线长度 + $实体大小 + $下影线长度; //总长度
//判断是否是锤子线或倒锤子线
if ($实体大小 / $总长度 < 0.06) {
if ($下影线长度 / $总长度 > 0.4 && $上影线长度 / $总长度 < 0.03) {
return HAMMER; //返回锤子线的常量
} elseif ($上影线长度 / $总长度 > 0.4 && $下影线长度 / $总长度 < 0.03) {
return INVERTED_HAMMER; //返回倒锤子线的常量
}
}
//如果都不是以上的形态,返回-1
return -1;
}
//定义一个函数,用来判断是否是K线反转
function is_reversal($klines) {
//获取K线的数量
$count = count($klines);
//判断是否有足够的K线数据
if ($count >= 2) {
//获取最后两根K线的数据
$kline1 = $klines[$count - 2];
$kline2 = $klines[$count - 1];
//获取最后两根K线的颜色和形态
$color1 = get_color($kline1);
$color2 = get_color($kline2);
$shape2 = is_hammer_or_inverted_hammer($kline2);
//判断是否是反转形态
if ($color1 == GREEN && $color2 == RED && $shape2 == HAMMER && $kline2["close"] > $kline1["open"]) {
return true; //返回真值,表示反转为上涨趋势
} elseif ($color1 == RED && $color2 == GREEN && $shape2 == INVERTED_HAMMER && $kline2["close"] < $kline1["open"]) {
return true; //返回真值,表示反转为下跌趋势
}
}
//如果都不是以上的情况,返回假值,表示没有反转
return false;
}
颜色就能判断方向,&& $kline2["close"] > $kline1["open"] 是否有点多余
//定义一个函数,用来计算一组K线的连续性
function get_continuity($klines) {
//参数为一个数组,表示一组K线的数据
//返回一个数值,表示K线的连续性
//获取K线的数量
$count = count($klines);
if ($count >= 3) {
//获取最后三根K线的数据
$kline1 = $klines[$count - 3];
$kline2 = $klines[$count - 2];
$kline3 = $klines[$count - 1];
//获取最后三根K线的颜色
$color1 = get_color($kline1);
$color2 = get_color($kline2);
$color3 = get_color($kline3);
//判断是否是早晨之星或黄昏之星
if (($color1 == GREEN && $color2 == BLACK && $color3 == RED) || ($color1 == RED && $color2 == BLACK && $color3 == GREEN)) {
//从倒数第四根K线开始向前遍历,计算连续性
$continuity = 0; //初始化连续性为零
for ($i = $count - 4; $i >= 0; $i--) {
//获取当前K线的数据和颜色
$kline = $klines[$i];
$color = get_color($kline);
//如果当前K线的颜色与第一根K线的颜色相同,则连续性加一
if ($color == $color1) {
$continuity++;
} else {
//否则跳出循环
break;
}
}
//返回连续性值
return $continuity;
}
}
//如果都不是早晨之星或黄昏之星,返回-1
return -1;
}
//定义一个函数,用来判断一组K线的形态,并返回形态和等级
function get_pattern_and_level($klines) {
//参数为一个数组,表示一组K线的数据
//返回一个数组,包含两个元素:形态和等级
//获取K线的数量
$count = count($klines);
if ($count >= 3) {
//获取最后三根K线的数据
$kline1 = $klines[$count - 3];
$kline2 = $klines[$count - 2];
$kline3 = $klines[$count - 1];
//获取最后三根K线的颜色和形态
$color1 = get_color($kline1);
$color2 = get_color($kline2);
$color3 = get_color($kline3);
$shape2 = get_shape($kline2);
//判断是否是早晨之星
if ($color1 == GREEN && $color2 == BLACK && $color3 == RED &&
$shape2 == DOJI &&
$kline3["close"] >
$kline1["open"]) {
//计算早晨之星的斜率和连续性
//早晨之星的斜率等于第三根K线的斜率减去第一根K线的斜率
//早晨之星的连续性等于反转形态之前的绿色K线的数量
$slope = get_slope($kline3) - get_slope($kline1);
$continuity = get_continuity($klines);
//根据斜率和连续性判断早晨之星的等级
//等级分为A、B、C三档,A最高,C最低
if ($slope > 2 && $continuity > 3) {
return array(MORNING_STAR, "A"); //返回早晨之星和A等级
} elseif ($slope > 1 && $continuity > 2) {
return array(MORNING_STAR, "B"); //返回早晨之星和B等级
} else {
return array(MORNING_STAR, "C"); //返回早晨之星和C等级
}
}
//判断是否是黄昏之星
if ($color1 == RED && $color2 == BLACK && $color3 == GREEN &&
$shape2 == DOJI &&
$kline3["close"] <
$kline1["open"]) {
//计算黄昏之星的斜率和连续性
//黄昏之星的斜率等于第一根K线的斜率减去第三根K线的斜率
//黄昏之星的连续性等于反转形态之前的红色K线的数量
$slope = get_slope($kline1) - get_slope($kline3);
$continuity = get_continuity($klines);
//根据斜率和连续性判断黄昏之星的等级
//等级分为A、B、C三档,A最高,C最低
if ($slope > 2 && $continuity > 3) {
return array(EVENING_STAR, "A"); //返回黄昏之星和A等级
} elseif ($slope > 1 && $continuity > 2) {
return array(EVENING_STAR, "B"); //返回黄昏之星和B等级
} else {
return array(EVENING_STAR, "C"); //返回黄昏之星和C等级
}
}
}
//如果都不是以上的形态,返回-1和空字符串
return array(-1, "");
}
//测试数据
$klines = array(
array(
"open" => 10.00, //开盘价
"close" => 10.01, //收盘价
"high" => 10.05, //最高价
"low" => 9.95 //最低价
),
array(
"open" => 10.02,
"close" => 9.98,
"high" => 10.03,
"low" => 9.90
),
array(
"open" => 9.97,
"close" => 10.06,
"high" => 10.10,
"low" => 9.96
),
//...更多的K线数据
);
//对最后一组K线进行判断和输出
list($pattern, $level) = get_pattern_and_level($klines);
switch ($pattern) {
case MORNING_STAR:
echo "这是一个早晨之星的形态,等级为{$level}。";
break;
case EVENING_STAR:
echo "这是一个黄昏之星的形态,等级为{$level}。";
break;
default:
echo "这不是一个特殊的形态。";
break;
}
?>
|
评分
-
查看全部评分
|