- 显示:
- 6059
- 等级:
- 已发布:
- 2020.03.31 17:25
- 已更新:
- 2020.03.31 18:54
-
需要基于此代码的EA交易或指标吗?请在自由职业者服务中订购 进入自由职业者服务
在输入时,如图:
‘maxrange’代表你要承受的最大波动,比如当前原油的价格在22美元,输入1000代表你抄底的最大范围在12美元(22-1000*0.01)
‘equityrate’代表当价格去往最大波动时你需要多少当前资金百分比去承受亏损,输入0.9就是90%的净值,请输入<=1.0的数。
‘volume’代表你每次下多少手。
‘calcmargin’是个选择,代表计算时是否需要考虑保证金,默认是‘true’。
‘type’也是选择,‘ORDER_TYPE_BUY’代表你想做多头,计算最大亏损时是按当前价格向下计算;另外‘ORDER_TYPE_SELL’代表空。
计算后消息显示在‘专家’里,在‘WTI’里运行脚本,参数同上,如图:
脚本里面包含两种算法。
第一种:
ResetLastError() ; double Ex = AccountInfoDouble(ACCOUNT_EQUITY) * equityrate; double price = SymbolInfoDouble(_Symbol,(type == ORDER_TYPE_BUY) ? SYMBOL_ASK : SYMBOL_BID); double maxlossn; if(!OrderCalcProfit(type,_Symbol,volume,price,(type == ORDER_TYPE_BUY) ? price + maxrange * _Point : price - maxrange * _Point,maxlossn) || maxlossn <= 0) { Print(__FUNCTION__,_LastError); return; } double perm = 0.0; if(calcmargin) if(!OrderCalcMargin(type,_Symbol,volume,price,perm)) { Print(_LastError); return; } int maxn = int((2.0 * Ex - maxlossn) / (2.0 * perm + maxlossn)); //maxn=int(2*Ex/maxlossn)-1; if(maxn <= 0) { Print(maxn); return; } //----------- int perpip = maxrange / maxn; double perpa; if(!OrderCalcProfit(type,_Symbol,volume,price,(type == ORDER_TYPE_BUY) ? price + perpip*_Point : price - perpip * _Point,perpa)) { Print(_LastError); return; } double maxvol = volume * maxn; //*(1+maxn)/2.0,非堆仓 double maxmargin; if(!OrderCalcMargin(type,_Symbol,maxvol,price,maxmargin)) { Print(_LastError); return; } printf("per:%f,pip:%d,n:%d,ex:%f,maxlossn:%f,maxvol:%f,maxmargin:%f",perpa,perpip,maxn,Ex,maxlossn,maxvol,maxmargin);
GridCalc (WTI,H1) per:5.020000,pip:55,n:18,ex:876.177000,maxlossn:91.200000,maxvol:0.180000,maxmargin:1.240000
'per'代表每一次的盈亏,'per'代表每一次间隔点;
‘n’代表假设价格一次性到达你定义的最大限度,你需要开几次,‘ex’代表那时亏损的金额,‘maxlossn’代表那时第一单亏损的金额,‘maxvol’代表累积的仓位,‘maxmargin’代表累积的保证金;
考虑到我当前的账户资金为1000,杠杆是3000倍,所以保证金比较少。
第二种方式:
int n = 1; double pms[][3];//iprice,imargin,iloss while(!IsStopped()) { ArrayResize(pms,n); perpip = maxrange / n; double out = (type == ORDER_TYPE_BUY) ? price - maxrange * _Point : price + maxrange * _Point; double sumargin = 0,sumloss = 0; for(int i = 0; i < n; i++) { pms[i][0] = (type == ORDER_TYPE_BUY) ? price - i * perpip * _Point : price + i * perpip * _Point; if(!OrderCalcMargin(type,_Symbol,volume,pms[i][0],pms[i][1]) || pms[i][1] <= 0) { Print(__FUNCTION__,_LastError); return; } if(!OrderCalcProfit(type,_Symbol,volume,out,pms[i][0],pms[i][2])) { Print(__FUNCTION__,_LastError); return; } if(calcmargin) sumargin += pms[i][1]; sumloss += pms[i][2]; } if(sumargin + sumloss >= Ex) { printf("margin:%f,loss:%f,out:%f,pip:%d,n:%d",sumargin,sumloss,out,perpip,n); break; } n++; } ArrayPrint(pms);
继续用前面的参数计算,
GridCalc (WTI,H1) margin:1.040000,loss:921.860000,out:12.630000,pip:52,n:19
‘margin’代表假设价格到达最大亏损时当前‘symbol’累积的保证金,‘loss’代表累计亏损,‘out’代表到达极限的价格(价格去往12.6);
‘pip’代表每隔多少点开一次(52大概是0.5),‘n’是总开次数;
下面打印出了极限‘maxrange’状态下每一单的开单价格,保证金,和亏损;
举例: GridCalc (WTI,H1) [ 8,] 18.47 0.06 53.26
由于当前原油价格比较小,如果保守点你可以把极限调到‘2000’或直接计算到0价格,因为你可以计算到极限。最近波动性又还不错,你可以反复用这种网格,每次上去0.5出掉,下来0.5又接回来;
或者适当的时候你可以间隔大一点再卖出/买入,但是不要少于计算的间隔。

该指标可以获取两个不同货币对各个时期的K线价格,然后通过简单的加减乘除显示在副图上,用来分析当前平台上没有的自定义商品走势。

于主图显示,类似于期货日内均线,可以选择更多的结算周期