自动计算批量大小的功能? - 页 5

 

嗨,菲利普,肖恩又来了。我做了我们上次讨论的小改动(但是我仍然没有实施你的最新版本),日元对的手数问题仍然出现了。我昨晚让我的EA运行,它产生了3笔交易(我的账户余额 为2550美元,风险为1%,所以每笔交易的风险约为25美元)。


(1) 卖出NZDJPY,0.89手

(2) 卖出澳元兑日元,0.23手

(3) 卖出CADJPY,0.94手


澳元兑日元交易的手数看起来还可以,但其他两个就不行了。我在调用你的东西时嵌入了一些Print语句。首先,这是我的EA在这部分的代码。


if(Bid > SellPrice && SellPrice != 0.00)
         {       
          CurrentOrderType=OP_SELL;
          CurrentStopLossPrice= FinalSellStopPrice;
          CurrentEquityAtRisk=(MaxPercentEquityAtRisk/100.0)*AccountBalance();
          CurrentLotSize=LotSize(CurrentEquityAtRisk,CurrentStopLossPrice,CurrentOrderType,CurrentSymbolType,CurrentCounterPairForCross);
          Print("SELL - ", Symbol(), "AccountBalance = ", DoubleToStr(AccountBalance(),2), " Max EquityAtRisk = $",DoubleToStr(CurrentEquityAtRisk,2)," and Max Lotsize = ",DoubleToStr(CurrentLotSize,4));
          CurrentLotSize=NormalizeLotSize(CurrentLotSize);
          Print("SELL - ", Symbol(), "Normalized LotSize is now = ", DoubleToStr(CurrentLotSize,4));
          if(CurrentLotSize<MarketInfo(Symbol(),MODE_MINLOT)) CurrentLotSize=MarketInfo(Symbol(),MODE_MINLOT);
          if(CurrentLotSize>MarketInfo(Symbol(),MODE_MAXLOT)) CurrentLotSize=MarketInfo(Symbol(),MODE_MAXLOT);
          CurrentEquityAtRisk=EquityAtRisk(CurrentLotSize,CurrentStopLossPrice,CurrentOrderType,CurrentSymbolType,CurrentCounterPairForCross);
          Print("SELL - ", Symbol(), "Current EquityAtRisk = $",DoubleToStr(CurrentEquityAtRisk,2)," and Current Lotsize = ",DoubleToStr(CurrentLotSize,4));
          Print("SELL - ", Symbol(), " MarketInfo(MODE_STOPLEVEL) = ",DoubleToStr(MarketInfo(Symbol(),MODE_STOPLEVEL),5));
          
          //Check free margin
          if (AccountFreeMargin() < (1000 * CurrentLotSize)) 
          {
             Print("We have no money. Free Margin = ", AccountFreeMargin());
             return(0);
          }
         
          Ticket=OrderSendReliable2Step(Symbol(),OP_SELLSTOP,CurrentLotSize,FinalSellPrice,Slippage,CurrentStopLossPrice,FinalSellProfTarg,Symbol()+DoubleToStr(MagicNumber,0),MagicNumber,0,Red);
          if(Ticket<=0) Print("Error = ",GetLastError());
          else 
          { 


这是从日志中提取的Print语句的输出,上面的3笔交易都是如此。


05:16:10 DelphiEA NZDJPY,H1: SELL - NZDJPYAccountBalance = 2550.90 Max EquityAtRisk = $25.51 and Max Lotsize = 0.8988
05:16:10 DelphiEA NZDJPY,H1: SELL - NZDJPYNormalized LotSize is now = 0.8900
05:16:10 DelphiEA NZDJPY,H1: SELL - NZDJPYCurrent EquityAtRisk = $25.26 and Current Lotsize = 0.8900
05:16:10 DelphiEA NZDJPY,H1: SELL - NZDJPY MarketInfo(MODE_STOPLEVEL) = 70.00000


05:16:56 DelphiEA AUDJPY,H1: SELL - AUDJPYAccountBalance = 2550.90 Max EquityAtRisk = $25.51 and Max Lotsize = 0.2376
05:16:56 DelphiEA AUDJPY,H1: SELL - AUDJPYNormalized LotSize is now = 0.2300
05:16:56 DelphiEA AUDJPY,H1: SELL - AUDJPYCurrent EquityAtRisk = $24.69 and Current Lotsize = 0.2300
05:16:56 DelphiEA AUDJPY,H1: SELL - AUDJPY MarketInfo(MODE_STOPLEVEL) = 50.00000


07:13:53 DelphiEA CADJPY,H1: 卖出 - CADJPYAccountBalance = 2550.90 Max EquityAtRisk = $25.51 and Max Lotsize = 0.9408
07:13:53 DelphiEA CADJPY,H1: SELL - CADJPYNormalized LotSize is now = 0.9400
07:13:53 DelphiEA CADJPY,H1: SELL - CADJPYCurrent EquityAtRisk = $25.49 and Current Lotsize = 0.9400

07:13:53 DelphiEA CADJPY,H1: SELL - CADJPY MarketInfo(MODE_STOPLEVEL) = 60.00000


希望这对你有帮助!!

哦,菲利普,还有一件事--我想我在OrderSendReliable2Step中发现了一个小错误。你知道我应该向谁报告吗?


谢谢!

肖恩

 
Ricotter:

这个人用文件历史记录来做。

https://www.mql5.com/en/articles/1493

由于你是新来的,值得一提的是,在MT5测试器中不存在这种限制。顺便说一下。

 
gordon:

由于你是新来的,值得一提的是,在MT5测试器中不存在这种限制。顺便说一下。

谢谢你的提示。 有什么理由我不应该使用MT5吗?

 
Ricotter:

谢谢你的提示。 有什么理由我不应该使用MT5吗?

如果你想立即进行真实交易,那么你最好坚持使用MT4,但如果你打算在进行真实交易之前学习和做几个月的模拟交易,那么你可以考虑使用MT5。这是一个新的平台,与MT4相比有许多改进,但它也更复杂,而且仍然不被许多经纪商支持。这里有一些好的信息 ->http://www.100forexbrokers.com/mt5-metatrader5。 另外,你可能想检查一下MQL5.com
 
shawnh:

嗨,菲利普,肖恩又来了。我做了我们上次讨论的小改动(但我仍然没有实施你的最新版本),日元对的手数问题仍然在出现。

你的代码中一切 "看起来 "都很好,仍然不知道为什么会发生在你身上。

我建议改用较新的代码。 在这一点上,你需要改变一些东西,因为你现在得到的东西不能正确工作。

我不知道你应该向谁报告有关orderlib问题的错误,对不起。
 
1005phillip:

第一步:把这个帖子中的所有文件附件放到你的包含路径中(...\experts\include\*.mqh)。

第2步:在你的EA顶部添加以下内容,以便它可以访问附件文件中的调用函数

第3步:根据预算好的股权风险金额计算手数,加入以下内容

第3步:假设你已经在你的EA中定义了MaxPercentEquityAtRisk,即在止损点被击中的情况下,每笔交易完全损失的最大允许权益,这部分代码将首先根据openprice和stoplossprice(不是点数而是实际市场价格,与你在订单中发送给经纪人的价格相同)确定最大手数,然后它将确定经纪人在不超过你预算的风险权益的同时接受的最大头寸大小。

第4步:如果你喜欢将计算结果打印在日志中或作为订单注释添加到交易中,你也可以添加以下内容

第5步:下单(使用ordersendreliable方法)。

https://c.mql5.com/mql4/forum/2010/10/OrderReliable_2010.10.12.mqh


嗨,1005phillip。


你有没有2个mqh(analyze..., and tradepositionmanage...)的版本,没有导入以下内容? 这是因为这两个版本都有这样的导入,因此不被编译器所允许。

//#include <stderror.mqh>.
//#include <stdlib.mqh>.


...这样我就不会编辑这些文件并使它们处于只读状态。 或者我可以编辑它们并删除这些导入?

 
jcadong5:

......这样我就不会编辑这些文件并使它们处于只读状态。或者我可以编辑它们并删除那些导入文件吗?


来吧,按照你的喜好编辑它们。 对我来说,重复性并不妨碍编译,编译器会记录一个关于重复性的说明,但这就是它所做的一切。
 
谢谢。
 
1005phillip:
你的代码中一切 "看起来 "都很好,仍然不知道为什么会发生在你身上。

我建议改用较新的代码。 在这一点上,你需要改变一些东西,因为你现在得到的东西不能正确工作。

我不知道你应该向谁报告有关orderlib问题的bug,抱歉。


嗨,菲利普,我是肖恩。在几周前安装了你们的最新版本后,我很高兴地报告,现在一切都很好,计算出来的地段大小也很准确。我想我只是需要最新的版本!


再次感谢你的帮助,你是个好人。


欢呼声

肖恩

 

我的荣幸! 谢谢你让我知道它在为你工作,我很感谢你的反馈。 我不确定早期的代码出了什么问题。 很可能是某个错误,我在两次修订之间不知不觉地纠正了它。

我可能在一两周内会有一个更新的版本,它将有一些回退功能,用于在MT4上对交叉货币对 进行回测。 现在,如果你试图在使用我的手数代码时对交叉货币对进行回测,你的回测将被炸毁,因为回测器无法访问必要的计数器和基础货币对的市场价格。(这不是实时或正向测试的问题,纯粹是MT4回测器的限制)。

等我过了那座桥,我再把代码贴出来,也许你或其他人会觉得有帮助。

祝您周末愉快。
- 菲尔