: | : | :期货程序化 | :期货程序化研究 | :期货量化学习 | :期货量化 |
返回列表 发帖

MultiCharts编程-PowerLanguage-Comparison and loops比较和循环

MultiCharts编程-PowerLanguage-Comparison and loops比较和循环

6 Comparison and loops比较和循环

本章对逻辑比较的关键字和程序语言的基本执行流程关键字做了详尽的说明。PL中的程序流程控制语法包括:

if…then…begin…endfor…while…switch…case…once…

其中if…then…是最常用的条件判断控制语法,针对逻辑表达式做比较,可以与elsebegin…end…结合使用,组合出不同的条件控制流程。因字典中没有switch…case…once…的定义,下面对两者的使用举例说明。

switch…case是条件判断式,它针对字符串或数值比较。如果对同一个变量或表达式做多重判断,可以使用switch…case会比if…then…有效率。

  Switch…case  
  

说明

  
  

以下语法,会先计算switch后的表达式的值。针对计算结果,对case设定的值,从上到下依次比较,如果符合某一个case的值,则执行其冒号(:)后的陈述式;若不符合,则比较下一个case;所有case都不符合,则执行default后的陈述式,default是可选项。

  
  

语法

  
  

Switch (E1or String1)

  

Begin

  

Case E2
or
String2 :

  


Instruction1;

  

Default:

  

Instruction2;

  

End;

  
  

参数

  
  

E1E2——数值表达式。

  

String1 String2——字符串表达式。

  

Instruction——陈述式。

  
  

范例

  
  

当前图表的持仓手数小于等于3,并大于等于1时,买入开仓;持仓手数为4,并且close上穿前10K线close的均价时,平仓全部:

  

Switch(CurrentContracts)

  

Begin

  

Case 1,2,3:// or  Case 1 to  3:

  

Buy(“B4”) Next Bar At  Market;

  

Case 4:

  

If Close Cross Over Average(C[1],10) Then

  

Sell Next Bar At Market;

  

End;

  


默认的程序会在每根Bar结束时执行一次。而有些程序我们希望它只执行一次,那么Once指令则提供了此功能。

  Once  
  

说明

  
  

限制其后的陈述式,在整个程序运算中只执行一次。

  
  

语法

  
  

Once Instruction1;

  

  

Once <(E)>
Begin

  

Instruction2;

  

End;

  

<>内的表达式是可选的。

  
  

参数

  
  

E——逻辑表达式,True/False类型。

  

Instruction——陈述式。

  
  

范例

  
  

在程序第一次执行时,把当根Bar的开盘价赋给变量Value1

  

Once Value1=Open;

  

等同于:If CurrentBar=1 Then Value1=Open;

  

当第一次满足close>open时,把当时Bar的开盘价赋给变量Value1

  

Once (Close<Open) Begin

  

Value1=Open;

  

End;

  


  Above/Over  
  

说明

  
  

Cross配合使用,指定交叉的方向。Above指定向上的方向(值从小到大)。

  

画线A向上交叉穿过画线B的定义如下:当前K棒的A值大于B值且满足下面的其中一个条件:

  

1、前一根K棒中A值小于B值。

  

2、前一根或前几根K棒的A值等于B值,再之前的KA值小于B值。

  

更多信息参考Cross

  
  

语法

  
  

E1 Cross Above E2

  

或:

  

Plot1 Cross Above Plot2

  
  

参数

  
  

E1,  E2——数值表达式。

  
  

范例

  
  

当收盘价上穿1350.00时,发出警报:

  

Plot1(Close);

  

If
Plot1
Cross
Above
1350.50
Then

  

Alert("Price has crossed above 1350.00");

  


  And  
  

说明

  
  

一个逻辑运算符(布尔型),当所有的运算式都为True时,返回True。逻辑运算符用于逻辑(布尔)的判断。

  
  

语法

  
  

E1
And E2

  
  

