Fragen von Anfängern MQL5 MT5 MetaTrader 5 - Seite 1331

 

Helfen Sie mit, den Indikator zu beheben, er wird nicht im MT5-Terminal angezeigt, er gibt Fehler während der Kompilierung.

 //--- descriзгo
#property description "Script cria objeto grбfico de \"Texto\"."
//--- janela de exibiзгo dos parвmetros de entrada durante inicializaзгo do script
#property script_show_inputs


//--- entrada de parвmetros do script
input int                IHistoryBars= 25 ;           // Check Historical Data
input string             InpFont= "Tahoma" ;       // Font Type
input int                InpFontSize= 7 ;           // Size of fonts
input color              UpColor= clrGold ;         // Cor Up
input color              DwColor= clrRoyalBlue ;         // Cor Dw
input color              HLColor= clrAqua ;         // Cor Center
input bool               InpBack= false ;           // Objeto de fundo
input bool               InpSelection= false ;       // Destaque para mover
input bool               InpHidden= true ;           // Ocultar na lista de objetos
input bool               WithDigit= true ;           // Ocultar na lista de objetos
input long               InpZOrder= 0 ;             // Prioridade para clique do mouse


int digits= 0 ,extradig= 0 ;

double             InpAngle= 0.0 ;           // Вngulo de inclinaзгo em graus
ENUM_ANCHOR_POINT InpAnchor= ANCHOR_CENTER ; // Tipo de ancoragem
double    gBars= 0 ;
double    gTotalRates= 0 ;
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void OnInit ()
  {
   digits= MathPow ( 10 , _Digits -extradig);
   if (WithDigit) extradig= 1 ;

  }
//+------------------------------------------------------------------+
//| Mover ponto de ancoragem                                         |
//+------------------------------------------------------------------+
bool TextMove( const long    chart_ID= 0 ,   // ID do grбfico
               const string name= "Text" , // nome do objeto
               datetime      time= 0 ,       // coordenada do ponto de ancoragem do tempo
               double        price= 0 )     // coordenada do ponto de ancoragem do preзo
  {
//--- se a posiзгo do ponto nгo estб definida, mover para a barra atual tendo o preзo Bid
   if (!time)
      time= TimeCurrent ();
   if (!price)
      price= SymbolInfoDouble ( Symbol (), SYMBOL_BID );
//--- redefine o valor de erro
   ResetLastError ();
//--- mover o ponto de ancoragem
   if (! ObjectMove (chart_ID,name, 0 ,time,price))
     {
       Print ( __FUNCTION__ ,
             ": falha ao mover o ponto de ancoragem! Cуdigo de erro = " , GetLastError ());
       return ( false );
     }
//--- sucesso na execuзгo
   return ( true );
  }
//+------------------------------------------------------------------+
//| Verificar valores de ponto de ancoragem e definir valores padrгo |
//| para aqueles vazios                                              |
//+------------------------------------------------------------------+
void ChangeTextEmptyPoint( datetime &time, double &price)
  {
//--- se o tempo do ponto nгo estб definido, serб na barra atual
   if (!time)
      time= TimeCurrent ();
//--- se o preзo do ponto nгo estб definido, ele terб valor Bid
   if (!price)
      price= SymbolInfoDouble ( Symbol (), SYMBOL_BID );
  }
//+------------------------------------------------------------------+
//| Custom indicator deinitialization function                       |
//+------------------------------------------------------------------+
void OnDeinit ( const int reason)
  {
   ClearMyObjects();
   Print ( "Deinit Value Chart, reason = " + IntegerToString (reason));
  }
