南客 2005-5-29 20:10
如何使买入信号、卖出信号一一对应
在设计公式时,我们经常遇到这样的问题,如何使买卖信号一一对应?
比如下面的代码:
input:n(26,5,300),p(2,0.1,10);
close;
mid : ma(close,n);
upper: mid + p*std(close,n);
lower: mid - p*std(close,n);
tjb:=cross(close,lower);
tjs:=cross(upper,close);
drawicon(tjb,close,4);
drawicon(tjs,close,5);
图示如下,可以看出,买入信号连续发出多次后,才出现卖出信号,卖出信号连续发出多次后,才发出买入信号。
南客 2005-5-29 20:11
如何过滤连续的买入、卖出信号,使买入后只要没有发出卖出信号,就不再发出买入信号;同样,卖出后只要没有出现买入信号,就不再发出卖出信号。即买入、卖出信号一一对应。
容易想到的是使用过滤函数filter(),但这个函数是难以实现的,因为未来有多少个连续的买入(或卖出)信号是未知的。
另一种方法是,从前一次卖出(或买入)信号开始累加买入(或卖出)信号,如果累加次数等于1,则发出真正的买入(或卖出)信号。
但这里还有一个问题,如果首次信号是卖出信号的话,也应该过滤,因为没有买入哪来卖出?应让首次信号是买入信号才合理。方法是,在第1根K线的位置,虚拟一个卖出信号。
以下是实现上述想法的常规函数代码:
input:n(26,5,300),p(2,0.1,10);
close;
mid : ma(close,n);
upper: mid + p*std(close,n);
lower: mid - p*std(close,n);
//以下为常规函数处理代码//
tjb:=cross(close,lower);//初始买入信号,可换成其它任意买入条件
tjs:=cross(upper,close);//初始卖出信号,可换成其它任意卖出条件
{以下代码,使买、卖信号一一对应}
tsb:=barssince(tjb);
tss:=barssince(tjs);
if tjs[datacount]<tjb[datacount] then begin
a:=setlbound(tjs,1);
tjs:=tjs or barpos=1;
end;
tjbuy:=count(tjb,barslast(tjs))=1 and tjb; //买入信号
tjsell:=count(tjs,barslast(tjb))=1 and tjs; //卖出信号
drawicon(tjbuy,low,4);
drawicon(tjsell,high,5);
图示如下:
南客 2005-5-29 20:14
从上图可以看出,原来连续出现的买入、卖出信号,都消失了。达到了我们预定的目的。
大家有兴趣的话,可以试试以下问题
1、如果使用飞狐内置循环语句,如何实现以上代码?
2、如果要求,允许连续出现2次买入信号或卖出信号,代码应该怎么编?
cwy 2005-5-29 22:36
你好,南客朋友,常常得到你的指教,谢谢你,祝你均安。
循环语句的使用还不是很熟练,想一想再做。
昨天在创幻有过类似的题目,如下也可解决
[code]
input:n(26,5,300),p(2,0.1,10);
close;
mid:ma(close,n);
upper:mid + p*std(close,n);
lower:mid - p*std(close,n);
tjb:=cross(close,lower);
tjs:=cross(upper,close);
tsb:=barslast(tjb);
tss:=barslast(tjs);
tj1:=tjb and count(tjb,tss+1)<2;
tj2:=tjs and count(tjs,tsb+1)<2;
drawicon(tj1,close,4);
drawicon(tj2,close,5);
[/code]
允许连续出现2次买入信号或卖出信号
[code]
input:n(26,5,300),p(2,0.1,10);
close;
mid:ma(close,n);
upper:mid + p*std(close,n);
lower:mid - p*std(close,n);
tjb:=cross(close,lower);
tjs:=cross(upper,close);
tsb:=barslast(tjb);
tss:=barslast(tjs);
tj1:=tjb and count(tjb,tss+1)<3;
tj2:=tjs and count(tjs,tsb+1)<3;
drawicon(tj1,close,4);
drawicon(tj2,close,5);
[/code]
[color=Teal][align=right] 本贴由 cwy 于 2005-5-29 22:45 最后编辑 [/align][/color]
南客 2005-5-30 00:16
代码很好呀:)
不过K线早期的信号要适当处理,否则会丢失一些早期的信号。
lhl311 2005-5-30 06:59
谢谢老师!
天高任鸟飞 2005-5-30 08:44
谢谢老师! 送上几分,表表心意。
股市骑兵00 2005-5-30 13:36
南客老师的思路挺巧妙的! :clap:
我又学到东西了!谢谢!
股市骑兵00 2005-5-30 13:38
用循环我试着答一下。
[code]
input:n(26,5,300),p(2,0.1,10),s(1,1,5);//S为允许连续出现信号调节参数!
close;
mid := ma(close,n);
upper: mid + p*std(close,n);
lower: mid - p*std(close,n);
//以下为常规函数处理代码//
tjb:=cross(close,lower);//初始买入信号,可换成其它任意买入条件
tjs:=cross(upper,close);//初始卖出信号,可换成其它任意卖出条件
///////////////////////////////////////////////////////////
m:=0*c;w:=0*c;mm:=0*c;
for i=LBOUND(upper) to datacount do begin
mm[i]:=mm[i-1]+tjb[i];
m[i]:=m[i-1]+tjb[i];
w[i]:=w[i-1]+tjs[i];
if tjs[i] then m[i]:=0;
if tjb[i] then w[i]:=0;
if m[i]<=s and tjb[i] then z[i]:=1;
if w[i]<=s and tjs[i] and mm[i]>0 then t[i]:=1;//首次要发卖出信号去掉and mm[i]>0
end;
drawicon(z,low,4);
drawicon(t,high,5);
[/code]
股市骑兵00 2005-5-30 13:53
稍微改下思路试试。
[code]
///////////////////////////////////////////////////////////
m:=0*c;w:=0*c;mm:=0*c;
for i=LBOUND(upper) to datacount do begin
mm[i]:=mm[i-1]+tjb[i];
m[i]:=m[i-1]+tjb[i];
w[i]:=w[i-1]+tjs[i];
if w[i]>w[i-1] then m[i]:=0;
if m[i]>m[i-1] or mm[i]=0 then w[i]:=0;
if m[i]-w[i]>s then m[i]:=m[i-1];
if w[i]-m[i]>s then w[i]:=w[i-1];
end;
drawicon(m>ref(m,1),low,4);
drawicon(w>ref(w,1),high,5);
[/code]
戏如人生 2005-5-30 13:59
谢谢老师!
今天 2005-5-30 15:46
对不起,刚刚发现问题。如果将买入、卖出条件改为以下方式,就无法实现信号的对应了。请问老师在买入条件仍然保持“C>MID”,而不是“CROSS(C,MID)”的情况下如何实现?
MID:MA(C,30);
tjb:=C>MID AND L>MID;//初始买入信号,可换成其它任意买入条件
U1:=L<REF(L,BARSLAST(CROSS(TJB,0.5)));
U2:=L<MID;
tjs:=U1 OR U2;//初始卖出信号,可换成其它任意卖出条件
{以下代码,使买、卖信号一一对应}
tsb:=barssince(tjb);
tss:=barssince(tjs);
if tjs[datacount]<tjb[datacount] then begin
a:=setlbound(tjs,1);
tjs:=tjs or barpos=1;
end;
tjbuy:=count(tjb,barslast(tjs))=1 and tjb; //买入信号
tjsell:=count(tjs,barslast(tjb))=1 and tjs; //卖出信号
drawicon(tjbuy,low,4);
drawicon(tjsell,high,5);
[color=Teal][align=right] 本贴由 今天 于 2005-5-30 16:10 最后编辑 [/align][/color]
股市骑兵00 2005-5-30 16:41
[quote]Originally posted by [i]今天[/i] at 2005-5-30 03:46 PM:
对不起,刚刚发现问题。如果将买入、卖出条件改为以下方式,就无法实现信号的对应了。请问老师在买入条件仍然保持“C>MID”,而不是“CROSS(C,MID)”的情况下如何实现?
MID:MA(C,30);
tjb:=C>MID AN ... [/quote]
你的买卖条件不对呀!
tjs//初始卖出信号
tjb//初始买入信号
2个条件自相矛盾了,同时买卖信号都会发的,那你听买的呢,还是卖的呢?:D
你硬要这个条件,下面的你参考。
[code]
MID:=MA(C,30);
tjb:=C>MID AND L>MID;
U1:=L<REF(L,BARSLAST(CROSS(TJB,0.5)));
U2:=L<MID;
tjs:=U1 OR U2;//初始卖出信号,可换成其它任意卖出条件
tjb:=tjb and not(tjs);//初始买入信号,可换成其它任意买入条件
{以下代码,使买、卖信号一一对应}
tsb:=barssince(tjb);
tss:=barssince(tjs);
if tjs[datacount]<tjb[datacount] then begin
a:=setlbound(tjs,1);
tjs:=tjs or barpos=1;
end;
tjbuy:=count(tjb,barslast(tjs))=1 and tjb; //买入信号
tjsell:=count(tjs,barslast(tjb))=1 and tjs; //卖出信号
drawicon(tjbuy,low,4);
drawicon(tjsell,high,5);
[/code]
今天 2005-5-30 16:45
老师,我也发现了,后来改成“C>MID AND L>MID”也是不行的。
今天 2005-5-30 16:49
厉害!厉害!您这次贴的就是我想表达的意思。谢谢老师!:clap::cool::D
[color=Teal][align=right] 本贴由 今天 于 2005-5-30 16:50 最后编辑 [/align][/color]
今天 2005-5-30 17:57
不好意思,我比较麻烦:)这次将骑兵老师最后贴出的公式中的“U2”又改了一下:
U2:=C>REF(C,BARSLAST(CROSS(TJB,0.5)));
请教怎样才能在“tjsell”条件成立后,当“C>MID AND L>MID”条件满足时即可产生新的“tjbuy”信号?谢谢!
[color=Teal][align=right] 本贴由 今天 于 2005-5-30 20:35 最后编辑 [/align][/color]
股市骑兵00 2005-5-30 21:29
你的买卖条件本身有重叠的问题。肯定有信号损失的,如果以买入信号为基准。
损失卖出信号改为如下表达。
MID:=MA(C,30);
tjb:=C>MID AND L>MID;//初始买入信号,可换成其它任意买入条件
U1:=L<REF(L,BARSLAST(CROSS(TJB,0.5)));
//U2:=L<MID;
U2:=C>REF(C,BARSLAST(CROSS(TJB,0.5)));
tjs:=(U1 OR U2) and not(tjb);//初始卖出信号,可换成其它任意卖出条件
cwy 2005-5-30 22:08
这是我在今天上班时思索一天的作业,请老师阅批。
这个作业不能说是真正的用循环语句来实现,对常规函数使用的考虑还是较多,如处理第一个卖出信号,实际上我不是做出来而是试出来的,我对循环语句的使用还是属于知其所以而不知其所以然,对循环语句的学习虽然艰难,但还是有信心,积少成多,终有收获。
看了骑兵朋友的代码,感想颇多,骑兵朋友对飞狐内置循环语句的使用,真是灵活,精练,是我学习的好朋友。
[code]
input:n(26,5,300),p(2,0.1,10);
close;
mid:ma(close,n);
upper:mid + p*std(close,n);
lower:mid - p*std(close,n);
//以下为常规函数处理代码//
tjb:=cross(c,lower);//初始买入信号,可换成其它任意买入条件
tjs:=cross(upper,c);//初始卖出信号,可换成其它任意卖出条件
tss1:=BARSSINCE(tjb);//第一个卖出信号
///////////////////////////////////////////////////////
fb:=0*c;
fs:=0*c;
for i =n to datacount do begin
fb[i]:=fb[i-1]+tjb[i];
fs[i]:=fs[i-1]+tjs[i];
if tjs[i] then fb[i]:=0;
if tjb[i] then fs[i]:=0;
if fb[i]=1 and tjb[i] then fb1[i]:=1;
if fs[i]=1 and tjs[i] then fs1[i]:=1;
end;
drawicon(fb1 ,l,4);
drawicon(fs1 and tss1>2 ,h,5);
[/code]
[color=Teal][align=right] 本贴由 cwy 于 2005-5-30 22:39 最后编辑 [/align][/color]
天高任鸟飞 2005-6-1 20:21
学习,感谢楼上的朋友,我看一次顶一次。:clap::clap::cool:
寻钱 2005-9-6 09:42
我还看不懂,还是学习
bockju 2005-9-8 01:04
用循环语句好
all88 2005-9-11 21:50
谢谢老师!
jngy 2005-9-14 10:19
我遇到这样的问题,图示如下:
卖出信号连续发出多次后,才发出买入信号。
我就想要过滤掉前面的卖出信号取最后一个卖出信号,和取第一个买入信号过滤掉后面的买入信号。
也就是说当单一一个卖出信号,就取这个卖出信号,若有N个卖出信号就取最后一个卖出信号。买入信号都是取第一个。
如何才能使买卖信号一一对应?
先谢谢了!
股市骑兵00 2005-9-14 20:48
[quote]Originally posted by [i]jngy[/i] at 2005-9-14 10:19:
我遇到这样的问题,图示如下:
卖出信号连续发出多次后,才发出买入信号。
我就想要过滤掉前面的卖出信号取最后一个卖出信号,和取第一个买入信号过滤掉后面的买入信号。
也就是说当单一一个卖出信号,就取这个 ... [/quote]
你好,短消息收到了。
按你上面的思路,我判断是未来数据,是没有任何意义!
jngy 2005-9-15 04:54
[quote]Originally posted by [i]股市骑兵00[/i] at 2005-9-14 08:48 PM:
按你上面的思路,我判断是未来数据,是没有任何意义! [/quote]
是的,是未来数据。
能写吗?
谢谢!
hps28 2005-9-15 05:17
谢谢老师!
股神大哥 2005-9-15 06:46
好贴,谢谢各位老师
章郎 2005-9-23 22:05
还是学习,谢谢各位老师!
muxiaojun 2005-9-24 00:08
谢谢,每天都有新收获
hps28 2005-10-6 17:10
谢谢,每天都有新收获
投资快乐 2005-10-18 07:28
谢谢老师!
投资快乐 2005-10-18 07:59
谢谢老师!
wangez 2005-10-22 20:03
谢谢老师!
rka 2005-10-23 22:21
谢谢老师!
杨柳岸 2005-10-26 22:13
谢谢老师!
joneslee 2005-10-27 18:49
顶帖是美德
qwe_rty_uio 2005-11-6 11:03
看贴是学习,回贴是礼貌
zhaozhongming 2005-11-7 17:50
受益菲浅,经常到这里来学习学习。
gzh 2005-11-17 23:20
我又学到东西了!谢谢!
wsmrzw 2005-12-18 20:32
财智论坛
6406753 2006-2-13 20:36
000000000
小资方舟 2006-2-22 09:57
请教:
如何编写三条均线越来越靠近和三条均线缠绕在一起的公式呢?谢谢!!!
多空趋势 2006-3-10 22:44
我又学到东西了!谢谢!