MultiCharts编程-PowerLanguage-Comparison and loops比较和循环
- UID
- 2
- 积分
- 2893117
- 威望
- 1396590 布
- 龙e币
- 1496527 刀
- 在线时间
- 13326 小时
- 注册时间
- 2009-12-3
- 最后登录
- 2024-12-26
|
MultiCharts编程-PowerLanguage-Comparison and loops比较和循环
第6章 Comparison and loops比较和循环 本章对逻辑比较的关键字和程序语言的基本执行流程关键字做了详尽的说明。PL中的程序流程控制语法包括: if…then…、begin…end、for…、while…、switch…case…、once…。 其中if…then…是最常用的条件判断控制语法,针对逻辑表达式做比较,可以与else和begin…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; | 参数 | E1,E2——数值表达式。 String1 ,String2——字符串表达式。 Instruction——陈述式。 | 范例 | 当前图表的持仓手数小于等于3,并大于等于1时,买入开仓;持仓手数为4,并且close上穿前10根K线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值,再之前的K棒A值小于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的定义如下:当前K棒A值小于B值且满足下面的其中一个条件: 1、前一根K棒中A值大于B值。 2、前一根或前几根K棒的A值等于B值,再之前的K棒A值大于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参量用来指定交叉的方向。Above和Over可替换,用来表示向上的方向(值从小到大),Below和Under可替换,用来表示向下的方向(值从大到小)。 画线A向上交叉穿过画线B的定义如下:当前K棒的A值大于B值且满足下面的其中一个条件: 1、前一根K棒中A值小于B值。 2、前一根或前几根K棒的A值等于B值,再之前的K棒A值小于B值。 画线A向下交叉穿过画线B的定义如下:当前K棒A值小于B值且满足下面的其中一个条件: 1、前一根K棒中A值大于B值。 2、前一根或前几根K棒的A值等于B值,再之前的K棒A值大于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——陈述式。 | 范例 | 将前10根Bar的最高价之和赋值给HighPriceSum: Variable: BarBackNo (0), HighPriceSum(0); For
BarBackNo=9
DownTo
0
Begin HighPriceSum=HighPriceSum+High[BarBackNo]; End; |
Else | 说明 | 与If和Then联合使用,形成一个条件语句。当某条件成立时,执行特定的陈述式。当条件不成立时,执行Else指定的陈述式。 条件执行语句包含If和Then,不包含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之前必须有一个对应的Begin,Begin...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 | 说明 | 与To或downTo
配合使用形成一个For循环语句,For循环陈述式会反复执行直到循环计数值达到指定的终值。 循环语句会指定一个变量,用来存储循环的次数,包含循环的开始值和结束值。可以搭配To或downTo使用,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——陈述式 | 范例 | 求前10根Bar的最高价之和并赋给变量HighPriceSum: Variable: BarBackNo (0), HighPriceSum(0); For
BarBackNo=0
To
9
Begin HighPriceSum=HighPriceSum+High[BarBackNo]; End; 求前10根Bar的最高价之和并赋给变量HighPriceSum: Variable: BarBackNo (0), HighPriceSum(0); For
BarBackNo=9
DownTo
0
Begin HighPriceSum=HighPriceSum+High[BarBackNo]; End; |
If | 说明 | 和Then配合使用,形成一个条件语句,如果某条件成立时,则执行特定的陈述式,和Else联合使用,形成一个条件语句,如果条件不成立,则执行Else指定的陈述式。 条件执行语句必须包含If和Then,Else是可选的。 陈述式组需要用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指定的陈述式。 条件执行语句必须包含If和Then,Else是可选的。 陈述式组需要用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——陈述式 | 范例 | 求前10根Bar的最高价之和并赋给变量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);
声明一个初始值为true的input型变量Overnight: Input:Overnight(True); |
While
| 说明 | 和Begin,End配合使用形成一个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;
|
|
论坛官方微信、群(期货热点、量化探讨、开户与绑定实盘)
|
|
|
|
|
|