设为首页收藏本站

 找回密码
 注册
查看: 6266|回复: 14
打印 上一主题 下一主题

学习TB编程,看看自己能够走多远 [复制链接]

Rank: 4

精华
0
UID
35833
积分
389
帖子
80
主题
14
阅读权限
50
注册时间
2011-4-26
最后登录
2017-7-3
跳转到指定楼层
1#
发表于 2011-7-5 18:20:49 |只看该作者 |倒序浏览
说实话,我在前一个多月就已经学习过TB了,但是就是没有学会,然后就放弃了。接着就学习金字塔,学习一个礼拜的金字塔,感觉就是用不习惯,所以又回到TB了。
今天立贴,努力学习TB编程,看看自己能够坚持到什么时候。
又重新看了入门教程,还是从Hello World开始吧
入门教程来自http://www.tradeblazer.net/forum/thread-242-1-1.html
重点学习一下plotnumeric 函数
Numeric plotNumeric(String Name,Numeric Number,Numeric Locator=0,Integer color=-1,Integer BarsBack=0)
Locator:表示位置之物,土地
BarsBack 为向前回朔的Bar数(不理解,是不是从第一根到最后一根的Bar数呀?)

现在的plotnumeric和以前的语法不一样了,以前的没有Locator这个参数
Begin
  If (Close>Open)
     {
          PlotNumeric("Vol",Vol,0,Red);
          }
  Else
     {
      PlotNumeric("Vol",Vol,0,Green);
     }         
End

今天先学到这里。

Rank: 4

精华
0
UID
35833
积分
389
帖子
80
主题
14
阅读权限
50
注册时间
2011-4-26
最后登录
2017-7-3
2#
发表于 2011-7-6 18:00:14 |只看该作者
Params
   
NumericSeries Price(0);
Numeric Length(2);
Numeric i(0);
Vars
    Numeric Sum;
Begin
    for  i To Length-1   //一定要把i写成 i=0才行,要不就死循环了,但是为什么会死循环,我还真不知道。
    {
      Sum=Sum+Price;  //看了一下原函数,只有这个地方和原函数写的不一样,原函数的写法为price[i]。一个对price[i]好好理解理解。
    }
Return Sum;
End

ReWrite summation函数的时候,i应该写成i=0,注意不能把函数名定义为变量,还有就是把price 应该写成 price[i], 这里糊涂了,如果是price[1]是不是就是第二个bar的price呀?

Params
NumericSeries Price(1);
Numeric Length(10);
Vars
Numeric AvgValue;
Begin
AvgValue = Summation(Price, Length) / Length;
Return AvgValue;
End
//对呀写Average函数,竟然写对了,呵呵。(*^__^*)

有时候不自己写函数,真的不知道这个函数是什么意思,调用起来也不会调用


spread  展开,价差,扩展
学完spread的指标的编写,才知道,当前的合约为data0,第二个插入的为data1,第三个插入的为data2。



extreme |iks'tri:m| 极端的
学下extremes 求极值 函数
什么叫做回溯周期索引?这个词不明白什么意思.
不知道这个极值是什么意思,是不是就是最高或者最低,要是最高或者最低的话,为什么还说最高价的极值呢?
对于extremes函数还是不明白什么意思。
Extremes(High, 20, True, oExtremeBar); 的意思是说计算20周期以来最高价的极值和极值出现的回朔周期所以。
还是先把Extremes的语法抄一下吧。 Numeric Extremes(NumericSeries Price,Numeric Length,Bool bMax,NumericRef ExtremeBar)

NumericRef 的意思是什么,不明白?
BarStatus ,当前公式应用到当前bar的状态值。(不知道这个函数有什么用?)
SetGlobalVar:设置某个索引的全局变量值,返回值为布尔型。
语法:Bool SetGlobalVar(Integer nIndex,Numeric fVal)。 (对于SetGlobalVar 函数,完全不知道这个函数是做什么用的)
BarSinceToday:求当天的第一个数据到当前的Bar数 (不明白这个函数的意思)



CurrentBar:当前公式应用商品在当前Bar的索引值,返回值为Integer型。(对这句话不怎么明白)


在看Summation函数的时候,备注说明当序列值CurrentBar小于Length时,该函数返回无效值。(这个话不怎么明白)
用回到了写Summation函数,发现现在的写法和以前不一样了,以前的函数对于当前bar数和你所想要计算的Length做了一下比较。

