龙听期货论坛's Archiver

龙听 发表于 2017-12-28 10:23

EasyLanguage/PowerLanguage 策略语言研究

1止损的函数用什么?

请教前辈,止损应该怎么写?2种情况

1.到价格触及到-5%时。
2.到收盘价触及到-5%时。

以多单的止损为例
1,
[code]sell next bar at entryprice*0.95 stop;[/code]


2、if close

2向高手老手请教,在ts中如何实现资金管理?
建议你设置止损,按能接受的止损来设置头寸,就是ANP方式


[code]
AccountBalance = InitialBalance + netprofit;
DollarRisk = AccountBalance * rate;
LTT=IntPortion(DollarRisk/stoploss);
[/code]


3[函式介绍] 如何用EL表示期货涨停,跌停价
最近有同学问到这个问题,现整理出来供大家一起参考学习~

由于中国商品期货的涨跌停系数会随着假日时间的变动而变动(中国商品这个感觉很麻烦,需要随时关注交易所公告来进行调整),以下是具体的一个例子的写法:


[code]
Inputs:begintime(1100608),endtime(1100912),abnormalratio(0.2),normalratio(0.1);

vars:upprice(0),downprice(0);

if time>=begintime and time<=endtime
   then begin
       upprice=Closed(1)*(1+abnormalratio);
       downprice=Closed(1)*(1-abnormalratio);
   end  
   else  begin
       upprice=Closed(1)*(1+normalratio);
       downprice=Closed(1)*(1-normalratio);
[/code]


4软件使用讨论] 如何将Tb代码转为MC代码

下面是我在转换TB代码到easylanguage的时候做的日志记录,有些是那个策略特有的,肯定还有很多漏掉的,我没空整理了,大家可以参考下

1 {变为then begin
考虑then换行后begin
如果在if else中注意else后没有then
while中begin前不需要then

2 }变为end;
如果在if else中注意else钱的end没有分号


3 Params变为Inputs:
注意别忘记分号

4 Vars变为variables:
注意别忘记分号

5 声明类型去掉
Numeric rangeMove(2);中的Numeric全部去掉

6 声明后的分号改为,
注意参数和变量的最后一个保持分号

7 声明类型缺少默认值的补上

8 逻辑运算中,等号==变为=,不等号!=变为<>


9 注释全部去掉

10下单指令
Bool Buy(Numeric Share=0,Numeric Price=0,Bool Delay=False)
Share 买入数量,为整型值,默认为使用系统设置参数;
Price 买入价格,为浮点数,默认=0时为使用现价(非最后Bar为Close);
Delay 买入动作是否延迟,默认为当前Bar发送委托,当Delay=True,在下一个Bar执行。

Buy xxx contracts next bar at xxx stop;

11 Ceiling Tb中两个参数
Ceiling(timemin/BarInterval, 1)
改为Ceiling(timemin/BarInterval)

12 &&变为and ||变为or


13 ContractUnit()变为currentContracts X

14 变量名range->myrange

15 GetGlobalVar-->GVGetNamedDouble

16 IntPart-->IntPortion

17 InvalidNumeric-->-1

18 GVGetNamedDouble(40变为GVGetNamedDouble("global40"
set同理

19 if后面的括号,mc可以有可以无,但是tb必须有


20 mc的maxlist函数 对应 tb的max ,minlist --min

21 mc的print对应Commentary

22 mc中的变量默认是序列变量 Tb中的变量主意区分普通变量和序列变量,如果同样是序列变量:
需要重设变量值
isBreak=isBreak[1];
k1=k1[1];
J1=J1[1];
5[程序代码分享] 深入Numeric资料形态


在MC中,资料形态有三类 Numeric, TrueFalse 与 String,其中Numeric可以再细分成Int、Float与Double。如果只宣告变数为Numeric,MC有自动帮你选择适当的数值形态,有些情况下,MC无法准确的判断时,有可能会出现使用Double储存Int形态的资料,如此一来,系统效能将会大大降低。如果你可以确定宣告变数myVars的资料形态为整数时,下次建议可以考虑用

[code]
vars: int myVars(0);
[/code]


取代

[code]
vars: myVars(0)
[/code]


6[程序代码分享] 提供一个移动止损的方法
移动止损的方法有很多,可以控制亏损百分比,或者控制亏损金额,我先抛个砖,大家继续:


[code]
stop1=0.02; //2个百分点止损
myStop=2990;//根据商品的价格不同而定义
if marketposition >0 then begin
if c*(1-stop1) > myStop then myStop = c*(1-stop1);
end;

if marketposition <0 then begin
if c*(1+stop1) < myStop then myStop = c*(1+stop1);
end;

if marketposition >0 and c < myStop then sell next bar at market;
if marketposition <0 and c > myStop then buytocover next bar at market;
[/code]


再提供一种方法:

2%止损:


[code]
if marketposition>0 and entryprice>close and (entryprice-close)/entryprice>=2% then
sell next bar at market;

if marketposition<0 and entryprice=2% then
buytocover next bar at market;
[/code]


7当日输N次不交易
做当冲的时候,最怕盘整盘。遇到盘整盘时,顺势系统很容易被修理。
为了避免当日亏损太多次,可以使用 DailyLosers 这个函数
以下是当日输N次不交易的写法


[code]
if DailyLosers(date)<=N then begin
        {code of your entry signal}
end;
[/code]


8程序代码分享] 直接在POWER EDITOR看系统绩效
常常要不断的改程序,让系统变好。不过当每次做点细小的修改,就要跑一次回侧报告,有点不方便。
尤其有时候只是要让DRAWDOWN变小。

为了让开发过程更容易,我在程式码后段加入下面程式码,这样一来,只要在编译后马上可以看到这次修改是否有让系统变好,不需要再到回侧报告去找。虽然不是很详细,不过有时后对我来说已经足够了,感觉很方便。


[code]
once(LastBarOnChart_s) begin
        messagelog("   Initial Capital: ",InitialCapital);
        messagelog("        Net Profit: ",netprofit);
        messagelog("      Gross Profit: ",grossprofit);
        messagelog("        Gross Loss: ",grossloss);
        messagelog("      Max Drawdown: ",maxiddrawdown);
        messagelog("Max Contracts Held: ",MaxContractsHeld);
        messagelog("   MaxConsecWinner: ",MaxConsecWinners);
        messagelog("    MaxConsecloser: ",maxconseclosers);
        messagelog("        Commission: ",commission);
        messagelog(" Largest Win Trade: ",LargestWinTrade);
        messagelog("Largest Loss Trade: ",largestlostrade);
end;
[/code]


10[程序代码分享] 减仓别忘了加 total 这个保留字

在MC中,第一次建仓或是要加仓时,可以用下面的语法

[code]
buy ("signalName") N contracts next bar at market;
sellshort ("signalName") N contracts next bar at market;
[/code]


当要减仓时则要用

[code]
sell ("signalName") M contracts total next bar at market;
buytocover ("signalName") M contracts total next bar at market;
[/code]


如果没有加 total,MC会把你所有仓位都平仓掉。

龙听 发表于 2017-12-28 10:26

11编程求助] 如何根据条件分段plot?
MC里用plot画的都是连续的线条,我要画一段一段分开的线条,如何画,我加了if然后plot也不行。比如我之要time>=0910 and time<=1450这一段的ma,怎么画?

