hslixuexue 发表于 2013-10-1 00:51:28

kenykau 发表于 2013-9-27 17:04 static/image/common/back.gif
谢谢楼主的努力!感动中!
本来想开一个新的帖子把自己的笔记也分享给大家,看到大大的帖子,感到还差远 ...
哦,好的,这个笔记很初级。不过word便于学习中查询,修正。我就放首页。另外,当然可以把读书笔记加在一起。

dd7896 发表于 2013-10-1 15:31:49

感谢楼主的奉献,学习了,国庆快乐!

hslixuexue 发表于 2013-10-5 12:58:53

代码2忘了修改,现在修改:
#NOTE  "h1与l2一组,l1与h2一组,分别代表起点终点,两组只输一组。如果有两个相同起点值,用d1选择起点"   
#MAINCHART
{参数设置}
#TEMPLATE "l1: Param#1 起点低点;h2: Param#2 终点高点;h1: Param#3 起点高点,l2: Param#4 终点低点"  
//参数精灵格式:#TEMPLATE " "第一个参数名:Param#1  参数说明,第二个参数:Param#2 ;" 参数说明可以省略。
Input:
l1(0,0,1341231),h2(0,0,100000),l2(0,0,100000),h1(0,0,100000) ;
// h1与l2一组,l1与h2一组,分别代表起点终点,两组只输一组。如果有两个相同起点值,用d1选择起点

{变量设置}
If l1!=0 then begin
if h2!=0 then begin
j:=h2-l1;
j1:=h2-0.382*j;
j2:=h2-0.5*j;
j3:=h2-0.618*j;
DRAWLINE(l=l1,j1,h=h2,j1,1);
DRAWTEXT(l=l1,j1,'38.2%'+J1);
DRAWLINE(l=l1,j2,h=h2,j2,1), LINETHICK2;
DRAWTEXT(l=l1,j2,'50%'+J2);
DRAWLINE(l=l1,j3,h=h2,j3,1) ,LINEDOT,2 , COLORRED;
DRAWTEXT(l=l1,j3,'61.8%'+J3), COLORRED;
DRAWLINE(l=l1,l1,h=h2,l1,1);
DRAWLINE(l=l1,h2,h=h2,h2,1);
end
else  begin
j:=h1-l2;
j1:=l2+0.382*j;
j2:=l2+0.5*j;
j3:=l2+0.618*j;
DRAWLINE(h=h1,j1,l=l2,j1,1);
DRAWTEXT(h=h1,j1,'38.2%'+J1);
DRAWLINE(h=h1,j2,l=l2,j2,1);
DRAWTEXT(h=h1,j2,'50%'+J2);
DRAWLINE(h=h1,j3,l=l2,j3,1);
DRAWTEXT(h=h1,j3,'61.8%'+J3);
DRAWLINE(h=h1,H1,l=l2,h1,1);
DRAWLINE(h=h1,l2,l=l2,L2,1);
end
end

hslixuexue 发表于 2013-10-5 20:50:19

本帖最后由 hslixuexue 于 2013-10-8 13:51 编辑

小结:参数、变量、中间变量的区别:
1、参数,在金语言中就是变量的一种,从input关键字分类就可以看出来。只不过把一些关键的,不变的,由人工控制并且可以通过专门的参数修改进行控制的变量,称为参数。如果用变量,通过修改源程序的初始值,起到一样的作用。
2、中间变量,如果是一些数值型的,中间变量与变量一样的作用,一样参加运算,一样被储存,一样被读取。但是字符型、整形、常数型,中间变量就没这个功能。
3、变量声明,不只有variable一种,还有很多种,不是都需要variable。不过其他的变量声明都是单一种,而variable,可以声明很多种。


更正一下:前面说tl-new,新画线函数,TL_New (sDate, sTime, sPriceValue, eDate, eTime, ePriceValue)
。日线以上周期, sTime没有取值,不能画线。看了例子,原来日线以上周期,eTime为0。

JMF001 发表于 2013-10-6 21:19:27

{:4_88:}{:4_88:}

hslixuexue 发表于 2013-10-20 10:50:38