使用道具 举报

Rank: 4

精华
0
UID
35833
积分
389
帖子
80
主题
14
阅读权限
50
注册时间
2011-4-26
最后登录
2017-7-3
3#
发表于 2011-7-6 18:06:21 |只看该作者
对于summation函数,求第一个的Bar到第五个Bar的price和,这个还能够理解,但是对于它能够从第二个到第六个bar的price和,怎么依次工作的,不明白,不知道明白这个有意义吗?

使用道具 举报

Rank: 10Rank: 10Rank: 10

精华
2
UID
4130
积分
20901
帖子
6519
主题
17
阅读权限
200
注册时间
2009-4-15
最后登录
2019-4-12
4#
发表于 2011-7-7 09:13:28 |只看该作者
回复 3# yuezongqi


公式是在每个bar上都会运行一次,所以每次运行都会相对于当前bar去计算第一到第五bar的price和。
先对于上一bar运行summation,就是第二根到第六根。

使用道具 举报

Rank: 4

精华
0
UID
35833
积分
389
帖子
80
主题
14
阅读权限
50
注册时间
2011-4-26
最后登录
2017-7-3
5#
发表于 2011-7-7 13:24:59 |只看该作者
关于Summation函数在每一根Bar上面的执行过程我算是明白了。
其实Summation函数在每一根Bar上面都执行了Lenght循环,就是Price[1]不同而已。
如果是Summation(close,5)的话,则在第一根Bar上面也是执行了5次。只是Price[4],Price[3],Price[2],Price[1]这四个数都为0而已。

使用道具 举报

Rank: 4

精华
0
UID
35833
积分
389
帖子
80
主题
14
阅读权限
50
注册时间
2011-4-26
最后登录
2017-7-3
6#
发表于 2011-7-7 18:04:24 |只看该作者
NumericRef:为数值型引用。Ref应该为Reference 的简写。
Reference: 提及,涉及,参考,引文

变量类型:简单类型,序列类型,引用类型。
对于变量的定义,引用类型是无效的。简单类型变量是单个的值,不能进行回朔。序列变量是和Bar长度一致的数据排列,可以通过回朔

来获取当前Bar以前的任意值。

今天重点攻一下数据回溯,来自http://www.tradeblazer.net/product/language14.html
Offset:偏移;抵消
写了一个变量回朔的例子,算是明白了回朔是怎么一回事了。
回朔10周期前的Bar的10日平均:
Vars
  NumericSeries  Ma(0);
Begin
  Ma=Average(Close,10);
  PlotNumeric("1",Ma,0,Green);
  PlotNumeric("2",Ma[10],0,Red);
End

http://www.tradeblazer.net/product/language15.html 中不是说用户函数返回一个值吗?
但是在读Extremes 函数的时候,备注说 该函数计算指定周期内的数值型序列值的极值和极值出现的回溯周期值。 这句话不就说明此函

数返回的是数值型序列值的极值和极值出现的回溯周期值吗?这不是返回两个值吗?

老师说,如果有引用参数的话,就可以返回多个值,看样子extremes函数有引用参数,看样子又要学习什么是引用参数了。
SkyWalker老师说在是引用变量,看样子就是小米老师说的引用参数。

用户函数必须通过Return返回数据,返回数据类型为三种基本类型之一。

在看K线形态的时候,说必须通过 PlotBar返回数据,但是没有看到PlotBar这个函数呀,是不是取消了呀?

对于Extremes函数在示例:
Extremes(High,20,True,oExtremeBar)的意思就是返回20周期以来最高价当中的最高价和那根最高价当中的最高价的CurrentBar值,不

知道我的理解对不对? 先试着这样子写一下 吧!
看了一下文章http://www.tradeblazer.net/forum ... =extreme&page=1,下面对于Extremes在编程:
Params
        NumericSeries   Price(0);
    Numeric          Length(10);
    Bool             bMax(true);
    NumericRef      Extremebar;

Vars
        Numeric Myval(0);
    Numeric Mybar(0);
    Numeric i(1);
