consulente esperto - domande varie - pagina 13

 

Potreste scrivere una funzione come questa:

void DrawLabel(string name, string text, int x, int y, int fontsize=10)

Se la chiamate senza il valore finale, verrà usato il valore di default, cioè fontsize sarà 10

DrawLabel("MyLabel","Hello,World!",50,50); // final parameter not passed (default value used)

Oppure puoi sovrascrivere esplicitamente il valore predefinito di fontsize:

DrawLabel("MyLabel","Hello,World!",50,50,24); // fontsize parameter is 24

È questo che intendi?

 
honest_knave:

È questo che vuoi dire?

Forse il mio inglese impedisce di capire il tuo commento.
Grazie per il tuo commento.
Se ho capito bene, ti capisco così: Posso scrivere 1x funzione Void per Label, e posso usarla con due metodi come sotto. ( Posso usare una funzione Void, per l'oggetto Label con il parametro dimensione del carattere e senza, è corretto? )

DrawLabel("MyLabel","Hello,World!",50,50);    // #1
DrawLabel("MyLabel","Hello,World!",50,50,24); // #2

Quindi, vorrei dire che ho passato alcune ore per questo Spreadsheet Object per capire da dove viene questo problema e come posso risolverlo.
Quindi, credo che provenga dal codice sottostante, non dalle funzioni Label, perché ho avuto 2 funzioni Label, ne ho rimossa una, gli indicatori di prezzo Bid e Ask (prezzi di mercato) funzionano ancora bene, ma Spreadsheet non funziona con la funzione Label. Spreadsheet funziona bene senza la funzione Label.

Ho bisogno di condividere un po' di codice da Spreadsheet. Ho dei dubbi come il codice qui sotto. (Anche - ho bisogno di menzionare ancora una volta sotto il codice funziona bene quando creo l'oggetto Label senza la funzione Label per Spreadsheet)

double  spread                                                 ;
        spread       = MarketInfo  ( symbol, MODE_SPREAD ) / 10;
        spreadstring = DoubleToStr ( spread, 1           )     ;

Grazie di tutto.

 

Beh, è una buona pratica verificare che qualcosa che si cerca di creare venga effettivamente creato.

Per esempio, quando si tratta di dimensioni dello schermo, molti utenti usano diverse risoluzioni, e ogni volta che, per qualche motivo, un oggetto viene creato oltre i limiti della larghezza o dell'altezza del grafico, l'oggetto non viene disegnato o scompare.

O per esempio l'errore 4200 mostrerà che l'oggetto che state cercando di creare esiste già.

Questo è importante se state cercando di assegnare diversi valori al vostro oggetto, i nuovi valori non saranno assegnati se la creazione fallisce.

Questo è il motivo per cui queste funzioni restituiscono un valore in modo da poter controllare se la creazione ha avuto successo o meno.

Sta a voi controllare se la funzione ha avuto successo o no, ma un buon codificatore controllerà il risultato.

Se scrivete una funzione void non restituisce nulla, quindi non potete controllare il risultato analizzando ciò che ritorna quando la chiamate.

Ma potete anche semplicemente controllare nella funzione stessa e sollevare un semplice avviso se qualcosa è andato storto.

Se lo fate allora non vedrete quegli avvisi normalmente, ma ogni volta che qualcosa va storto, vi indicherà immediatamente il problema stesso.


Per il secondo problema potete molte volte omettere almeno alcuni dei parametri, se lo fate allora la funzione assumerà i valori di default.

Quindi, a meno che non abbiate bisogno o vogliate deviare dei parametri standard, specificateli.

La dimensione del carattere è un buon esempio, quando non lo specifichi userà semplicemente le impostazioni predefinite.

Inoltre ci sono leggere differenze tra alcuni oggetti e questo può essere visto quando si analizzano i parametri che vengono passati alla funzione.

Non tutti condividono lo stesso set di variabili, quindi è importante guardare cosa può e cosa non può essere passato come riferimento.

Non sono sicuro di cosa vuoi fare con la spreadstring, forse puoi spiegare un po' di più a cosa serve e come vuoi usarla?

 
Marco vd Heijden:

Non sono sicuro di cosa vuoi fare con la spreadstring forse puoi spiegare un po' di più a cosa serve e come vuoi usarla?

Uso Label Object Function per Bid, Ask, Spreadsheet, e così via. Tutto funziona perfettamente, senza foglio di calcolo - e l'ho cancellato e riscritto, senza effetti positivi.

Dopo che ho usato il metodo @honest_knave del codice degli errori per la descrizione dell'errore. Non vedo più avvertimenti 4200.
Come ho detto uso'Spreadsheet' in due posti, #1 nella funzione Init() - #2 nella funzione OnTick(), ma uso anche Bid, Ask in 2 posti con 'Spreadsheet', non hanno nessun errore, avvertimenti. Ma questo foglio di calcolo non mi dà alcun avvertimento, ma non si aggiorna.

