在某些地方,它与代码相冲突。
//+------------------------------------------------------------------+ //| 返回名称时间范围| //+------------------------------------------------------------------+ string NameTimeframe(int timeframe=PERIOD_CURRENT) { if(timeframe==PERIOD_CURRENT) timeframe=Period(); switch(timeframe) { case 1 : return "M1"; case 2 : return "M2"; case 3 : return "M3"; case 4 : return "M4"; case 5 : return "M5"; case 6 : return "M6"; case 10 : return "M10"; case 12 : return "M12"; case 15 : return "M15"; case 20 : return "M20"; case 30 : return "M30"; case 16385 : return "H1"; case 16386 : return "H2"; case 16387 : return "H3"; case 16388 : return "H4"; case 16390 : return "H6"; case 16392 : return "H8"; case 16396 : return "H12"; case 16408 : return "D1"; case 32769 : return "W1"; case 49153 : return "MN1"; default : return (string)(int)Period(); } }
string NameTimeframe( const ENUM_TIMEFRAMES timeframe = PERIOD_CURRENT ) { return(StringSubstr(EnumToString(timeframe == PERIOD_CURRENT ? Period() : timeframe), 7)); }
//+------------------------------------------------------------------+ //|| 填充位置票数组| //+------------------------------------------------------------------+ void FillingListTickets(void) { list_tickets_buy.Clear(); list_tickets_sell.Clear(); total_volume_buy=0; total_volume_sell=0; //--- int total=PositionsTotal(); for(int i=total-1; i>=0; i--) { ulong ticket=PositionGetTicket(i); ENUM_POSITION_TYPE type=(ENUM_POSITION_TYPE)PositionGetInteger(POSITION_TYPE); if(PositionGetInteger(POSITION_MAGIC)!=InpMagic) continue; if(PositionGetString(POSITION_SYMBOL)!=symb) continue; double volume=PositionGetDouble(POSITION_VOLUME); if(type==POSITION_TYPE_BUY) { list_tickets_buy.Add(ticket); total_volume_buy+=volume; } else if(type==POSITION_TYPE_SELL) { list_tickets_sell.Add(ticket); total_volume_sell+=volume; } } }
无 PositionGetTicket 检查。
"else if "可以是 "else"。
继续后不使用类型。
Expert Advisor 中没有挂单,因此该条件仅适用于 POSITION_TYPE_BUY。
double price=(order_type==ORDER_TYPE_BUY ? symbol_info.Ask() : symbol_info.Bid());
此条件仅适用于POSITION_TYPE_BUY。
为什么?
代码中有两处需要调用该函数:
//--- 按信号开仓 if(open_long) { if(num_s>0) CloseSell(); if(num_b==0) { double sl=(InpStopLoss==0 ? 0 : CorrectStopLoss(ORDER_TYPE_BUY,InpStopLoss)); double tp=(InpTakeProfit==0 ? 0 : CorrectTakeProfit(ORDER_TYPE_BUY,InpTakeProfit)); double ll=trade.CheckVolume(symb,lot,symbol_info.Ask(),ORDER_TYPE_BUY); if(ll>0 && CheckLotForLimitAccount(POSITION_TYPE_BUY,ll)) { if(trade.Buy(ll,symb,0,sl,tp)) FillingListTickets(); } } } if(open_short) { if(num_b>0) CloseBuy(); if(num_s==0) { double sl=(InpStopLoss==0 ? 0 : CorrectStopLoss(ORDER_TYPE_SELL,InpStopLoss)); double tp=(InpTakeProfit==0 ? 0 : CorrectTakeProfit(ORDER_TYPE_SELL,InpTakeProfit)); double ll=trade.CheckVolume(symb,lot,symbol_info.Ask(),ORDER_TYPE_SELL); if(ll>0 && CheckLotForLimitAccount(POSITION_TYPE_SELL,ll)) { if(trade.Sell(ll,symb,0,sl,tp)) FillingListTickets(); } } }
因此,如果只有编写这段代码的程序员愚蠢地向函数发送了错误的订单类型,那么就会出现错误。而这段代码不会出错。
为什么?
代码中有两个地方需要调用这个函数:
因此,如果只有编写这段代码的程序员愚蠢地向函数发送了错误的阶次类型,那么就会出现错误。而这段代码则不会出错。
因为可以对 KB
并不是说在这种特殊情况下会出现错误。但函数会从一个代码迁移到另一个代码。迁移函数中的潜在错误就像挂在墙上的枪。
当然,你可以让它从你的指缝中溜走。但在这里,我认为最好还是提出警告。
因为对四分卫可以有不同的看法
并不是说在这种特殊情况下会出现错误。但函数会从一个代码迁移到另一个代码。迁移函数中的潜在错误就像挂在墙上的枪。
当然,你可以让它从你的指缝中溜走。但我认为最好还是发出警告。
你说得对,警告是正确的。
作者的意思可能是删除不必要的多余检查--在某些情况下,通用性是不必要的。您一定是被 ENUM_ORDER_TYPE 的枚举搞糊涂了。如果有ENUM_POSITION_TYPE,就不会有问题了。
你关于剪切文本的建议也不会有问题。切换不是更快吗?
作者可能是想删除不必要的检查--在某些情况下,普遍性是不必要的。您一定是被 ENUM_ORDER_TYPE 枚举搞糊涂了。如果有ENUM_POSITION_TYPE,就不会有问题了。
在这里,您应该更正函数本身及其调用。从 MT4 开始,作者就没有完全意识到这一点。
就像您建议剪切文本一样。切换不是更快吗?
这种切换结构正是您不应该做的。至于速度,这个功能根本不需要速度。但这个例子确实很能说明问题。至少会很有趣。
函数本身及其调用应在此处更正。从 MT4 开始,作者就没有完全意识到这一点。
但这种切换结构正是不应该做的。至于速度,这个函数根本不需要。但这个例子确实很能说明问题。至少会很有趣。
有趣在你看来,设置止损单的最小距离的标准计算方法有什么问题吗?
//+------------------------------------------------------------------+ //| 返回相对于 StopLevel 的正确 StopLoss。 //+------------------------------------------------------------------+ double CorrectStopLoss(const ENUM_ORDER_TYPE order_type,const int stop_loss) { if(stop_loss==0) return 0; double pt=symbol_info.Point(); double price=(order_type==ORDER_TYPE_BUY ? symbol_info.Ask() : symbol_info.Bid()); int lv=StopLevel(),dg=symbol_info.Digits(); return (order_type==ORDER_TYPE_BUY ? NormalizeDouble(fmin(price-lv*pt,price-stop_loss*pt),dg) : NormalizeDouble(fmax(price+lv*pt,price+stop_loss*pt),dg) ); } //+------------------------------------------------------------------+
//+------------------------------------------------------------------+ //| 返回计算出的停止级别| //+------------------------------------------------------------------+ int StopLevel(void) { int sp=symbol_info.Spread(); int lv=symbol_info.StopsLevel(); return(lv==0 ? sp*size_spread : lv); } //+------------------------------------------------------------------+
我看不出有什么错误。请解释一下。MT4 和 MT5 的最小距离计算方法有何不同?
有意思。您认为止损单最小距离的标准计算方法有什么问题?
我看不出有什么错误。解释一下。MT4 和 MT5 的最小距离计算有何不同?
错误在于枚举输入和调用,而不是最小距离。但计算结果也不正确,因为
Diff_TF_MA_EA:
一个基于 Diff_TF_MA 指标的 EA 交易。
作者: Scriptor