Questions des débutants MQL4 MT4 MetaTrader 4 - page 19

 
Vitalie Postolache:
Ne sois pas comme ça ))))
la raison n'est pas mql4
 
Vitalie Postolache:

Ce n'est pas vraiment comme ça que ça marche. Les arguments de cette fonction sont 1) la chaîne à rechercher ; 2) la combinaison de caractères à trouver ; 3) le début de la recherche (par défaut, à partir du caractère nul de la chaîne de l'étape 1).

Elle renvoie le numéro de la position dans la chaîne, à laquelle la sous-chaîne recherchée commence, ou -1 si aucune sous-chaîne n'est trouvée.

Il faut donc l'écrire comme ceci :

if(StringFind(OrderComment(),"[tp]",0)>-1) {действие при нахождении признака закрытия по TP}

Merci pour la réponse... Ainsi, la fonctionStringFind avec ses paramètres ( string_value, string match_substring, int start_pos=0 ) est écrite en code commun en une seule ligne avec

desarguments correspondant aux données des paramètres de la fonction : chaîne de caractères OrderComment(), chaîne de caractères "[tp]", int 0 et si cette expression (entre crochets) est supérieure à -1 , le code {entre crochets}suivant est exécuté

if(StringFind(OrderComment(),"[tp]",0)>-1)

{

double OrderTakeProfit() ;

si(OrderSelect(12, SELECT_BY_POS)==true)

Print("Ordre #",OrderTicket()," profit : ", OrderTakeProfit()) ;

sinon

Print("OrderSelect() returned error ",GetLastError()) ;

bool PlaySound(

string payment // où "payment" estle nom du fichier dans le dossier MT4 Sound

) ;

}

... Ce code fonctionnera-t-il dans MQL4 ? ...

 
bablusut:

Merci pour la réponse ... Il s'avère que la fonctionStringFind avec ses paramètres ( string_value, string match_substring, int start_pos=0 ) est écrite dans le code commun en une seule ligne avec

desarguments correspondant aux données des paramètres de la fonction : chaîne de caractères OrderComment(), chaîne de caractères "[tp]", int 0 et si cette expression (entre crochets) est supérieure à -1 , le code {entre crochets}suivant est exécuté

if(StringFind(OrderComment(),"[tp]",0)>-1)

{

double OrderTakeProfit() ;

si(OrderSelect(12, SELECT_BY_POS)==true)

Print("Ordre #",OrderTicket()," profit : ", OrderTakeProfit()) ;

sinon

Print("OrderSelect() returned error ",GetLastError()) ;

bool PlaySound(

string payment // où "payment" estle nom du fichier dans le dossier MT4 Sound

) ;

}

... Ce code fonctionnera-t-il dans MQL4 ? ...

double OrderTakeProfit() ; - le code devrait avoir une erreur lors de la compilation.

D'après ce que je comprends (je l'étudie encore moi-même), OrderTakeProfit() ; demande le profit de l'ordre au marché. Ainsi, notre Expert Advisor fait 2 requêtes pour ces quelques lignes OrderTakeProfit() ; il semble que cette ligne doive être supprimée (double OrderTakeProfit() ; )

 
bablusut:

Merci pour la réponse ... Il s'avère que la fonctionStringFind avec ses paramètres ( string_value, string match_substring, int start_pos=0 ) est écrite dans le code commun en une seule ligne avec

desarguments correspondant aux données des paramètres de la fonction : string OrderComment(), string "[tp]", int 0 et si cette expression (entre crochets) est supérieure à -1 , le code {entre crochets}suivant est exécuté

if(StringFind(OrderComment(),"[tp]",0)>-1)

{

double OrderTakeProfit() ;

si(OrderSelect(12, SELECT_BY_POS)==true)

Print("Ordre #",OrderTicket()," profit : ", OrderTakeProfit()) ;

sinon

Print("OrderSelect() returned error ",GetLastError()) ;

bool PlaySound(

string payment // où "payment" estle nom du fichier dans le dossier MT4 Sound

) ;

}

... Ce code fonctionnera-t-il dans MQL4 ? ...

Cela a déjà été mentionné :double OrderTakeProfit() - ne le faites pas. Cette fonction est déclarée automatiquement et ne doit pas être annoncée à nouveau. Le compilateur générera une erreur, car les fonctions standard n'ont pas besoin d'être déclarées au préalable.

if(OrderSelect(12, SELECT_BY_POS)==true) - si nous le faisons, alors, au mieux, il s'agira d'un autre ordre, et non de celui pour lequel le commentaire a été traité ci-dessus. L'ordre doit déjà être sélectionné au tout début avantif(StringFind(OrderComment(),"[tp]",0)>-1) et le compteur de boucle doit être utilisé comme argument du numéro d'ordre, et non comme une constante, sinon le 12ème ordre sera vérifié à chaque itération.

 
Vitalie Postolache:

Ils l'ont déjà dit :double OrderTakeProfit() - ne le faites pas. Cette fonction est déclarée automatiquement et ne doit pas être déclarée à plusieurs reprises. Le compilateur générera une erreur, car les fonctions standard n'ont pas besoin d'être déclarées au préalable.