Begin
        If(CurrentBar < length - 1)
      { Myval = InvalidNumeric;
        Mybar = InvalidNumeric;
       }
    Else
          { For i = 0 To Length - 1
         If(bMax)
           { If(Price > Myval )
              Myval = Price;
              Mybar = i;
            }
         Else
           { If(Price < Myval )
              Myval = Price[1];
              Mybar = i;
            }
       }
     Extremebar = Mybar;
     Return Myval;
End

这样子的编程正是我想要表达的,但是现在的程序却是这样写的:
Params
        NumericSeries Price(1);
        Numeric Length(10);
        Bool bMax(True);       
        NumericRef ExtremeBar;       
Vars
        NumericSeries MyVal;
        NumericSeries MyBar;
        Numeric i;
Begin
        MyVal = Price;
        MyBar = 0;
       
        If ( CurrentBar <= Length - 1 || MyBar[1] == Length - 1)
        {
                for i = 1 to Length - 1
                {
                        If (bMax )
                        {
                                If ( Price > MyVal)
                                {
                                        MyVal = Price;
                                        MyBar = i;
                                }
                        }Else
                        {
                                If ( Price < MyVal)
                                {
                                        MyVal = Price;
                                        MyBar = i;
                                }
                        }
                }       
        }Else
        {
                If ( bMax )
                {
                        If ( Price >= MyVal[1])
                        {
                                MyVal = Price;
                                MyBar = 0;
                        }Else
                        {
                                MyVal = MyVal[1];
                                MyBar = MyBar[1] + 1;
                        }
                }Else
                {
                        If ( Price <= MyVal[1])
                        {
                                MyVal = Price;
                                MyBar = 0;
                        }Else
                        {
                                MyVal = MyVal[1];
                                MyBar = MyBar[1] + 1;
                        }
                }
        }       
        ExtremeBar = MyBar;
        Return MyVal;
End
对于MyBar[1] == Length - 1 不明白写这个有什么用,也不明白这个的意思是什么,对于第一个IF...Else....,Else后面的语句不知道有什么用?
看这这个主要是学会了引用参数的使用。
又看了一下NthExtremes在函数用法,这个用法好像上学的时候学过,就是忘记了,应该是取出所有的Price,然后根据bMax类型,对其Price序列进行比值,大概思路应该是这样子的。
今天写函数的时候 看天HighD,Highest,HighestBar,决定明天写这三个函数,感觉这三个函数还是比较具有代表性的。

使用道具 举报

Rank: 4

精华
0
UID
35833
积分
389
帖子
80
主题
14
阅读权限
50
注册时间
2011-4-26
最后登录
2017-7-3
7#
发表于 2011-7-8 18:49:56 |只看该作者
没有想到用记事本写的东西,竟然因为一不小心碰到电源,所有的东西都给丢失了。
Highest,HighestBar函数都写完了,写完HighestBar 才明白做是回溯了,
在写HighD函数的时候 ,对HighD函数理解产生错误了,HighD函数就是Length周期前的最高价,
又把Extremes函数给写了一遍,
Params
        NumericSeries Price(10);
        Numeric Length(10);
        Bool  BoolMaxMin(True);
        NumericRef ExtremesBar;
Vars
        Numeric ExtremesValue;
        Numeric i;
        Numeric j;
Begin
    ExtremesValue=Price;
        if(BoolMaxMin==True)
        {
            for  i = 0 To Length-1 /*循环次数*/
                  {
                         if(Price[i]>ExtremesValue)
               {
                  ExtremesValue=Price[i];
                                  j=i;
               }                          
                  }
        }else
        {
           for  i = 0 To Length-1 /*循环次数*/
                  {
                         if(Price[i]<ExtremesValue)
               {
                  ExtremesValue=Price[i];
                                  j=i;
               }                          
                  }
        }
        ExtremesBar=j;
        Return ExtremesValue;
End
但是对于Extremes函数的调用,却有点不明白,不是说返回极值出现的回溯周期值吗?
测试如下:
Vars
   Numeric oExtremeBar;
Begin
  //FileAppend("C:\\12.Log",Text(Highest(High,10)));
  //PlotNumeric("ces",Highest(High,10));
  //FileAppend("C:\\123.Log",Text(HighestBar(High,10)));
  FileAppend("c:\\1.Log",Text(ExtremesReWrite(High,10,True,oExtremeBar)));
  FileAppend("c:\\2.Log",Text(Extremes(High,10,True,oExtremeBar)));
End