//+------------------------------------------------------------------+
//| Value Chart                                                      | 
//+------------------------------------------------------------------+
int OnCalculate ( const int rates_total,
                 const int prev_calculated,
                 const datetime &Time[],
                 const double &Open[],
                 const double &High[],
                 const double &Low[],
                 const double &Close[],
                 const long &TickVolume[],
                 const long &Volume[],
                 const int &Spread[])
  {

//--- definir a forma como muitas vezes os textos serгo exibidos
   int scale=( int ) ChartGetInteger ( 0 , CHART_SCALE );
   int bars=( int ) ChartGetInteger ( 0 , CHART_VISIBLE_BARS )+ 3 ;
   double value;
   digits= MathPow ( 10 , _Digits -extradig);

//--- definir o passo
   int step= 1 ;
   switch (scale)
     {
       case 0 :
         step= 12 ;
         break ;
       case 1 :
         step= 6 ;
         break ;
       case 2 :
         step= 4 ;
         break ;
       case 3 :
         step= 2 ;
         break ;
     }
   gTotalRates=rates_total;
   gBars=bars;
   for ( int i=rates_total- 1 ;i>rates_total-bars;i-=step) 
     {
       if (Close[i]>Open[i])
        {
         // bullish candle
         value=(Close[i]-Open[i])*digits;
         //Print(Close[i]-Open[i], "->", Close[i]-Open[i]*digits);

         TextCreate( 0 , "Text_" +( string )i+( string ) PERIOD_CURRENT , 0 ,Time[i],(Close[i]+Open[i])/ 2 , DoubleToString (value,extradig),InpFont,InpFontSize,
                    UpColor,InpAngle,InpAnchor,InpBack,InpSelection,InpHidden,InpZOrder);

         value=(Open[i]-Low[i]) *digits;
         if (!TextCreate( 0 , "TextL_" +( string )i+( string ) PERIOD_CURRENT , 0 ,Time[i],Low[i], DoubleToString (value,extradig),InpFont,InpFontSize,
            HLColor,InpAngle,InpAnchor,InpBack,InpSelection,InpHidden,InpZOrder)) {       return 0 ;     }

         value=(High[i]-Close[i]) *digits;
         if (!TextCreate( ChartID (), "TextH_" +( string )i+( string ) PERIOD_CURRENT , 0 ,Time[i],High[i], DoubleToString (value,extradig),InpFont,InpFontSize,
            HLColor,InpAngle,InpAnchor,InpBack,InpSelection,InpHidden,InpZOrder)) {       return 0 ;     }

           } else {

         value=(Open[i]-Close[i]) *digits;
         if (!TextCreate( ChartID (), "Text_" +( string )i+( string ) PERIOD_CURRENT , 0 ,Time[i],(Close[i]+Open[i])/ 2 , DoubleToString (value,extradig),InpFont,InpFontSize,
            DwColor,-InpAngle,InpAnchor,InpBack,InpSelection,InpHidden,InpZOrder)) {       return 0 ;      }

         value=(Close[i]-Low[i]) *digits;
         if (!TextCreate( ChartID (), "TextL_" +( string )i+( string ) PERIOD_CURRENT , 0 ,Time[i],Low[i], DoubleToString (value,extradig),InpFont,InpFontSize,
            HLColor,InpAngle,InpAnchor,InpBack,InpSelection,InpHidden,InpZOrder)) {       return 0 ;     }

         value=(High[i]-Open[i]) *digits;
         if (!TextCreate( ChartID (), "TextH_" +( string )i+( string ) PERIOD_CURRENT , 0 ,Time[i],High[i], DoubleToString (value,extradig),InpFont,InpFontSize,
            HLColor,InpAngle,InpAnchor,InpBack,InpSelection,InpHidden,InpZOrder)) {       return 0 ;     }
        }

     }
   ChartRedraw ();
   return 0 ;
  }
//+------------------------------------------------------------------+
//|  Trace Arrow Function                                            |
//+------------------------------------------------------------------+
void Trace( string name, int sens, double price, datetime time, color couleur)
  {
   ObjectCreate ( 0 ,name, OBJ_ARROW , 0 ,time,price);
   if (sens== 1 )
       ObjectSetInteger ( 0 ,name, OBJPROP_ARROWCODE , 233 );
   if (sens==- 1 )
       ObjectSetInteger ( 0 ,name, OBJPROP_ARROWCODE , 234 );
   ObjectSetInteger ( 0 ,name, OBJPROP_COLOR ,couleur);
   ObjectSetInteger ( 0 ,name, OBJPROP_WIDTH , 5 );
  }
