Domande dai principianti MQL5 MT5 MetaTrader 5 - pagina 1331

 

Aiuta a correggere l'indicatore, non viene visualizzato nel terminale MT5, dà errori durante la compilazione.

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

  }
//+------------------------------------------------------------------+
File:
 
Green handsome:

Aiuta a risolvere l'indicatore, non viene visualizzato nel terminale MT5, dà errori durante la compilazione.

Il modo più semplice è impostare ArraySetAsSeries(Open,true) ; ArraySetAsSeries(Close,true) ; e così via in OnCalculate all'inizio di tutti gli array.

questa è la tradizionale sorpresa in apparenza: in 5 le direzioni di indicizzazione predefinite sono diverse che in 4.

L'indicatore non usa buffer, costruisce solo oggetti grafici - dopo l'avvio premi Ctrl+B e vedi dove li ha messi

 

Scavando attraverso la documentazione e il forum ...
Come rendere globali le variabili di tipo puntatore [nell'esempio var], se sono create in OnInit() da stringa:

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

e il numero di oggetti e i parametri del costruttore non sono noti in anticipo e sono calcolati in OnInit() ?

 
Mikhail Tkachev:

Scavando attraverso la documentazione e il forum ...
Come rendere globali le variabili di tipo puntatore, se sono create in OnInit():

e il numero di oggetti e i parametri del costruttore non sono noti in anticipo e sono calcolati in OnInit() ?

Non ci capisco niente, ma passare un array di puntatori CArrayObj agli oggetti creati in OnInit()

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

Niente di comprensibile, ma passare un array di puntatori CArrayObj agli oggetti creati in OnInit()

Artem, grazie per la risposta.
Mi scuso per la domanda poco chiara)
Ci sono tre variabili globali di tipo puntatore a un oggetto in Expert Advisor: var1, var2, var3.

Prima di eseguire OnInit(), non si sa se tutte queste variabili saranno necessarie (questo è legato ai tempi), anche i parametri per i costruttori, che inizializzeranno gli oggetti, sono sconosciuti.
Come creare tali variabili in OnInit() in modo che siano globali?

 
Mikhail Tkachev:

Artem, grazie per la tua risposta.
Mi scuso per la domanda poco chiara)
In EA si possono usare tre variabili globali di tipo puntatore: var1, var2, var3.

Prima di eseguire OnInit(), non si sa se tutte queste variabili saranno necessarie (questo è legato ai tempi), anche i parametri per i costruttori che inizializzeranno gli oggetti sono sconosciuti.
Come creare tali variabili in OnInit(), in modo che siano globali?

Non so quale magico costruttore hai lì, che contiene solo incognite :)

Non è necessario dichiarare prima gli oggetti come istanze.

Dovete dichiarare un array CArrayObj. I vostri oggetti stessi devono essere discendenti di CObject.

Create il vostro oggetto con new e aggiungete un puntatore ad esso alla lista.

Crea il prossimo oggetto e lo aggiunge alla lista, e così via.

Questa lista - un puntatore ad essa (e la lista è dichiarata globalmente) - è passata ai vostri costruttori.

Ma ecco come volevi fare i costruttori con argomenti sconosciuti in anticipo - non ci capisco niente. Cerca di chiarirlo

 
Artyom Trishkin:


Ma ecco come farete i costruttori con argomenti sconosciuti in anticipo - sono un po' confuso qui. Prova a spiegarlo

Creazione di oggetti di tipo CIsNewBar per ogni timeframe utilizzato per ogni simbolo.
I caratteri sono specificati da una linea con separatori nel parametro di input, quindi non è possibile creare tutti gli oggetti in anticipo prima di OnInit().
Cioè il primo parametro sconosciuto del costruttore è un simbolo.
Il secondo parametro sconosciuto del costruttore è un timeframe, poiché ogni simbolo avrà il proprio insieme di timeframe, analogamente passato da una stringa con delimitatori nel parametro di input.

