初心者の方からの質問 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には複数のシグナルがある。問題は、それをどうやって1つ(つまり最初の信号)に限定するかということです。k=0; for (i=OrdersTotal()-1;i>=0;i--){ RefreshRates(); if(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]) // 売却 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 コーディングのヘルプ Wrong parameters count! 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であることを書き込み、その他の情報は更新が止まり、1つの位置でフリーズし、単にハングアップする)。どう対処すればいいのか? スクリーンショットを添付します。少し前に議論された同様の問題ですが、ログタブまたはExpert Advisorsを見たことがありますか、私は100%の確信を持って、これらの行でゼロによる分割 エラーがあると言うことができます 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);} この問題は、サーバーへの接続が まだ起こっておらず、アカウントにデータがないため、ゼロで割ってしまうことに起因します。簡単なチェックを入力し、接続がない場合は残高がゼロになる - 接続を待って更新する。 Sergey Gritsay 2017.01.22 07:55 #526 ilnur17021992 :小さな情報パネルを書きました: extern string Display = "Настройки отображения" ; //Display extern color PanelBackgroundColor = Black; extern color PanelTextColor = White;すべてが機能し、情報は正しく表示されますが、端末が再起動されるとすぐに、パネルは機能を停止します(バランスが0であり、残りの情報が更新を停止し、1つの位置でフリーズすると、単にフリーズします)。どのように対処しますか?添付のスクリーンショット:私はあなたのパネルに少し魔法をかけました。このコードを取得し、ゼロ除算のエラーを排除しました。 //+------------------------------------------------------------------+ //| 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パネルのどちらかをインストールしなければならなくなります =)。 このコードをインジケータにコピーするのはそれほど難しいことではありません。トピ主の質問には、インジケーターを書いている様子はなかった。 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千を超えるシグナルをコピー 金融ニュースで金融マーケットを探索 新規登録 ログイン スペースを含まないラテン文字 このメールにパスワードが送信されます エラーが発生しました Googleでログイン WebサイトポリシーおよびMQL5.COM利用規約に同意します。 新規登録 MQL5.com WebサイトへのログインにCookieの使用を許可します。 ログインするには、ブラウザで必要な設定を有効にしてください。 ログイン/パスワードをお忘れですか? Googleでログイン
こんな感じです。
こんにちは、どなたかこの問題の解決策を提案していただけないでしょうか。M15にエントリーでコードがありますが、H1からの信号が考慮されています。H1にはシグナルがあるが、M15には複数のシグナルがある。問題は、それをどうやって1つ(つまり最初の信号)に限定するかということです。
k=0;
for (i=OrdersTotal()-1;i>=0;i--)
{
RefreshRates();
if(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]) // 売却
小さなインフォパネルを書きました。
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であることを書き込み、その他の情報は更新が止まり、1つの位置でフリーズし、単にハングアップする)。どう対処すればいいのか?
スクリーンショットを添付します。少し前に議論された同様の問題ですが、ログタブまたはExpert Advisorsを見たことがありますか、私は100%の確信を持って、これらの行でゼロによる分割 エラーがあると言うことができます
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であり、残りの情報が更新を停止し、1つの位置でフリーズすると、単にフリーズします)。どのように対処しますか?
添付のスクリーンショット:私はあなたのパネルに少し魔法をかけました。このコードを取得し、ゼロ除算のエラーを排除しました。
//| 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パネルのどちらかをインストールしなければならなくなります =)。
このコードをインジケータにコピーするのはそれほど難しいことではありません。質問には、インジケーターを書いている様子はなかった。
ストラテジーテスターで、「最適化」タブに移動します。
ここには、最適化の結果が表示されます。