//+------------------------------------------------------------------+
//|   Delete Arrow Function                                          |
//+------------------------------------------------------------------+  
void ClearMyObjects() 
  {
   string name;
   int scale=( int ) ChartGetInteger ( 0 , CHART_SCALE );
   int bars=( int ) ChartGetInteger ( 0 , CHART_VISIBLE_BARS )+ 3 ;
   double value;
   digits= MathPow ( 10 , _Digits -extradig);
   int step= 1 ;
   switch (scale)
     {
       case 0 :
         step= 12 ;
         break ;
       case 1 :
         step= 6 ;
         break ;
       case 2 :
         step= 4 ;
         break ;
       case 3 :
         step= 2 ;
         break ;
     }
   for ( int i=gTotalRates- 1 ;i>gTotalRates-bars;i-=step) 
     {
       if (!TextDelete( ChartID (), "Text_" +( string )i+( string ) PERIOD_CURRENT )){}
       if (!TextDelete( ChartID (), "TextH_" +( string )i+( string ) PERIOD_CURRENT )){}
       if (!TextDelete( ChartID (), "TextL_" +( string )i+( string ) PERIOD_CURRENT )){}
       //--- redesenhar o grбfico
     }
   ChartRedraw ();

  }
//+------------------------------------------------------------------+

//+------------------------------------------------------------------+
//| Alterar o texto do objeto                                        |
//+------------------------------------------------------------------+
bool TextChange( const long    chart_ID= 0 ,   // ID do Grбfico
                 const string name= "Text" , // nome do objeto
                 const string text= "Text" ) // texto
  {
//--- redefine o valor de erro
   ResetLastError ();
//--- alterar texto do objeto
   if (! ObjectSetString (chart_ID,name, OBJPROP_TEXT ,text))
     {
       Print ( __FUNCTION__ ,
             ": falha ao alterar texto! Cуdigo de erro = " , GetLastError ());
       return ( false );
     }
//--- sucesso na execuзгo
   return ( true );
  }
//+------------------------------------------------------------------+
//| Excluir objeto Texto                                             |
//+------------------------------------------------------------------+
bool TextDelete( const long    chart_ID= 0 ,   // Id do Grбfico
                 const string name= "Text" ) // nome do objeto
  {
//--- redefine o valor de erro
   ResetLastError ();
//--- excluir o objeto
   if (! ObjectDelete (chart_ID,name))
     {
       Print ( __FUNCTION__ ,
             ": falha ao excluir o objeto \"Texto\"! Cуdigo de erro = " , GetLastError ());
       return ( false );
     }
//--- sucesso na execuзгo
   return ( true );
  }
