1. 止损止盈价格必须距离市价一定点数之外,这个点数即最小距离STOP_LEVEL,通过 SymbolInfoInteger()可以查询。
2. 空单要注意单子本身的stoploss()=0的情况
3. 不要使用Select(symbol),因为这永远只选中ticket number最小的那个单子,对netting account还行,对hedging account就不适用了。
#property copyright "Copyright 2018,fxMeter" #property link "https://www.mql5.com/en/users/fxmeter" #property version "1.00" #include <Trade\Trade.mqh> #include <Trade\SymbolInfo.mqh> #include <Trade\PositionInfo.mqh> #include <MoneyManagement.mqh> //--- CSymbolInfo mySymbol; CPositionInfo myPosition; CTrade myTrade; int StopLoss=500,TrailStopLossStep=200; //+------------------------------------------------------------------+ //| Expert initialization function | //+------------------------------------------------------------------+ int OnInit() { //--- if(!mySymbol.Name(Symbol()))return(INIT_FAILED); myTrade.SetDeviationInPoints(50); //--- return(INIT_SUCCEEDED); } //+------------------------------------------------------------------+ //| Expert deinitialization function | //+------------------------------------------------------------------+ void OnDeinit(const int reason) { //--- } //+------------------------------------------------------------------+ //| Expert tick function | //+------------------------------------------------------------------+ void OnTick() { //--- if(!RefreshRates())return; TrailStopFunction(myTrade,myPosition,mySymbol,StopLoss,TrailStopLossStep); } //+------------------------------------------------------------------+ bool RefreshRates(void) { //--- refresh rates if(!mySymbol.RefreshRates()) { Print("RefreshRates error"); return(false); } //--- protection against the return value of "zero" if(mySymbol.Ask()==0 || mySymbol.Bid()==0) return(false); //--- return(true); } //+------------------------------------------------------------------+ void TrailStopFunction(CTrade &trade,CPositionInfo &pos,CSymbolInfo &sym,int stoploss,int trailstep) { double point=sym.Point(); int stopLevel=sym.StopsLevel(); //the minimum distance = stop level double sl=0; //new sl double stopLevelPrice=0.0; // the minimum distance price from the market price. for(int i=PositionsTotal()-1;i>=0;i--) { if(pos.SelectByIndex(i)) { if(pos.Symbol()==sym.Name()) { if(pos.PositionType()==POSITION_TYPE_BUY) { if(pos.PriceCurrent()-pos.PriceOpen()>(stoploss+trailstep)*point) { sl=sym.NormalizePrice(pos.PriceCurrent()-stoploss*point); stopLevelPrice=sym.NormalizePrice(sym.Bid()-stopLevel*point); if(pos.StopLoss()<sl && sl<stopLevelPrice) { if(!trade.PositionModify(pos.Symbol(),sl,pos.TakeProfit())) { Print("Modify ",pos.Ticket()," Position -> false. Result Retcode: ",trade.ResultRetcode(), ", description of result: ",trade.ResultRetcodeDescription()); } } } } else if(pos.PositionType()==POSITION_TYPE_SELL) { if(pos.PriceOpen()-pos.PriceCurrent()>(stoploss+trailstep)*point) { sl=sym.NormalizePrice(pos.PriceCurrent()+stoploss*point); stopLevelPrice=sym.NormalizePrice(sym.Ask()+stopLevel*point); if((pos.StopLoss()>sl || (pos.StopLoss()==0)) && sl>stopLevelPrice) { if(!trade.PositionModify(pos.Symbol(),sl,pos.TakeProfit())) { Print("Modify ",pos.Ticket()," Position -> false. Result Retcode: ",trade.ResultRetcode(), ", description of result: ",trade.ResultRetcodeDescription()); } } } } } } } } //+------------------------------------------------------------------+
谢谢您的帮忙,我会依照您的建议再修改一下我的代码。
大家好,我用MQL5的标准库写的一段跟踪止损程序,在运行时会出现部分订单无法修改止损的情况,但是其它的订单是成功修改止损的,程序显示的问题是invalid stop,错误代码是4756,希望大家能帮我看看程序是哪里写错了,谢谢!