本帖最后由 hslixuexue 于 2013-10-23 13:56 编辑

                                                         七十六

{编程规则:语句规则、数据规则:1、if语句规则:有begin必须换行,且下一行开始每行空四格,直到end出现才返回四格;End必须单独成为一行;End下一行语句与End所在语句同列。Else if 所在行不格外空四格,因为Elseif可以换成if if,实际上是两句。then、begin、end关键字后不用分号。之间语句用分号,之间语句实际上是多句作为句子一部分。尽量少嵌套if,嵌套越多,越不好纠错。普通的一句多行,从第二行开始每行空四格,句子结束后,下一句返回四格。
2、数据流规则、避免非法数据、数据乱流:A、程序中数据来源:原始数据,如ohlc数据;初始化数据,如参数变量初始值;再生数据,各种表达式、变量、各种函数处理结果。B、数据生成时间:原始数据,随每一K线诞生而产生于每一K线;初始化数据,第一次运行程序时,将初始化数值存储在每一K线上,意思每一k线上有该参数值,形成参数序列值;再生数据,变量、中间变量在执行计算所在K线位置为数据起点,比如:if 50800=ref(c,2) then t:= ref(h,4),t数据从当前周期产生。因逐根逐行模式不同,再生数据流向不同。C、数据去向:逐行模式下,根据官方论坛的解释:每一行代码计算完所有K线之后,该行代码运算才结束、才产生结果,中间K线计算出的值不保留。我理解实际上每一行代码执行完所有K线,每一行的计算结果由最后一根k线数据决定。经验证:如参数初始值j2,代码:if  l=j2 THEN t:=1; print(,t);日志没有输出值,其值为逻辑非,0。因为T值由最后一根K线数据决定。当l=j2时,t=1,但是计算没有结束,中间结果不保留,最后一根K线时该行计算结束,但又不符合条件l=j2。因此t没有值(逻辑值0)。因此很多数学计算没法进行。逐行模式下执行非计算功能,如代码:DRAWTEXT(l=j2,j2,'好东西') ;。逐根模式下,参数、变量、中间变量都在每一K线储存数据成为序列变量。变量值在生成之前,自动默认逻辑非值0。变量值在生成之后,每一K线都有存储有该变量值。因此既要考虑排除逻辑值0,又要考虑之后的重复值对某些函数有影响。也就是说每K线上都能读取所有参数、变量、中间变量的值。如:if  ref(low,2)=j2 THENk:=1;print(k);当某根K线上读取以前数据并计算ref(low,2)=j2时,则k=1,则该K线之前每一根K线都有变量k的逻辑值且为0,该K线之后每一K线都有该变量的值,且k=1,除非另有计算。D、函数、计算表达式取值与存储。除了ref等引用函数可以获取当前K线外数据,所有函数、计算表达式都是从当前K线读入数据,不具有向前、向后取值,也不能向参数、变量取读取该值。因此程序前面代码在需要后面的K线上计算并存储变量数据,而后面代码在前面K线上读该变量时,该变量还没有计算出来,获取的值是逻辑非值0,导致计算原理发生错误。3、某些较于复杂的语句,不是程序需要的,但是可以用于查看阶段程序的结果,比如一些中间过程中使用的图形。这类语句,不要删除,用暂时用//屏蔽,因为在程序纠错、修改中会在同一位置反复使用。}
{策略描述
    1、画出符合鹿希武定义的趋势线:
    上升趋势:连接某一时间周期内最低点(或相对低点)与最高点之前的某一低点,中间不穿越任何价位的一条直线(切线原则)。不能连接最高点之后的低点。 如果按照定义可以绘制出多条上升趋势线,选择与中轴线最接近平行的一条作为上升趋势线。选择的两点之间,要有一定的时间跨度。并且两个连接点不能偏向最低点或最高点一边。
    下降趋势:连接某一时间周期内最高点(或相对高点)与最低点之前的某一高点,中间不穿越任何价位的一条直线。不能连接最低点之后来的高点。如果按照定义可以绘制出现多条下降趋势线,选择与中轴线最接近平行的一条作为下降趋势线。选择的两点之间,要有一定的时间跨度。并且两个连接点不能偏向最高点一边。
    双重顶或双重底的时候允许连接最高点或最低点之后的点。通过我们人工判别双重顶或双重底,直接把时间范围扩大到最高点或最低点之后的点。
    鹿希武定义的趋势线,即使再同一周期下,根据波浪理论分为各种长期趋势、短期趋势,把几个趋势合成一个趋势没有多大实际意义,不如人工判别,把各种趋势分开,根据止损程度选择趋势。不同区间上的趋势线通过人工取最高价和最低价来界定。
    2、画拐点线:
    确定外延线,与趋势线画法相同,只不过是对面方向。
    外延线平移,相切为拐点线。
    3、画分界点水平线:分界点必须自己判断,趋势反转前的一个回调或反弹点,并画水平线。
    4、止损水平线:最低价或最高价水平线为第一个止损线。
}
{预计功能模块
区间确定:参数输入界定,起点、终点、分界点有参数输入,符合条件的h或l值。如下降趋势,起点是h值、终点是l值,分界点是h值。
趋势线画法:采取期初、期末k线中线平移至一个交点,交点在中点一侧,向另外一侧旋转,产生交点。
外延线画法:同趋势线画法,反向平移。
外延线平移为拐点线。
根据分界点画水平线。
参数、变量根据需要简单记录,中文英文皆可,再编代码雏形,最后完善参数变量模块
}
{
需要的关键函数:因为不熟,必须在字典里翻。这个可能是新手最难的。函数变化,参数、变量、模块都要变。
}
{
调试工具:(1)print(k);在日志内显示k所有结果,查看图形上不见的数据是否被正确执行。(2)//、{},把不需要检查的屏蔽了。
检查方法:用编译初查。用//、{}分段检查。用print(k);检查每一个变量。
检查内容:检查变量值错误、检查数学运算原理错误、检查数学运算表达式书写错误、检查函数使用条件错误。
}
{
错误调试描述
}
function  //内置函数,没有删除
#NOTE  
"根据输入价格输出趋势线、拐点线、分界线、止损线"  //#NOTE "公式说明"
#RunMode RUN_BY_BAR
#MAINCHART
#RunMode Run_by_Bar
#TEMPLATE
'j1: Param#1 起点
j2: Param#2 终点
f: Param#3 起点和终点之间分界点'
//参数精灵格式:#TEMPLATE  '第一个参数名: Param#1  参数说明 第二个参数: Param#2 参数说明 第三个参数名: Param#3  参数说明'  参数说明可以省略,引号内换行,同一位置显示换行。
INPUT:
j1(53530,0,100000000),j2(50800,0,100000000),f(51600,0,100000000);//为了方便,初始化为铜1401
在8月至9月30分钟线数据

    zn1:=BarsLastCount(h<f);
zn2:=BarsLastCount(h<j1);      
    //以下判别趋势求出j1、j2两点的时间、价格。
    IF j1>j2  THEN  BEGIN        
     IF f=REF(h,zn1) and j1=REF(h,zn2) and l=j2 THEN   BEGIN     
               dj2:=date;
               hj2:=h;
               lj2:=l;
               IF  time>0 THEN  tj2:=time;
                   ELSE  tj2:=0;
         barNumberJ2:= BarNumber(DJ2,TJ2);     
   
         dj1:=REF(DATE,zn2);
               hj1:=REF(H,zn2);
               lj1:=REF(L,zn2);
               IF  REF(TIME,zn2)>0 THEN
                   tj1:=REF(TIME,zn2);
                   ELSE tj1:=0;
      barNumberJ1:= BarNumberj2-zn2;
   
      df:=REF(DATE,zn1);
               hf:=REF(H,zn1);
               lf:=REF(L,zn1);
               IF  REF(TIME,zn1)>0 THEN
                    tf:=REF(TIME,zn1);
                    ELSE tf:=0;
      END           
    END  

zn1:=BarsLastCount(L>f);
zn2:=BarsLastCount(l>j1);     
   
IF j1<j2  THEN BEGIN      
             IF f=REF(l,zn1)and j1=REF(l,zn2) and h=j2 THEN   BEGIN
                   dj2:=date;
                   hj2:=h;
                   lj2:=l;
                   IF  TIME>0 THEN  tj2:=time;
                       ELSE  tj2:=0;
             barNumberJ2:= BarNumber(DJ2,TJ2);     
                  
             dj1:=REF(DATE,zn2);
                   hj1:=REF(H,zn2);
                   lj1:=REF(L,zn2);
                   IF  REF(TIME,zn2)>0 THEN
                       tj1:=REF(TIME,zn2);
                       ELSE tj1:=0;
          barNumberJ1:= BarNumberj2-zn2;
      
       df:=REF(DATE,zn1);
                   hf:=REF(H,zn1);
                   lf:=REF(L,zn1);
                   IF  REF(TIME,zn1)>0 THEN
                       tf:=REF(TIME,zn1);
                       ELSE tf:=0;
    END         
    END
        
    //以下画中线并求中线斜率
    IF BARSSINCE(dj1<dj2)=1 THEN TL_ID1:=TL_NEW(dj1,tj1,(hj1+lj1)/2,dj2,tj2,(hj2+lj2)/2);
    kz: = ((hj1+lj1)/2-(hj2+lj2)/2) / (barNumberJ1-barNumberJ2);
    b=(hj1+lj1)/2- kz*barNumberJ1; //求出常数b
    n=barNumberJ2-barNumberJ1 ;
   
    //求各点到中线距离,距离最大位置为将中线平移到两边最远端与价格线相切的切点位置。         
    IF BARSSINCE(dj1<dj2)=1  THEN BEGIN
     barNumberx:=BarNumber(DATE,TIME);
  d1:=0;d2:=0; n1:=0;n2:=0;
        For I=1 TO n+1 DO BEGIN
            hi:=REF(H,i);
            li:=REF(L,i);
            di:=REF(DATE,i);
            IF  REF(TIME,i)>0 THEN
             ti=REF(TIME,i);
             ELSE ti=0 ;
     barNumberi:=BarNumberx-i;
     valueY:=kz*barNumberi + b;
         
            IF hi>=valueY THEN  distanceX1:= ABS((kz*barNumberi-hi+b)/SQRT(kz*kz+1)); //最高价到中线距离
            IF li<=valueY THEN  distanceX2:= ABS((kz*barNumberi-li+b)/SQRT(kz*kz+1)); //最低价到中线距离
                        
            IF d1<distanceX1 THEN BEGIN
       d1=distanceX1;
    n1=i;
      END
            IF d2<distanceX2 THEN BEGIN
                d2=distanceX2 ;
    n2=i;
    END           
        END
        gdh:=REF(H,n1);
        gdd:=REF(DATE,n1);
        IF  REF(TIME,n1)>0 THEN
       gdt=REF(TIME,n1);
       ELSE gdt=0;
        barNumberGD = BarNumberx-n1;
        gpb:=gdh-kz*barNumberGD;
  gpj2y:=kz*barNumberj2+gpb;
        ddl:=REF(L,n2);
  ddh:=REF(H,n2);
        ddd=REF(DATE,n2);
        IF  REF(TIME,n2)>0 THEN
         ddt=REF(TIME,n2);
         ELSE ddt=0;
        barNumberDD = BarNumberx-n2;
        dpb:=ddl-kz*barNumberDD;
  dpj2y:=kz*barNumberj2+dpb;
    END
  
    //IF BARSSINCE(dj1<dj2)=1  THEN  gpid:=Tl_New(gdd,gdt,gdh,dj2,tj2,gpj2y);
//IF BARSSINCE(dj1<dj2)=1  THEN TL_SetExtLeft(gpid,TRUE);
    //IF BARSSINCE(dj1<dj2)=1  THEN  dpid:=Tl_New(ddd,ddt,ddl,dj2,tj2,dpj2y);
//IF BARSSINCE(dj1<dj2)=1  THEN TL_SetExtLeft(dpid,TRUE);
      
    //确定切点位置偏向,确定旋转方向范围,第二次相切   
    //波峰切线
    k=1000.00;
    t2:=0;            
    IF n1>=(n+1)/2 THEN BEGIN
      t1=1;
  t2=n1-1;
END
    ELSE BEGIN
     t1=n1+1;
  t2=n+1;
END
    IF BARSSINCE(dj1<dj2)=1 THEN BEGIN
        For i=t1 TO t2 DO BEGIN  
            gd2h:=REF(H,i);
            gd2d:=REF(DATE,i);
            IF  REF(TIME,i)>0 THEN  gd2t=REF(TIME,i);
         ELSE gd2t=0;
            barNumbergd2:= BarNumberx-i;
            kx:=(gdh-gd2h)/(barNumberGD-barNumbergd2);
            Mi:=ABS(kx -kz);
         IF  k>=Mi  THEN BEGIN
             k=Mi;
             gd2n:=i;
   END
        END  
        gd2h:=REF(H,gd2n);
        gd2l:=REF(L,gd2n);
        gd2d:=REF(DATE,gd2n);
        IF REF(TIME,gd2n)>0 THEN
            gd2t=REF(TIME,gd2n);
         ELSE  gd2t=0;
  barNumbergd2:= BarNumberx-gd2n;
        kg=(gdh-gd2h)/(barNumbergd-barNumbergd2);
        bg=gd2h-kg*barNumbergd2;
  
    END
//IF BARSSINCE(dj1<dj2)=1  THEN  gqid:=Tl_New(gdd,gdt,gdh,gd2d,gd2t,gd2h);
//IF  BARSSINCE(dj1<dj2)=1  THEN TL_SetExtLeft(gqid,TRUE);
   // IF  BARSSINCE(dj1<dj2)=1  THEN TL_SetExtright(gqid,TRUE);
   
    //波谷切线
    k=1000.00;
    IF n2>=(n+1)/2 THEN BEGIN
     t1=1;
        t2=n2-1;
END
    ELSE BEGIN
     t1=n2+1;
  t2=n+1;
    END  
    IF BARSSINCE(dj1<dj2)=1  THEN BEGIN
        For i=t1 TO t2 DO BEGIN
            dd2l:=REF(L,i);
   dd2h:=REF(H,i);
   dd2d:=REF(DATE,i);
            IF  REF(TIME,i)>0 THEN
             dd2t=REF(TIME,i);
         ELSE dd2t=0;
            barNumberdd2:=BarNumberx-i;
            kx:=(ddl-dd2l)/(barNumberdD-barNumberdd2);
            mi:=ABS(kx -kz);
         IF k>mi  THEN BEGIN  
         k=mi;
      dd2n:=i;
         END
        END
        dd2h:=REF(H,dd2n);
        dd2l:=REF(L,dd2n);
        dd2d:=REF(DATE,dd2n);
        IF  REF(TIME,dd2n)>0 THEN
         dd2t=REF(TIME,dd2n);
         ELSE dd2t=0;
        barNumberdd2:= BarNumberx-dd2n;
        kd=(ddl-dd2l)/(barNumberdd-barNumberdd2);
        bd=dd2l-kd*barNumberdd2;
    END
//IF BARSSINCE(dj1<dj2)=1  THEN  dqid:=Tl_New(ddd,ddt,ddl,dd2d,dd2t,dd2l);
//IF  BARSSINCE(dj1<dj2)=1  THEN TL_SetExtLeft(dqid,TRUE);
    //IF  BARSSINCE(dj1<dj2)=1  THEN TL_SetExtright(dqid,TRUE);

    //确定并画出拐点线
    d1=0;
    IF BARSSINCE(dj1<dj2)=1  THEN BEGIN
        For i=1 TO n+1 DO BEGIN
            ih:=REF(H,i);
            il:=REF(L,i);
            id:=REF(DATE,i);
            IF  REF(TIME,i)>0 THEN
             it=REF(TIME,i) ;
             ELSE it=0;
            barNumberi:=BarNumberx-i;
            IF j1>j2 THEN              
            distanceX1=ABS((kd*barNumberi-ih+bd)/SQRT(kd*kd+1));
            IF j1<j2 THEN distanceX1=ABS((kg*barNumberi-il+bg)/SQRT(kg*kg+1));
            IF d1<distanceX1 THEN BEGIN
       d1=distanceX1;
                n3:=i;
   END
        END
  guaidl=REF(L,n3);
        guaidh=REF(H,n3);
        guaidd:=REF(DATE,n3);  
        IF  REF(TIME,n3)>0 THEN guaidt=REF(TIME,n3);
        ELSE guaidt=0;
        barNumberguai:= BarNumberx-n3;
  IF j1>j2 THEN BEGIN
      guaidb:=guaidh-kd*barNumberguai;
   guaij2:=kd*barNumberj2+guaidb;
   guaiy:=guaidh;
  END
  IF j1<j2 THEN BEGIN
      guaidb:=guaidl-kg*barNumberguai;
   guaij2:=kg*barNumberj2+guaidb;
   guaiy:=guaidl;
  END
    END
    //IF BARSSINCE(dj1<dj2)=1  THEN  guaiid:=Tl_New(guaidd,guaidt,guaiy,dj2,tj2,guaij2);
//IF  BARSSINCE(dj1<dj2)=1  THEN TL_SetExtLeft(guaiid,TRUE);
    //IF  BARSSINCE(dj1<dj2)=1  THEN TL_SetExtright(guaiid,TRUE);

    //画线
    IF j1>j2 AND  BARSSINCE(dj1<dj2)=1  THEN  BEGIN  

     qushixianid:=Tl_New(gdd,gdt,gdh,gd2d,gd2t,gd2h) ;
  TL_SetExtLeft(qushixianid,TRUE)  ;
        TL_SetExtright(qushixianid,TRUE);
        guaidianxianid:= Tl_New(guaidd,guaidt,guaiy,dj2,tj2,guaij2);
  TL_SetExtLeft(guaidianxianid,TRUE),POINTDOT;
        TL_SetExtright(guaidianxianid,TRUE);
     fenjiexianid:=Tl_New(df,tf,hf,dj2,tj2,hf);
  TL_SetExtright(fenjiexianid,TRUE);
     zhisunxianid:=Tl_New(dj2,tj2,lj2,date,time,lj2);
  TL_SetExtright(zhisunxianid,TRUE);
    END  
    IF j1<j2 AND  BARSSINCE(dj1<dj2)=1  THEN  BEGIN
        qushixianid:=Tl_New(ddd,ddt,ddl,dd2d,dd2t,dd2l);
  TL_SetExtLeft(qushixianid,TRUE);
        TL_SetExtright(qushixianid,TRUE);
        guaidianxianid:=Tl_New(guaidd,guaidt,guaiy,dj2,tj2,guaij2);
     TL_SetExtLeft(guaidianxianid,TRUE);
        TL_SetExtright(guaidianxianid,TRUE);
  fenjiexianid:=Tl_New(df,tf,lf,dj2,tj2,lf) , ColorLightGreen , POINTDOT ;
  TL_SetExtright(fenjiexianid,TRUE);
     zhisunxianid:=Tl_New(dj2,tj2,hj2,date,time,hj2);
  TL_SetExtright(zhisunxianid,TRUE);
    END         


netarmy 发表于 2013-10-22 13:44:57

学这个有用吗?这个难学吗?

hslixuexue 发表于 2013-10-23 00:56:40

netarmy 发表于 2013-10-22 13:44 static/image/common/back.gif
学这个有用吗?这个难学吗?

当你想编程的时候有用,学会一种,其他基本会了80%。喜欢数学的人不难。

windy_b 发表于 2013-11-11 21:14:06

真的是0基础,适合新手,楼主辛苦了

sysw 发表于 2013-11-16 13:47:14

辛苦了,今天下载,准备学习。
页: 1 2 3 4 5 6 7 [8] 9 10 11 12 13 14 15 16 17
查看完整版本: 自制《金语言初级教程》--从0开始学习金语言