标题:有对股票指标的编程感兴趣的吗?大家探讨下
只看楼主
reedwu
Rank: 1
等 级:新手上路
威 望:1
帖 子:113
专家分:5
注 册:2006-9-23
得分:0 
我打算先编程5个指标做测试,优化后根据他们出的买卖信号操作,每出1个进出20%,呵呵,把资金管理的部分都省了
2012-03-20 11:40
sdta
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:江苏省连云港市
等 级:版主
威 望:323
帖 子:9621
专家分:26174
注 册:2012-2-5
得分:0 
回复 100楼 reedwu
SELECT SUM(profit) FROM kddk WHERE shy>=2009  INTO ARRAY xx
?nday1,nm1,nn1,xx &&可以不要

把前面的三个FOR ENDFOR,放在这行后面
对应的指标也要改。如NDAY要改为NDAY1,
如果不要LSB.DBF,中间对应的指标可以不改,但最上面的NDAY1等要改为NDAY
如果想看中间结果,可以在适当的位置加BROWSE

[ 本帖最后由 sdta 于 2012-3-20 11:49 编辑 ]

坚守VFP最后的阵地
2012-03-20 11:41
reedwu
Rank: 1
等 级:新手上路
威 望:1
帖 子:113
专家分:5
注 册:2006-9-23
得分:0 
回复 102楼 sdta
还是不执行蓝色部分的程序,我看到kd,dk,kddk都是空的,
我觉得先建立lsb表,
CREATE TABLE  LSB (XH N(3),NDAY N(2),NM N(2),NN N(2))
 FOR NDAY1=9 TO 20
     FOR NM1=3 TO 5
         FOR NN1=3 TO 5
     INSERT INTO LSB VALUES(RECNO(),NDAY1,NM1,NN1)
      ENDFOR
ENDFOR
ENDFOR     

在这中间应该加入语句,如下面的程序中nday,nm,nn应该取lsb表里的值,执行到lsb表尾
FOR I=1 TO RECCOUNT()-(nday-1)
SELECT MAX(SHHIGH),MIN(SHLOW) FROM 1A0001 WHERE BETWEEN(RECNO(),I,I+(nday-1)) INTO ARRAY AA
SELECT A
REPLACE K WITH AA(1,2),D WITH AA(1,1),TRIX WITH (ABS(shclose-k)/ABS(d-k))*100,TRMA WITH (TRIX+(nm-1)*G)/nm,TRMD WITH (TRMA+(nn-1)*H)/nn FOR RECNO()=I+(nday-1)
GO I+(nday-1)
G=TRMA
H=TRMD
ENDFOR


[ 本帖最后由 reedwu 于 2012-3-20 12:48 编辑 ]
2012-03-20 12:34
sdta
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:江苏省连云港市
等 级:版主
威 望:323
帖 子:9621
专家分:26174
注 册:2012-2-5
得分:0 
CLOSE TABLES &&该行封了
LSB被关闭了

坚守VFP最后的阵地
2012-03-20 12:44
reedwu
Rank: 1
等 级:新手上路
威 望:1
帖 子:113
专家分:5
注 册:2006-9-23
得分:0 
回复 104楼 sdta
CLOSE TABLES
IF FILE('lsb.dbf')
DELETE FILE lsb.dbf
ENDIF

CREATE TABLE  LSB (XH N(3),NDAY0 N(2),NM0 N(2),NN0 N(2),xx0 n(15,4))
 FOR NDAY1=9 TO 10
     FOR NM1=3 TO 4
         FOR NN1=3 TO 4
         INSERT INTO LSB VALUES(RECNO(),NDAY1,NM1,NN1,0)
    ENDFOR
ENDFOR
ENDFOR
CLOSE TABLES &&以上建立lsb表,将要取值的变量列表

USE lsb.dbf
nx=1
GO nx
 DO WHILE !EOF()
 nday=nday0
 nm=nm0
 nn=nn0  &&分别从lsb表中将nday,nm,nn的值取过来


&&nday=18   &&修改天数
&&nm=5  &&修改k参数
&&nn=4  &&修改d参数,以下程序不变,直到skip

USE 1a0001.DBF ALIAS A

BLANK ALL FIELDS K,D,TRIX,TRMA,trmd
G=100
H=100

