Code: double LotsOptimized() { double b,e,d; int orders=OrdersHistoryTotal(); int losses=0,wins=0; int c; b=iATR(NULL,0,60,0); c=AccountLeverage(); e=AccountBalance()-AccountMargin();//AccountFreeMargin(); d=e-OrderProfit(); if(b!=0&&d!=0 && AccountFreeMarginMode()==1) { if (orders==0) {lot=NormalizeDouble(10000*MaximumRisk/2000,2);} if (orders>=1 )// when add,this problem would be complex. { if(e>=d) {lot=NormalizeDouble((e*MaximumRisk/2000)*(1-15*((e/d)-1)),2);} if(e<d) {lot=NormalizeDouble((e*MaximumRisk/2000)*1/2*(1-15*((e/d)-1)),2);} } } 以上是我资金管理的部分代码 以下是我测试金融危机以来的测试结果 有几个疑问,请大家帮忙看看。 (不会在海洋发图) 1、我用不同的MT4平台(都是五位的,100的杠杆),同样的数据、同一个EA、参数、同样的标的及周期得到了不同的结果,请问原因在哪里?其它人用不同MT4有类似问题么?而且发现用手工计算的利润及亏损点数与EA跑出来的结果不同。比如第二单进场1.54140,SL1.44534 点数应该是9606,那利润应该是9606*0.2=1921.2 即使再双向扣点差48点,结果也应该是1911.6 但测试结果是1793.20 另一个平台结果是1884.36,求解释? 2、report里的maximal drawdown是怎么计算的,我的grossloss才7000+ 但它的drawdown却有9000+ 还有它的比例是怎么算出来的? 3、我是加仓策略,首单进场是3倍Lotsoptimized(),加仓用的2倍Lotsoptimized(),但我发现加仓时计算出的lot似乎有问题。也许我的代码逻辑有问题:如果之前的单子全平后,现在进了首单后,后加第二单,而此时第一单没平,此时的e只是之前的balance-第一单的margin后的数值?,(另外orderprofit()也不能确定,d计算就有问题?)。如果这样是对的,第7单的lot为什么是0.24?第10单为啥是0.38? 4、这个EA因为是趋势系统在金融危机时表现看起来会比较好,但从过去01年到现在的测试来看,表现一般 05-07年资金曲线几乎水平运动 5、这个资金管理的策略我把它归类到面向账户的,这一点与固定百分比等方式类似,但与海龟的办法不同。另外,这个是一个盈利减仓、亏损加仓(当然有部分没帖出来,亏到一定次数会快速砍仓)的资金管理办法,我把它称为一个震荡式的资金管理办法。虽然没有理论依据,但在测试后发现趋势型的系统及震荡式的资金管理办法可能会更好一些。 6、发现MT4如果同时平掉首单和加仓单时,会加仓单显示在前,首单显示在后,这似乎与FIFO(first in first out)原则相背啊?而且这个先后顺序会直接影响到我的e和d的计算。不知道这种想法对不对? 本人没有计算机背景,也许提的问题计算及循环的问题十分初级,请方家海涵。
那些交易纪录不完全,但应试不影响第2单(#2)、第7单(#47)、第10单(#106)仓位的计算 有这几个问题应该信息量较大。对问题,大家有啥疑问,我会尽全力解释。请同道、前辈也帮我看看这几个问题,估计有不少人有同问吧。
如果程序完全一样的话,计算过程必定是一样的。 首先确保数据是完全一样的, 用MarketInfo()把服务器端的那些设定读出来,比较一下,看有没有不同。 仔细分析1,2个错误明显的交易,用print把一些关键地方的数据打印出来。 debugging is an art.
目前只看到点差一个是19 一个是23 这个区别,其它的没查出来 但这个对结果影响应该没那么大 另外帮忙看看后面的几个问题 maximumdrawdown的计算 及LOT的计算过程 这里面我有些总结 但问题不少 希望能引玉出来