作者n33222 (满身菜味)
看板ForeignEX
标题[投稿] MQL4初学-实用子函数篇
时间Fri Jul 21 11:37:14 2017
我又来啦记得上次发过一个简单的EA设计概念,这次我提供一些实用的子函数,
给大家使用,基本上都可以直接复制贴上。
废话不多说本文开始:
一.固定风险计算手数:
有的人喜欢用金额去计算下单量,让下单量随着资金上涨而加大,
这边提供一个函数达成这样的作法。
double Lotsact()
{
double lot;
double margin = MarketInfo(Symbol(),MODE_MARGININIT);
if(固定风险开关==true)
{
lot=NormalizeDouble(AccountFreeMargin()*固定风险值/margin,2);
}
if(固定风险开关==false)
{
lot=固定手数;
}
if(lot<0.01) lot=0.01;
return(lot);
}
将这段加在程式中,记得上次说的放在ONTICK之外,
然後在下单程序中的"LOTS"栏位中,把他呼叫出来即可。
另外记得在程式开头加上以下三段:
extern double 固定风险值 =0.01;
extern bool 固定风险开关=false;
extern double 固定手数 =0.1;
二.计算前面K棒之总和(或影线)
double swing()
{
double swing[200] ;//纪录数组,括号中的200可任意输入但不能小於K线数量
double swingg ;//最後输出值
for(int i=0;i<K线数量;i++)
{
swing[i]
=MathAbs(iClose(Symbol(),PERIOD_M30,i)-iHigh(Symbol(),PERIOD_M30,i));
swingg+=swing[i]; //数组中资料相加
}
return(swingg);
}
这段程式码是纪录前面的实体K棒波动,做相加最後导出一个总和数值,
我本身会在下单RULE将数值导出後在除上计算的K线数量,去求出前段的实体波动。
请在程序开头加上
extern int K线数量 =200;//你要计算的K棒数,任意输入。
三.马丁中的手数计算方式
马丁算是市场上很多人爱用的,我本身是不倡导这种作法,除非你已经做出一支带停损
停利能获利的EA,这时候加上马丁只是在浮亏时增加自己的获利,我觉得这样才有意义
马丁正常才来说会有两段下单程式,第一段是当场上没有部位的第一张单,
再来是场上有多张单的加码,我这边就直接提供多张单加码的手数计算方式。
double olot()
{
double adlot;
int ticket = 0;
if(CalculateCurrentOrder(Symbol()) >=1)//如果场上大於等於1
{
for(int i= OrdersTotal()-1; i>=0; i--)
{
if(!OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
continue;
if(OrderSymbol()!=Symbol() || OrderMagicNumber()!=MAGICMA)
continue;
if(OrderTicket()>ticket)//如果单子编号大於前一张
{
ticket= OrderTicket(); //编号=最大的那张单
adlot = OrderLots() ; //手数=选择到的最大的那张
}
}
}
return(adlot);//回传LOT
}
这段程式码搜索场上最新的单子,并回传他的手数,在马丁下单的程式码中,
在呼叫这段函数出来,并乘上你要的倍数,这样就达到马丁的效果了。
额外一题常常有人会出现 ORDERSEND ERROR 131,这是因为你的程式计算出来的手数,
可能是个无限小数,或是小数点下超过第二位,因为MT4基本上大多最小0.01手而已,
这时候你要用个程序把导出来的数值缩到小数点下第二位。
double NextLot =NormalizeDouble(olot()*加仓倍数,2);//这就是马丁了
NormalizeDouble()能够帮你把数值四舍五入到你要的小数位。
四.计算场上总获利亏损
这不用多作解释就是计算未平仓的获利亏损
double Calculateprofit(string symbol)
{
int profit = 0;
int orderprofit;
for(int i=0;i<OrdersTotal();i++)
{
if(!OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
continue;
if(OrderMagicNumber()==MAGICMA)
orderprofit+= OrderProfit();
}
return(orderprofit);
}
需要的时候在ONTICK里面做呼叫。
以上就这次分享,一样有问题可以询问。
--
※ 发信站: 批踢踢实业坊(ptt.cc), 来自: 36.225.38.18
※ 文章网址: https://webptt.com/cn.aspx?n=bbs/ForeignEX/M.1500608236.A.FE5.html
1F:→ yzfr6: 又是子函数,讲不听 07/21 13:57
我是不知道这有甚麽差,不知道您为何一直纠结这个问题。
https://zh.wikipedia.org/zh-hant/%E5%AD%90%E7%A8%8B%E5%BA%8F
※ 编辑: n33222 (36.225.38.18), 07/21/2017 14:45:55
※ 编辑: n33222 (36.225.38.18), 07/21/2017 14:46:18
2F:→ k1dave6412: 你可以打 子程式、函数、方法(针对不同程式语言而有 07/21 16:49
3F:→ k1dave6412: 不同称呼) 都可以,但是没有人打子函数… 07/21 16:49
4F:推 wesleytz502: 可以开Mql5的介绍吗? 07/21 17:51
5F:→ n33222: 好吧下次改进,我会这麽称呼是因为我前阵子待在中国,教 07/21 18:17
6F:→ n33222: 我的老师也是中国人,他都是这麽称呼跟我说的,所以我只是 07/21 18:17
7F:→ n33222: 仿照他的说法 07/21 18:17
8F:推 k1dave6412: 中译的问题很难解决… 除非用英文来解决,这边应该 07/21 21:25
9F:→ k1dave6412: 都是用 07/21 21:25
10F:→ k1dave6412: function称呼,method会用在物件导向的程式上(Java) 07/21 21:25
11F:推 k1dave6412: ea的写法应该是用c语言,所以可以说是function 07/21 21:33
12F:→ n33222: 了解感谢指导 07/21 23:33
13F:推 PsMonkey: 我在对岸也接触过不少程序员,没听过子函数这种说法 07/21 23:35
14F:推 angrywater: Sub Procedure 的意思吧?只是翻译的问题吧? 07/22 01:01
16F:→ angrywater: 或者是 Sub Function 07/22 01:03
18F:推 labdog: 看的懂就好,何必纠结在一个无聊的名称。人家肯分享就要 07/22 01:56
19F:→ labdog: 拍拍手了 07/22 01:56
20F:推 ohboy: 感谢分享 不用在意翻译的事啦^_^ 07/22 02:14
21F:推 ducati5566: 推…意思明白就好,就好像欧巴马/奥巴马一样,知道是O 07/22 13:02
22F:→ ducati5566: bama就好。何必纠结 07/22 13:02
23F:推 nicholasmax: 感谢提供教学期待还有其他的分享 07/22 14:55
24F:推 bxc: 肯分享给推 07/22 16:57
25F:推 contaminate: 那些纠结名称的人真无聊 推分享 07/25 23:51