我的策略测试:_MA_MDH30_30Reverse


自己写的一个程序化交易策略,其思路是共振原理,当超长均线,长期均线,中期均线,短期均线都呈现多头排列时,容易出现多头行情……



但从实际测量结果看,效果很差



//————————————————————————

// 简称: _MA_MDH30_30Reverse

// 名称: MA月日时30分同向30分反转

// 类别: 公式应用

// 类型: 用户应用

// 输出:

//————————————————————————

Params

    Numeric length1(3);

    Numeric length2(6);

    Numeric length3(20);

    Numeric length4(50);

    Numeric length5(100);

    Numeric BuyLots(1);

Vars   

    NumericSeries AvgValue1;

    NumericSeries AvgValue2;

    NumericSeries AvgValue3;

    NumericSeries AvgValue4;

    NumericSeries AvgValue5;

    Numeric fangxiang;//0空,1多

Begin

    AvgValue1 = AverageFC(Close,length1)-100;

    AvgValue2 = AverageFC(Close,length2)-100;

    AvgValue3 = AverageFC(Close,length3)-100;

    AvgValue4 = AverageFC(Close,length4)-100;

    AvgValue5 = AverageFC(Close,length5)-100;

    //判断大方向多空

    If(AvgValue5 < AvgValue4){

        fangxiang = 1;

    }Else{

        fangxiang = 0;

    }

    

    //大方向为空的持仓策略

    If(fangxiang == 0){

        If(    //当前持有的非空仓(持平或者多仓),且线型呈现空头排列,出现最低级反转

            MarketPosition!=-1

            And

                (AvgValue5 > AvgValue4)

            And

                (AvgValue4 > AvgValue3)

            And

                (AvgValue3 > AvgValue2)

            And

                (AvgValue2 > AvgValue1)

            And

                (AvgValue2[1] < AvgValue1[1])

        )

        {

            SellShort(BuyLots,Close);

        }

        If(    //当前持有空仓,线型初步呈现空头排列,出现线型破坏

            MarketPosition==-1

            And

                (AvgValue5 > AvgValue4)

            And

                (AvgValue4 > AvgValue3)

            And

                (AvgValue3 > AvgValue2)

            And

                (AvgValue2 < AvgValue1)

        )

        {

            BuyToCover(BuyLots,Close);

        }

    }

    //大方向为多的持仓策略

    If(fangxiang == 1){

        If(//当前持有的非多仓(持平或者空仓),且线型呈现多头排列,出现最低级反转

            MarketPosition!=1

            And

                (AvgValue5 < AvgValue4)

            And

                (AvgValue4 < AvgValue3)

            And

                (AvgValue3 < AvgValue2)

            And

                (AvgValue2 < AvgValue1)

            And

                (AvgValue2[1] > AvgValue1[1])

        )

        {

            Buy(BuyLots,Close);

        }

        If(    //当前持有多仓,线型初步呈现多头排列,出现线型破坏

            MarketPosition==1

            And

                (AvgValue5 < AvgValue4)

            And

                (AvgValue4 < AvgValue3)

            And

                (AvgValue3 < AvgValue2)

            And

                (AvgValue2 > AvgValue1)

        )

        {

            Sell(BuyLots,Close);

        }

    }

    

    PlotNumeric(“MA_01”,AvgValue1);

    PlotNumeric(“MA_02”,AvgValue2);

    PlotNumeric(“MA_03”,AvgValue3);

    PlotNumeric(“MA_04”,AvgValue4);

    PlotNumeric(“MA_05”,AvgValue5);

End





//————————————————————————

// 编译版本    GS2010.12.08

// 用户版本    2015/06/28 22:59

// 版权所有    zlqh29000620

// 更改声明    TradeBlazer Software保留对TradeBlazer平台

//            每一版本的TrabeBlazer公式修改和重写的权利

//————————————————————————



더보기

R_Break策略


R-Breaker



在外汇交易系统中,枢轴点 (Pivot Points) 交易方法是一种经典的交易策略。Pivot Points是一个非常单纯的阻力支撑体系,根据昨日的最高价、最低价和收盘价,计算出七个价位,包括一个枢轴点、三个阻力位和三个支撑位。



Pivot Points策略的原理图 R-Breaker <wbr><wbr> <wbr><wbr>交易策略













期货