参数

  
  

E1,E2——逻辑表达式,值为true/false

  
  

范例

  
  

2=1
And
2=2
返回值为 False

  

True And True And True 返回值为True

  


  Begin  
  

说明

  
  

End搭配使用建立一组一至多行陈述式的陈述式组。一个Begin之后一定有一个对应的End

  

Begin...End可以跟在Then, Else, For, While条件语句后使用。

  

Begin后无需加分号(;),整个陈述式组中的每句陈述式都要以分号(;)结束,在建构成完整陈述式之后的End也要加上分号(;)结尾。

  
  

语法

  
  

Conditions
Begin

  

Instruction1;

  

Instruction2;

  

Instruction3;

  

End;

  
  

参数

  
  

Conditions——条件语句; Instruction——陈述式。

  
  

范例

  
  

如果满足条件 Uptrend 则开多仓,否则开空仓:

  

If
UpTrend Then Begin Buy Next Bar Market;

  

End

  

Else BeginSellShort Next Bar Market;

  

End;

  


  Below/Under
  
  

说明

  
  

Cross组合使用来指定交叉的方向。Below指定了一个向下(值由大到小)的方向。

  

画线A向下交叉穿过画线B的定义如下:当前KA值小于B值且满足下面的其中一个条件:

  

1、前一根K棒中A值大于B值。

  

2、前一根或前几根K棒的A值等于B值,再之前的KA值大于B值。

  

更多信息参考Cross

  
  

语法

  
  

E1
Cross
Below E2

  

或:

  

Plot1
Cross
Below
Plot2

  
  

参数

  
  

E1, E2——数值表达式。

  
  

范例

  
  

当收盘价向下穿过1350.00时,发出警报:

  

Plot1(Close);

  

If
Plot1
Cross
Below
1350.50
Then

  

Alert("Price has crossed below 1350.00");  

  


  Break  
  

说明

  
  

退出循环。

  
  

语法

  
  

Break;

  
  

范例

  
  

For
Value1
=
0
To
10
Begin

  

If
(
close[Value1]
=
open[Value1]
)
Then
Break;

  

End;

  

If
Value1
<=
10
Then
print("Open = Close ", Value1:0:0,
" Bars ago.");  

  


  Cross/Crosses  
  

说明

  
  

如果在当前K棒,数值表达式A的画线和数值表达式B的画线按指定方向交叉,则返回True

  

Above, Over,  Below, Under参量用来指定交叉的方向。AboveOver可替换,用来表示向上的方向(值从小到大),BelowUnder可替换,用来表示向下的方向(值从大到小)。

  

画线A向上交叉穿过画线B的定义如下:当前K棒的A值大于B值且满足下面的其中一个条件:

  

1、前一根K棒中A值小于B值。

  

2、前一根或前几根K棒的A值等于B值,再之前的KA值小于B值。

  

画线A向下交叉穿过画线B的定义如下:当前KA值小于B值且满足下面的其中一个条件:

  

1、前一根K棒中A值大于B值。

  

2、前一根或前几根K棒的A值等于B值,再之前的KA值大于B值。

  
  

语法

  
  

E1
Cross  Direction E2

  

  

Plot1 Cross Direction  Plot2

  
  

参数

  
  

E1,  E2——数值表达式;

  

Direction——必要的参量;Above, Over, Below, Under用来指定交叉的方向

  
  

范例

  
  

当收盘价上穿1350.00时,发出警报:

  

Plot1(Close);

  

If
Plot1
Cross
Above
1350.50
Then

  

Alert("Price has crossed above 1350.00");

  


  DownTo  
  

说明

  
  

For搭配使用构成一个For循环,For循环陈述式反复执行直到循环次数达到设定的终值。

  

每完成一次循环,DownTo
所指定的循环计数变量值就减一。

  

更多信息参考For

  
  

语法

  
  

For
Counter=IValue DownTo FValue Begin

  

