开启辅助访问 切换到宽版

精易论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

用微信号发送消息登录论坛

新人指南 邀请好友注册 - 我关注人的新帖 教你赚取精币 - 每日签到


求职/招聘- 论坛接单- 开发者大厅

论坛版规 总版规 - 建议/投诉 - 应聘版主 - 精华帖总集 积分说明 - 禁言标准 - 有奖举报

查看: 342|回复: 9
收起左侧

[易语言纯源码] K线形态判断:锤子形/倒锤子形/十字形【php&易代码】

[复制链接]
结帖率:60% (3/5)
发表于 昨天 17:07 | 显示全部楼层 |阅读模式   广东省广州市
分享源码
界面截图: -
是否带模块: -
备注说明: -
本帖最后由 易造轮 于 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形_普通形 )  ' 一根普通的K线
' // 实体大小占比解释:仅参考
' 实体大小占总长度的0%~3%,表示实体非常小,基本是一根十字星,说明市场的力量平衡,有可能发生反转。
' 实体大小占总长度的3%~6%,表示实体较小,可能是一根锤子线或倒锤子线,说明市场出现了一方力量,也有可能发生反转。
' 实体大小占总长度的6%~20%,表示实体一般,说明市场有一定的趋势方向,但不是很强烈。
' 实体大小占总长度的20%~50%,表示实体较大,说明市场有明显的趋势方向,上涨或下跌的动力较强。
' 实体大小占总长度的50%以上,表示实体非常大,说明市场有强烈的趋势方向,上涨或下跌的动力非常强。



还有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;
}
?>

评分

参与人数 1好评 +1 精币 +5 收起 理由
笨来无一悟 + 1 + 5 打到狗庄 还我钱财

查看全部评分


结帖率:98% (107/109)

签到天数: 20 天

发表于 8 分钟前 | 显示全部楼层   山东省青岛市
全都是大佬~
回复 支持 反对

使用道具 举报

结帖率:96% (51/53)

签到天数: 23 天

发表于 13 分钟前 | 显示全部楼层   山东省青岛市
下个学习一下
回复 支持 反对

使用道具 举报

签到天数: 26 天

发表于 4 小时前 | 显示全部楼层   山东省青岛市
哈,这代码有点专业啊。不过说到K线形态,倒锤子形可是反转信号呢,楼主分享得很详细啦。
回复 支持 反对

使用道具 举报

结帖率:0% (0/1)

签到天数: 26 天

发表于 5 小时前 | 显示全部楼层   江西省上饶市
有点厉害啊。
回复 支持 反对

使用道具 举报

结帖率:90% (27/30)

签到天数: 9 天

发表于 昨天 20:21 | 显示全部楼层   辽宁省鞍山市
浪级的 能做一个吗
回复 支持 反对

使用道具 举报

签到天数: 10 天

发表于 昨天 20:18 | 显示全部楼层   江苏省连云港市
感谢分享
回复 支持 反对

使用道具 举报

结帖率:100% (3/3)

签到天数: 24 天

发表于 昨天 17:33 | 显示全部楼层   贵州省毕节市
我来就是杀庄的 让我收米 是你唯一的选择
回复 支持 反对

使用道具 举报

结帖率:0% (0/1)

签到天数: 26 天

发表于 昨天 17:25 | 显示全部楼层   江西省上饶市
好东东啊,支持。
回复 支持 反对

使用道具 举报

结帖率:88% (7/8)

签到天数: 14 天

发表于 昨天 17:20 | 显示全部楼层   黑龙江省大庆市
支持开源~!感谢分享
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则 致发广告者

发布主题 收藏帖子 返回列表

sitemap| 易语言源码| 易语言教程| 易语言论坛| 易语言模块| 手机版| 广告投放| 精易论坛
拒绝任何人以任何形式在本论坛发表与中华人民共和国法律相抵触的言论,本站内容均为会员发表,并不代表精易立场!
论坛帖子内容仅用于技术交流学习和研究的目的,严禁用于非法目的,否则造成一切后果自负!如帖子内容侵害到你的权益,请联系我们!
防范网络诈骗,远离网络犯罪 违法和不良信息举报电话0663-3422125,QQ: 793400750,邮箱:wp@125.la
网站简介:精易论坛成立于2009年,是一个程序设计学习交流技术论坛,隶属于揭阳市揭东区精易科技有限公司所有。
Powered by Discuz! X3.4 揭阳市揭东区精易科技有限公司 ( 粤ICP备12094385号-1) 粤公网安备 44522102000125 增值电信业务经营许可证 粤B2-20192173

快速回复 返回顶部 返回列表