//+------------------------------------------------------------------+
//| Criando objeto Texto                                             |
//+------------------------------------------------------------------+
bool TextCreate( const long               chart_ID= 0 ,               // ID do grбfico
                 const string             name= "Text" ,               // nome do objeto
                 const int                sub_window= 0 ,             // нndice da sub-janela
                 datetime                 time= 0 ,                   // ponto de ancoragem do tempo
                 double                   price= 0 ,                   // ponto de ancoragem do preзo
                 const string             text= "Text" ,               // o prуprio texto
                 const string             font= "Arial" ,             // fonte
                 const int                font_size= 10 ,             // tamanho da fonte
                 const color              clr= clrRed ,               // cor
                 const double             angle= 0.0 ,                 // inclinaзгo do texto
                 const ENUM_ANCHOR_POINT anchor= ANCHOR_CENTER , // tipo de ancoragem
                 const bool               back= false ,               // no fundo
                 const bool               selection= false ,           // destaque para mover
                 const bool               hidden= true ,               // ocultar na lista de objetos
                 const long               z_order= 0 )                 // prioridade para clicar no mouse
  {

   if ( ObjectFind (chart_ID,name)==- 1 ) 
     {

       //--- definir as coordenadas de pontos de ancoragem, se eles nгo estгo definidos
       //--- redefine o valor de erro
       ResetLastError ();
       //--- criar objeto Texto
       if (! ObjectCreate (chart_ID,name, OBJ_TEXT ,sub_window,time,price)) 
        {
         Print ( __FUNCTION__ ,
               ": falha ao criar objeto \"Texto\"! Cуdigo de erro = " , GetLastError ());
         return ( false );
        }
       //--- definir o texto
       ObjectSetString (chart_ID,name, OBJPROP_TEXT ,text);
       //--- definir o texto fonte
       ObjectSetString (chart_ID,name, OBJPROP_FONT ,font);
       //--- definir tamanho da fonte
       ObjectSetInteger (chart_ID,name, OBJPROP_FONTSIZE ,font_size);
       //--- definir o вngulo de inclinaзгo do texto
       ObjectSetDouble (chart_ID,name, OBJPROP_ANGLE ,angle);
       //--- tipo de definiзгo de ancoragem
       ObjectSetInteger (chart_ID,name, OBJPROP_ANCHOR ,anchor);
       ObjectSetInteger (chart_ID,name, OBJPROP_ALIGN , ALIGN_CENTER );

       //--- definir cor
       ObjectSetInteger (chart_ID,name, OBJPROP_COLOR ,clr);
       //--- exibir em primeiro plano (false) ou fundo (true)
       ObjectSetInteger (chart_ID,name, OBJPROP_BACK ,back);
       //--- habilitar (true) ou desabilitar (false) o modo de mover o objeto com o mouse
       ObjectSetInteger (chart_ID,name, OBJPROP_SELECTABLE ,selection);
       ObjectSetInteger (chart_ID,name, OBJPROP_SELECTED ,selection);
       //--- ocultar (true) ou exibir (false) o nome do objeto grбfico na lista de objeto 
       ObjectSetInteger (chart_ID,name, OBJPROP_HIDDEN ,hidden);
       //--- definir a prioridade para receber o evento com um clique do mouse no grбfico
       ObjectSetInteger (chart_ID,name, OBJPROP_ZORDER ,z_order);
       ObjectSetDouble (chart_ID,name, OBJPROP_PRICE ,price);
       ObjectSetInteger (chart_ID,name, OBJPROP_TIME ,time);

       //--- sucesso na execuзгo
       return ( true );
        } else {
      ChangeTextEmptyPoint(time,price);

       ObjectSetString (chart_ID,name, OBJPROP_TEXT ,text);
       ObjectSetInteger (chart_ID,name, OBJPROP_COLOR ,clr);
       ObjectSetInteger (chart_ID,name, OBJPROP_ANCHOR ,anchor);
       ObjectSetInteger (chart_ID,name, OBJPROP_ALIGN , ALIGN_CENTER );
       ObjectSetDouble (chart_ID,name, OBJPROP_ANGLE ,angle);
       ObjectSetDouble (chart_ID,name, OBJPROP_PRICE ,price);
       ObjectSetInteger (chart_ID,name, OBJPROP_TIME ,time);
       ObjectSetString (chart_ID,name, OBJPROP_FONT ,font);
       //--- definir tamanho da fonte
       ObjectSetInteger (chart_ID,name, OBJPROP_FONTSIZE ,font_size);
       ObjectSetInteger (chart_ID,name, OBJPROP_YDISTANCE , 100 );

/*ObjectSetString(chart_ID,name,OBJPROP_FONT,Font);
      ObjectSetInteger(chart_ID,name,OBJPROP_FONTSIZE,Size);*/
       return ( true );
     }

  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void OnChartEvent ( const int id,         // Event ID
                   const long & lparam,   // Parameter of type long event
                   const double & dparam, // Parameter of type double event
                   const string & sparam   // Parameter of type string events
                  )
  {
   if (id== CHARTEVENT_CHART_CHANGE )
     {
      ClearMyObjects();
     }

  }
//+------------------------------------------------------------------+
Dateien:
 
Green handsome:

Helfen Sie, den Indikator zu reparieren, er wird im MT5-Terminal nicht angezeigt, er gibt Fehler beim Kompilieren.

Am einfachsten ist es, ArraySetAsSeries(Open,true) ; ArraySetAsSeries(Close,true) ; und so weiter in OnCalculate ganz am Anfang aller Arrays zu setzen.

Das ist die traditionelle Überraschung auf den ersten Blick: in 5 sind die Standard-Indexierungsrichtungen anders als in 4.

Der Indikator verwendet keine Puffer, sondern erstellt nur Graph-Objekte - drücken Sie nach dem Start Strg+B und sehen Sie nach, wo er sie hingestellt hat

 

Ich habe mich durch die Dokumentation und das Forum gewühlt ...
Wie macht man Variablen vom Zeigertyp global [im Beispiel var], wenn sie in OnInit() von string erstellt werden:

CObj* var=new CObj(p1,p2,p3);

und die Anzahl der Objekte und Konstruktorparameter nicht im Voraus bekannt sind und in OnInit() berechnet werden?

 
Mikhail Tkachev:

Ich habe mich durch die Dokumentation und das Forum gewühlt ...
Wie kann man Variablen vom Typ Zeiger global machen, wenn sie in OnInit() erstellt werden?

und die Anzahl der Objekte und Konstruktorparameter nicht im Voraus bekannt sind und in OnInit() berechnet werden?

Ich verstehe nichts, sondern übergebe ein Array von Zeigern CArrayObj an die in OnInit() erstellten Objekte

Документация по MQL5: Стандартная библиотека / Коллекции данных / CArrayObj
Документация по MQL5: Стандартная библиотека / Коллекции данных / CArrayObj
  • www.mql5.com
CArrayObj - Коллекции данных - Стандартная библиотека - Справочник MQL5 - Справочник по языку алгоритмического/автоматического трейдинга для MetaTrader 5
 
Artyom Trishkin:

Nichts verstanden, aber ein Array von CArrayObj-Zeigern auf Objekte übergeben, die in OnInit() erstellt wurden

Artem, ich danke Ihnen für Ihre Antwort.
Ich entschuldige mich für die unklare Frage)
Es gibt drei globale Variablen vom Typ Zeiger auf ein Objekt in Expert Advisor: var1, var2, var3.