HH.C'era un problema con la classeCArrayObj: quando si accede agli elementi di tipoCArrayObj* ArrayObj. At(0), i membri della classe dell'oggetto che è At(0) sono inaccessibili, anche se questi membri della classe sono esattamente pubblici, cioè un costrutto di tipo ArrayObj.At(0).method(parameter) non funziona.
E
ho anche paura di usare queste librerie, forse qualcosa cambierà in esse quando si aggiorna il terminale, e il mio Expert Advisor smetterà improvvisamente di funzionare...
 
Mikhail Tkachev:

Crea oggetti di tipo CIsNewBar per ogni timeframe utilizzato per ogni simbolo.
I caratteri sono specificati da una linea con delimitatori nel parametro di input, quindi è impossibile creare tutti gli oggetti prima di OnInit().
Cioè il primo parametro sconosciuto del costruttore è un simbolo.
Il secondo parametro sconosciuto del costruttore è un timeframe, poiché ogni simbolo avrà il proprio insieme di timeframe, analogamente passato da una stringa con delimitatori nel parametro di input.

P.S.C'era un problema con la classeCArrayObj: quando si accede agli elementi di tipoCArrayObj* ArrayObj. At(0), i membri della classe oggetto che At(0) non è disponibile, anche se questi membri della classe sono esattamente pubblici, cioè un costrutto di tipo ArrayObj.At(0).method(parameter) non funziona.
E
ho anche paura di usare queste librerie, forse qualcosa cambierà in esse quando si aggiorna il terminale, e il mio Expert Advisor smetterà improvvisamente di funzionare...

È tutto sbagliato in qualche modo...

Scrivi in parole semplici quello che vuoi fare. Senza alcun riferimento ai vostri tentativi di codificare il tutto.

 
Artyom Trishkin:

Non mi sembra giusto...

Scrivi in parole semplici quello che vuoi fare. Senza alcun accenno ai vostri tentativi di codificare il tutto.

Consulente esperto multivaluta.
La lista dei simboli è specificata tramite il parametro di input, la stringa con il delimitatore "AUDUSD,EURUSD,GBPUSD...", il numero di simboli non è predefinito.
Per ogni simbolo, ci sono due timeframes, su cui lavora il suo "proprio" sistema di trading.
Corrispondentemente, ci sono due parametri di input, stringhe delimitate da: breve lasso di tempo per un rispettivo simbolo "M1,M30,M5..."
un timeframe lungo per il rispettivo simbolo "H1,D1,H4.."
Cioè per AUDUSD i timeframe sono M1 e H1, per EURUSD M30 e D1, ecc.
In OnTick(), per ogni simbolo, è necessario tracciare la comparsa di una nuova barra su entrambi i timeframe (breve e lungo) per prendere decisioni di trading.
Ho cercato di scriverlo nel modo più semplice possibile)

 
Mikhail Tkachev:

Consulente esperto multivaluta.
L'elenco dei simboli è impostato tramite il parametro di input, una stringa con separatore "AUDUSD,EURUSD,GBPUSD...", il numero di simboli non è predefinito.
Per ogni simbolo, ci sono due timeframes, su cui lavora il suo "proprio" sistema di trading.
Corrispondentemente, ci sono due parametri di input, stringhe delimitate da: breve lasso di tempo per un rispettivo simbolo "M1,M30,M5..."
un timeframe lungo per il rispettivo simbolo "H1,D1,H4.."
Cioè per AUDUSD i timeframe sono M1 e H1, per EURUSD M30 e D1, ecc.
In OnTick(), per ogni simbolo, è necessario tracciare la comparsa di una nuova barra su entrambi i timeframe (breve e lungo) per prendere decisioni di trading.
Ho cercato di scriverlo nel modo più semplice possibile).

Avete già una classe per un nuovo bar?

E come sono esattamente i parametri di input?

Motivazione: