查看完整版本: 如何使买入信号、卖出信号一一对应

南客 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]

你好,短消息收到了。
按你上面的思路,我判断是未来数据,是没有任何意义!

大猫 2005-9-14 21:41

大师呵1!

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

谢谢,每天都有新收获

shuy 2005-10-17 21:53

谢谢

投资快乐 2005-10-18 07:28

谢谢老师!

投资快乐 2005-10-18 07:59

谢谢老师!

犇犇 2005-10-19 20:09

学习来了

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

我又学到东西了!谢谢!

扑天雕 2005-11-18 23:20

ddd

wsmrzw 2005-12-18 20:32

财智论坛

6406753 2006-2-13 20:36

000000000

小资方舟 2006-2-22 09:57

请教:

如何编写三条均线越来越靠近和三条均线缠绕在一起的公式呢?谢谢!!!

多空趋势 2006-3-10 22:44

我又学到东西了!谢谢!

追风逐月 2006-3-11 01:39

谢谢!
页: [1] 2
查看完整版本: 如何使买入信号、卖出信号一一对应