这部分引发了疑问:
bool CheckMoneyForTrade(string symb,double lots,ENUM_ORDER_TYPE type) { //--- 获取开盘价 MqlTick mqltick; SymbolInfoTick(symb,mqltick); double price=mqltick.ask; if(type==ORDER_TYPE_SELL) price=mqltick.bid; //-- 股本和必要保证金值 double margin,equity=AccountInfoDouble(ACCOUNT_EQUITY); //--- 调用测试函数 if(!OrderCalcMargin(type,symb,lots,price,margin)) { //--- 出错了,报告并返回 false Print("Error in ",__FUNCTION__," code=",GetLastError()); return(false); } //--- 如果没有足够资金执行操作 if(margin>equity) { //--- 报告错误并返回 false Print("Not enough money for ",EnumToString(type)," ",lots," ",symb," Error code=",GetLastError()); return(false); } //--- 测试成功 return(true); }
为什么要求保证金是与权益相比,而不是与自由保证金相比?
Andrey Barinov:
合理 - 我们会解决的。
这部分引起了疑问:
为什么要求的保证金与权益相比,而不是与自由保证金相比?
感谢您的文章,但到目前为止,我还无法使用 "AccountFreeMarginCheck "获得工作结果。
bool CheckMoneyForTrade(string symb, double lots,int type) { double free_margin=AccountFreeMarginCheck(symb,lots,type); // -- 如果钱不够 if(free_margin<0) { string oper=(type==OP_BUY)? "Buy":"Sell"; Print("Not enough money for ", oper," ",lots, " ", symb, " Error code=",GetLastError()); return(false); } //-- 测试成功 return(true); }
AccountFreeMarginCheck 的任何变体都 会出错,根本无法为市场设置智能交易系统,我试着从用户那里了解情况,然后就出现了这篇文章,没办法,无论你做什么或不做什么
如果在 GetLastError()!=134 条件中添加 GetLastError()!=134,或者使用上述函数,只会出错失败。
上述函数会产生这样的错误。
2016.07.25 15:15:54.200 2016.01.04 19:59 RSI_Grabber.1.1 XAUUSD,H1: invalid lots amount for FreeMarginCheck function 2016.07.25 15:15:54.200 2016.01.04 19:59 RSI_Grabber.1.1 XAUUSD,H1: Not enough money for Buy 0.1 XAUUSD Error code=4051
我可能弄错了,0.1 是手动指定的正常手数,货币对的 MODE_MINLOT 是 0.01。
但老实说,我越是深入研究,就越不明白问题出在哪里。
也许应该在该函数中将手数正常化,这样就不会出现 Disabled。
然后函数写入没有资金,但不会向服务器发送开仓 请求,这符合市场规则。
我最近开始使用这样的指令,大约是在两年前:
double margin=EMPTY_VALUE; margin=AccountFreeMarginCheck(sy,op,ll); if(margin>0) { ticket=OrderSend(sy,op,ll,NormalizeDouble(pp,MarketInfo(sy,MODE_DIGITS)),Slippage,NormalizeDouble(sl,MarketInfo(sy,MODE_DIGITS)),NormalizeDouble(tp,MarketInfo(sy,MODE_DIGITS)), coomment,mn,0,clOpen); } else Print("Not Enought Money Margin Required"+(string)margin);
实际上一切正常。
开仓时,EA 只返回Print("Not Enought Money Margin Required "+( string)margin) 字符串;
该智能交易系统已经过市场测试,大家都很满意。
我使用这个选项进行精确计算,只有它能帮我解决这个问题。然后,您就可以自由比较它们了。
Laverage = AccountInfoInteger(ACCOUNT_LEVERAGE); //肩部 RazmerKontrakta=LotSize*MarketInfo(Symbol(),MODE_LOTSIZE); //交易量*1 手 MargaB=(RazmerKontrakta/Laverage)*NormalizeDouble(MarketInfo(Symbol(),MODE_BID),Digits()); MargaS=(RazmerKontrakta/Laverage)*NormalizeDouble(MarketInfo(Symbol(),MODE_ASK),Digits()); FreeMargin = AccountInfoDouble(ACCOUNT_MARGIN_FREE);
亲爱的作者,感谢您的文章。
如果可以的话,MQL4 的代码中有一个小错误。函数CheckMoneyForTrade:
double free_margin=AccountFreeMarginCheck(symb,lots,type);
required:
double free_margin=AccountFreeMarginCheck(symb,type,lots);
所有语言的文章都已修复,谢谢。
新文章 交易机器人在市场发布前必须经过的检验 已发布:
任何产品在市场发布之前,它必须通过强制的预先检验,以确保符合统一的质量标准。本文介绍了开发者们在他们的技术指标和交易机器人中最常犯下的错误,并且也展示了在把产品发送到市场之前如何进行自我测试。
平台中集成的策略测试器不仅允许回测交易系统,而且可以用于发现交易机器人开发过程中的逻辑和算法错误,在测试中,所有有关交易操作的消息以及发现的错误都输出在测试器的日志(Journal)中。使用特别的记录阅读器就可以很方便地分析这些消息, 它可以使用上下文菜单的命令调用出来。
作者:MetaQuotes Software Corp.