conseiller expert - questions diverses - page 13

 

Vous pouvez écrire une fonction comme suit :

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

Si vous l'appelez sans la valeur finale, la valeur par défaut sera utilisée, c'est-à-dire que fontsize sera 10.

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

Ou vous pouvez remplacer explicitement la valeur par défaut de fontsize:

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

C'est ce que vous voulez dire ?

 
honest_knave:

C'est ce que vous voulez dire ?

Peut-être que mon anglais empêche de comprendre votre commentaire.
Merci pour votre commentaire.
Si je comprends bien, je vous comprends comme ceci : Je peux écrire 1x fonction Void pour Label, et je peux l'utiliser avec deux méthodes comme ci-dessous. ( Je peux utiliser une fonction Void, pour l'objet label avec le paramètre de taille de police et sans lui, est-ce correct ? )

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

Donc, je voudrais dire que j'ai passé quelques heures pour ce Spreadsheet Object pour savoir d'où vient ce problème et comment je peux le résoudre.
Je pense que le problème vient du code ci-dessous, et non des fonctions Label, car j'avais 2 fonctions Label, j'en ai supprimé une, les indicateurs de prix Bid et Ask (prix du marché) fonctionnent toujours bien, mais le tableur ne fonctionne pas avec la fonction Label. Le tableur fonctionne bien sans la fonction Label.

J'ai besoin de partager une partie du code de la feuille de calcul. Je doute du code ci-dessous. (Même - je dois mentionner une fois de plus que le code ci-dessous fonctionne bien lorsque je crée un objet Étiquette sans fonction Étiquette pour le tableur).

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

Merci pour tout.

 

C'est une bonne pratique de vérifier que ce que vous essayez de créer est effectivement créé.

Par exemple, en ce qui concerne les tailles d'écran, de nombreux utilisateurs utilisent des résolutions différentes et lorsque, pour une raison quelconque, un objet est créé au-delà des limites de la largeur ou de la hauteur du graphique, l'objet n'est pas dessiné ou disparaît.

Ou par exemple l'erreur 4200 montrera que l'objet que vous essayez de créer existe déjà.

Ceci est important si vous essayez d'attribuer différentes valeurs à votre objet, les nouvelles valeurs ne seront pas attribuées si la création échoue.

C'est pourquoi ces fonctions renvoient une valeur qui vous permet de vérifier si la création a réussi ou non.

C'est à vous de vérifier si la fonction a réussi ou non, mais un bon codeur vérifiera le résultat.

Si vous écrivez une fonction void, elle ne renvoie rien et vous ne pouvez donc pas vérifier le résultat en analysant ce qui revient lorsque vous l'appelez.

Mais vous pouvez aussi simplement vérifier dans la fonction elle-même et déclencher une simple alerte si quelque chose ne va pas.

Si vous faites cela, vous ne verrez pas ces alertes normalement, mais si quelque chose ne va pas, cela vous indiquera immédiatement le problème lui-même.


En ce qui concerne le second problème, vous pouvez souvent omettre au moins certains des paramètres, mais si vous le faites, la fonction prendra les valeurs par défaut.

Ainsi, à moins que vous n'ayez besoin ou ne souhaitiez détourner des paramètres standard, vous devez les spécifier.

La taille de la police est un bon exemple : si vous ne la spécifiez pas, elle utilisera simplement les paramètres par défaut.

Il existe également de légères différences entre certains objets, ce que l'on peut constater en analysant les paramètres transmis à la fonction.

Ils ne partagent pas tous le même ensemble de variables, il est donc important d'examiner ce qui peut et ce qui ne peut pas être transmis comme référence.

Je ne suis pas sûr de ce que vous voulez faire avec la chaîne de diffusion, peut-être pouvez-vous expliquer un peu plus à quoi elle sert et comment vous voulez l'utiliser ?

 
Marco vd Heijden:

Je ne suis pas sûr de ce que vous voulez faire avec le spreadstring, peut-être pouvez-vous expliquer un peu plus à quoi il sert et comment vous voulez l'utiliser ?