Creazione assolutamente riuscita, nessun errore, nessun avvertimento, per nessun oggetto, nei miei codici EA.

Non so se sono un buon codificatore o cosa? (Non mi considero un codificatore o un programmatore) ma vedo il risultato. Quindi posso usare solo Label Object (senza funzione solo per il foglio di calcolo).

La funzione Void restituisce i risultati per quello che voglio, inoltre questa funzione crea un oggetto per il valore iniziale di spread, ma non si aggiorna.



Non sono sicuro di cosa vuoi fare con la spreadstring, forse puoi spiegare un po' di più a cosa serve e come vuoi usarla?

Ok, voglio solo usarla in questo modo: Voglio solo che mi dia Spreadsheet Size ( / Value ), quando apro / aggiungo il mio EA al grafico per ora. Poi cercherò di scrivere il codice per l'ora attuale Spread High / Low dimensioni ( / valori ).

Grazie in anticipo.

 

Beh, puoi anche memorizzarlo in un array doppio[] e poi confrontarli tutti per vedere dov'è lo spread più basso.


double spread[];
--

ArrayResize(spread,SymbolsTotal(1),0);
   for(int i=0;i<SymbolsTotal(1);i++)
     {
      spread[i]=MarketInfo(SymbolName(i,1),13);
     }
 

Quando rimuovo il codice sottostante, il foglio di calcolo inizia a funzionare perfettamente.
Quindi, ho solo bisogno di aiuto, come posso scrivere un buon codice ( / ottimale ) al suo posto, per favore?

{
    Print(__FUNCTION__, ": failed to create text label! Error code = ", GetLastError());
    return(false);
}

Tengo solo il codice sottostante per la funzione Label Object.

if( !ObjectCreate( chart_ID, name, OBJ_LABEL, sub_window, 0, 0 ) ) 

Grazie in anticipo.

(se questo problema è davvero un problema - spero che MetaQuotes lo risolva - perché ci sono volute poche ore da parte mia, aiutate gli altri che sono nuovi in questo settore del codice)

 

Cancellate il "return(false)" ma mantenete la dichiarazione di stampa ed eseguite il vostro codice.

Penso che potresti ottenere dei messaggi. Penso che tu stia cercando di creare l'etichetta ancora e ancora, piuttosto che cambiare il valore.

 
honest_knave:

Elimina il "return(false)" ma mantieni la dichiarazione di stampa ed esegui il tuo codice.

CHE CAZZO!
Questa
merda mi ha preso qualche ora, non so cosa posso dire a riguardo.
Posso rimuoverlo da tutte le mie funzioni Objects?
Inoltre potete farmi sapere come funziona?

return(false);

Solo grazie.

 
Max Enrik:

CHE DIAVOLO!
Posso
rimuoverlo da tutte le mie funzioni Objects?

Sì, ma sarebbe meglio tenerlo e affrontare la fonte dell'errore.

Max Enrik:

CHE CAZZO!
Inoltre,
potete farmi sapere come funziona?

return(false);

L'operatore return dice semplicemente alla funzione di uscire immediatamente. Se la funzione restituisce un valore (nel tuo caso, è un bool) devi anche restituire un valore.

Ti libererai del tuo errore (4200, giusto?) se controlli se l'oggetto esiste prima di crearlo.

Return Operator - Operators - Language Basics - MQL4 Reference
Return Operator - Operators - Language Basics - MQL4 Reference
  • docs.mql4.com
Return Operator - Operators - Language Basics - MQL4 Reference
 
honest_knave:

Grazie per i tuoi commenti chiari.

L'ho già sostituito con il tuo metodo, come il seguente codice. ( per la funzione Label Object )

Era - prima dei tuoi commenti sulla descrizione dell'errore:

if( !ObjectCreate( chart_ID, name, OBJ_LABEL, sub_window, 0, 0 ) )
{
    Print( __FUNCTION__, ": failed to create text label! Error code = ", GetLastError() );
    return(false);
}

// which one this code gives me error no: 4200 

dopo:

if( !ObjectCreate( chart_ID, name, OBJ_LABEL, sub_window, 0, 0 ) )
{
    if( errorcode !=0 ) printf( "Error %i: %s", errorcode, ErrorDescription( errorcode ) );
    return(false);
}

// prevent error no: 4200 - but was not update spreadsheet values 

Ora - e funziona perfettamente:

if( !ObjectCreate( chart_ID, name, OBJ_LABEL, sub_window, 0, 0 ) )
{
    if( errorcode !=0 ) printf( "Error %i: %s", errorcode, ErrorDescription( errorcode ) );
    return(false); // removed this line
}

// now spreadsheet values updates, no any more error no: 4200 

Tutto il meglio per voi.