int shift = iBarShift(NULL,0,OrderOpenTime()); //以该仓位的开仓时间搜索当前K线偏移值 if(shift >= 0 ) high_price =High[iHighest(NULL,0,MODE_HIGH, shift)]; if(shift >=0) low_price =Low[iLowest(NULL,0,MODE_LOW, shift)];
找来的一个,不知道对不对。好像是mt4的。 http://www.zhinengjiaoyi.com/thread-107-1-1.html int start() { datetime a; for(int i=0;i<OrdersTotal();i++) { if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)) { a= OrderOpenTime(); } } Print("开仓到现在的最高价:"+High[iHighest(NULL,0,MODE_HIGH,iBarShift(Symbol(),0,a),0)]); Print("开仓到现在的最低价:"+Low[iLowest(NULL,0,MODE_LOW,iBarShift(Symbol(),0,a),0)]); Print("开仓时间"+TimeToStr(OrderOpenTime(),TIME_DATE|TIME_SECONDS)); return(0); } 这是老师批改后正确的脚本。
谢谢!经常看到你的帖子,我没了解过MT4,工作又较忙,所以想直接研究MT5,等有券商支持时我能掌握(哈哈,要几年的)......因为我的思路里好多是根据最高价/最低价回撤来定的过程控制,所以这个不解决,也很头痛,人笨工作又忙,自学到毕业估计时间短不了..........
道理是一样的吧,我也是MT5新手,刚学习了两天,练习中.... Code: double HighestPriceSinceEntry(string symbol,ENUM_TIMEFRAMES TF,datetime orderopentime) { double highprice[]; datetime time[]; int MaxAnalyze = 1000; int shift = -1; double price; ArraySetAsSeries(highprice,true); ArraySetAsSeries(time,true); int copiesTime = CopyTime(symbol,TF,0,MaxAnalyze,time); int Copieshigh = CopyHigh(symbol,TF,0,MaxAnalyze,highprice); if(copiesTime <0 ||Copieshigh<0) {Print("copy rates error");return(-1);} shift = ArrayBsearch(time,orderopentime); if(shift>=0) price= highprice[ArrayMaximum(highprice,0,shift)]; return(price); } void test() { for(i=0;i<PositionsTotal();i++) { if(Symbol()==PositionGetSymbol(i)) { double HighPrice=HighestPriceSinceEntry(Symbol(),PERIOD_M5 ,PositionGetInteger(POSITION_TIME)); Print("price since entry :",HighPrice); } } }
网上找的代码,可以试验一下 Code: input int TS = 50; // trail Stop Loss MqlTradeRequest request; MqlTradeResult result; double Ask,Bid,sl; int Spread; double Lots; ulong StopLevel; int i; void trail() { Ask = SymbolInfoDouble(_Symbol, SYMBOL_ASK); Bid = SymbolInfoDouble(_Symbol, SYMBOL_BID); Spread=int(SymbolInfoInteger(_Symbol,SYMBOL_SPREAD)); StopLevel=SymbolInfoInteger(Symbol(),SYMBOL_TRADE_STOPS_LEVEL); //--- trailing position for(i=0;i<PositionsTotal();i++) { if(Symbol()==PositionGetSymbol(i)) { if(PositionGetInteger(POSITION_TYPE)==POSITION_TYPE_BUY) { sl=MathMax(PositionGetDouble(POSITION_PRICE_OPEN)+Spread*_Point,Bid-TS*_Point); if(sl>PositionGetDouble(POSITION_SL) && (Bid-StopLevel*_Point-Spread*_Point)>PositionGetDouble(POSITION_PRICE_OPEN)) { request.action = TRADE_ACTION_SLTP; request.symbol = _Symbol; request.sl = NormalizeDouble(sl,_Digits); request.tp = PositionGetDouble(POSITION_TP); OrderSend(request,result); if(result.retcode==10009 || result.retcode==10008) // request executed Print("Moving Stop Loss of Buy position #",request.order); else { Print(ResultRetcodeDescription(result.retcode)); return; } return; } } if(PositionGetInteger(POSITION_TYPE)==POSITION_TYPE_SELL) { sl=MathMin(PositionGetDouble(POSITION_PRICE_OPEN)-Spread*_Point,Ask+TS*_Point); if(sl<PositionGetDouble(POSITION_SL) && (PositionGetDouble(POSITION_PRICE_OPEN)-StopLevel*_Point-Spread*_Point)>Ask) { request.action = TRADE_ACTION_SLTP; request.symbol = _Symbol; request.sl = NormalizeDouble(sl,_Digits); request.tp = PositionGetDouble(POSITION_TP); OrderSend(request,result); if(result.retcode==10009 || result.retcode==10008) // request executed Print("Moving Stop Loss of Sell position #",request.order); else { Print(ResultRetcodeDescription(result.retcode)); return; } return; } } } } } //+------------------------------------------------------------------+ //| ResultRetcodeDescription | //+------------------------------------------------------------------+ string ResultRetcodeDescription(int retcode) { string str; switch(retcode) { case TRADE_RETCODE_REQUOTE: str="Requote"; break; case TRADE_RETCODE_REJECT: str="Request rejected"; break; case TRADE_RETCODE_CANCEL: str="Request canceled by trader"; break; case TRADE_RETCODE_PLACED: str="Order placed"; break; case TRADE_RETCODE_DONE: str="Request executed"; break; case TRADE_RETCODE_DONE_PARTIAL: str="Request partially executed"; break; case TRADE_RETCODE_ERROR: str="Request processing error"; break; case TRADE_RETCODE_TIMEOUT: str="Request canceled because of time out"; break; case TRADE_RETCODE_INVALID: str="Invalid request"; break; case TRADE_RETCODE_INVALID_VOLUME: str="Invalid request volume"; break; case TRADE_RETCODE_INVALID_PRICE: str="Invalid request price"; break; case TRADE_RETCODE_INVALID_STOPS: str="Invalid request stops"; break; case TRADE_RETCODE_TRADE_DISABLED: str="Trade disabled"; break; case TRADE_RETCODE_MARKET_CLOSED: str="Market is closed"; break; case TRADE_RETCODE_NO_MONEY: str="Insufficient funds for request execution"; break; case TRADE_RETCODE_PRICE_CHANGED: str="Prices changed"; break; case TRADE_RETCODE_PRICE_OFF: str="No quotes for request processing"; break; case TRADE_RETCODE_INVALID_EXPIRATION: str="Invalid order expiration date in request"; break; case TRADE_RETCODE_ORDER_CHANGED: str="Order state changed"; break; case TRADE_RETCODE_TOO_MANY_REQUESTS: str="Too many requests"; break; case TRADE_RETCODE_NO_CHANGES: str="No changes in request"; break; case TRADE_RETCODE_SERVER_DISABLES_AT: str="Autotrading disabled by server"; break; case TRADE_RETCODE_CLIENT_DISABLES_AT: str="Autotrading disabled by client terminal"; break; case TRADE_RETCODE_LOCKED: str="Request blocked for processing"; break; case TRADE_RETCODE_FROZEN: str="Order or position frozen"; break; case TRADE_RETCODE_INVALID_FILL: str="Unsupported type of order execution for balance is specified"; break; case TRADE_RETCODE_CONNECTION: str="No connection to the trading server"; break; case TRADE_RETCODE_ONLY_REAL: str="Operation is allowed only for real accounts"; break; case TRADE_RETCODE_LIMIT_ORDERS: str="Number of pending orders reached the limit"; break; case TRADE_RETCODE_LIMIT_VOLUME: str="Volume of orders and positions for this symbol reached the limit"; break; default: str="Unknown result"; } return(str); } //+------------------------------------------------------------------+