Vor der Ausführung von OnInit() ist nicht bekannt, ob alle diese Variablen benötigt werden (dies hängt mit den Zeitrahmen zusammen), und auch die Parameter für die Konstruktoren, die die Objekte initialisieren, sind unbekannt.
Wie kann man solche Variablen in OnInit() erstellen, so dass sie global sind?

 
Mikhail Tkachev:

Artem, ich danke Ihnen für Ihre Antwort.
Ich entschuldige mich für die unklare Frage)
Drei globale Variablen vom Zeigertyp können in EA verwendet werden: var1, var2, var3.

Vor der Ausführung von OnInit() ist nicht bekannt, ob alle diese Variablen benötigt werden (dies hängt mit den Zeitrahmen zusammen), auch die Parameter für die Konstruktoren, die die Objekte initialisieren, sind unbekannt.
Wie kann man solche Variablen in OnInit() erstellen, so dass sie global sind?

Ich weiß nicht, welchen magischen Konstruktor Sie da haben, der nur Unbekannte enthält :)

Sie müssen Objekte nicht vorher als Instanzen deklarieren.

Sie müssen ein Array CArrayObj deklarieren. Ihre Objekte selbst müssen Nachkommen von CObject sein.

Erstellen Sie Ihr Objekt mit new und fügen Sie der Liste einen Zeiger darauf hinzu.

Erstellen Sie das nächste Objekt und fügen Sie es der Liste hinzu, usw.

Diese Liste - ein Zeiger auf sie (und die Liste wird global deklariert) - wird an Ihre Konstruktoren übergeben.

Aber hier ist, wie Sie gehen, um Konstruktoren mit Argumenten im Voraus unbekannt zu tun - ich verstehe es nicht ein bisschen. Versuchen Sie, das zu klären

 
Artyom Trishkin:


Aber hier ist, wie Sie gehen, um Konstruktoren mit Argumenten im Voraus unbekannt zu machen - ich bin ein wenig verwirrt hier. Versuchen Sie, es zu erklären

Erstellung von Objekten vom Typ CISNewBar für jeden verwendeten Zeitrahmen und jedes Symbol.
Die Zeichen werden in einer Zeile mit Trennzeichen in den Eingabeparametern angegeben, so dass Sie nicht alle Objekte vor OnInit() erstellen können.
D.h. der erste unbekannte Konstruktorparameter ist ein Symbol.
Der zweite unbekannte Konstruktorparameter ist ein Zeitrahmen, da jedes Symbol seine eigene Reihe von Zeitrahmen hat, die ebenfalls durch eine Zeichenkette mit Begrenzungszeichen im Eingabeparameter übergeben werden.

HH:Es gab ein Problem mit derCArrayObj-Klasse: Beim Zugriff auf Elemente vom TypCArrayObj* ArrayObj. At(0) sind die Klassenmitglieder des Objekts, das At(0) ist, nicht verfügbar, obwohl genau diese Klassenmitglieder öffentlich sind, d.h. ein Konstrukt vom Typ ArrayObj.At(0).method(parameter) funktioniert nicht.
Und
ich habe auch Angst, diese Bibliotheken zu verwenden, vielleicht ändert sich etwas darin, wenn ich das Terminal aktualisiere, und mein Expert Advisor wird plötzlich nicht mehr funktionieren...
 
