请老师帮忙把文华跨周期引用模型改为TB公式 [开拓者 TB]
- 咨询内容:
nopain老师,我之前一直使用文华的年费服务,考虑到TB在历史回测方面的优势,决定转向TB。我想把文华的跨周期引用模型转换成TB模型(1分钟周期K线图中引用30分钟周期的DMI指标),但由于刚刚学习TB语言,对TB不了解,请老师帮忙修改,谢谢。
1、文华模型
(1)引用模型
TR:=SUM(MAX(MAX(HIGH-LOW,ABS(HIGH-REF(CLOSE,1))),ABS(LOW-REF(CLOSE,1))),14);
HD:=HIGH-REF(HIGH,1);
LD:=REF(LOW,1)-LOW;
DMP:=SUM(IFELSE(HD>0&&HD>LD,HD,0),14);
DMM:=SUM(IFELSE(LD>0&&LD>HD,LD,0),14);
PDI1:=DMP*100/TR;
MDI1:=DMM*100/TR;
ADX1:=MA(ABS(MDI1-PDI1)/(MDI1+PDI1)*100,6);
(2)主模型
#IMPORT[,MIN30,MYDHL33] AS VAR
PDI:=VAR.PDI1;
MDI:=VAR.MDI1;
ADX:=VAR.ADX1;
ADX>25&&ADX>REF(ADX,1)&&NOT(R3)&&DI>MDI&&DI>REF(PDI,1)&&MDI<REF(MDI,1),BK;//CCI上穿100,做多
.....
AUTOFILTER;
2、通过学习TB帖子,
http://bbs.tb18.net/forum.php?mo ... ge%3D1&tid=1996,
我编写了一个TB函数和一个TB公式,具体如下:
(1)TransMinsDatab 函数
//------------------------------------------------------------------------
// 简称: TransMinsDatab
// 名称: TransMinsDatab
// 类别: 用户函数
// 类型: 用户函数
// 输出: 数值型
//------------------------------------------------------------------------
Params
NumericSeries Price(1);
Numeric nMinSet(5);
Numeric MinsAgo(2);
Vars
NumericSeries barCnt;
NumericSeries MinData;
Numeric i;
Numeric j;
Numeric nIndex(0);
Begin
If(IntPart(Minute%nMinSet)==0)
{
barCnt = 1;
}Else
{
barCnt = barCnt[1] + 1;
}
MinData = Price;
If(MinsAgo == 0)
{
return MinData;
}Else
{
For i = 1 To MinsAgo
{
If( i == 1)
{
j = 0;
}Else
{
j = j + BarCnt[j];
}
If (j > CurrentBar ) Return InvalidNumeric;
nIndex = nIndex + BarCnt[j];
}
Return MinData[nIndex];
}
End
(2)根据文华代码直接编译过来的TB公式(名称为ADX66)
//------------------------------------------------------------------------
// 简称: ADX66
// 名称: ADX66
// 类别: 公式应用
// 类型: 用户应用
//------------------------------------------------------------------------
Params
Numeric Length(14);
Numeric ADXLength(6);
Numeric Lots(1);
Vars
Numeric MyOpen;
NumericSeries MyHigh;
NumericSeries MyLow;
NumericSeries MyClose;
Numeric MyOpen1;
NumericSeries MyHigh1;
NumericSeries MyLow1;
NumericSeries MyClose1;
Numeric TR;
Numeric HD;
Numeric LD;
Numeric DMP;
Numeric DMM;
NumericSeries PDI;
NumericSeries MDI;
Numeric i;
NumericSeries CY;
Numeric Value1;
Numeric SumValue(0);
NumericSeries ADX;
Begin
MyOpen1=DataConvert(Open,"min",30,"Open");
MyHigh1=DataConvert(High,"min",30,"High");
MyLow1=DataConvert(Low,"min",30,"Low");
MyClose1=DataConvert(Close,"min",30,"Close");
//ADX
TR=Summation(MAX(MAX((MyHigh1-MyLow1),ABS(MyHigh1-MyClose1[1])),ABS(MyLow1-MyClose1[1])),Length);
HD=MyHigh1-MyHigh1[1];
LD=MyLow1[1]-MyLow1;
DMP=Summation(IIF(HD>0&&HD>LD,HD,0),Length);
DMM=Summation(IIF(LD>0&&LD>HD,LD,0),Length);
PDI=DMP*100/TR;
MDI=DMM*100/TR;
CY=(ABS(MDI-PDI)/(MDI+PDI))*100;
For i=ADXLength-1 DownTo 0
{
Value1=TransMinsDatab(CY,30,i);
SumValue=SumValue+Value1;
}
ADX=SumValue/ADXLength;
PlotNumeric("DI",PDI);
PlotNumeric("MDI",MDI);
PlotNumeric("ADX",ADX);
If(ADX>25&&ADX>ADX[1]&&PDI>MDI&&PDI>PDI[1]&&MDI<MDI[1])
{
Buy(Lots,OPEN);
}
End
在超级图标插入ADX公式,好多地方显示ADX=-1.#J,无法显示正常的ADX值;PDI和MDI也显示异常(显示为零)。
请TB老师帮忙修改,谢谢。其中,值得注意是 ADX、PDI和MDI需要定义成有序列的回溯参数,才能用于回溯。
此外,我也注意到TB论坛里有关于DMI的参考模型
http://bbs.tb18.net/forum.php?mo ... 7&highlight=DMI ,
由于DirMovement函数的设置返回值为布尔型,我不知道怎么用于跨周期引用的公式。如果老师无法修改我直接从文华编译的TB公式,那就请帮忙以TB帖子的DMI参考模型为基础,直接改为我想要的跨周期引用公式。再次表示感谢。 - TB技术人员:
不好意思,刚才文华模型中主模型中“ADX>25&&ADX>REF(ADX,1)&&NOT(R3)&& PDI>MDI&& PDI>REF(PDI,1)&& MDI<REF(MDI,1)BK;//CCI上穿100,做多” 在网页中显示有问题。
- TB客服:
不好意思,刚才文华模型中主模型中“ADX>25&&ADX>REF(ADX,1)&&NOT(R3)&& PDI>MDI&& PDI>REF(PDI,1)&& MDI<REF(MDI,1),BK;” 在网页中显示有问题,
应该为“ADX>25&&ADX>REF(ADX,1)&&NOT(R3)&& PDI>MDI&& PDI>REF(PDI,1)&& MDI<REF(MDI,1),BK;”。同时,ADX66公式中的”PlotNumeric("PDI",PDI);“在网页中显示出问题,应该为”PlotNumeric("PDI",PDI);“。 - 网友回复:
顶起,请TB老师帮忙解答,谢谢!
- 网友回复:
再次请TB老师抽空指导修改,非常感谢。
有思路,想编写各种指标公式,程序化交易模型,选股公式,预警公式的朋友
可联系技术人员 QQ: 1145508240 进行 有偿 编写!(不贵!点击查看价格!)
相关文章
-
没有相关内容