Demandez ! - page 21

 
billworld2:
Existe-t-il un moyen de supprimer des objets en fonction d'une chaîne de texte sélectionnée dans le nom de l'objet ?

Voici l'exemple :

datetime currentDay = StrToTime(Year()+". "+Month()+". "+Day()+" 00.00") ;

for(int i=0;i<ObjectsTotal();i++)

{

string name = ObjectName(i) ;

if( ObjectGet(name,OBJPROP_TIME1) < currentDay && ObjectGet(name,OBJPROP_TIME2) < currentDay && ObjectGet(name,OBJPROP_TIME3) < currentDay)

{

ObjectDelete(ObjectName(i)) ;

retour (false) ;

}

}

return(true) ;

 
billworld2:
Un de mes projets d'apprentissage consiste à personnaliser le tester.tpl qui régit l'option d'affichage du graphique pour le testeur de stratégie. Je trouve le style de graphique par défaut très difficile à visualiser. J'ai donc créé un nouveau modèle, puis construit un script pour remplacer toutes les flèches par des flèches plus attrayantes.

Cependant, j'aimerais également récupérer les informations contenues dans les noms des flèches et les afficher sous forme de texte sur le graphique. Les noms des flèches incluent des choses comme "#62 achat" ou "73 vente clôture". De cette façon, vous pouvez regarder le graphique et voir exactement quand un numéro de transaction particulier est entré/sorti. Je ne sais pas pourquoi cela n'est pas inclus par défaut dans le Strategy Tester comme c'est le cas sur d'autres plateformes (par exemple TradeStation).

Quoi qu'il en soit, j'aimerais saisir le texte en question et insérer de nouveaux objets texte juste en dessous des flèches existantes sur le graphique. Mais je n'arrive pas à trouver comment y parvenir.

Comment dois-je m'y prendre ?

Merci

Bill

Eh bien, vous pouvez écrire un script ou une fonction qui lira les informations sur les flèches et créera une étiquette de texte sous celles-ci. Puis exécuter le script à chaque fois qu'une nouvelle flèche est dessinée. Ou simplement placer la fonction à la fin de la fonction principale de l'ea. Je ne sais pas pourquoi cette information n'est pas standard dans Metatrader, mais il est simple de coder ce genre de fonctionnalité.

 
Kalenzo:
Vous devriez vous renseigner sur les fonctions Date et Heure, et utiliser la fonction iBarShift pour obtenir le décalage de la première barre du mois spécifié dans la période spécifiée.

Je sais que cela doit être trivial pour vous. C'est juste que je n'y arrive pas encore en suivant la documentation limitée (il n'y a pas beaucoup d'exemples fournis). Pourriez-vous avoir l'amabilité de me donner un exemple de la façon de procéder ?

Merci

Bill

 
Kalenzo:
Eh bien, vous pouvez écrire un script ou une fonction qui lira les informations sur la flèche et créera une étiquette de texte sous celle-ci. Puis exécuter le script à chaque fois qu'une nouvelle flèche est dessinée. Ou simplement placer la fonction à la fin de la fonction principale de l'ea. Je ne sais pas pourquoi cette information n'est pas standard dans Metatrader, mais il est simple de coder ce genre de fonctionnalité.

Merci, mais je suis bloqué sur la façon de coder le script. Si vous avez le temps de me donner un petit exemple, je vous en serais reconnaissant.

Merci encore.

Bill

 

Je ne suis pas sûr de comprendre. Pour être clair, je cherche un moyen de faire correspondre une sous-chaîne de caractères à partir d'un nom d'objet. Par exemple, j'ai un groupe d'objets contenant la chaîne "-206" (ainsi que d'autres textes). Je veux localiser et supprimer tous les objets qui contiennent "-206" dans leur nom.

Ce qui me perturbe dans l'exemple ci-dessous, c'est l'association avec OBJPROP_TIME1, OBJPROP_TIME2 et OBJPROP_TIME3. Je sais que les objets peuvent avoir jusqu'à trois coordonnées temporelles. Je ne vois pas comment cela s'intègre dans ce que j'essaie de faire.

Kalenzo:
Voici l'exemple :

datetime currentDay = StrToTime(Year()+". "+Month()+". "+Day()+" 00.00") ;

for(int i=0;i<ObjectsTotal();i++)

{

string name = ObjectName(i) ;

if( ObjectGet(name,OBJPROP_TIME1) < currentDay && ObjectGet(name,OBJPROP_TIME2) < currentDay && ObjectGet(name,OBJPROP_TIME3) < currentDay)

{

ObjectDelete(ObjectName(i)) ;

retour (false) ;

}

}

retour (vrai) ;
 
billworld2:
Je ne suis pas sûr de comprendre. Pour être clair, je cherche un moyen de faire une correspondance de sous-chaîne basée sur le nom d'un objet. Par exemple, j'ai un groupe d'objets contenant la chaîne "-206" (ainsi que d'autres textes). Je veux localiser et supprimer tous les objets qui contiennent "-206" dans leur nom. Ce qui me perturbe dans l'exemple ci-dessous, c'est l'association avec OBJPROP_TIME1, OBJPROP_TIME2 et OBJPROP_TIME3. Je sais que les objets peuvent avoir jusqu'à trois coordonnées temporelles. Je ne vois pas comment cela s'intègre dans ce que j'essaie de faire.