Mikhail Tkachev:

Erstellen Sie Objekte vom Typ CISNewBar für jeden Zeitrahmen, der für jedes Symbol verwendet wird.
Die Zeichen werden in einer Zeile mit Trennzeichen in den Eingabeparametern angegeben, so dass es unmöglich ist, alle Objekte vor OnInit() im Voraus zu erstellen.
D.h. der erste unbekannte Konstruktorparameter ist ein Symbol.
Der zweite unbekannte Konstruktorparameter ist ein Zeitrahmen, da jedes Symbol seine eigene Reihe von Zeitrahmen hat, die ebenfalls durch eine Zeichenkette mit Begrenzungszeichen im Eingabeparameter übergeben werden.

P.S.Es gab ein Problem mit derCArrayObj-Klasse: Beim Zugriff auf Elemente vom TypCArrayObj* ArrayObj. At(0), die Klassenmitglieder des Objekts, das At(0) ist nicht verfügbar, obwohl diese Klassenmitglieder genau öffentlich sind, d.h. ein Konstrukt wie ArrayObj.At(0).method(parameter) funktioniert nicht.
Und
ich habe auch Angst, diese Bibliotheken zu verwenden, vielleicht ändert sich etwas darin, wenn ich das Terminal aktualisiere, und mein Expert Advisor wird plötzlich nicht mehr funktionieren...

Irgendwie ist das alles falsch...

Schreiben Sie in einfachen Worten, was Sie tun wollen. Ohne jeglichen Hinweis auf Ihre Versuche, das Ganze zu kodieren.

 
Artyom Trishkin:

Es fühlt sich einfach nicht richtig an...

Schreiben Sie in einfachen Worten, was Sie tun wollen. Ohne jegliche Erwähnung Ihrer Versuche, das Ganze zu kodieren.

Multicurrency Expert Advisor.
Die Liste der Symbole wird über den Eingabeparameter, die Zeichenkette mit dem Trennzeichen "AUDUSD,EURUSD,GBPUSD..." angegeben, die Anzahl der Symbole ist nicht vordefiniert.
Für jedes Symbol gibt es zwei Zeitrahmen, auf denen sein "eigenes" Handelssystem arbeitet.
Dementsprechend gibt es zwei Eingabeparameter, Strings, begrenzt durch: kurze Zeitspanne für ein jeweiliges Symbol "M1,M30,M5..."
einen langen Zeitrahmen für das jeweilige Symbol "H1,D1,H4.."
D.h. für AUDUSD sind die Zeitrahmen M1 und H1, für EURUSD M30 und D1, usw.
In OnTick() muss für jedes Symbol das Erscheinen eines neuen Balkens auf beiden (kurzen und langen) Zeitrahmen verfolgt werden, um Handelsentscheidungen zu treffen.
Ich habe versucht, es so einfach wie möglich zu schreiben)

 
Mikhail Tkachev:

Multicurrency Expert Advisor.
Die Liste der Symbole wird über einen Eingabeparameter, eine Zeichenkette mit dem Trennzeichen "AUDUSD,EURUSD,GBPUSD...", festgelegt, die Anzahl der Symbole ist nicht vordefiniert.
Für jedes Symbol gibt es zwei Zeitrahmen, auf denen sein "eigenes" Handelssystem arbeitet.
Dementsprechend gibt es zwei Eingabeparameter, Strings, begrenzt durch: kurze Zeitspanne für ein jeweiliges Symbol "M1,M30,M5..."
einen langen Zeitrahmen für das jeweilige Symbol "H1,D1,H4.."
D.h. für AUDUSD sind die Zeitrahmen M1 und H1, für EURUSD M30 und D1, usw.
In OnTick() muss für jedes Symbol das Erscheinen eines neuen Balkens auf beiden (kurzen und langen) Zeitrahmen verfolgt werden, um Handelsentscheidungen zu treffen.
Ich habe versucht, es so einfach wie möglich zu schreiben.)

Haben Sie bereits eine Klasse für eine neue Bar?

Und wie genau sehen die Eingabeparameter aus?