Instruction1;

  

Instruction2;

  

End;

  
  

参数

  
  

Counter——数值变量,用来存储循环计数值。

  

IValue——数值表达式,指定起始计数值。

  

FValue——数值表达式,指定最终计数值。

  

Instruction——陈述式。

  
  

范例

  
  

将前10Bar的最高价之和赋值给HighPriceSum

  

Variable: BarBackNo (0), HighPriceSum(0);

  

For
BarBackNo=9
DownTo
0
Begin

  

HighPriceSum=HighPriceSum+High[BarBackNo];

  

End;

  


  Else  
  

说明

  
  

IfThen联合使用,形成一个条件语句。当某条件成立时,执行特定的陈述式。当条件不成立时,执行Else指定的陈述式。

  

条件执行语句包含IfThen,不包含Else。更多信息请见If

  
  

语法

  
  

If E
Then Instruction1
Else Instruction2

  
  

参数

  
  

E——逻辑表达式,值为true/false

  

Instruction——陈述式。

  
  

范例

  
  

如果满足条件UpTrend 则开多仓,否则开空仓:

  

If UpTrend
Then Buy Next Bar  Market Else SellShort Next Bar Market;

  


  End
  
  

说明

  
  

Begin配合使用建立一组包含一至多行陈述式的陈述式组,一个End之前必须有一个对应的BeginBegin...End要配合If, Then,  For, While使用。

  

Begin后无需加分号(;),整个陈述式组中的每句陈述式都要以分号(;)结束,在建构成完整陈述式之后的End也要加上分号(;)结尾。

  
  

语法

  
  

Conditions
Begin

  

Instruction1;

  

Instruction2;

  

Instruction3;

  

End;

  
  

参数

  
  

Conditions——条件语句;Instruction——陈述式。

  
  

范例

  
  

如果满足条件Uptrend ,则开多仓,否则开空仓:

  

If
UpTrend Then  Begin Buy Next Bar Market;

  

End

  

Else BeginSellShort  Next Bar Market;

  

End;

  


  False  
  

说明

  
  

一个逻辑值(布尔型)。逻辑值用于逻辑(布尔)表达式和宣告布尔型inputs参数。

  
  

语法

  
  

False

  
  

范例

  
  

下面的逻辑判断式返回值为False

  

False
And
True

  

下面的逻辑判断式返回值为 False

  

2=1

  

声明一个初始值为false的逻辑变量LogicalVar

  

Variable:LogicalVar(False);

  

声明一个默认值为false的逻辑input型变量Overnight

  

Input:Overnight(False);

  


  For  
  

说明

  
  

TodownTo
配合使用形成一个For循环语句,For循环陈述式会反复执行直到循环计数值达到指定的终值。

  

循环语句会指定一个变量,用来存储循环的次数,包含循环的开始值和结束值。可以搭配TodownTo使用,To指定的计数变量每完成一次循环就加一,downTo指定的计数变量每完成一次循环是减一。

  

循环语句中的陈述式组需要用Begin...End包含。一个Begin必须跟随一个End

  

Begin后无需加分号(;),整个陈述式组中的每句陈述式都要以分号(;)结束,在建构成完整陈述式之后的End也要加上分号(;)结尾。

  
  

语法

  
  

For
Counter=IValue To FValue Begin

  

Instruction1;

  

Instruction2;

  

End;

  

  

For
Counter=IValue DownTo FValue Begin

  

Instruction1;

  

Instruction2;

  

End;

  
  

参数

  
  

Counter—— 数值变量,用来存储循环计数值。

  

IValue——数值表达式,指定起始计数值。

  

FValue——数值表达式,指定最终计数值。

  

Instruction——陈述式

  
  

范例

  
  

求前10Bar的最高价之和并赋给变量HighPriceSum

  

Variable: BarBackNo (0), HighPriceSum(0);

  

For
BarBackNo=0
To
9
Begin

  