我写的Extreme要ReWrite 和Extremes函数输出的结果一样,都是只有最高价,没有返回回溯周期,不知道应该怎么才能返回回溯周期,所以对Extremes函数还是有点不明白。

下一步,准备写一个完整的均线模型,包括进场,止损,出场。
感觉止损应该好好 学习学习

使用道具 举报

Rank: 5Rank: 5

精华
0
UID
32158
积分
731
帖子
176
主题
53
阅读权限
60
注册时间
2011-4-5
最后登录
2023-1-17
8#
发表于 2011-7-9 20:46:38 |只看该作者
哥们你学得很认真
微信公众号:tuwening

使用道具 举报

Rank: 4

精华
0
UID
35833
积分
389
帖子
80
主题
14
阅读权限
50
注册时间
2011-4-26
最后登录
2017-7-3
9#
发表于 2011-7-11 19:18:33 |只看该作者
想写个均线模型,发现心定不下来,造成了什么也不想做的后果,因此一定要努力修行才是。故把QQ昵称改为定慧,也是用来提醒自己时刻要持戒、禅定和修慧。
大学之道,在明明德,在亲明,在止于至善。 知止而后有定,定而后能静,静而后能安,安而后能虑,虑而后能得。
                                                  -------------《大学》
随便写了一个,竟然发现不能交易。
Params
    Numeric Para1(10);

Vars
        Bool Condition1;
        Bool Condition2;
Begin
        Condition1 = CrossOver(Close[1],Para1);
        Condition2 =CrossUnder(Close[1],Para1);
        //if (Condition1 And MarketPosition==0)
        //{
        //        Buy(1,Open);
               
        //}
        if (Condition1 || MarketPosition==-1)
        {
                BuyToCover(1,Open);
                Buy(1,Open);
               
        }
        //if (Condition2 And MarketPosition==0)
        //{
        //        SellShort(1,Open);
        //}
        if (Condition2 || MarketPosition==1)
        {
            Sell(1,Open);
                SellShort(1,Open);
        }
End
后来,修改完成,加入止损 指令如下:
Params
    Numeric Para1(20);

Vars
    Numeric Ma1;
        BoolSeries Condition1;
        BoolSeries Condition2;
        Numeric MinPoint;
        Numeric MyEntryPrice;
        Numeric StopLossSet(100);
Begin
        MinPoint=MinMove*PriceScale;
        MyEntryPrice=EntryPrice;
    Ma1=Average(Close,Para1);
        Condition1 = CrossOver(Close,Ma1);
        Condition2 =CrossUnder(Close,Ma1);
       
    If(Condition1[1] And MarketPosition==0)
        {
           Buy(1,Open);
        }
        If(Condition1[1] And MarketPosition==-1)
        {
           BuyToCover(1,open);
           Buy(1,Open);
        }
        If(Condition2[1] And MarketPosition==0)
        {
           SellShort(1,open);
        }
        If(Condition2[1] And MarketPosition==1)
        {
           Sell(1,Open);
           SellShort(1,open);
        }
        If(MarketPosition==1 And Close<=MyEntryPrice-StopLossSet)
        {
           Sell(1,Close);
           SellShort(1,Close);
        }
        If(MarketPosition==-1 And Close>=MyEntryPrice+StopLossSet)
        {
            BuyToCover(1,Close);
            Buy(1,Close);
        }
End
止损指令加入的应该没有问题,模型代码的意思为:
收盘价上穿单均线时,就以第二根Bar的开盘价做多,收盘价下穿单均线就以第二根Bar的开盘价做多。盘中以100点做为止损点,如果盘中碰到止损点就反手。这个模型在实盘当中有没有问题,还需要等待明天开盘才能够知道。

此模型在测试中,是不能够被测试准确的,关于止损 模型的测试,不知道前辈们是如何解决的???????

使用道具 举报

Rank: 4

精华
0
UID
35833
积分
389
帖子
80
主题
14
阅读权限
50
注册时间
2011-4-26
最后登录
2017-7-3
10#
发表于 2011-7-11 19:20:46 |只看该作者
明天努力努力,把海龟交易法则给拿下。

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

bottom

静态版|手机版|联系我们|交易开拓者 ( 粤ICP备07044698   

GMT+8, 2024-5-10 21:38

Powered by Discuz! X2 LicensedChrome插件扩展

© 2011-2012 交易开拓者 Inc.

回顶部