FOR I=1 TO RECCOUNT()-(nday-1)
SELECT MAX(SHHIGH),MIN(SHLOW) FROM 1A0001 WHERE BETWEEN(RECNO(),I,I+(nday-1)) INTO ARRAY AA
SELECT A
REPLACE K WITH AA(1,2),D WITH AA(1,1),TRIX WITH (ABS(shclose-k)/ABS(d-k))*100,TRMA WITH (TRIX+(nm-1)*G)/nm,TRMD WITH (TRMA+(nn-1)*H)/nn FOR RECNO()=I+(nday-1)
GO I+(nday-1)
G=TRMA
H=TRMD
ENDFOR
&&Close all
*----KD表
SELECT *,CAST("" AS Numeric(4)) AS TRME FROM 1A0001 WHERE trma>trmd INTO TABLE KD
B=SHNO
SCAN FOR RECNO()>1 AND !EOF()
A=SHNO
REPLACE TRME WITH A-B
B=SHNO
ENDSCAN
DELETE FOR TRME=1
PACK

*----DK表
SELECT *,CAST("" AS Numeric(4)) AS TRME FROM 1A0001 WHERE trma<trmd INTO TABLE DK
B=SHNO
SCAN FOR RECNO()>1 AND !EOF()
A=SHNO
REPLACE TRME WITH A-B
B=SHNO
ENDSCAN
DELETE FOR TRME=1
PACK
&&Close all
SELECT shno,shtime,shy,shm,shhigh,shlow,shclose,trma,trmd,CAST("" AS Numeric(4)) AS TRMEKD,CAST("" AS Numeric(4)) AS TRMEDK, CAST("" AS Numeric(15,4)) AS profit FROM 1A0001 WHERE shy>=2009 INTO TABLE KDDK
UPDATE KDDK SET TRMEKD=KD.TRME FROM KD WHERE KDDK.SHNO==KD.SHNO
UPDATE KDDK SET TRMEDK=DK.TRME FROM DK WHERE KDDK.SHNO==DK.SHNO
DELETE FOR (TRMEKD=0 AND TRMEDK=0) &&可以留着,这样数据都全
PACK
&&close all
USE kddk.dbf
GO TOP
b=shclose
SCAN FOR RECNO()>1 AND !EOF()
REPLACE profit WITH shclose-b
b=shclose
ENDSCAN
REPLACE ALL profit WITH 0 for trmekd>0
SELECT SUM(profit) FROM kddk  INTO ARRAY xx

?nday,nm,nn,xx   &&这句也可以将xx写进lsb.dbf中的xx0中去,对应的的nx就是xh repl xx0 with xx for xh=nx 可能和下面的一样都没能找到 lsb表,所以都出错了


SKIP  &&这里出错了,没能执行下去
 nx=nx+1
ENDDO



CLOSE TABLES

CLOSE ALL
2012-03-20 13:44
sdta
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:江苏省连云港市
等 级:版主
威 望:323
帖 子:9621
专家分:26174
注 册:2012-2-5
得分:0 
回复 105楼 reedwu
程序代码:
CLEAR
CLOSE TABLES
USE 1a0001.DBF ALIAS A
CREATE CURSOR LSB (XH N(3),NDAY0 N(2),NM0 N(2),NN0 N(2))
FOR NDAY=9 TO 9
    FOR NM=3 TO 3
        FOR NN=3 TO 3
            INSERT INTO LSB VALUES(RECNO(),NDAY,NM,NN)
            SELECT A
            T1=seconds()
            BLANK ALL FIELDS K,D,TRIX,TRMA
            G=100
            H=100
            FOR I=1 TO RECCOUNT()-(nday-1)
                SELECT MAX(SHHIGH),MIN(SHLOW) FROM 1A0001 WHERE BETWEEN(RECNO(),I,I+(nday-1)) INTO ARRAY AA
                SELECT A
                REPLACE K WITH AA(1,2),D WITH AA(1,1),TRIX WITH (ABS(shclose-k)/ABS(d-k))*100,TRMA WITH (TRIX+2*G)/3,TRMD WITH (TRMA+2*H)/3 FOR RECNO()=I+(nday-1)
                GO I+(nday-1)
                G=TRMA
                H=TRMD
            ENDFOR
            *----KD表
            SELECT *,CAST("" AS Numeric(4)) AS TRME FROM 1A0001 WHERE trma>trmd INTO TABLE KD &&--------
            *SELECT KD
            B=SHNO
            SCAN FOR RECNO()>1 AND !EOF()
                 A=SHNO
                 REPLACE TRME WITH A-B
                 B=SHNO
            ENDSCAN
            DELETE FOR TRME=1
            PACK
            *----DK表
            SELECT *,CAST("" AS Numeric(4)) AS TRME FROM 1A0001 WHERE trma<trmd  INTO TABLE DK
            SELECT DK
            B=SHNO
            SCAN FOR RECNO()>1 AND !EOF()
                 A=SHNO
                 REPLACE TRME WITH A-B
                 B=SHNO
            ENDSCAN
            DELETE FOR TRME=1
            PACK
            *----生成新的数据表
            SELECT *,CAST("" AS Numeric(4)) AS TRMEKD,CAST("" AS Numeric(4)) AS TRMEDK FROM 1A0001 INTO TABLE KDDK
            UPDATE KDDK SET TRMEKD=KD.TRME FROM KD WHERE KDDK.SHNO==KD.SHNO
            UPDATE KDDK SET TRMEDK=DK.TRME FROM DK WHERE KDDK.SHNO==DK.SHNO
            DELETE FOR (TRMEKD=0 AND TRMEDK=0)
            PACK
        ENDFOR
    ENDFOR