HighPriceSum=HighPriceSum+High[BarBackNo];

  

End;

  

求前10Bar的最高价之和并赋给变量HighPriceSum

  

Variable: BarBackNo (0), HighPriceSum(0);

  

For
BarBackNo=9
DownTo
0
Begin

  

HighPriceSum=HighPriceSum+High[BarBackNo];

  

End;

  


  If  
  

说明

  
  

Then配合使用,形成一个条件语句,如果某条件成立时,则执行特定的陈述式,和Else联合使用,形成一个条件语句,如果条件不成立,则执行Else指定的陈述式。

  

条件执行语句必须包含IfThenElse是可选的。

  

陈述式组需要用Begin...End包含。一个Begin必须跟随一个End

  

Begin后无需加分号(;),整个陈述式组中的每句陈述式都要以分号(;)结束,在建构成完整陈述式之后的End也要加上分号(;)结尾。

  
  

语法

  
  

If E
Then Instruction1
Else Instruction2

  

:

  

If E
Then Begin

  

Instruction1;

  

Instruction2;

  

End
Begin

  

Instruction3;

  

Instruction4;

  

End;

  
  

参数

  
  

E——布林表达式,判断条件是否成立;

  

Instruction——陈述式。

  
  

范例

  
  

如果条件UpTrend为假则卖平:

  

If
UpTrend=False
Then
Sell
Next
Bar
Market;

  

如果条件UpTrend为真就开多仓,否则开空仓:

  

If
UpTrend
Then Buy Next Bar  Market Else SellShort Next Bar Market;

  

如果条件UpTrend为真就开多仓,否则开空仓:

  

If
UpTrend Then Begin

  

Buy Next Bar Market;

  

End

  

Else Begin

  

SellShort Next Bar Market;

  

End ;

  


  Not  
  

说明

  
  

用于布林表达式:取反

  
  

范例

  
  

Condition1取反后赋值给Condition2

  

Condition1 = True;

  

Condition2 = Not
Condition1;

  


  Or
  
  

说明

  
  

一个逻辑运算符(布尔型),如果逻辑表达式中有一个为true时,返回True。逻辑运算符用于逻辑(布尔表达式)的判断。

  
  

语法

  
  

E1
Or  E2

  
  

参数

  
  

E1, E2——布尔型表达式。

  
  

范例

  
  

下面的逻辑运算返回值为False

  

2=1
Or
2>2

  

下面的逻辑运算返回值为True

  

True
Or
False
Or
False

  


  Then  
  

说明

  
  

If配合使用,形成一个条件语句,如果某条件成立时,则执行特定的陈述式,和Else联合使用,形成一个条件语句,如果条件不成立,则执行Else指定的陈述式。

  

条件执行语句必须包含IfThenElse是可选的。

  

陈述式组需要用Begin...End包含。一个Begin必须跟随一个End

  

Begin后无需加分号(;),整个陈述式组中的每句陈述式都要以分号(;)结束,在建构成完整陈述式之后的End也要加上分号(;)结尾。

  
  

语法

  
  

If E
Then Instruction

  
  

参数

  
  

E——条件判断式

  

Instruction——陈述式

  
  

范例

  
  

如果条件UpTrend
为假则卖平:

  

If UpTrend=False Then Sell Next Bar Market;

  


  To  
  

说明

  
  

For搭配使用构成一个For循环,For循环陈述式反复执行直到循环次数达到设定的终值。

  

每完成一次循环,To
所指定的循环计数变量值就加一。

  

更多信息参考For

  
  

语法

  
  

For
Counter=IValue To FValue Begin

  

Instruction1;

  

Instruction2;

  

End;

  
  

参数

  
  

Counter—— 数值变量,用来存储循环计数值。

  

IValue——数值表达式,指定起始计数值。

  

FValue——数值表达式,指定最终计数值。

  

Instruction——陈述式

  
  

范例

  
  