阻力线和支撑线是技术分析中经常使用的工具之一,并且支撑线和压力线的作用是可以互相转化的。从交易的角度上来看,Pivot Point好比是作战地图,给投资者指出了盘中应该关注的支撑和阻力价位,而至于具体的战术配合,Pivot Point并没有具体地规定,完全取决于投资者自身的交易策略。投资者可以根据盘中价格和枢轴点、支撑位和阻力位的相关走势灵活地制定策略,甚至可以根据 关键点位进行加减仓的头寸管理。



R-Breaker策略的原理图 R-Breaker <wbr><wbr> <wbr><wbr>交易策略








期货



R-Breaker根据昨日价格计算出六个价位作为今日盘中交易的参考价位,只是比Pivot Points的设置少了一个枢轴点。R-BreakerPivot Points的不同点体现在:通过参数设置,使得六个价格间的距离更加灵活,并且R-Breaker明确了具体的交易策略。根据盘中价格走势,同时采取趋 势追踪和反转策略。图中有颜色背景的区域可以视为观察区,当盘中日内最高价触及Ssetup后出现回落,且跌破参考Senter的阻力线时,采取反转策 略,即在S1点开仓做空;在空仓的情况下,如果盘中价格一路突破Bbreak的阻力线时,则采取趋势追踪策略,即在B2点开仓做多。类似地,B1点反转做 S2点顺势做空








