下载MetaTrader 5
要添加评论,请登录注册
开发应用程序用于订购。使用工作服务获取利润!
32723
36
32723 2012.04.19 10:09 

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

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

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);
}

BaiChun Li
838
BaiChun Li 2012.04.24 12:34  

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

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

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

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

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

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

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

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

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

32723
36
32723 2012.04.26 02:25  

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;
}

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

BaiChun Li
838
BaiChun Li 2012.04.27 07:31  

秒平?要求很高啊。

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

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

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

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

/
要添加评论,请登录注册