源码:

[code]
if time >=1000 and time <=1100 then
plot1( AverageFC( c, 9 ) , "Avg" ) ;
[/code]


设置:

[font=Verdana, 宋体, sans-serif][color=#464646][size=12px]设置指标 -> 样式, 更改画线 Type为 Point or Cross[/size][/color][/font]
[font=Verdana, 宋体, sans-serif][color=#464646]
[/color][/font]
[size=12px][font=Verdana, 宋体, sans-serif][color=#464646]12如何按资金的百分比开仓[/color][/font][/size]
[size=12px][font=Verdana, 宋体, sans-serif][color=#464646]
[/color][/font][/size]
[size=12px][font=Verdana, 宋体, sans-serif][color=#464646][code]
Inputs:
initCapital(100000);
Variables:
RiskPercent(0.3),

TotalEquity(0.0),
SetShareSize(0);
TotalEquity=initCapital+NetProfit+OpenPositionProfit;
SetShareSize= TotalEquity * RiskPercent/Close;
Buy("Entry") SetShareSize shares Next Bar At ................
sell("Exit") All shares Next Bar At ......................
[/code]
[/color][/font][/size]

龙听 发表于 2017-12-28 10:36

13[程序代码分享] 计算当日做多的次数
在日内交易中,我们常常需要知道今天作多几次,以下是我的编程方式,与大家分享

[code]
vars:
        mp(0),
        mpd(0),
        myLongNumber(0);
      
mp = i_CurrentContracts;
mpd = i_MarketPosition;

if date<>date[1] then myLongNumber = 0 else begin
        if mpd=1 and mpd[1]=-1 then begin
                myLongNumber=myLongNumber[1]+1;
        end else begin
                if mp>mp[1] and i_MarketPosition>0 then
                        myLongNumber=myLongNumber[1]+1
                else
                        myLongNumber=myLongNumber[1];
        end;
end;

DailyLongNumber = myLongNumber;[/code]


16[编程求助] 出场信号为买入价格获利3%怎么写

[code]
if marketposition<>0 then setprofittarget(entryprice*0.03*bigpointvalue);
[/code]




[code]
if marketposition=1 then sell next bar at entryprice*1.03% limit;
[/code]


30一天只交易一次的语法

[code]
vars:go (true);

if marketposition <> 0 then    //当有部位后,交易停止

go  =False;

If date<>date[1] then          // 当换日后,交易开始

go =true;


IF condition and go then       //如果买进条件成立而且可以交易就买进   

   buy("buy") next bar at close;
[/code]




[code]
input:TN(1);
var:tradeNum(0);
if  date<>date[1]  then
tradeNum=0;
if conditions and tradeNum then
tradeNum=tradeNum[1]+1;
buy……;
end;
[/code]


31请问如何在图上显示字?
如果我想在走势图上写字,比如,在买进信号旁边写上“买进做多”,在平仓信号旁边写上“多仓平仓”,但是好像ts/mc没有直接在图上写字的函数,应该如何办呢?

[code]
if marketposition =0 and  condition1 then buy("买进作多") next bar at market;

if marketposition =1 and condition2 then sell("多单平仓") next bar at market;

[/code]


36日内交易收盘前出场的写法
以沪深300为例,每日14:50分平仓的写法如下


[code]
if time>=1450 then begin
     if marketposition>0 then sell next bar at market;
     if marketposition<0 then buytocover next bar at market;
end;
[/code]

页: [1]