J'utilise Label Object Function pour Bid, Ask, Spreadsheet, et ainsi de suite. Tout fonctionne parfaitement, sans la feuille de calcul - et je l'ai supprimée et réécrite, sans effets positifs.

Après avoir utilisé la méthode @honest_knave de code d'erreurs pour la description des erreurs. Je ne vois plus d 'avertissements 4200.
Comme je l'ai mentionné, j'utilise'Spreadsheet' à deux endroits, #1 dans la fonction Init() - #2 dans la fonction OnTick(), mais j'utilise aussi Bid, Ask à 2 endroits avec 'Spreadsheet', ils n'ont pas d'erreurs, ni d'avertissements. Mais cette feuille de calcul ne me donne aucun avertissement, mais ne se met pas à jour non plus.

Création absolument réussie, aucune erreur, aucun avertissement, pour tous les objets, dans les codes de mon EA.

Je ne sais pas si je suis un bon codeur ou quoi ! ( Je ne me considère pas comme un codeur ou un programmeur. ) Mais je vois le résultat. Par conséquent, je peux utiliser uniquement l'objet Étiquette (sans fonction, juste pour la feuille de calcul).

La fonction Void renvoie des résultats pour ce que je veux, aussi cette fonction crée un objet pour la valeur initiale du spread, mais ne fait pas de mises à jour.



Je ne suis pas sûr de ce que vous voulez faire avec le spreadstring ; peut-être pouvez-vous expliquer un peu plus à quoi il sert et comment vous voulez l'utiliser ?

OK, je veux juste l'utiliser comme ça : Je veux juste qu'il me donne la taille de la feuille de calcul ( / valeur ), lorsque j'ouvre / ajoute mes EA's au graphique pour le moment. Ensuite, j'essaierai d'écrire un code pour les tailles de Spreads High / Low de l'heure actuelle ( / valeurs ).

Merci d'avance.

 

Vous pouvez aussi les stocker dans un double tableau[] et les comparer pour voir où se trouve l'écart le plus faible.


double spread[];
--

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

Lorsque je supprime le code ci-dessous, alors la feuille de calcul commence à fonctionner parfaitement.
Donc, j'ai juste besoin d'aide, comment puis-je écrire un bon ( / Optimal ) code à la place de celui-ci, s'il vous plaît ?

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

Je garde juste le code ci-dessous pour la fonction Label Object.

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

Merci d'avance.

( si ce problème est vraiment un problème - j'espère que MetaQuotes va le résoudre - parce que cela m'a pris quelques heures, pour aider les autres qui sont nouveaux dans cette industrie du code ).

 

Supprimez le "return(false)" mais conservez l'instruction Print et exécutez votre code.

Je pense que vous obtiendrez des messages. Je pense que vous essayez de créer l'étiquette encore et encore, plutôt que de changer la valeur.

 
honest_knave:

Supprimez le "return(false)" mais gardez l'instruction Print et exécutez votre code.

QUEL QU'IL SOIT !
Cette
merde m'a pris quelques heures, je ne sais pas ce que je peux dire à ce sujet.
Puis-je le supprimer de toutes mes fonctions Objets ?
Pouvez-vous aussi me dire comment cela fonctionne ?

return(false);

Juste merci, mec.

 
Max Enrik:

QUEL QU'IL SOIT !
Puis-je
le supprimer de toutes mes fonctions Objets ?

Oui, mais il serait préférable de la conserver et de s'attaquer à la source de l'erreur.

Max Enrik:

QUEL EST LE PROBLÈME ?
Pouvez-vous
également me dire comment cela fonctionne ?

return(false);

L'opérateur return indique simplement à la fonction de sortir immédiatement. Si la fonction renvoie une valeur (dans votre cas, c'est un bool), vous devez également renvoyer une valeur.

Vous vous débarrasserez de votre erreur (4200, non ?) si vous vérifiez si l'objet existe avant de le créer.

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:

Merci pour vos commentaires clairs.

Je l'ai déjà remplacé par votre méthode, comme le code ci-dessous. ( pour la fonction Label Object )

Etait - avant vos commentaires sur la description de l'erreur :

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 

après :

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 

Maintenant - et fonctionne parfaitement :

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 

Je vous souhaite bonne chance.