if(OrderSelect(12, SELECT_BY_POS)==true) - si nous le faisons, alors, au mieux, il s'agira d'un autre ordre, et non de celui pour lequel le commentaire a été traité ci-dessus. L'ordre doit déjà avoir été sélectionné au tout début, avantif(StringFind(OrderComment(),"[tp]",0)>-1).

A1exPit:

double OrderTakeProfit() ; - il est censé se planter ici lors de la compilation.

D'après ce que je comprends (je le comprends toujours moi-même), OrderTakeProfit() ; fait une demande de profit de l'ordre auprès du marché. Ainsi, notre Expert Advisor fait 2 requêtes pour ces quelques lignes OrderTakeProfit() ; il semblerait que cette ligne doive être supprimée (double OrderTakeProfit() ; )

Merci pour le commentaire - il s'est avéré que vous aviez raison.
 
"Vitalie Postolache:

Ils l'ont déjà dit :double OrderTakeProfit() - ne le faites pas. Cette fonction est déclarée automatiquement et ne doit pas être déclarée à plusieurs reprises. Le compilateur générera une erreur, car les fonctions standard n'ont pas besoin d'être déclarées au préalable.

if(OrderSelect(12, SELECT_BY_POS)==true) - si nous faisons cela, alors, au mieux, ce sera un autre ordre, et non celui pour lequel le commentaire a été traité ci-dessus. L'ordre doit déjà être sélectionné au début, avantif(StringFind(OrderComment(),"[tp]",0)>-1) et nous devons définir le compteur de boucle comme un argument du numéro d'ordre, et non comme une constante.

Merci pour la réponse ... La déclaration de la fonctiondouble OrderTakeProfit() est compréhensible, supprimons-la.

"Si nous n'avons qu'un seul compteur de boucle dans le code précédent, dans la fonctionOrdersHistoryTotal, la boucle pour l' opérateur avec le corps(i=0;i<accTotal;i++) doit êtreutilisée comme argument du numéro de commande, ce qui signifie que nous devons remplacer le corps de l'opérateur par le corps de la fonctionOrderSelect et nous l'obtiendrons

if(StringFind(OrderComment(),"[tp]",0)>-1)

{

si(OrderSelect(i=0;i<accTotal;i++)==true)

Print("Ordre #",OrderTicket()," profit : ", OrderTakeProfit()) ;

sinon

Print("OrderSelect() returned error ",GetLastError()) ;

bool PlaySound(

string payment // où"payment" estle nom du fichier dans le dossier MT4 Sound

) ;

}

... Ce code fonctionnera-t-il dans MQL4 ? ...




 
bablusut:

Merci pour la réponse ... La déclaration de la fonctiondouble OrderTakeProfit() est claire, supprimons-la.

Loop counter should be used as an argument of the order number" - dans le code précédent, nous n'avons qu'un seul compteur de boucle ; l'opérateur "for "dans la fonctionOrdersHistoryTotal a le corps(i=0;i<accTotal;i++), ce qui signifie que nous devrions remplacer le corps de l'opérateur par le corps de la fonctionOrderSelect, et nous l'obtiendrons :

Encore une fois. Dans le travail avec la commande, la première place doit être OrderSelect. Et puis tout le reste.

Si nous travaillons en boucle autour de la commande, l'ordre des opérations est le suivant

1. Vérification if(OrderSelect())

2. Pour vérifier s'il s'agit du bon ordre, nous vérifions généralement le symbole et le numéro magique, puis le type si(OrderSymbol()==_Symbol && OrderMagicNumber()==Magic && OrderType()<2) - dans ce cas, seuls les ordres de marché placés pour le symbole actuel et avec le numéro magique spécifié sont traités.

Traitement d'autres données comme OrderComment(), OrderProfit(), etc.

Cela ressemblerait à quelque chose comme ceci

for(int i=OrdersHistoryTotal()-1; i>=0; i--) //перебираем историю торгов
{
      if(OrderSelect(i,SELECT_BY_POS,MODE_HISTORY)) //если ордер выбран то работаем дальше, иначе смысла нет
      {
         if(OrderSymbol()==_Symbol && OrderMagicNumber()==Magic && OrderType()<2) //Если ордер тот, что нам нужен (эту проверку можно и опустить, если нужно обработать все ордера в истории)
         {
            if(StringFind(OrderComment(),"[tp]",0)>-1) //если найден признак закрытия профитом
            Print("Order #",OrderTicket()," profit: ", OrderTakeProfit());
            if(StringFind(OrderComment(),"[sl]",0)>-1) //если найден признак закрытия стоплосс
            Print("Order #",OrderTicket()," loss: "OrderTakeProfit());
         }
      }
}
 
Comment puis-je vérifier s'il y a une valeur de signal dans un tampon ou l'autre de l'indicateur iCustom?
 
Vitalie Postolache:
Encore une fois. OrderSelect devrait se trouver en première place lorsqu'on travaille avec une commande. Puis tout le reste.

Ils ont décidé par essai et erreur apparemment, mais c'est cher, j'y suis allé moi-même...

Mes oreilles bourdonnent pour être honnête...

 
atik441:
Comment puis-je vérifier s'il y a une valeur de signal dans le tampon de l'indicateur iCustom?
Suivez le lien, il est mis en évidence dans votre message.
Raison: