初学者的问题 MQL4 MT4 MetaTrader 4 - 页 53 1...464748495051525354555657585960...260 新评论 ilnur17021992 2017.01.21 06:02 #521 Vitaly Muzichenko:情况是这样的。 太好了,利润加起来了。谢谢你! customer03 2017.01.21 12:30 #522 下午好,谁能提出解决这个问题的办法?在M15上有一个带入口的代码,但来自H1的信号被考虑到了。虽然在H1上有一个信号,但在M15上,指标给出了几个信号。问题是如何将其限制在一个(即第一个信号)。k=0; for (i=OrdersTotal()-1;i>=0;i-){ RefreshRates(); 如果(OrderSelect(i, SELECT_BY_POS, MODE_TRADES) == true) a = 0; if (OrderSymbol() == Symbol() && OrderMagicNumber() == Magic) k++;} if( stM1 >= 80 && stM0 < 80 && stH0 < 30 && k==0 && opp != Time[0]) // sale ilnur17021992 2017.01.21 18:32 #523 我写了一个小的信息面板。extern string Display = "Настройки отображения"; //Displayextern color PanelBackgroundColor = Black;extern color PanelTextColor = White;double MaxDD;int OnInit() {//--- indicator buffers mapping ObjectCreate("Background", OBJ_RECTANGLE_LABEL, 0, 0, 0); ObjectSet("Background", OBJPROP_CORNER, 0); ObjectSet("Background", OBJPROP_XDISTANCE, 5); ObjectSet("Background", OBJPROP_YDISTANCE, 35); ObjectSet("Background", OBJPROP_XSIZE, 215); ObjectSet("Background", OBJPROP_YSIZE, 220); ObjectSet("Background", OBJPROP_BGCOLOR, PanelBackgroundColor); ObjectCreate("Account information", OBJ_LABEL, 0, 0, 0); ObjectSet("Account information", OBJPROP_CORNER, 0); ObjectSet("Account information", OBJPROP_XDISTANCE, 15); ObjectSet("Account information", OBJPROP_YDISTANCE, 45); ObjectSetText("Account information","=====Account information=====",10,"Arial",PanelTextColor); ObjectCreate("Balance", OBJ_LABEL, 0, 0, 0); ObjectSet("Balance", OBJPROP_CORNER, 0); ObjectSet("Balance", OBJPROP_XDISTANCE, 15); ObjectSet("Balance", OBJPROP_YDISTANCE, 60); ObjectCreate("Profit/DD", OBJ_LABEL, 0, 0, 0); ObjectSet("Profit/DD", OBJPROP_CORNER, 0); ObjectSet("Profit/DD", OBJPROP_XDISTANCE, 15); ObjectSet("Profit/DD", OBJPROP_YDISTANCE, 75); ObjectCreate("Max DD", OBJ_LABEL, 0, 0, 0); ObjectSet("Max DD", OBJPROP_CORNER, 0); ObjectSet("Max DD", OBJPROP_XDISTANCE, 15); ObjectSet("Max DD", OBJPROP_YDISTANCE, 90); ObjectCreate("Equity", OBJ_LABEL, 0, 0, 0); ObjectSet("Equity", OBJPROP_CORNER, 0); ObjectSet("Equity", OBJPROP_XDISTANCE, 15); ObjectSet("Equity", OBJPROP_YDISTANCE, 105); ObjectCreate("Free margin", OBJ_LABEL, 0, 0, 0); ObjectSet("Free margin", OBJPROP_CORNER, 0); ObjectSet("Free margin", OBJPROP_XDISTANCE, 15); ObjectSet("Free margin", OBJPROP_YDISTANCE, 120); ObjectCreate("Pair information", OBJ_LABEL, 0, 0, 0); ObjectSet("Pair information", OBJPROP_CORNER, 0); ObjectSet("Pair information", OBJPROP_XDISTANCE, 15); ObjectSet("Pair information", OBJPROP_YDISTANCE, 150); ObjectSetText("Pair information","=======Pair information======",10,"Arial",PanelTextColor); ObjectCreate("Pair", OBJ_LABEL, 0, 0, 0); ObjectSet("Pair", OBJPROP_CORNER, 0); ObjectSet("Pair", OBJPROP_XDISTANCE, 15); ObjectSet("Pair", OBJPROP_YDISTANCE, 165); ObjectSetText("Pair","Pair: "+Symbol(),10,"Arial",PanelTextColor); ObjectCreate("Margin required", OBJ_LABEL, 0, 0, 0); ObjectSet("Margin required", OBJPROP_CORNER, 0); ObjectSet("Margin required", OBJPROP_XDISTANCE, 15); ObjectSet("Margin required", OBJPROP_YDISTANCE, 180); ObjectCreate("Price pips", OBJ_LABEL, 0, 0, 0); ObjectSet("Price pips", OBJPROP_CORNER, 0); ObjectSet("Price pips", OBJPROP_XDISTANCE, 15); ObjectSet("Price pips", OBJPROP_YDISTANCE, 195); ObjectCreate("Spread", OBJ_LABEL, 0, 0, 0); ObjectSet("Spread", OBJPROP_CORNER, 0); ObjectSet("Spread", OBJPROP_XDISTANCE, 15); ObjectSet("Spread", OBJPROP_YDISTANCE, 210); ObjectCreate("Leverage", OBJ_LABEL, 0, 0, 0); ObjectSet("Leverage", OBJPROP_CORNER, 0); ObjectSet("Leverage", OBJPROP_XDISTANCE, 15); ObjectSet("Leverage", OBJPROP_YDISTANCE, 225);//--- return(INIT_SUCCEEDED); }void start(){ //Расчет максимальной просадки if (AccountProfit()<0) { if (AccountProfit()<MaxDD) MaxDD=AccountProfit(); } ObjectSetText("Balance","Balance: "+DoubleToString (AccountBalance(),2)+" "+AccountCurrency(),10,"Arial",PanelTextColor); ObjectSetText("Profit/DD","Profit/DD: "+DoubleToString (AccountProfit(),2)+" ("+DoubleToString((AccountProfit()*100)/AccountBalance(),2)+"%)",10,"Arial",PanelTextColor); ObjectSetText("Max DD","Max DD: "+DoubleToString (MaxDD,2)+" ("+DoubleToString((MaxDD*100)/AccountBalance(),2)+"%)",10,"Arial",PanelTextColor); ObjectSetText("Equity","Equity: "+DoubleToString (AccountEquity(),2),10,"Arial",PanelTextColor); ObjectSetText("Free margin","Free margin: "+DoubleToString (AccountFreeMargin(),2),10,"Arial",PanelTextColor); ObjectSetText("Margin required","Margin required: "+DoubleToString(MarketInfo(Symbol(), MODE_MARGINREQUIRED), 2)+" $",10,"Arial",PanelTextColor); ObjectSetText("Price pips","Price pips: "+DoubleToString(MarketInfo(Symbol(), MODE_TICKVALUE), 2)+" $",10,"Arial",PanelTextColor); ObjectSetText("Spread","Spread: "+DoubleToString(MarketInfo(Symbol(),MODE_SPREAD),2),10,"Arial",PanelTextColor); ObjectSetText("Leverage","Leverage: 1:"+IntegerToString(AccountLeverage(), 0),10,"Arial",PanelTextColor);}一切工作正常,信息显示正确,但只要你重新启动终端,面板就会停止工作(写明余额为0,其余信息停止更新,并冻结在一个位置上,简单地挂起)。如何打击这种情况? 附上一张截图。 附加的文件: 2017-01-21_23-27-08.png 5 kb Questions from Beginners MQL4 编码帮助 新人对MQL4和MQL5的任何问题,对算法和代码的帮助和讨论 Sergey Gritsay 2017.01.22 04:07 #524 ilnur17021992:我写了一个小的信息面板。extern string Display = "Настройки отображения"; //Displayextern color PanelBackgroundColor = Black;extern color PanelTextColor = White;double MaxDD;int OnInit() {//--- indicator buffers mapping ObjectCreate("Background", OBJ_RECTANGLE_LABEL, 0, 0, 0); ObjectSet("Background", OBJPROP_CORNER, 0); ObjectSet("Background", OBJPROP_XDISTANCE, 5); ObjectSet("Background", OBJPROP_YDISTANCE, 35); ObjectSet("Background", OBJPROP_XSIZE, 215); ObjectSet("Background", OBJPROP_YSIZE, 220); ObjectSet("Background", OBJPROP_BGCOLOR, PanelBackgroundColor); ObjectCreate("Account information", OBJ_LABEL, 0, 0, 0); ObjectSet("Account information", OBJPROP_CORNER, 0); ObjectSet("Account information", OBJPROP_XDISTANCE, 15); ObjectSet("Account information", OBJPROP_YDISTANCE, 45); ObjectSetText("Account information","=====Account information=====",10,"Arial",PanelTextColor); ObjectCreate("Balance", OBJ_LABEL, 0, 0, 0); ObjectSet("Balance", OBJPROP_CORNER, 0); ObjectSet("Balance", OBJPROP_XDISTANCE, 15); ObjectSet("Balance", OBJPROP_YDISTANCE, 60); ObjectCreate("Profit/DD", OBJ_LABEL, 0, 0, 0); ObjectSet("Profit/DD", OBJPROP_CORNER, 0); ObjectSet("Profit/DD", OBJPROP_XDISTANCE, 15); ObjectSet("Profit/DD", OBJPROP_YDISTANCE, 75); ObjectCreate("Max DD", OBJ_LABEL, 0, 0, 0); ObjectSet("Max DD", OBJPROP_CORNER, 0); ObjectSet("Max DD", OBJPROP_XDISTANCE, 15); ObjectSet("Max DD", OBJPROP_YDISTANCE, 90); ObjectCreate("Equity", OBJ_LABEL, 0, 0, 0); ObjectSet("Equity", OBJPROP_CORNER, 0); ObjectSet("Equity", OBJPROP_XDISTANCE, 15); ObjectSet("Equity", OBJPROP_YDISTANCE, 105); ObjectCreate("Free margin", OBJ_LABEL, 0, 0, 0); ObjectSet("Free margin", OBJPROP_CORNER, 0); ObjectSet("Free margin", OBJPROP_XDISTANCE, 15); ObjectSet("Free margin", OBJPROP_YDISTANCE, 120); ObjectCreate("Pair information", OBJ_LABEL, 0, 0, 0); ObjectSet("Pair information", OBJPROP_CORNER, 0); ObjectSet("Pair information", OBJPROP_XDISTANCE, 15); ObjectSet("Pair information", OBJPROP_YDISTANCE, 150); ObjectSetText("Pair information","=======Pair information======",10,"Arial",PanelTextColor); ObjectCreate("Pair", OBJ_LABEL, 0, 0, 0); ObjectSet("Pair", OBJPROP_CORNER, 0); ObjectSet("Pair", OBJPROP_XDISTANCE, 15); ObjectSet("Pair", OBJPROP_YDISTANCE, 165); ObjectSetText("Pair","Pair: "+Symbol(),10,"Arial",PanelTextColor); ObjectCreate("Margin required", OBJ_LABEL, 0, 0, 0); ObjectSet("Margin required", OBJPROP_CORNER, 0); ObjectSet("Margin required", OBJPROP_XDISTANCE, 15); ObjectSet("Margin required", OBJPROP_YDISTANCE, 180); ObjectCreate("Price pips", OBJ_LABEL, 0, 0, 0); ObjectSet("Price pips", OBJPROP_CORNER, 0); ObjectSet("Price pips", OBJPROP_XDISTANCE, 15); ObjectSet("Price pips", OBJPROP_YDISTANCE, 195); ObjectCreate("Spread", OBJ_LABEL, 0, 0, 0); ObjectSet("Spread", OBJPROP_CORNER, 0); ObjectSet("Spread", OBJPROP_XDISTANCE, 15); ObjectSet("Spread", OBJPROP_YDISTANCE, 210); ObjectCreate("Leverage", OBJ_LABEL, 0, 0, 0); ObjectSet("Leverage", OBJPROP_CORNER, 0); ObjectSet("Leverage", OBJPROP_XDISTANCE, 15); ObjectSet("Leverage", OBJPROP_YDISTANCE, 225);//--- return(INIT_SUCCEEDED); }void start(){ //Расчет максимальной просадки if (AccountProfit()<0) { if (AccountProfit()<MaxDD) MaxDD=AccountProfit(); } ObjectSetText("Balance","Balance: "+DoubleToString (AccountBalance(),2)+" "+AccountCurrency(),10,"Arial",PanelTextColor); ObjectSetText("Profit/DD","Profit/DD: "+DoubleToString (AccountProfit(),2)+" ("+DoubleToString((AccountProfit()*100)/AccountBalance(),2)+"%)",10,"Arial",PanelTextColor); ObjectSetText("Max DD","Max DD: "+DoubleToString (MaxDD,2)+" ("+DoubleToString((MaxDD*100)/AccountBalance(),2)+"%)",10,"Arial",PanelTextColor); ObjectSetText("Equity","Equity: "+DoubleToString (AccountEquity(),2),10,"Arial",PanelTextColor); ObjectSetText("Free margin","Free margin: "+DoubleToString (AccountFreeMargin(),2),10,"Arial",PanelTextColor); ObjectSetText("Margin required","Margin required: "+DoubleToString(MarketInfo(Symbol(), MODE_MARGINREQUIRED), 2)+" $",10,"Arial",PanelTextColor); ObjectSetText("Price pips","Price pips: "+DoubleToString(MarketInfo(Symbol(), MODE_TICKVALUE), 2)+" $",10,"Arial",PanelTextColor); ObjectSetText("Spread","Spread: "+DoubleToString(MarketInfo(Symbol(),MODE_SPREAD),2),10,"Arial",PanelTextColor); ObjectSetText("Leverage","Leverage: 1:"+IntegerToString(AccountLeverage(), 0),10,"Arial",PanelTextColor);}一切工作正常,信息显示正确,但当你重新启动终端时,面板停止运作(写出余额为0,其余的信息停止更新,冻结在一个位置上,简单地挂起)。如何处理这个问题? 我附上一张屏幕截图。不久前讨论过类似的问题,你是否查看过日志标签或专家顾问,我可以100%肯定地说,你在这些行中有一个除以0 的错误 ObjectSetText("Profit/DD","Profit/DD: "+DoubleToString (AccountProfit(),2)+" ("+DoubleToString((AccountProfit()*100)/AccountBalance(),2)+"%)",10,"Arial",PanelTextColor); ObjectSetText("Max DD","Max DD: "+DoubleToString (MaxDD,2)+" ("+DoubleToString((MaxDD*100)/AccountBalance(),2)+"%)",10,"Arial",PanelTextColor);... Vitaly Muzichenko 2017.01.22 07:23 #525 ilnur17021992:我写了一个小的信息面板。void start(){ //Расчет максимальной просадки if (AccountProfit()<0) { if (AccountProfit()<MaxDD) MaxDD=AccountProfit(); } ObjectSetText("Balance","Balance: "+DoubleToString (AccountBalance(),2)+" "+AccountCurrency(),10,"Arial",PanelTextColor); ... ObjectSetText("Leverage","Leverage: 1:"+IntegerToString(AccountLeverage(), 0),10,"Arial",PanelTextColor);}一切工作正常,信息显示正确,但只要你重新启动终端,面板就会停止工作(写出余额为0,其余信息停止更新,冻结在一个位置上,简单地挂起)。如何与之抗争? 附上屏幕截图。像这样试试吧。void start(){ if (AccountBalance()<5) return; // <<< if (AccountBalance()==0) return; //Расчет максимальной просадки if (AccountProfit()<0) { if (AccountProfit()<MaxDD) MaxDD=AccountProfit(); } ObjectSetText("Balance","Balance: "+DoubleToString (AccountBalance(),2)+" "+AccountCurrency(),10,"Arial",PanelTextColor); ... ObjectSetText("Leverage","Leverage: 1:"+IntegerToString(AccountLeverage(), 0),10,"Arial",PanelTextColor);} 这个问题是由于与服务器的连接 还没有发生,账户上没有数据,所以它除以0。输入一个简单的检查,如果没有连接,那么余额将为零 - 等待连接和更新。 Sergey Gritsay 2017.01.22 07:55 #526 ilnur17021992 :写了一个小的信息面板: extern string Display = "Настройки отображения" ; //Display extern color PanelBackgroundColor = Black; extern color PanelTextColor = White;一切正常,信息显示正确,但是一旦重新启动终端,面板就会停止运行(它说余额为 0,其余信息停止更新并冻结在一个位置,它只是冻结)。如何处理?附截图:我在你的面板上做了一个小魔术。结果如下代码,消除了被零除的错误。 //+------------------------------------------------------------------+ //| test_panel.mq4 | //| Sergey Gritsay | //| https://www.mql5.com/ru/users/sergey1294 | //+------------------------------------------------------------------+ #property copyright "Sergey Gritsay" #property link "https://www.mql5.com/ru/users/sergey1294" #property version "1.00" #property strict sinput string Display= NULL ; //Настройки отображения input color PanelBackgroundColor = clrBlack ; input color PanelTextColor = clrWhite ; input color ColorMinus= clrRed ; input color ColorPlus= clrBlueViolet ; input color ColorZero= clrMediumAquamarine ; double balans= 0.0 ; double profit= 0.0 ; double profit_dd_procent= 0.0 ; double MaxDD= 0.0 ; double MaxDD_procent= 0.0 ; double Equity= 0.0 ; double Freemargin= 0.0 ; double Marginrequired= 0.0 ; double Pricepips= 0.0 ; int Spread= 0 ; int Leverage= 0 ; string symbol= NULL ; string currency= NULL ; int X= 15 ; int Y= 45 ; int size= 15 ; int x_sdvig= 150 ; //+------------------------------------------------------------------+ //| Expert initialization function | //+------------------------------------------------------------------+ int OnInit () { //--- Refresh(); Panel(); //--- return ( INIT_SUCCEEDED ); } //+------------------------------------------------------------------+ //| Expert deinitialization function | //+------------------------------------------------------------------+ void OnDeinit ( const int reason) { //--- RectLabelDelete( 0 , "Background" ); LabelDelete( 0 , "Account information" ); LabelDelete( 0 , "Balance" ); LabelDelete( 0 , "Balance value" ); LabelDelete( 0 , "Profit/DD" ); LabelDelete( 0 , "Profit/DD value" ); LabelDelete( 0 , "Max DD" ); LabelDelete( 0 , "Max DD value" ); LabelDelete( 0 , "Equity" ); LabelDelete( 0 , "Equity value" ); LabelDelete( 0 , "Free margin" ); LabelDelete( 0 , "Free margin value" ); LabelDelete( 0 , "Pair information" ); LabelDelete( 0 , "Pair" ); LabelDelete( 0 , "Pair value" ); LabelDelete( 0 , "Margin required" ); LabelDelete( 0 , "Margin required value" ); LabelDelete( 0 , "Price pips" ); LabelDelete( 0 , "Price pips value" ); LabelDelete( 0 , "Spread" ); LabelDelete( 0 , "Spread value" ); LabelDelete( 0 , "Leverage" ); LabelDelete( 0 , "Leverage value" ); } //+------------------------------------------------------------------+ //| Expert tick function | //+------------------------------------------------------------------+ void OnTick () { //--- Refresh(); Panel(); } //+------------------------------------------------------------------+ //| | //+------------------------------------------------------------------+ void Refresh() { symbol= _Symbol ; currency= AccountInfoString ( ACCOUNT_CURRENCY ); balans = AccountInfoDouble ( ACCOUNT_BALANCE ); profit = AccountInfoDouble ( ACCOUNT_PROFIT ); Equity = AccountInfoDouble ( ACCOUNT_EQUITY ); Freemargin= AccountInfoDouble ( ACCOUNT_MARGIN_FREE ); Marginrequired= MarketInfo (symbol, MODE_MARGINREQUIRED ); Pricepips= SymbolInfoDouble (symbol, SYMBOL_TRADE_TICK_VALUE ); Leverage=( int ) AccountInfoInteger ( ACCOUNT_LEVERAGE ); double ask= SymbolInfoDouble (symbol, SYMBOL_ASK ); double bid= SymbolInfoDouble (symbol, SYMBOL_BID ); double point= SymbolInfoDouble (symbol, SYMBOL_POINT ); Spread=( int ) SymbolInfoInteger (symbol, SYMBOL_SPREAD ); if (Spread== 0 )Spread= int ((ask-bid)/point); //Расчет максимальной просадки if (profit< 0 ) if (profit<MaxDD) MaxDD=profit; if (balans!= 0 ) { profit_dd_procent=profit* 100.0 /balans; MaxDD_procent=MaxDD* 100.0 /balans; } } //+------------------------------------------------------------------+ //| | //+------------------------------------------------------------------+ void Panel() { RectLabelCreate( 0 , "Background" , 0 , 5 , 35 , 300 , 230 ,PanelBackgroundColor); LabelCreate( 0 , "Account information" , 0 ,X,Y, "=====Account information=====" ,PanelTextColor);Y+=size; LabelCreate( 0 , "Balance" , 0 ,X,Y, "Balance (" +currency+ "):" ,PanelTextColor); LabelCreate( 0 , "Balance value" , 0 ,x_sdvig,Y, DoubleToString (balans, 2 ),ColorValue(balans));Y+=size; LabelCreate( 0 , "Profit/DD" , 0 ,X,Y, "Profit/DD (" +currency+ " / %):" ,PanelTextColor); LabelCreate( 0 , "Profit/DD value" , 0 ,x_sdvig,Y, DoubleToString (profit, 2 )+ " / " + DoubleToString (profit_dd_procent, 2 ),ColorValue(profit));Y+=size; LabelCreate( 0 , "Max DD" , 0 ,X,Y, "Max DD (" +currency+ " / %):" ,PanelTextColor); LabelCreate( 0 , "Max DD value" , 0 ,x_sdvig,Y, DoubleToString (MaxDD, 2 )+ " / " + DoubleToString (MaxDD_procent, 2 ),ColorValue(MaxDD));Y+=size; LabelCreate( 0 , "Equity" , 0 ,X,Y, "Equity (" +currency+ "):" ,PanelTextColor); LabelCreate( 0 , "Equity value" , 0 ,x_sdvig,Y,( string )Equity,ColorValue(Equity));Y+=size; LabelCreate( 0 , "Free margin" , 0 ,X,Y, "Free margin (" +currency+ "):" ,PanelTextColor); LabelCreate( 0 , "Free margin value" , 0 ,x_sdvig,Y,( string )Freemargin,ColorValue(Freemargin));Y+=size;Y+=size; LabelCreate( 0 , "Pair information" , 0 ,X,Y, "=======Pair information======" ,PanelTextColor);Y+=size; LabelCreate( 0 , "Pair" , 0 ,X,Y, "Pair:" ,PanelTextColor); LabelCreate( 0 , "Pair value" , 0 ,x_sdvig,Y,symbol,PanelTextColor);Y+=size; LabelCreate( 0 , "Margin required" , 0 ,X,Y, "Margin required (" +currency+ "):" ,PanelTextColor); LabelCreate( 0 , "Margin required value" , 0 ,x_sdvig,Y,( string )Marginrequired,ColorValue(Marginrequired));Y+=size; LabelCreate( 0 , "Price pips" , 0 ,X,Y, "Price pips (" +currency+ "):" ,PanelTextColor); LabelCreate( 0 , "Price pips value" , 0 ,x_sdvig,Y,( string )Pricepips,ColorValue(Pricepips));Y+=size; LabelCreate( 0 , "Spread" , 0 ,X,Y, "Spread:" ,PanelTextColor); LabelCreate( 0 , "Spread value" , 0 ,x_sdvig,Y,( string )Spread,ColorValue(Spread));Y+=size; LabelCreate( 0 , "Leverage" , 0 ,X,Y, "Leverage:" ,PanelTextColor); LabelCreate( 0 , "Leverage value" , 0 ,x_sdvig,Y, "1:" +( string )Leverage,PanelTextColor); } //+------------------------------------------------------------------+ //| Создает прямоугольную метку | //+------------------------------------------------------------------+ bool RectLabelCreate( const long chart_ID= 0 , // ID графика const string name= "RectLabel" , // имя метки const int sub_window= 0 , // номер подокна const int x= 0 , // координата по оси X const int y= 0 , // координата по оси Y const int width= 50 , // ширина const int height= 18 , // высота const color back_clr= C'236,233,216' , // цвет фона const ENUM_BORDER_TYPE border= BORDER_SUNKEN , // тип границы const ENUM_BASE_CORNER corner= CORNER_LEFT_UPPER , // угол графика для привязки const color clr= clrRed , // цвет плоской границы (Flat) const ENUM_LINE_STYLE style= STYLE_SOLID , // стиль плоской границы const int line_width= 1 , // толщина плоской границы const bool back= false , // на заднем плане const bool selection= false , // выделить для перемещений const bool hidden= true , // скрыт в списке объектов const long z_order= 0 ) // приоритет на нажатие мышью { //--- сбросим значение ошибки ResetLastError (); //--- создадим прямоугольную метку if ( ObjectFind (chart_ID,name)!=sub_window) { if (! ObjectCreate (chart_ID,name, OBJ_RECTANGLE_LABEL ,sub_window, 0 , 0 )) { Print ( __FUNCTION__ , ": не удалось создать прямоугольную метку! Код ошибки = " , GetLastError ()); return ( false ); } } //--- установим координаты метки ObjectSetInteger (chart_ID,name, OBJPROP_XDISTANCE ,x); ObjectSetInteger (chart_ID,name, OBJPROP_YDISTANCE ,y); //--- установим размеры метки ObjectSetInteger (chart_ID,name, OBJPROP_XSIZE ,width); ObjectSetInteger (chart_ID,name, OBJPROP_YSIZE ,height); //--- установим цвет фона ObjectSetInteger (chart_ID,name, OBJPROP_BGCOLOR ,back_clr); //--- установим тип границы ObjectSetInteger (chart_ID,name, OBJPROP_BORDER_TYPE ,border); //--- установим угол графика, относительно которого будут определяться координаты точки ObjectSetInteger (chart_ID,name, OBJPROP_CORNER ,corner); //--- установим цвет плоской рамки (в режиме Flat) ObjectSetInteger (chart_ID,name, OBJPROP_COLOR ,clr); //--- установим стиль линии плоской рамки ObjectSetInteger (chart_ID,name, OBJPROP_STYLE ,style); //--- установим толщину плоской границы ObjectSetInteger (chart_ID,name, OBJPROP_WIDTH ,line_width); //--- отобразим на переднем (false) или заднем (true) плане ObjectSetInteger (chart_ID,name, OBJPROP_BACK ,back); //--- включим (true) или отключим (false) режим перемещения метки мышью ObjectSetInteger (chart_ID,name, OBJPROP_SELECTABLE ,selection); ObjectSetInteger (chart_ID,name, OBJPROP_SELECTED ,selection); //--- скроем (true) или отобразим (false) имя графического объекта в списке объектов ObjectSetInteger (chart_ID,name, OBJPROP_HIDDEN ,hidden); //--- установим приоритет на получение события нажатия мыши на графике ObjectSetInteger (chart_ID,name, OBJPROP_ZORDER ,z_order); //--- успешное выполнение return ( true ); } //+------------------------------------------------------------------+ //| Создает текстовую метку | //+------------------------------------------------------------------+ bool LabelCreate( const long chart_ID= 0 , // ID графика const string name= "Label" , // имя метки const int sub_window= 0 , // номер подокна const int x= 0 , // координата по оси X const int y= 0 , // координата по оси Y const string text= "Label" , // текст const color clr= clrRed , // цвет const string font= "Arial" , // шрифт const int font_size= 10 , // размер шрифта const double angle= 0.0 , // наклон текста const ENUM_BASE_CORNER corner= CORNER_LEFT_UPPER , // угол графика для привязки const ENUM_ANCHOR_POINT anchor= ANCHOR_LEFT_UPPER , // способ привязки const bool back= false , // на заднем плане const bool selection= false , // выделить для перемещений const bool hidden= true , // скрыт в списке объектов const long z_order= 0 ) // приоритет на нажатие мышью { //--- сбросим значение ошибки ResetLastError (); //--- создадим текстовую метку if ( ObjectFind (chart_ID,name)!=sub_window) { if (! ObjectCreate (chart_ID,name, OBJ_LABEL ,sub_window, 0 , 0 )) { Print ( __FUNCTION__ , ": не удалось создать текстовую метку! Код ошибки = " , GetLastError ()); return ( false ); } } //--- установим координаты метки ObjectSetInteger (chart_ID,name, OBJPROP_XDISTANCE ,x); ObjectSetInteger (chart_ID,name, OBJPROP_YDISTANCE ,y); //--- установим угол графика, относительно которого будут определяться координаты точки ObjectSetInteger (chart_ID,name, OBJPROP_CORNER ,corner); //--- установим текст ObjectSetString (chart_ID,name, OBJPROP_TEXT ,text); //--- установим шрифт текста ObjectSetString (chart_ID,name, OBJPROP_FONT ,font); //--- установим размер шрифта ObjectSetInteger (chart_ID,name, OBJPROP_FONTSIZE ,font_size); //--- установим угол наклона текста ObjectSetDouble (chart_ID,name, OBJPROP_ANGLE ,angle); //--- установим способ привязки ObjectSetInteger (chart_ID,name, OBJPROP_ANCHOR ,anchor); //--- установим цвет ObjectSetInteger (chart_ID,name, OBJPROP_COLOR ,clr); //--- отобразим на переднем (false) или заднем (true) плане ObjectSetInteger (chart_ID,name, OBJPROP_BACK ,back); //--- включим (true) или отключим (false) режим перемещения метки мышью ObjectSetInteger (chart_ID,name, OBJPROP_SELECTABLE ,selection); ObjectSetInteger (chart_ID,name, OBJPROP_SELECTED ,selection); //--- скроем (true) или отобразим (false) имя графического объекта в списке объектов ObjectSetInteger (chart_ID,name, OBJPROP_HIDDEN ,hidden); //--- установим приоритет на получение события нажатия мыши на графике ObjectSetInteger (chart_ID,name, OBJPROP_ZORDER ,z_order); //--- успешное выполнение return ( true ); } //+------------------------------------------------------------------+ //| Изменяет текст объекта | //+------------------------------------------------------------------+ bool LabelTextChange( const long chart_ID= 0 , // ID графика const string name= "Label" , // имя объекта const string text= "Text" ) // текст { //--- сбросим значение ошибки ResetLastError (); //--- изменим текст объекта if (! ObjectSetString (chart_ID,name, OBJPROP_TEXT ,text)) { Print ( __FUNCTION__ , ": не удалось изменить текст! Код ошибки = " , GetLastError ()); return ( false ); } //--- успешное выполнение return ( true ); } //+------------------------------------------------------------------+ //| Удаляет текстовую метку | //+------------------------------------------------------------------+ bool LabelDelete( const long chart_ID= 0 , // ID графика const string name= "Label" ) // имя метки { //--- сбросим значение ошибки ResetLastError (); //--- удалим метку if (! ObjectDelete (chart_ID,name)) { Print ( __FUNCTION__ , ": не удалось удалить текстовую метку! Код ошибки = " , GetLastError ()); return ( false ); } //--- успешное выполнение return ( true ); } //+------------------------------------------------------------------+ //| Удаляет прямоугольную метку | //+------------------------------------------------------------------+ bool RectLabelDelete( const long chart_ID= 0 , // ID графика const string name= "RectLabel" ) // имя метки { //--- сбросим значение ошибки ResetLastError (); //--- удалим метку if (! ObjectDelete (chart_ID,name)) { Print ( __FUNCTION__ , ": не удалось удалить прямоугольную метку! Код ошибки = " , GetLastError ()); return ( false ); } //--- успешное выполнение return ( true ); } //+------------------------------------------------------------------+ color ColorValue( double value) { if (value> 0 ) return (ColorPlus); if (value< 0 ) return (ColorMinus); return (ColorZero); } //+------------------------------------------------------------------+ …… Questions from Beginners MQL4 新人对MQL4和MQL5的任何问题,对算法和代码的帮助和讨论 专家顾问 - 杂项问题 Vitaly Muzichenko 2017.01.22 09:07 #527 Sergey Gritsay:我在你的仪表盘上做了一些工作。 我得到了这段代码,除以零 的错误已经被消除了。//+------------------------------------------------------------------+//| test_panel.mq4 |//| Sergey Gritsay |//| https://www.mql5.com/ru/users/sergey1294 |//+------------------------------------------------------------------+#property copyright "Sergey Gritsay"#property link "https://www.mql5.com/ru/users/sergey1294"#property version "1.00"#property strict....嗯,它是以EA的形式出现的,而且很可能你需要一个指标,因为安装了这个EA后,你就不能再安装EA了,你必须选择,或者安装一个交易EA,或者一个EA面板=) Sergey Gritsay 2017.01.22 09:17 #528 Vitaly Muzichenko:好吧,这是EA的形式,你很可能需要一个指标,因为安装了这个EA后,将不再可能安装EA,你将不得不选择,要么安装一个交易EA,要么安装一个EA面板=) 将这段代码复制到指标中并不难。拓荒者的问题中没有表明他在写一个指标。 ilnur17021992 2017.01.22 09:47 #529 Sergey Gritsay: 将这段代码复制到一个指标中并不难。问题中没有表明他在写指标。 非常感谢那些回应和帮助的人。实际上,我正在写的不仅仅是一个 "面板",而是一个全功能的交互式信息面板,其形式是一个网格机器人的指标。 附加的文件: 2017-01-22_14-42-25.png 70 kb 2017-01-22_14-43-54.png 77 kb Ivan Denisov 2017.01.24 17:16 #530 Vladimir Karputov:在策略测试器中,进入 "优化 "选项卡------。 这里将显示优化的结果。 我有mt4,我是这样做的,没有优化图,也没有结果! 1...464748495051525354555657585960...260 新评论 原因: 取消 您错过了交易机会: 免费交易应用程序 8,000+信号可供复制 探索金融市场的经济新闻 注册 登录 拉丁字符(不带空格) 密码将被发送至该邮箱 发生错误 使用 Google 登录 您同意网站政策和使用条款 如果您没有帐号,请注册 可以使用cookies登录MQL5.com网站。 请在您的浏览器中启用必要的设置,否则您将无法登录。 忘记您的登录名/密码? 使用 Google 登录
情况是这样的。
下午好,谁能提出解决这个问题的办法?在M15上有一个带入口的代码,但来自H1的信号被考虑到了。虽然在H1上有一个信号,但在M15上,指标给出了几个信号。问题是如何将其限制在一个(即第一个信号)。
k=0;
for (i=OrdersTotal()-1;i>=0;i-)
{
RefreshRates();
如果(OrderSelect(i, SELECT_BY_POS, MODE_TRADES) == true) a = 0;
if (OrderSymbol() == Symbol() && OrderMagicNumber() == Magic) k++;
}
if( stM1 >= 80 && stM0 < 80 && stH0 < 30 && k==0 && opp != Time[0]) // sale
我写了一个小的信息面板。
extern color PanelBackgroundColor = Black;
extern color PanelTextColor = White;
double MaxDD;
int OnInit()
{
//--- indicator buffers mapping
ObjectCreate("Background", OBJ_RECTANGLE_LABEL, 0, 0, 0);
ObjectSet("Background", OBJPROP_CORNER, 0);
ObjectSet("Background", OBJPROP_XDISTANCE, 5);
ObjectSet("Background", OBJPROP_YDISTANCE, 35);
ObjectSet("Background", OBJPROP_XSIZE, 215);
ObjectSet("Background", OBJPROP_YSIZE, 220);
ObjectSet("Background", OBJPROP_BGCOLOR, PanelBackgroundColor);
ObjectCreate("Account information", OBJ_LABEL, 0, 0, 0);
ObjectSet("Account information", OBJPROP_CORNER, 0);
ObjectSet("Account information", OBJPROP_XDISTANCE, 15);
ObjectSet("Account information", OBJPROP_YDISTANCE, 45);
ObjectSetText("Account information","=====Account information=====",10,"Arial",PanelTextColor);
ObjectCreate("Balance", OBJ_LABEL, 0, 0, 0);
ObjectSet("Balance", OBJPROP_CORNER, 0);
ObjectSet("Balance", OBJPROP_XDISTANCE, 15);
ObjectSet("Balance", OBJPROP_YDISTANCE, 60);
ObjectCreate("Profit/DD", OBJ_LABEL, 0, 0, 0);
ObjectSet("Profit/DD", OBJPROP_CORNER, 0);
ObjectSet("Profit/DD", OBJPROP_XDISTANCE, 15);
ObjectSet("Profit/DD", OBJPROP_YDISTANCE, 75);
ObjectCreate("Max DD", OBJ_LABEL, 0, 0, 0);
ObjectSet("Max DD", OBJPROP_CORNER, 0);
ObjectSet("Max DD", OBJPROP_XDISTANCE, 15);
ObjectSet("Max DD", OBJPROP_YDISTANCE, 90);
ObjectCreate("Equity", OBJ_LABEL, 0, 0, 0);
ObjectSet("Equity", OBJPROP_CORNER, 0);
ObjectSet("Equity", OBJPROP_XDISTANCE, 15);
ObjectSet("Equity", OBJPROP_YDISTANCE, 105);
ObjectCreate("Free margin", OBJ_LABEL, 0, 0, 0);
ObjectSet("Free margin", OBJPROP_CORNER, 0);
ObjectSet("Free margin", OBJPROP_XDISTANCE, 15);
ObjectSet("Free margin", OBJPROP_YDISTANCE, 120);
ObjectCreate("Pair information", OBJ_LABEL, 0, 0, 0);
ObjectSet("Pair information", OBJPROP_CORNER, 0);
ObjectSet("Pair information", OBJPROP_XDISTANCE, 15);
ObjectSet("Pair information", OBJPROP_YDISTANCE, 150);
ObjectSetText("Pair information","=======Pair information======",10,"Arial",PanelTextColor);
ObjectCreate("Pair", OBJ_LABEL, 0, 0, 0);
ObjectSet("Pair", OBJPROP_CORNER, 0);
ObjectSet("Pair", OBJPROP_XDISTANCE, 15);
ObjectSet("Pair", OBJPROP_YDISTANCE, 165);
ObjectSetText("Pair","Pair: "+Symbol(),10,"Arial",PanelTextColor);
ObjectCreate("Margin required", OBJ_LABEL, 0, 0, 0);
ObjectSet("Margin required", OBJPROP_CORNER, 0);
ObjectSet("Margin required", OBJPROP_XDISTANCE, 15);
ObjectSet("Margin required", OBJPROP_YDISTANCE, 180);
ObjectCreate("Price pips", OBJ_LABEL, 0, 0, 0);
ObjectSet("Price pips", OBJPROP_CORNER, 0);
ObjectSet("Price pips", OBJPROP_XDISTANCE, 15);
ObjectSet("Price pips", OBJPROP_YDISTANCE, 195);
ObjectCreate("Spread", OBJ_LABEL, 0, 0, 0);
ObjectSet("Spread", OBJPROP_CORNER, 0);
ObjectSet("Spread", OBJPROP_XDISTANCE, 15);
ObjectSet("Spread", OBJPROP_YDISTANCE, 210);
ObjectCreate("Leverage", OBJ_LABEL, 0, 0, 0);
ObjectSet("Leverage", OBJPROP_CORNER, 0);
ObjectSet("Leverage", OBJPROP_XDISTANCE, 15);
ObjectSet("Leverage", OBJPROP_YDISTANCE, 225);
//---
return(INIT_SUCCEEDED);
}
void start()
{
//Расчет максимальной просадки
if (AccountProfit()<0)
{
if (AccountProfit()<MaxDD)
MaxDD=AccountProfit();
}
ObjectSetText("Balance","Balance: "+DoubleToString (AccountBalance(),2)+" "+AccountCurrency(),10,"Arial",PanelTextColor);
ObjectSetText("Profit/DD","Profit/DD: "+DoubleToString (AccountProfit(),2)+" ("+DoubleToString((AccountProfit()*100)/AccountBalance(),2)+"%)",10,"Arial",PanelTextColor);
ObjectSetText("Max DD","Max DD: "+DoubleToString (MaxDD,2)+" ("+DoubleToString((MaxDD*100)/AccountBalance(),2)+"%)",10,"Arial",PanelTextColor);
ObjectSetText("Equity","Equity: "+DoubleToString (AccountEquity(),2),10,"Arial",PanelTextColor);
ObjectSetText("Free margin","Free margin: "+DoubleToString (AccountFreeMargin(),2),10,"Arial",PanelTextColor);
ObjectSetText("Margin required","Margin required: "+DoubleToString(MarketInfo(Symbol(), MODE_MARGINREQUIRED), 2)+" $",10,"Arial",PanelTextColor);
ObjectSetText("Price pips","Price pips: "+DoubleToString(MarketInfo(Symbol(), MODE_TICKVALUE), 2)+" $",10,"Arial",PanelTextColor);
ObjectSetText("Spread","Spread: "+DoubleToString(MarketInfo(Symbol(),MODE_SPREAD),2),10,"Arial",PanelTextColor);
ObjectSetText("Leverage","Leverage: 1:"+IntegerToString(AccountLeverage(), 0),10,"Arial",PanelTextColor);
}
一切工作正常,信息显示正确,但只要你重新启动终端,面板就会停止工作(写明余额为0,其余信息停止更新,并冻结在一个位置上,简单地挂起)。如何打击这种情况?
附上一张截图。我写了一个小的信息面板。
extern color PanelBackgroundColor = Black;
extern color PanelTextColor = White;
double MaxDD;
int OnInit()
{
//--- indicator buffers mapping
ObjectCreate("Background", OBJ_RECTANGLE_LABEL, 0, 0, 0);
ObjectSet("Background", OBJPROP_CORNER, 0);
ObjectSet("Background", OBJPROP_XDISTANCE, 5);
ObjectSet("Background", OBJPROP_YDISTANCE, 35);
ObjectSet("Background", OBJPROP_XSIZE, 215);
ObjectSet("Background", OBJPROP_YSIZE, 220);
ObjectSet("Background", OBJPROP_BGCOLOR, PanelBackgroundColor);
ObjectCreate("Account information", OBJ_LABEL, 0, 0, 0);
ObjectSet("Account information", OBJPROP_CORNER, 0);
ObjectSet("Account information", OBJPROP_XDISTANCE, 15);
ObjectSet("Account information", OBJPROP_YDISTANCE, 45);
ObjectSetText("Account information","=====Account information=====",10,"Arial",PanelTextColor);
ObjectCreate("Balance", OBJ_LABEL, 0, 0, 0);
ObjectSet("Balance", OBJPROP_CORNER, 0);
ObjectSet("Balance", OBJPROP_XDISTANCE, 15);
ObjectSet("Balance", OBJPROP_YDISTANCE, 60);
ObjectCreate("Profit/DD", OBJ_LABEL, 0, 0, 0);
ObjectSet("Profit/DD", OBJPROP_CORNER, 0);
ObjectSet("Profit/DD", OBJPROP_XDISTANCE, 15);
ObjectSet("Profit/DD", OBJPROP_YDISTANCE, 75);
ObjectCreate("Max DD", OBJ_LABEL, 0, 0, 0);
ObjectSet("Max DD", OBJPROP_CORNER, 0);
ObjectSet("Max DD", OBJPROP_XDISTANCE, 15);
ObjectSet("Max DD", OBJPROP_YDISTANCE, 90);
ObjectCreate("Equity", OBJ_LABEL, 0, 0, 0);
ObjectSet("Equity", OBJPROP_CORNER, 0);
ObjectSet("Equity", OBJPROP_XDISTANCE, 15);
ObjectSet("Equity", OBJPROP_YDISTANCE, 105);
ObjectCreate("Free margin", OBJ_LABEL, 0, 0, 0);
ObjectSet("Free margin", OBJPROP_CORNER, 0);
ObjectSet("Free margin", OBJPROP_XDISTANCE, 15);
ObjectSet("Free margin", OBJPROP_YDISTANCE, 120);
ObjectCreate("Pair information", OBJ_LABEL, 0, 0, 0);
ObjectSet("Pair information", OBJPROP_CORNER, 0);
ObjectSet("Pair information", OBJPROP_XDISTANCE, 15);
ObjectSet("Pair information", OBJPROP_YDISTANCE, 150);
ObjectSetText("Pair information","=======Pair information======",10,"Arial",PanelTextColor);
ObjectCreate("Pair", OBJ_LABEL, 0, 0, 0);
ObjectSet("Pair", OBJPROP_CORNER, 0);
ObjectSet("Pair", OBJPROP_XDISTANCE, 15);
ObjectSet("Pair", OBJPROP_YDISTANCE, 165);
ObjectSetText("Pair","Pair: "+Symbol(),10,"Arial",PanelTextColor);
ObjectCreate("Margin required", OBJ_LABEL, 0, 0, 0);
ObjectSet("Margin required", OBJPROP_CORNER, 0);
ObjectSet("Margin required", OBJPROP_XDISTANCE, 15);
ObjectSet("Margin required", OBJPROP_YDISTANCE, 180);
ObjectCreate("Price pips", OBJ_LABEL, 0, 0, 0);
ObjectSet("Price pips", OBJPROP_CORNER, 0);
ObjectSet("Price pips", OBJPROP_XDISTANCE, 15);
ObjectSet("Price pips", OBJPROP_YDISTANCE, 195);
ObjectCreate("Spread", OBJ_LABEL, 0, 0, 0);
ObjectSet("Spread", OBJPROP_CORNER, 0);
ObjectSet("Spread", OBJPROP_XDISTANCE, 15);
ObjectSet("Spread", OBJPROP_YDISTANCE, 210);
ObjectCreate("Leverage", OBJ_LABEL, 0, 0, 0);
ObjectSet("Leverage", OBJPROP_CORNER, 0);
ObjectSet("Leverage", OBJPROP_XDISTANCE, 15);
ObjectSet("Leverage", OBJPROP_YDISTANCE, 225);
//---
return(INIT_SUCCEEDED);
}
void start()
{
//Расчет максимальной просадки
if (AccountProfit()<0)
{
if (AccountProfit()<MaxDD)
MaxDD=AccountProfit();
}
ObjectSetText("Balance","Balance: "+DoubleToString (AccountBalance(),2)+" "+AccountCurrency(),10,"Arial",PanelTextColor);
ObjectSetText("Profit/DD","Profit/DD: "+DoubleToString (AccountProfit(),2)+" ("+DoubleToString((AccountProfit()*100)/AccountBalance(),2)+"%)",10,"Arial",PanelTextColor);
ObjectSetText("Max DD","Max DD: "+DoubleToString (MaxDD,2)+" ("+DoubleToString((MaxDD*100)/AccountBalance(),2)+"%)",10,"Arial",PanelTextColor);
ObjectSetText("Equity","Equity: "+DoubleToString (AccountEquity(),2),10,"Arial",PanelTextColor);
ObjectSetText("Free margin","Free margin: "+DoubleToString (AccountFreeMargin(),2),10,"Arial",PanelTextColor);
ObjectSetText("Margin required","Margin required: "+DoubleToString(MarketInfo(Symbol(), MODE_MARGINREQUIRED), 2)+" $",10,"Arial",PanelTextColor);
ObjectSetText("Price pips","Price pips: "+DoubleToString(MarketInfo(Symbol(), MODE_TICKVALUE), 2)+" $",10,"Arial",PanelTextColor);
ObjectSetText("Spread","Spread: "+DoubleToString(MarketInfo(Symbol(),MODE_SPREAD),2),10,"Arial",PanelTextColor);
ObjectSetText("Leverage","Leverage: 1:"+IntegerToString(AccountLeverage(), 0),10,"Arial",PanelTextColor);
}
一切工作正常,信息显示正确,但当你重新启动终端时,面板停止运作(写出余额为0,其余的信息停止更新,冻结在一个位置上,简单地挂起)。如何处理这个问题?
我附上一张屏幕截图。不久前讨论过类似的问题,你是否查看过日志标签或专家顾问,我可以100%肯定地说,你在这些行中有一个除以0 的错误
ObjectSetText("Max DD","Max DD: "+DoubleToString (MaxDD,2)+" ("+DoubleToString((MaxDD*100)/AccountBalance(),2)+"%)",10,"Arial",PanelTextColor);
...
我写了一个小的信息面板。
{
//Расчет максимальной просадки
if (AccountProfit()<0)
{
if (AccountProfit()<MaxDD)
MaxDD=AccountProfit();
}
ObjectSetText("Balance","Balance: "+DoubleToString (AccountBalance(),2)+" "+AccountCurrency(),10,"Arial",PanelTextColor);
...
ObjectSetText("Leverage","Leverage: 1:"+IntegerToString(AccountLeverage(), 0),10,"Arial",PanelTextColor);
}
一切工作正常,信息显示正确,但只要你重新启动终端,面板就会停止工作(写出余额为0,其余信息停止更新,冻结在一个位置上,简单地挂起)。如何与之抗争?
附上屏幕截图。像这样试试吧。
{
if (AccountBalance()<5) return; // <<< if (AccountBalance()==0) return;
//Расчет максимальной просадки
if (AccountProfit()<0)
{
if (AccountProfit()<MaxDD)
MaxDD=AccountProfit();
}
ObjectSetText("Balance","Balance: "+DoubleToString (AccountBalance(),2)+" "+AccountCurrency(),10,"Arial",PanelTextColor);
...
ObjectSetText("Leverage","Leverage: 1:"+IntegerToString(AccountLeverage(), 0),10,"Arial",PanelTextColor);
}
写了一个小的信息面板:
extern color PanelBackgroundColor = Black;
extern color PanelTextColor = White;
一切正常,信息显示正确,但是一旦重新启动终端,面板就会停止运行(它说余额为 0,其余信息停止更新并冻结在一个位置,它只是冻结)。如何处理?
附截图:我在你的面板上做了一个小魔术。结果如下代码,消除了被零除的错误。
//| test_panel.mq4 |
//| Sergey Gritsay |
//| https://www.mql5.com/ru/users/sergey1294 |
//+------------------------------------------------------------------+
#property copyright "Sergey Gritsay"
#property link "https://www.mql5.com/ru/users/sergey1294"
#property version "1.00"
#property strict
sinput string Display= NULL ; //Настройки отображения
input color PanelBackgroundColor = clrBlack ;
input color PanelTextColor = clrWhite ;
input color ColorMinus= clrRed ;
input color ColorPlus= clrBlueViolet ;
input color ColorZero= clrMediumAquamarine ;
double balans= 0.0 ;
double profit= 0.0 ;
double profit_dd_procent= 0.0 ;
double MaxDD= 0.0 ;
double MaxDD_procent= 0.0 ;
double Equity= 0.0 ;
double Freemargin= 0.0 ;
double Marginrequired= 0.0 ;
double Pricepips= 0.0 ;
int Spread= 0 ;
int Leverage= 0 ;
string symbol= NULL ;
string currency= NULL ;
int X= 15 ;
int Y= 45 ;
int size= 15 ;
int x_sdvig= 150 ;
//+------------------------------------------------------------------+
//| Expert initialization function |
//+------------------------------------------------------------------+
int OnInit ()
{
//---
Refresh();
Panel();
//---
return ( INIT_SUCCEEDED );
}
//+------------------------------------------------------------------+
//| Expert deinitialization function |
//+------------------------------------------------------------------+
void OnDeinit ( const int reason)
{
//---
RectLabelDelete( 0 , "Background" );
LabelDelete( 0 , "Account information" );
LabelDelete( 0 , "Balance" );
LabelDelete( 0 , "Balance value" );
LabelDelete( 0 , "Profit/DD" );
LabelDelete( 0 , "Profit/DD value" );
LabelDelete( 0 , "Max DD" );
LabelDelete( 0 , "Max DD value" );
LabelDelete( 0 , "Equity" );
LabelDelete( 0 , "Equity value" );
LabelDelete( 0 , "Free margin" );
LabelDelete( 0 , "Free margin value" );
LabelDelete( 0 , "Pair information" );
LabelDelete( 0 , "Pair" );
LabelDelete( 0 , "Pair value" );
LabelDelete( 0 , "Margin required" );
LabelDelete( 0 , "Margin required value" );
LabelDelete( 0 , "Price pips" );
LabelDelete( 0 , "Price pips value" );
LabelDelete( 0 , "Spread" );
LabelDelete( 0 , "Spread value" );
LabelDelete( 0 , "Leverage" );
LabelDelete( 0 , "Leverage value" );
}
//+------------------------------------------------------------------+
//| Expert tick function |
//+------------------------------------------------------------------+
void OnTick ()
{
//---
Refresh();
Panel();
}
//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
void Refresh()
{
symbol= _Symbol ;
currency= AccountInfoString ( ACCOUNT_CURRENCY );
balans = AccountInfoDouble ( ACCOUNT_BALANCE );
profit = AccountInfoDouble ( ACCOUNT_PROFIT );
Equity = AccountInfoDouble ( ACCOUNT_EQUITY );
Freemargin= AccountInfoDouble ( ACCOUNT_MARGIN_FREE );
Marginrequired= MarketInfo (symbol, MODE_MARGINREQUIRED );
Pricepips= SymbolInfoDouble (symbol, SYMBOL_TRADE_TICK_VALUE );
Leverage=( int ) AccountInfoInteger ( ACCOUNT_LEVERAGE );
double ask= SymbolInfoDouble (symbol, SYMBOL_ASK );
double bid= SymbolInfoDouble (symbol, SYMBOL_BID );
double point= SymbolInfoDouble (symbol, SYMBOL_POINT );
Spread=( int ) SymbolInfoInteger (symbol, SYMBOL_SPREAD );
if (Spread== 0 )Spread= int ((ask-bid)/point);
//Расчет максимальной просадки
if (profit< 0 )
if (profit<MaxDD)
MaxDD=profit;
if (balans!= 0 )
{
profit_dd_procent=profit* 100.0 /balans;
MaxDD_procent=MaxDD* 100.0 /balans;
}
}
//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
void Panel()
{
RectLabelCreate( 0 , "Background" , 0 , 5 , 35 , 300 , 230 ,PanelBackgroundColor);
LabelCreate( 0 , "Account information" , 0 ,X,Y, "=====Account information=====" ,PanelTextColor);Y+=size;
LabelCreate( 0 , "Balance" , 0 ,X,Y, "Balance (" +currency+ "):" ,PanelTextColor);
LabelCreate( 0 , "Balance value" , 0 ,x_sdvig,Y, DoubleToString (balans, 2 ),ColorValue(balans));Y+=size;
LabelCreate( 0 , "Profit/DD" , 0 ,X,Y, "Profit/DD (" +currency+ " / %):" ,PanelTextColor);
LabelCreate( 0 , "Profit/DD value" , 0 ,x_sdvig,Y, DoubleToString (profit, 2 )+ " / " + DoubleToString (profit_dd_procent, 2 ),ColorValue(profit));Y+=size;
LabelCreate( 0 , "Max DD" , 0 ,X,Y, "Max DD (" +currency+ " / %):" ,PanelTextColor);
LabelCreate( 0 , "Max DD value" , 0 ,x_sdvig,Y, DoubleToString (MaxDD, 2 )+ " / " + DoubleToString (MaxDD_procent, 2 ),ColorValue(MaxDD));Y+=size;
LabelCreate( 0 , "Equity" , 0 ,X,Y, "Equity (" +currency+ "):" ,PanelTextColor);
LabelCreate( 0 , "Equity value" , 0 ,x_sdvig,Y,( string )Equity,ColorValue(Equity));Y+=size;
LabelCreate( 0 , "Free margin" , 0 ,X,Y, "Free margin (" +currency+ "):" ,PanelTextColor);
LabelCreate( 0 , "Free margin value" , 0 ,x_sdvig,Y,( string )Freemargin,ColorValue(Freemargin));Y+=size;Y+=size;
LabelCreate( 0 , "Pair information" , 0 ,X,Y, "=======Pair information======" ,PanelTextColor);Y+=size;
LabelCreate( 0 , "Pair" , 0 ,X,Y, "Pair:" ,PanelTextColor);
LabelCreate( 0 , "Pair value" , 0 ,x_sdvig,Y,symbol,PanelTextColor);Y+=size;
LabelCreate( 0 , "Margin required" , 0 ,X,Y, "Margin required (" +currency+ "):" ,PanelTextColor);
LabelCreate( 0 , "Margin required value" , 0 ,x_sdvig,Y,( string )Marginrequired,ColorValue(Marginrequired));Y+=size;
LabelCreate( 0 , "Price pips" , 0 ,X,Y, "Price pips (" +currency+ "):" ,PanelTextColor);
LabelCreate( 0 , "Price pips value" , 0 ,x_sdvig,Y,( string )Pricepips,ColorValue(Pricepips));Y+=size;
LabelCreate( 0 , "Spread" , 0 ,X,Y, "Spread:" ,PanelTextColor);
LabelCreate( 0 , "Spread value" , 0 ,x_sdvig,Y,( string )Spread,ColorValue(Spread));Y+=size;
LabelCreate( 0 , "Leverage" , 0 ,X,Y, "Leverage:" ,PanelTextColor);
LabelCreate( 0 , "Leverage value" , 0 ,x_sdvig,Y, "1:" +( string )Leverage,PanelTextColor);
}
//+------------------------------------------------------------------+
//| Создает прямоугольную метку |
//+------------------------------------------------------------------+
bool RectLabelCreate( const long chart_ID= 0 , // ID графика
const string name= "RectLabel" , // имя метки
const int sub_window= 0 , // номер подокна
const int x= 0 , // координата по оси X
const int y= 0 , // координата по оси Y
const int width= 50 , // ширина
const int height= 18 , // высота
const color back_clr= C'236,233,216' , // цвет фона
const ENUM_BORDER_TYPE border= BORDER_SUNKEN , // тип границы
const ENUM_BASE_CORNER corner= CORNER_LEFT_UPPER , // угол графика для привязки
const color clr= clrRed , // цвет плоской границы (Flat)
const ENUM_LINE_STYLE style= STYLE_SOLID , // стиль плоской границы
const int line_width= 1 , // толщина плоской границы
const bool back= false , // на заднем плане
const bool selection= false , // выделить для перемещений
const bool hidden= true , // скрыт в списке объектов
const long z_order= 0 ) // приоритет на нажатие мышью
{
//--- сбросим значение ошибки
ResetLastError ();
//--- создадим прямоугольную метку
if ( ObjectFind (chart_ID,name)!=sub_window)
{
if (! ObjectCreate (chart_ID,name, OBJ_RECTANGLE_LABEL ,sub_window, 0 , 0 ))
{
Print ( __FUNCTION__ ,
": не удалось создать прямоугольную метку! Код ошибки = " , GetLastError ());
return ( false );
}
}
//--- установим координаты метки
ObjectSetInteger (chart_ID,name, OBJPROP_XDISTANCE ,x);
ObjectSetInteger (chart_ID,name, OBJPROP_YDISTANCE ,y);
//--- установим размеры метки
ObjectSetInteger (chart_ID,name, OBJPROP_XSIZE ,width);
ObjectSetInteger (chart_ID,name, OBJPROP_YSIZE ,height);
//--- установим цвет фона
ObjectSetInteger (chart_ID,name, OBJPROP_BGCOLOR ,back_clr);
//--- установим тип границы
ObjectSetInteger (chart_ID,name, OBJPROP_BORDER_TYPE ,border);
//--- установим угол графика, относительно которого будут определяться координаты точки
ObjectSetInteger (chart_ID,name, OBJPROP_CORNER ,corner);
//--- установим цвет плоской рамки (в режиме Flat)
ObjectSetInteger (chart_ID,name, OBJPROP_COLOR ,clr);
//--- установим стиль линии плоской рамки
ObjectSetInteger (chart_ID,name, OBJPROP_STYLE ,style);
//--- установим толщину плоской границы
ObjectSetInteger (chart_ID,name, OBJPROP_WIDTH ,line_width);
//--- отобразим на переднем (false) или заднем (true) плане
ObjectSetInteger (chart_ID,name, OBJPROP_BACK ,back);
//--- включим (true) или отключим (false) режим перемещения метки мышью
ObjectSetInteger (chart_ID,name, OBJPROP_SELECTABLE ,selection);
ObjectSetInteger (chart_ID,name, OBJPROP_SELECTED ,selection);
//--- скроем (true) или отобразим (false) имя графического объекта в списке объектов
ObjectSetInteger (chart_ID,name, OBJPROP_HIDDEN ,hidden);
//--- установим приоритет на получение события нажатия мыши на графике
ObjectSetInteger (chart_ID,name, OBJPROP_ZORDER ,z_order);
//--- успешное выполнение
return ( true );
}
//+------------------------------------------------------------------+
//| Создает текстовую метку |
//+------------------------------------------------------------------+
bool LabelCreate( const long chart_ID= 0 , // ID графика
const string name= "Label" , // имя метки
const int sub_window= 0 , // номер подокна
const int x= 0 , // координата по оси X
const int y= 0 , // координата по оси Y
const string text= "Label" , // текст
const color clr= clrRed , // цвет
const string font= "Arial" , // шрифт
const int font_size= 10 , // размер шрифта
const double angle= 0.0 , // наклон текста
const ENUM_BASE_CORNER corner= CORNER_LEFT_UPPER , // угол графика для привязки
const ENUM_ANCHOR_POINT anchor= ANCHOR_LEFT_UPPER , // способ привязки
const bool back= false , // на заднем плане
const bool selection= false , // выделить для перемещений
const bool hidden= true , // скрыт в списке объектов
const long z_order= 0 ) // приоритет на нажатие мышью
{
//--- сбросим значение ошибки
ResetLastError ();
//--- создадим текстовую метку
if ( ObjectFind (chart_ID,name)!=sub_window)
{
if (! ObjectCreate (chart_ID,name, OBJ_LABEL ,sub_window, 0 , 0 ))
{
Print ( __FUNCTION__ ,
": не удалось создать текстовую метку! Код ошибки = " , GetLastError ());
return ( false );
}
}
//--- установим координаты метки
ObjectSetInteger (chart_ID,name, OBJPROP_XDISTANCE ,x);
ObjectSetInteger (chart_ID,name, OBJPROP_YDISTANCE ,y);
//--- установим угол графика, относительно которого будут определяться координаты точки
ObjectSetInteger (chart_ID,name, OBJPROP_CORNER ,corner);
//--- установим текст
ObjectSetString (chart_ID,name, OBJPROP_TEXT ,text);
//--- установим шрифт текста
ObjectSetString (chart_ID,name, OBJPROP_FONT ,font);
//--- установим размер шрифта
ObjectSetInteger (chart_ID,name, OBJPROP_FONTSIZE ,font_size);
//--- установим угол наклона текста
ObjectSetDouble (chart_ID,name, OBJPROP_ANGLE ,angle);
//--- установим способ привязки
ObjectSetInteger (chart_ID,name, OBJPROP_ANCHOR ,anchor);
//--- установим цвет
ObjectSetInteger (chart_ID,name, OBJPROP_COLOR ,clr);
//--- отобразим на переднем (false) или заднем (true) плане
ObjectSetInteger (chart_ID,name, OBJPROP_BACK ,back);
//--- включим (true) или отключим (false) режим перемещения метки мышью
ObjectSetInteger (chart_ID,name, OBJPROP_SELECTABLE ,selection);
ObjectSetInteger (chart_ID,name, OBJPROP_SELECTED ,selection);
//--- скроем (true) или отобразим (false) имя графического объекта в списке объектов
ObjectSetInteger (chart_ID,name, OBJPROP_HIDDEN ,hidden);
//--- установим приоритет на получение события нажатия мыши на графике
ObjectSetInteger (chart_ID,name, OBJPROP_ZORDER ,z_order);
//--- успешное выполнение
return ( true );
}
//+------------------------------------------------------------------+
//| Изменяет текст объекта |
//+------------------------------------------------------------------+
bool LabelTextChange( const long chart_ID= 0 , // ID графика
const string name= "Label" , // имя объекта
const string text= "Text" ) // текст
{
//--- сбросим значение ошибки
ResetLastError ();
//--- изменим текст объекта
if (! ObjectSetString (chart_ID,name, OBJPROP_TEXT ,text))
{
Print ( __FUNCTION__ ,
": не удалось изменить текст! Код ошибки = " , GetLastError ());
return ( false );
}
//--- успешное выполнение
return ( true );
}
//+------------------------------------------------------------------+
//| Удаляет текстовую метку |
//+------------------------------------------------------------------+
bool LabelDelete( const long chart_ID= 0 , // ID графика
const string name= "Label" ) // имя метки
{
//--- сбросим значение ошибки
ResetLastError ();
//--- удалим метку
if (! ObjectDelete (chart_ID,name))
{
Print ( __FUNCTION__ ,
": не удалось удалить текстовую метку! Код ошибки = " , GetLastError ());
return ( false );
}
//--- успешное выполнение
return ( true );
}
//+------------------------------------------------------------------+
//| Удаляет прямоугольную метку |
//+------------------------------------------------------------------+
bool RectLabelDelete( const long chart_ID= 0 , // ID графика
const string name= "RectLabel" ) // имя метки
{
//--- сбросим значение ошибки
ResetLastError ();
//--- удалим метку
if (! ObjectDelete (chart_ID,name))
{
Print ( __FUNCTION__ ,
": не удалось удалить прямоугольную метку! Код ошибки = " , GetLastError ());
return ( false );
}
//--- успешное выполнение
return ( true );
}
//+------------------------------------------------------------------+
color ColorValue( double value)
{
if (value> 0 ) return (ColorPlus);
if (value< 0 ) return (ColorMinus);
return (ColorZero);
}
//+------------------------------------------------------------------+
……
我在你的仪表盘上做了一些工作。 我得到了这段代码,除以零 的错误已经被消除了。
//| test_panel.mq4 |
//| Sergey Gritsay |
//| https://www.mql5.com/ru/users/sergey1294 |
//+------------------------------------------------------------------+
#property copyright "Sergey Gritsay"
#property link "https://www.mql5.com/ru/users/sergey1294"
#property version "1.00"
#property strict
....
嗯,它是以EA的形式出现的,而且很可能你需要一个指标,因为安装了这个EA后,你就不能再安装EA了,你必须选择,或者安装一个交易EA,或者一个EA面板=)
好吧,这是EA的形式,你很可能需要一个指标,因为安装了这个EA后,将不再可能安装EA,你将不得不选择,要么安装一个交易EA,要么安装一个EA面板=)
将这段代码复制到一个指标中并不难。问题中没有表明他在写指标。
在策略测试器中,进入 "优化 "选项卡------。
这里将显示优化的结果。