Ok, essayez ceci :

for(int i=0;i<ObjectsTotal();i++)

{

string name = ObjectName(i) ;

if(StringSubstr( name, 0, 3)==206)

{

ObjectDelete(ObjectName(i)) ;

}

}

Si les 3 premières lettres du nom de l'objet sont 206, l'objet est supprimé.

 
billworld2:
Merci, mais je suis coincé sur la façon de coder le script. Si vous avez le temps de fournir un court exemple, ce serait très apprécié.

Merci encore.

Bill

tout d'abord déclarer une variable globale (globale pour le script) int objectCount ;

puis à la fin de l'ea traiter tous les objets (vous pouvez par exemple les rechercher par nom)

for(int i=0;i>=ObjectsTotal(OBJ_ARROW) ;i++)

{

//alors, si l'étiquette de l'objet n'existe pas, dessinez-la.

//nom de la flèche existante et lui ajouter une étiquette L pour l'identifier.

if(ObjectFind(ObjectName(i)+"L")== -1)

{

ObjectCreate(ObjectName(i)+"L",OBJ_ARROW,0,ObjectGet(ObjectName(i), OBJPROP_TIME1),ObjectGet(ObjectName(i),(OBJPROP_PRICE1+3*Point))) ;

// et c'est tout

}

}

Ce n'est qu'un exemple, je n'ai pas eu le temps de vérifier s'il y avait d'éventuels bugs mais cela devrait fonctionner, et vous connaissez maintenant le bon chemin.

 

Ok. Je l'ai. En fait, j'avais besoin d'utiliser StringFind(). Merci pour les indications !

#property show_inputs

extern string stringname="blah" ;

//+------------------------------------------------------------------+

//| fonction de démarrage du programme de script |

//+------------------------------------------------------------------+

int start()

{

//----

for(int i=0;i<ObjectsTotal();i++)

if(StringFind(ObjectName(i),stringname,0)>0)

{

ObjectDelete(ObjectName(i)) ;

}

Kalenzo:
Ok, essayez ceci :

for(int i=0;i<ObjectsTotal();i++)

{

string name = ObjectName(i) ;

if(StringSubstr( name, 0, 3)==206)

{

ObjectDelete(ObjectName(i)) ;

}

}

Si les 3 premières lettres du nom de l'objet sont 206, l'objet sera supprimé.
 

Merci, mais cela ne fonctionne pas. D'abord, j'ai remplacé "i>=ObjectsTotal" par "i<=ObjectsTotal" (faute de frappe). Ensuite, j'ai remarqué que vous créez un autre objet flèche alors que nous voulons créer un nouvel objet texte qui inclut le nom de l'objet flèche. Quoi qu'il en soit, le code ci-dessous crée un tas de flèches (environ 50) qui se chevauchent toutes sur les mêmes coordonnées.

Je suis toujours perdu sur ce point. Si vous avez la possibilité de jeter un autre coup d'œil, ce serait très apprécié. Pour être clair, je cherche à créer un nouvel objet texte qui se positionne sous chaque objet flèche existant où la description du texte de l'objet texte est égale au nom de l'objet flèche.

Bill

Kalenzo:
déclarez d'abord une variable globale (globale pour le script) int objectCount ;

puis à la fin de l'ea traiter tous les objets (vous pouvez par exemple les rechercher par nom)

for(int i=0;i>=ObjectsTotal(OBJ_ARROW) ;i++)

{

//alors, si l'étiquette de l'objet n'existe pas, dessinez-la.

//nom de la flèche existante et lui ajouter une étiquette L pour l'identifier.

if(ObjectFind(ObjectName(i)+"L")== -1)

{

ObjectCreate(ObjectName(i)+"L",OBJ_ARROW,0,ObjectGet(ObjectName(i), OBJPROP_TIME1),ObjectGet(ObjectName(i),(OBJPROP_PRICE1+3*Point))) ;

// et c'est tout

}

}

Ce n'est qu'un exemple, je n'ai pas eu le temps de vérifier s'il y avait d'éventuels bugs mais cela devrait fonctionner, et vous connaissez maintenant le bon chemin.
 

Suppression d'objets basée sur le contenu

Existe-t-il un moyen de supprimer des objets en fonction d'une chaîne de texte sélectionnée dans le nom de l'objet?

Edit : J'ai trouvé la solution avec le pointeur de Kalenzo. La réponse est dans le post #212.

Raison: