计算通用最大可下订单量

 

请大侠指点下,以下代码并不能算出在不同货币对中得出最大的可下订单量,问题出在哪里吖?

可用资金某一商品里最大可下订单量计算:

double LotsOptimized()
{
double lot;
if(Symbol()=="XAUUSD"){lot=NormalizeDouble(AccountFreeMargin()*4/(MarketInfo(Symbol(),MODE_ASK)),2);}
else if(Symbol()=="XAGUSD"){lot=NormalizeDouble(AccountFreeMargin()/(MarketInfo(Symbol(),MODE_ASK)*1.25),2);}
else {
for(lot=NormalizeDouble(AccountFreeMargin()/(2*MarketInfo(Symbol(),MODE_ASK)),2);lot>0;lot=lot-0.01)
{if(AccountFreeMarginCheck(Symbol(),OP_SELL,lot)>0){break;}}
}
if(Symbol()=="XAGUSD"&&lot>20){lot=20;}
else if(lot>100){lot=100;}
else if(lot<0){lot=0.0;}
return(lot);
}

 

这个是资金管理范畴比较基本的东西,所以我刚刚试写了一段大概的。

并不难,基本会做+-×÷就可以了,思路也不复杂;

我把结果发出来,相信一看就知道了,没发源码因为个人认为主要是看结果更能明白思路。

发源码只会让人懒惰,对于学习交流没有任何好处。

至于说问题出在哪,我觉得还是思路上面有一点小问题:

1、楼主的代码好像不能通用;

2、计算的过程中数据应该采用市场变量(比如:杠杆)。

需要说明的,我写的只是大概,实际运用当中计算出来的最大手数应该至少还需要考虑市场允许的最小交易手数加以限定等等。

另外,这是将任意货币对拖入图表的通用结果,仅供参考。

 

void CloseSELL()
{
for(int k=OrdersTotal()-1;k>=0;k--)
{
RefreshRates();
if(OrderSelect(k, SELECT_BY_POS, MODE_TRADES)==false){break;}
else if(OrderType()==OP_SELL){OrderClose(OrderTicket(),OrderLots(),MarketInfo(Symbol(),MODE_ASK),3,CLR_NONE);}
else if(OrderType()==OP_SELLSTOP || OP_BUYSTOP || OP_SELLLIMIT || OP_BUYLIMIT){OrderDelete(OrderTicket());}
}
return;
}

这种平仓法对十张单以上无法实现秒平,有什么办法呢?

 

秒平?要求很高啊。

可是我觉得,对于单量比较大的情况,MQL是根本做不到秒平的。因为他是按照过程执行必须要等前面的指令执行完毕才能执行下一项。

而类似OrderClose这样的交易函数,都需要等待市场(也可以说是服务器)来处理才能返回结果,只有返回了结果才能确认它已经执行完毕。

就MQL以外的情况来讲,我个人并不觉得秒平有多么重要,甚至没有任何意义的;

当然,MQL本身来讲(编程方面)来讲,如果楼主有可以实现秒平的方法,我也 比较 愿意学习一下~~

原因: