Preguntas de los principiantes MQL4 MT4 MetaTrader 4 - página 53

 
Vitaly Muzichenko:

Es algo así:

Genial, los beneficios se acumulan. Gracias.
 

Buenas tardes, ¿Alguien puede sugerir una solución a este tema? Hay un código con entrada en M15, pero se tiene en cuenta la señal de H1. Mientras que hay una señal en H1, en M15 el indicador da varias señales. La cuestión es cómo limitarlo a uno (es decir, la primera señal).

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]) // venta

 

He escrito un pequeño panel informativo:

extern string     Display                    = "Настройки отображения"; //Display
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);
}

Todo funciona, muestra la información correctamente, pero al reiniciar el terminal, el panel deja de funcionar (escribe que el saldo es 0, y el resto de la información deja de actualizarse y se congela en una posición, simplemente se cuelga). ¿Cómo combatirlo?

Se adjunta una captura de pantalla:
Archivos adjuntos:
 
ilnur17021992:

He escrito un pequeño panel informativo:

extern string     Display                    = "Настройки отображения"; //Display
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);
}

Todo funciona, muestra la información correctamente, pero al reiniciar el terminal, el panel deja de funcionar (escribe que el saldo es 0, y el resto de la información deja de actualizarse y se congela en una posición, simplemente se cuelga). ¿Cómo afrontarlo?

Adjunto una captura de pantalla:

Problema similar comentado no hace mucho, has mirado la pestaña de registro o los Asesores Expertos, puedo decir con 100% de certeza que tienes un error de división por cero en estas líneas

   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);


...

 
ilnur17021992:

He escrito un pequeño panel informativo:

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);
}

Todo funciona, muestra la información correctamente, pero en cuanto reinicias el terminal, el panel deja de funcionar (escribe que el saldo es 0 y el resto de la información deja de actualizarse y se congela en una posición, simplemente se cuelga). ¿Cómo luchar contra ello?

Se adjunta captura de pantalla:

Pruébalo así:

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);
}
Este problema se debe a que la conexión con el servidor aún no se ha producido y no hay datos en la cuenta, por lo que se divide por cero. Introduzca una simple comprobación y si no hay conexión el saldo será cero - espere a la conexión y actualice.
 
ilnur17021992 :

Escribió un pequeño panel de información:

extern string      Display                    = "Настройки отображения" ; //Display
extern color       PanelBackgroundColor       = Black;
extern color       PanelTextColor             = White;



Todo funciona, la información se muestra correctamente, pero en cuanto se reinicia el terminal, el panel deja de funcionar (dice que el saldo es 0, y el resto de la información deja de actualizarse y se congela en una posición, simplemente se congela). ¿Cómo lidiar con ello?

Captura de pantalla adjunta:

Hice un poco de magia en tu panel. Obtuve este código, eliminé el error de división por cero .

//+------------------------------------------------------------------+
//|                                                   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);
  }
//+------------------------------------------------------------------+


....

 
Sergey Gritsay:

He hecho un poco de trabajo en su tablero. Tengo este código, el error de la división por cero se ha eliminado.

//+------------------------------------------------------------------+
//|                                                   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


....

Bueno, es en forma de EA, y lo más probable es que usted necesita un indicador, porque después de instalar este EA, no se puede instalar un EA más y usted tiene que elegir, o instalar un EA de comercio, o un panel de EA =)

 
Vitaly Muzichenko:

Bueno, esto es en forma de un EA, y lo más probable es que necesite un indicador, porque después de instalar este EA, ya no será posible instalar un EA, y usted tendrá que elegir, ya sea para instalar un EA de comercio o un panel de EA =)

No es demasiado difícil copiar este código en el indicador. En la pregunta del topiker no había ninguna indicación de que estuviera escribiendo un indicador.
 
Sergey Gritsay:
No es demasiado difícil copiar este código en un indicador. La pregunta no indicaba que estuviera escribiendo el indicador.
Muchas gracias a los que respondieron y ayudaron. En realidad estoy escribiendo no sólo un "panel", sino un panel de información interactivo con todas las funciones en forma de indicador para un robot de rejilla:
Archivos adjuntos:
 
Vladimir Karputov:

En el probador de estrategias, vaya a la pestaña "Optimización" -

Aquí se mostrarán los resultados de la optimización.

¡Tengo mt4 y lo hice así, singráfico de optimización y sin resultados!