(。。。。。上图进一步的说明详解:主要的思想依据上图为:



根据前一个交易日的收盘价最高价最低价数据通过一定方式计算出六个价位,从大到小依次为:突破买入价(Bbreak)、观察卖出价(Ssetup)、反转卖出价(Senter)、反转买入价(Benter)、观察买入价(Bsetup)、突破卖出价(Sbreak)以此来形成当前交易日盘中交易的触发条件。这里,通过对计算方式的调整。可以调节六个价格间的距离。



 



交易规则:



反转:



持多单,当日内最高价超过观察卖出价后,盘中价格出现回落,且进一步跌破反转卖出价构成的支撑线时,采取反转策略,即在该点位反手做空;



持空单,当日内最低价低于观察买入价后,盘中价格出现反弹,且进一步超过反转买入价构成的阻力线时,采取反转策略,即在该点位反手做多;



突破:



在空仓的情况下,如果盘中价格超过突破买入价,则采取趋势策略,即在该点位开仓做多




在空仓的情况下,如果盘中价格跌破突破卖出价,则采取趋势策略,即在该点位开仓做空;。。。








由于盘中开仓的触发条件涉及到多个价位,对日内价格走势较为敏感,因此该策略适用于在一分钟周期上交易。另外,该策略触发的交易次数并不多,不考虑跨周期的条件。TB IF8881分钟数据源最早为2010/4/28,其他测试条件和Dual Thrust相同。



6R-Breaker策略的累计收益率













R-Breaker <wbr><wbr> <wbr><wbr>交易策略










股指期货



R-Breaker中距离参数的设置对交易触发次数和最终收益率有一定影响,为了验证其策略的有效性,把R-Breaker的思路移植到距离参 数固定的Pivot Point上,测试结果显示收益率103.6%、最大资产回撤值比例14.6%、胜率40.96%、均盈利/均亏损1.97、交易次数595








——————————————————————–



R_Break  TB代码



——————————————————————–



//————————————————————————

// 简称: _R_Break

// 名称: _R_Break

// 类别: 公式应用

// 类型: 用户应用

// 输出:

//————————————————————————



Params

Numeric notbef(9.00);

Numeric notaft(14.55);

Numeric f1(0.35);

Numeric f2(0.07);

Numeric f3(0.25);

Numeric reverse(1.00);

Numeric rangemin(0.2);

Numeric xdiv(3);



Vars

NumericSeries ssetup(0);

NumericSeries bsetup(0);

NumericSeries senter(0);

NumericSeries benter(0);

NumericSeries bbreak(0);

NumericSeries sbreak(0);

NumericSeries ltoday(0);

NumericSeries hitoday(9999);

NumericSeries startnow(0);

NumericSeries div(0);

BoolSeries rfilter(false);

Numeric i_reverse;

Numeric i_rangemin;

Numeric i_vB;

Numeric i_vS;



Begin

i_reverse = reverse(OpenD(0)/100);

i_rangemin = rangemin
(OpenD(0)/100);

if(BarStatus==0)

{

        startnow=0;

        div=max(xdiv,1);

}



if(Date != Date[1])

{

        SetGlobalVar(0,0);

        SetGlobalVar(1,0);

        startnow=startnow+1;

        ssetup=hitoday[1]+f1(Close[1]-ltoday[1]);

        senter=((1+f2)/2)
(hitoday[1]+Close[1])-(f2)ltoday[1];

        benter=((1+f2)/2)
(ltoday[1]+Close[1])-(f2)hitoday[1];

        bsetup=ltoday[1]-f1
(hitoday[1]-Close[1]);

        bbreak=ssetup+f3(ssetup-bsetup);

        sbreak=bsetup-f3
(ssetup-bsetup);



        hitoday=High;

        ltoday=Low;



        rfilter=(hitoday[1]-ltoday[1])>=i_rangemin;

}



if(High>hitoday)

{

        hitoday=High;

}

if(Low<ltoday)

{

        ltoday=Low;

}

if(Time100>=notbef and Time100<notaft and startnow>=2 and rfilter)

{



       if(Time != GetGlobalVar(1) and GetGlobalVar(1) != 0)

        {

                SetGlobalVar(1,10000);

        }

        if(hitoday>=ssetup and marketposition>-1 and GetGlobalVar(1)<1)

        {

                If(Low<=(senter+(hitoday-ssetup)/div))

                {

                        SellShort(1,senter+(hitoday-ssetup)/div);

                        SetGlobalVar(1,Time);

                        Return;

                }

        }

        if(ltoday<=bsetup and marketposition<1  and GetGlobalVar(1)<1)

        {

                If(High>=(benter-(bsetup-ltoday)/div))

                {

                        Buy(1,benter-(bsetup-ltoday)/div);

                        SetGlobalVar(1,Time);

                        Return;

                }

        }



        if(marketposition==-1)

        {

                SetGlobalVar(0,1);

                if(High-EntryPrice>=i_reverse)

                {

                        BuyToCover(1,entryprice+i_reverse);

                        Return;

                }

        }

        if(marketposition==1)

        {

                SetGlobalVar(0,1);

                if(EntryPrice-Low>=i_reverse)

                {

                        Sell(1,entryprice-i_reverse);

                        Return;

                }

        }



        if(marketposition==0)

        {

                if(High>=bbreak and GetGlobalVar(0) == 0)

                {

                        Buy(1,bbreak);

                        Return;

                }

        }

        if(marketposition==0)

        {

                if(low<=sbreak  and GetGlobalVar(0) == 0)

                {

                        SellShort(1,sbreak);

                        Return;

                }

        }



}



if(Time*100>=notaft and Time<0.1600)

{



        if(marketposition==-1)

        {

                BuyToCover(1,Open);

        }

        if(marketposition==1)

        {

                Sell(1,Open);

        }



}

End



//————————————————————————

// 编译版本    GS2010.12.08

// 用户版本    2015/06/28 11:10

// 版权所有    zlqh29000620

// 更改声明    TradeBlazer Software保留对TradeBlazer平台

//            每一版本的TrabeBlazer公式修改和重写的权利

//————————————————————————


더보기

交易开拓者中MA线的画法



日内交易策略Dual Thrust





Dual
Thrust
R-Breaker一样,曾长期排名 Future Trust杂志最赚钱的策略。该策略在形式上和开盘区间突破策略类似。不同点主要体现在两方面:Dual ThrustRange(代码中的浮动区间)的设置上,引入前N日的四个价位,使得一定时期内的Range相对稳定,可以适用于日间的趋势跟踪;Dual Thrust对于多头和空头的触发条件,考虑了非对称的幅度,做多和做空参考的Range可以选择不同的周期数,也可以通过参数K1K2来确定。



더보기

交易开拓者画线



我的QQ空间被关闭,所以我决定换成了github空间

我的QQ空间被关闭了,已经申诉了一个星期,但是毫无效果。

那天在QQ群里和同事发送文件,赫然的出现了一个大大的惊叹号:“您发送的文件有危险代码,禁止发送”……

于是我决定换个空间把,换个github空间。

之前自己写了一个jekyll的博客空间,但是只有简单的日志功能,今天进行了一些改造:

더보기

jekyll常用语法


前言


如果你只想快速搭建一个 github 的静态网站, 而暂时没有时间来研究 jekyll 语法的话,建议直接 fork 我的这个


当然,阅读一下之前我记录的一些笔记也可以增长一些知识.



不过,现在我要记录一个比较完整的语法来建立一个功能比较健全记录型博客.


具体官方文档地址请参考 官方文档.

这里只介绍关于 jekyll 的语法,不介绍其他内容.


开始


Jekyll 是什么?


jekyll 是一个静态网站生成器.

jekyll 通过 标记语言 markdowntextile 和 模板引擎 liquid 转换生成网页.

github 为我们提供了这个一个地方, 可以使用 jekyll 做一个我们自己的网站.


这里不介绍怎么在本地安装使用 jekyll, 如果你想在本地使用,请参考官方文档的 安装教程使用教程.

不过这里可以透漏一下, jekyll 依赖于 ruby .


配置


注意,配置不用使用 tab . 否则可能会忽略那条命令.


文件介绍


_config.yml


jekyll 的全局配置在 _config.yml 文件中配置.

比如网站的名字, 网站的域名, 网站的链接格式等等.


_includes


对于网站的头部, 底部, 侧栏等公共部分, 为了维护方便, 我们可能想提取出来单独编写, 然后使用的时候包含进去即可.

这时我们可以把那些公共部分放在这个目录下.

使用时只需要引入即可.


{ % include filename % }

_layouts


对于网站的布局,我们一般会写成模板的形式,这样对于写实质性的内容时,比如文章,只需要专心写文章的内容, 然后加个标签指定用哪个模板即可.
对于内容,指定模板了模板后,我们可以称内容是模板的儿子.

为什么这样说呢? 因为这个模板时可以多层嵌套的, 内容实际上模板,只不过是叶子节点而已.


在模板中, 引入儿子的内容.


{ { content } }

在儿子中,指定父节点模板


注意,必须在子节点的顶部.



layout: post


_posts


写的内容,比如博客,常放在这里面, 而且一般作为叶子节点.


_data


也用于配置一些全局变量,不过数据比较多,所以放在这里。


比如这个网站如果是多人开发, 我们通常会在这里面定义一个 members.yml 文件.


文件内容为


- name: 袁小康
github: tiankonguse
oldnick : shen1000
nick : skyyuan

然后在模板中我们就可以通过下面语法使用这些数据了.


site.data.members

_site


jekyll 生成网站输出的地方, 一般需要在 .gitignore 中屏蔽掉这个目录.


index.html


主页文件, 后缀有时也用 index.md 等.

这个需要根据自己的需要来写, 因为不同的格式之间在某些情况下还是有一些细微的差别的.


静态资源


对于其他静态资源, 可以直接放在根目录或任何其他目录, 然后路径和平常的网站一样, 按路径来找链接中的文件.


配置全局变量


虽然全局变量都有自己的默认配置, 但是我们往往会手动配置为自己心中最好的效果.


源代码的位置


这个一般不配置, 默认即可.


source: DIR

当然编译的时候也可以指定,但是使用 github 我们是不能指定参数的.


-s, –source DIR

输出网站位置


这个一般也默认.


# 编译参数 -d, –destination DIR
destination: DIR #配置语法

Safe开关


官方文档上就一句话.


Disable custom plugins, and ignore symbolic links.

大概意思是禁用常用的插件,忽略符号链接.


# 编译参数  –safe
safe: BOOL

忽略文件


这个很有用, 有时候你写了一个文件, 里面的一个东西可能会被 jekyll 处理, 但是你不想让 jekyll 处理的话, 就使用这个语法忽略那些文件吧.


exclude: [DIR, FILE, …]

强制处理文件


有时候我们的一些文件的名字由于不在 jekyll 处理的文件名字范围内,这时候就需要强制处理这些文件了.

比如 .htaccess 文件.


include: [DIR, FILE, …]

时区


我们模板中经常会对时间进行转换,这个时候如果至指定时区的话,可能得到的时间会和我们想要的时间错几个小时.


# timezone: Asia/Shanghai
timezone: TIMEZONE

编码


大家都是程序员,就不用多说了.


# encoding : utf-8
encoding: ENCODING

模板语法


模板语法实际上分两部分, 一部分是头部定义,另一部分是语法.


头部定义


头部定义主要用于指定模板(layout)和定义一些变量, 比如 标题(title), 描述(description), 分类(category/categories), tags, 是否发布(published), 自定义变量.



layout: post
title: title
category: blog
description: description
published: true # default true


模板语法


使用变量


所有的变量是都一个树节点, 比如模板中定义的头部变量,需要使用下面的语法获得


page.title

page 是当前页面的根节点.


其中全局根结点有



  • site _config.yml 中配置的信息

  • page 页面的配置信息

  • content 模板中,用于引入子节点的内容

  • paginator 分页信息


site 下的变量



  • site.time 运行 jekyll 的时间

  • site.pages 所有页面

  • site.posts 所有文章

  • site.related_posts 类似的10篇文章,默认最新的10篇文章,指定lsi为相似的文章

  • site.static_files 没有被 jekyll 处理的文章,有属性 path, modified_time 和 extname.

  • site.html_pages 所有的 html 页面

  • site.collections 新功能,没使用过

  • site.data _data 目录下的数据

  • site.documents 所有 collections 里面的文档

  • site.categories 所有的 categorie

  • site.tags 所有的 tag

  • site.[CONFIGURATION_DATA] 自定义变量


page 下的变量



  • page.content 页面的内容

  • page.title 标题

  • page.excerpt 摘要

  • page.url 链接

  • page.date 时间

  • page.id 唯一标示

  • page.categories 分类

  • page.tags 标签

  • page.path 源代码位置

  • page.next 下一篇文章

  • page.previous 上一篇文章


paginator 下的变量



  • paginator.per_page 每一页的数量

  • paginator.posts 这一页的数量

  • paginator.total_posts 所有文章的数量

  • paginator.total_pages 总的页数

  • paginator.page 当前页数

  • paginator.previous_page 上一页的页数

  • paginator.previous_page_path 上一页的路径

  • paginator.next_page 下一页的页数

  • paginator.next_page_path 下一页的路径


字符转义


有时候想输出 { 了,怎么办,使用 \ 转义即可.


{ => {

输出变量


输出变量直接使用两个大括号括起来即可.


{ { page.title } }

循环


和平常的解释性语言很想.


{ % for post in site.posts % }
<a href=”http://blog/2014/11/10/jekyll-study/{ { post.url } }”>{ { post.title } }</a>
{ % endfor % }

自动生成摘要


  { % for post in site.posts % }
{ { post.url } } { { post.title } }
{ { post.excerpt | remove: ‘test’ } }
{ % endfor % }

删除指定文本


remove 可以删除变量中的指定内容


{ { post.url | remove: ‘http’ } }

删除 html 标签


这个在摘要中很有用.


{ { post.excerpt | strip_html } }

代码高亮


{ % highlight ruby linenos % }
# some ruby code
{ % endhighlight % }

数组的大小


{ { array | size } }

赋值


{ % assign index = 1 % }

格式化时间


{ { site.time | date_to_xmlschema } } 2008-11-07T13:07:54-08:00
{ { site.time | date_to_rfc822 } } Mon, 07 Nov 2008 13:07:54 -0800
{ { site.time | date_to_string } } 07 Nov 2008
{ { site.time | date_to_long_string } } 07 November 2008

搜索指定key


# Select all the objects in an array where the key has the given value.
{ { site.members | where:”graduation_year”,”2014” } }

排序


{ { site.pages | sort: ‘title’, ‘last’ } }

to json


{ { site.data.projects | jsonify } }

序列化


把一个对象变成一个字符串


{ { page.tags | array_to_sentence_string } }

单词的个数


{ { page.content | number_of_words } }

指定个数


得到数组指定范围的结果集


{ % for post in site.posts limit:20 % }

内容名字规范


对于博客,名字必须是 YEAR-MONTH-DAY-title.MARKUP 的格式.


比如


-11-06-memcached-code.md
-11-06-memcached-lib.md
-11-06-sphinx-config-and-use.md
-11-07-memcached-hash-table.md
-11-07-memcached-string-hash.md



더보기

技术的巅峰




做程序猿的,多有一个到达技术巅峰的梦想。

只是从没有人知道什么是技术的巅峰

今天看了一段代码,是某业内高能的作品,解决了高并发,高可用的一系列难题……

但感觉这类代码已无新意,高并发不过是分而治之,高可用无非是出错了有下一个备选方案。

如罗玉凤所说:“如果黄灿灿长这样都能称之为女神,那么我就是中国的国花,地球的球花。”

程序猿的雄起,在于他有一个英雄的梦想:我可以创造世界上独一无二的代码,进而改变世界创造未来

没错,很多人做到了,他们创造了lisp,aogol,c,c++,java,ruby,python………

假如没有他们,火箭恐怕要拖着长长的信号线才能射到月球



但没有他们,火箭拖着长长的信号线也能到达月球。


技术的巅峰是一个虚幻的概念,没人能够到达

程序猿则只能做自己,让自己能解决一切问题,进而受人尊敬,活成自我



PS:生命也开了一个残酷的玩笑。接触过人工智能的都知道,机器学习有两个概念,训练与测试。

程序猿长久的训练模式就是:努力打代码,能解决一切问题,加薪升职受人尊敬……

长久下来,程序猿隐约有个“技术巅峰”的梦想,但是谁也说不准这巅峰在哪儿,大家漫无目的向前冲,

有的人累了,就离开了,有的人还能忍受,就坚持着,有的人以此为乐,就开心着。



더보기

lua使用手册

<!DOCTYPE html PUBLIC “-//W3C//DTD XHTML 1.0 Transitional//EN”>


Lua 5.2 参考手册











官网


Lua 5.2 参考手册



by Roberto Ierusalimschy, Luiz Henrique de Figueiredo, Waldemar Celes



Copyright © 2011–2013 Lua.org, PUC-Rio.
Freely available under the terms of the
Lua license.




keyring (译) keyrings@163.com






开始
·
目录
·
索引
·
英文版
·
Github




目录




索引










Lua functions



_G

_VERSION



assert

collectgarbage

dofile

error

getmetatable

ipairs

load

loadfile

next

pairs

pcall

print

rawequal

rawget

rawlen

rawset

require

select

setmetatable

tonumber

tostring

type

xpcall



bit32.arshift

bit32.band

bit32.bnot

bit32.bor

bit32.btest

bit32.bxor

bit32.extract

bit32.lrotate

bit32.lshift

bit32.replace

bit32.rrotate

bit32.rshift



coroutine.create

coroutine.resume

coroutine.running

coroutine.status

coroutine.wrap

coroutine.yield



debug.debug

debug.getuservalue

debug.gethook

debug.getinfo

debug.getlocal

debug.getmetatable

debug.getregistry

debug.getupvalue

debug.setuservalue

debug.sethook

debug.setlocal

debug.setmetatable

debug.setupvalue

debug.traceback

debug.upvalueid

debug.upvaluejoin



file:close

file:flush

file:lines

file:read

file:seek

file:setvbuf

file:write



io.close

io.flush

io.input

io.lines

io.open

io.output

io.popen

io.read

io.stderr

io.stdin

io.stdout

io.tmpfile

io.type

io.write



 



math.abs

math.acos

math.asin

math.atan

math.atan2

math.ceil

math.cos

math.cosh

math.deg

math.exp

math.floor

math.fmod

math.frexp

math.huge

math.ldexp

math.log

math.max

math.min

math.modf

math.pi

math.pow

math.rad

math.random

math.randomseed

math.sin

math.sinh

math.sqrt

math.tan

math.tanh



os.clock

os.date

os.difftime

os.execute

os.exit

os.getenv

os.remove

os.rename

os.setlocale

os.time

os.tmpname



package.config

package.cpath

package.loaded

package.loadlib

package.path

package.preload

package.searchers

package.searchpath



string.byte

string.char

string.dump

string.find

string.format

string.gmatch

string.gsub

string.len

string.lower

string.match

string.rep

string.reverse

string.sub

string.upper



table.concat

table.insert

table.pack

table.remove

table.sort

table.unpack



C API



lua_Alloc

lua_CFunction

lua_Debug

lua_Hook

lua_Integer

lua_Number

lua_Reader

lua_State

lua_Unsigned

lua_Writer



lua_absindex

lua_arith

lua_atpanic

lua_call

lua_callk

lua_checkstack

lua_close

lua_compare

lua_concat

lua_copy

lua_createtable

lua_dump

lua_error

lua_gc

lua_getallocf

lua_getctx

lua_getfield

lua_getglobal

lua_gethook

lua_gethookcount

lua_gethookmask

lua_getinfo

lua_getlocal

lua_getmetatable

lua_getstack

lua_gettable

lua_gettop

lua_getupvalue

lua_getuservalue

lua_insert

lua_isboolean

lua_iscfunction

lua_isfunction

lua_islightuserdata

lua_isnil

lua_isnone

lua_isnoneornil

lua_isnumber

lua_isstring

lua_istable

lua_isthread

lua_isuserdata

lua_len

lua_load

lua_newstate

lua_newtable

lua_newthread

lua_newuserdata

lua_next

lua_pcall

lua_pcallk

lua_pop

lua_pushboolean

lua_pushcclosure

lua_pushcfunction

lua_pushfstring

lua_pushglobaltable

lua_pushinteger

lua_pushlightuserdata

lua_pushliteral

lua_pushlstring

lua_pushnil

lua_pushnumber

lua_pushstring

lua_pushthread

lua_pushunsigned

lua_pushvalue

lua_pushvfstring

lua_rawequal

lua_rawget

lua_rawgeti

lua_rawgetp

lua_rawlen

lua_rawset

lua_rawseti

lua_rawsetp

lua_register

lua_remove

lua_replace

lua_resume

lua_setallocf

lua_setfield

lua_setglobal

lua_sethook

lua_setlocal

lua_setmetatable

lua_settable

lua_settop

lua_setupvalue

lua_setuservalue

lua_status

lua_toboolean

lua_tocfunction

lua_tointeger

lua_tointegerx

lua_tolstring

lua_tonumber

lua_tonumberx

lua_topointer

lua_tostring

lua_tothread

lua_tounsigned

lua_tounsignedx

lua_touserdata

lua_type

lua_typename

lua_upvalueid

lua_upvalueindex

lua_upvaluejoin

lua_version

lua_xmove

lua_yield

lua_yieldk



auxiliary library



luaL_Buffer

luaL_Reg



luaL_addchar

luaL_addlstring

luaL_addsize

luaL_addstring

luaL_addvalue

luaL_argcheck

luaL_argerror

luaL_buffinit

luaL_buffinitsize

luaL_callmeta

luaL_checkany

luaL_checkint

luaL_checkinteger

luaL_checklong

luaL_checklstring

luaL_checknumber

luaL_checkoption

luaL_checkstack

luaL_checkstring

luaL_checktype

luaL_checkudata

luaL_checkunsigned

luaL_checkversion

luaL_dofile

luaL_dostring

luaL_error

luaL_execresult

luaL_fileresult

luaL_getmetafield

luaL_getmetatable

luaL_getsubtable

luaL_gsub

luaL_len

luaL_loadbuffer

luaL_loadbufferx

luaL_loadfile

luaL_loadfilex

luaL_loadstring

luaL_newlib

luaL_newlibtable

luaL_newmetatable

luaL_newstate

luaL_openlibs

luaL_optint

luaL_optinteger

luaL_optlong

luaL_optlstring

luaL_optnumber

luaL_optstring

luaL_optunsigned

luaL_prepbuffer

luaL_prepbuffsize

luaL_pushresult

luaL_pushresultsize

luaL_ref

luaL_requiref

luaL_setfuncs

luaL_setmetatable

luaL_testudata

luaL_tolstring

luaL_traceback

luaL_typename

luaL_unref

luaL_where







1 – 简介




Lua 是一门扩展型程序设计语言,用于辅助一般的过程式编程。当然,它也对面向对象编程、函数式编程和数据驱动式编程提供良好的支持。Lua
作为一门强大、轻量、可嵌入式的脚本语言能供任何需要的程序使用。Lua 是由 clean
C(标准 C和C++的一个共通子集)实现的一个库。


作为一门扩展型语言,Lua没有“main”程序的概念:它只能嵌入宿主程序,宿主程序被称为 embedding program 或者简称 host。宿主程序可以调用函数执行一段 Lua 代码,可以读写 Lua 变量,甚至可以注册 C 函数以在Lua代码中调用。通过对 C 函数的使用,Lua足以应付各种领域,完全可以共享一个句法框架而定制不同的程序语言。Lua官方发布版包含一个叫 lua 的宿主程序示例,它是一个利用Lua库写成的完整独立的Lua解释器,一般用于交互和批处理。



Lua 作为自由软件,就像license里面所说,使用它是不需要抵押品的 :)。本手册所描述的实现可以在 Lua 官方网站 www.lua.org 中找到。



就像任何参考手册一样,这份文档某些地方有点枯燥。关于 Lua 背后设计思想的探讨,可以看看 Lua 官方网站上的技术论文。至于Lua编程的详细介绍,请参阅Roberto的书, Programming in Lua(当前最新是第三版)。


2 – 基本概念




本章节介绍 Lua 语言里的基本概念。

2.1 – 值与类型




Lua 是一门动态类型语言。这意味着变量没有类型,只有值。Lua 没有类型定义,由值本身携带自己的类型信息。


Lua 中的所有值均是 first-class values(第一类值)。这意味着所有的值均可存于变量中,也可作为参数传递给其他函数,也可作为函数结果被返回。


Lua中有八种基本类型:
nil(空)boolean(布尔)number(数字)string(字符串)function(函数)userdata(用户数据)thread(线程)table(表)


Nil 类型只有值 nil,主要用于标识与其他值的不同;通常代表无意义的值。


Boolean 类型只有两种值 falsetrue
nilfalse 都表示条件为假;而其他任何值均表示为真。


Number 表示实数(双精度浮点数)。数字间的运算操作与底层C实现遵循相同的规则,一般就是IEEE754标准。(使用内部其他数字类型如单精度浮点或长整型重新编译一个Lua解释器也非常容易;参见 luaconf.h 文件。)


String 代表字节串。Lua is 8-bit clean:字符串可以包含任意8-bit值,包括 ‘\0‘ 。


Lua 可以调用(操作)由 Lua 和 C 写成的 Function (参见 §3.4.9)。


userdata 类型用来将任意 C 数据保存在 Lua 变量中。
一个 userdata 类型的值就是一块原生内存的指针。  userdata 分两类:full userdata 和 light userdata ,前者的内存块由 Lua 管理;后者的内存块由 host 管理。
Userdata 在 Lua 中除了赋值与鉴定测试便没有其他预定义操作了。但是通过使用 metatables(元表),程序员可以为 full userdata 类型的值自定义操作(参见 §2.4)。
Userdata 类型的值不能在 Lua 中创建与修改,只能通过 C API。这样保证了宿主程序能完全掌管其中的数据。


thread 代表独立的执行线程,用于实现 coroutines(协同程序)(参见 §2.6)。不要把 Lua 线程与操作系统线程搞混。Lua 在所有系统上均支持 coroutines,即使系统并不支持 threads 。


table 类型实现了关联数组。也就是说,该数组可以用任何 Lua 值(除了nil 和 NaN)作索引,而不仅限于数字。
Tables 可以包含所有类型的值(除了nil)。任何带 nil 值的键都不是 table 的一部分。相应的,任何不属于 table 的键都关联一个 nil 值。



Table 是 Lua 中唯一的数据组织机制,可以用于表示普通数组、序列、符号表、集合、记录、图、树等等。在表示记录时,Lua 以域作为索引。语言支持以 a.name 来表示 a[“name”],这只是一种语法糖。table 的创建方式有很多种(参见 §3.4.8)。



我们使用 序列 这个词来表示一个递增表,其索引为 {1..n} ,其中的 n 表示序列的长度(参见 §3.4.6)。



与索引一样,table 中的域也可为任意类型。特别的,由于函数也是 first-class values (第一类值/一等公民),所以 table 的域也可包含函数。从而 table 也能携带 methods (参见 §3.4.10)。(译注:这为面向对象提供了基础)



table 的索引遵循语言中定义的原生相等性。表达式 a[i]a[j] 只在 ij 原生相等(指无元方法的相等)时才表示同一个表元素。



Table、function、thread 和 (full) userdata 类型的值均是 对象:变量实际上不含有 值,只是引用 值。赋值、参数传递和函数返回等操控的只是值的引用;这些操作不会做任何性质的拷贝。



库函数 type 可以返回一个给定值的类型(参见 §6.1)。


2.2 – 环境与全局变量




就像在 §3.2§3.3.3 讨论的那样,任何对全局名称 var 的引用均会被翻译成 _ENV.var。此外,任何在局部变量之外编译的程序块均叫作
_ENV(参见 §3.3.2),
所以 _ENV 本身在程序块中从来都不是全局名称。



尽管存在外部 _ENV 变量用于全局名称的翻译,_ENV 本身其实是一个完全符合命名规则的名称。你完全可以定义新的变量/参数并取这个名字。每一次使用 _ENV 对全局名称的引用在当时对程序是可见的,完全遵循 Lua 通用可见性规则(参见 §3.5)。



任何被存储 _ENV 值的表叫作 environment(环境).



Lua 维持一个叫 global environment(全局环境)的特殊环境。这个值在 C 注册表(参见 §4.5)表示一个特殊索引。在 Lua 中,变量 _G 被初始化为相同值。



当 Lua 编译一个 chunk(程序块)时,会先将其中 _ENV 的值提升为全局环境(参见 load)。因此,默认情况下,Lua代码中的全局变量一般指的是全局环境里的入口。此外,加载到全局环境下的所有标准库和部分函数均是在该环境下运作。你可以使用 load (或者 loadfile)来加载一个不同环境下的 chunk。