哪位大佬帮忙改写成TB格式的。感谢感谢,一共有2个这样的
2023-10-23 19:38
import numpy as np
def average_curvature(curve, length):
\"\"\"
计算给定曲线的平均曲率
参数:
curve: 一个包含x和y坐标的列表或numpy数组,表示曲线上的点
length: 曲线的长度
返回:
平均曲率
\"\"\"
# 将曲线分成多个小段,并计算每一段的曲率半径
num_segments = 100
segment_length = length / num_segments
curvature_list = []
for i in range(num_segments):
start_point = curve[i]
end_point = curve[i+1]
mid_point = (start_point + end_point) / 2
dx = end_point[0] - start_point[0]
dy = end_point[1] - start_point[1]
曲率半径 = (dx**2 + dy**2)**1.5 / np.abs(dx*dy)
curvature_list.append(曲率半径)
# 计算平均曲率
average_curvature = sum(curvature_list) / len(curvature_list)
return average_curvature
改成TB用户函数,非公式,按上面Python代码转换,供参考
Params
//此处添加参数
Series<Numeric> curve;//价格序列变量
Integer length;//计算曲率的长度
Vars
//此处添加变量
Array<Numeric> curvature_list;
Numeric start_point;
Numeric end_point;
Numeric dx;
Numeric dy;
Numeric radius;
Numeric average_curvature;
Begin
//此处添加代码正文
Integer i;
For i = 0 to length -1
{
start_point = curve[i];
end_point = curve[i+1];
dx = end_point - start_point;
dy = 1;
radius = (dx^2 + dy^2)^1.5 / Abs(dx*dy);
curvature_list[GetArraySize(curvature_list)] = radius;
}
//计算平均曲率
average_curvature = SummationArray(curvature_list)/GetArraySize(curvature_list);
Return average_curvature;
End
老师辛苦了。非常感觉你的帮助
另外一个也能请您出手看看吗:我准备用这两个函数来算一条曲线是不是滑溜。穷举出一个阀值后,做流畅的行情。
import numpy as np
def flexure(curve):
\"\"\"
计算给定曲线的折数
参数:
curve: 一个包含x和y坐标的列表或numpy数组,表示曲线上的点
返回:
折数
\"\"\"
# 初始化折数为0
flexure_count = 0
# 遍历曲线上的每一段,计算折数
for i in range(len(curve)-1):
start_point = curve[i]
end_point = curve[i+1]
dx = end_point[0] - start_point[0]
dy = end_point[1] - start_point[1]
if np.abs(dx) < 1e-6 or np.abs(dy) < 1e-6:
continue
if dx * dy > 0:
flexure_count += 0.5
else:
flexure_count += 1
return flexure_count
仅供参考:
Params
//此处添加参数
Series<Numeric> curve;//价格均线
Vars
//此处添加变量
Numeric flexure_count;
Numeric start_point;
Numeric end_point;
Numeric dx;
Numeric dy;
Integer i;
Begin
//此处添加代码正文
flexure_count = 0;
for i = 0 to CurrentBar
{
start_point = curve[i];
end_point = curve[i+1];
dx = end_point - start_point;
dy = 1;
if(Abs(dx)<0.000001 or Abs(dy)<0.000001){
Continue;
}
if(dx*dy>0){
flexure_count = flexure_count + 0.5;
}Else{
flexure_count = flexure_count + 1;
}
}
return flexure_count;
End
老师辛苦了。感谢大师