求前10Bar的最高价之和并赋给变量HighPriceSum:

  

Variable: BarBackNo (0), HighPriceSum(0);

  

For
BarBackNo=0
To
9
Begin

  

HighPriceSum=HighPriceSum+High[BarBackNo];

  

End;

  


  True  
  

说明

  
  

逻辑值(布尔型)。用来表示逻辑(布尔)表达式的值和宣告布尔型inputs参数。

  
  

语法

  
  

True

  
  

范例

  
  

下面的逻辑表达式的返回值为 True

  

True Or False

  

下面的逻辑表达式的返回值为 True

  

2=2

  

声明一个初始值为true的变量LogicalVar

  

Variable:LogicalVar(True);

  

声明一个初始值为trueinput型变量Overnight

  

Input:Overnight(True);

  


  While
  
  

说明

  
  

BeginEnd配合使用形成一个While条件循环语句。如果布林表达式判断为真,则不断重复执行一组陈述式,直到条件不再成立。

  

While循环语句中的陈述式组需要用Begin...End包含。一个Begin必须跟随一个End

  

Begin后无需加分号(;),整个陈述式组中的每句陈述式都要以分号(;)结束,在建构成完整陈述式之后的End也要加上分号(;)结尾。

  
  

语法

  
  

While E Begin

  

Instruction1;

  

Instruction2;

  

Instruction3;

  

End;

  
  

参数

  
  

E——布尔表达式

  

Instruction——陈述式

  
  

注意

  
  

使用While循环时,Begin...End内的陈述式必须包含改变循环条件的布林表达式。若没有,可能会造成无穷循环,使用上宜特别小心。PL为避免出现无穷循环的状况,当While循环执行超过5秒仍未停止时,会出现一个执行时错误,并停止执行脚本。

  
  

范例

  
  

求最近十根K棒的最高价之和并赋值给变量HighPriceSum

  

Variable: BarBackNo (0), HighPriceSum(0);

  

BarBackNo= 0;

  

While
BarBackNo<10
Begin

  

HighPriceSum=HighPriceSum+High[BarBackNo];

  

BarBackNo= BarBackNo +1;

  

End;

  

论坛官方微信、群(期货热点、量化探讨、开户与绑定实盘)
 
期货论坛 - 版权/免责声明   1.本站发布源码(包括函数、指标、策略等)均属开放源码,用意在于让使用者学习程序化语法撰写,使用者可以任意修改语法內容并调整参数。仅限用于个人学习使用,请勿转载、滥用,严禁私自连接实盘账户交易
  2.本站发布资讯(包括文章、视频、历史记录、教材、评论、资讯、交易方案等)均系转载自网络主流媒体,内容仅为作者当日个人观点,本网转载此文出于传递更多信息之目的,并不意味着赞同其观点或证实其描述。本网不对该类信息或数据做任何保证。不对您构成任何投资建议,不能依靠信息而取代自身独立判断,不对因使用本篇文章所诉信息或观点等导致的损失承担任何责任。
  3.本站发布资源(包括书籍、杂志、文档、软件等)均从互联网搜索而来,仅供个人免费交流学习,不可用作商业用途,本站不对显示的内容承担任何责任。请在下载后24小时内删除。如果喜欢,请购买正版,谢谢合作!
  4.龙听期货论坛原创文章属本网版权作品,转载须注明来源“龙听期货论坛”,违者本网将保留追究其相关法律责任的权力。本论坛除发布原创文章外,亦致力于优秀财经文章的交流分享,部分文章推送时若未能及时与原作者取得联系并涉及版权问题时,请及时联系删除。联系方式:http://www.qhlt.cn/thread-262-1-1.html
如何访问权限为100/255贴子:/thread-37840-1-1.html;注册后仍无法回复:/thread-23-1-1.html;微信/QQ群:/thread-262-1-1.html;网盘链接失效解决办法:/thread-93307-1-1.html

返回列表