ENDFOR
MESSAGEBOX("共用时间: "+TRANSFORM(seconds()-T1,"@Z 999.99")+" 秒")
BROWSE
CLOSE TABLES
ERASE KD.DBF
ERASE DK.DBF
ERASE KDDK.DBF

坚守VFP最后的阵地
2012-03-20 14:32
reedwu
Rank: 1
等 级:新手上路
威 望:1
帖 子:113
专家分:5
注 册:2006-9-23
得分:0 
回复 106楼 sdta
通过测试,谢了,我只测试了18~20,3~5,3~5,每次耗时25.6,共用了700秒啊,看来多了就得放台式机上了,不过效果很好,马上就对比出了高点,kdj(18,5,4)是最适合上证2009年以来的走势的,共获利772.04点,大家可以以此为基础,测试不同指标的最佳参数,来晒晒,方便大家参考。sdta谢了。

[ 本帖最后由 reedwu 于 2012-3-20 15:28 编辑 ]
2012-03-20 14:54
reedwu
Rank: 1
等 级:新手上路
威 望:1
帖 子:113
专家分:5
注 册:2006-9-23
得分:0 
回复 107楼 reedwu
上述程序已经完全能适合大家的测试了,这个帖子也能完结了。
不过大家有没有注意到这句DELETE FOR (TRMEKD=0 AND TRMEDK=0),我后面特意加了句要留着,这个语句是删除除金叉死叉的其他数据的,但有种理论是说不管死叉,只等金叉出现就买入,设好止损,持有n天就出货的,再等下次的买入机会。但我觉得在震荡市中比较适合,感兴趣的可以测试下,持有n天的程序,但我这里就不做了,免得误导大家,因为碰上2006年的那个牛市,简单持股就行了,下了车就没机会了。
再次感谢sdta的大力帮助,谢谢。
 
2012-03-20 15:44
sdta
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:江苏省连云港市
等 级:版主
威 望:323
帖 子:9621
专家分:26174
注 册:2012-2-5
得分:0 
回复 108楼 reedwu
代码应该还能优化,可本人对股票一窍不通,其中的流程是什么,是一无所知。你自己看看如何优化。即使放在台式机上,上面的代码估计也节省不了多少时间。如果有了什么好的想法,可随时联系我。

坚守VFP最后的阵地
2012-03-20 15:53
reedwu
Rank: 1
等 级:新手上路
威 望:1
帖 子:113
专家分:5
注 册:2006-9-23
得分:0 
回复 109楼 sdta
好,谢了。不过建议编程的去试试炒股,你们的逻辑能力和处理数据的能力应该是远胜于一般人的,自己建立个模型,呵呵,赢钱应该是不成问题的。我再到后面的程序就没戏了,比如怎么做图表等,看看买卖点,最高最低的时间分布图等等,虽然有点想法,但我都不知道该怎么弄?哪天理清头绪了,再来探讨,免不了请你帮忙。

[ 本帖最后由 reedwu 于 2012-3-20 16:45 编辑 ]
2012-03-20 16:35



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-363238-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.548948 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved