Comment coder ? - page 302

 

...

Oui, vous pouvez

La seule limitation est que vous ne devez pas faire d'"appels circulaires" lorsque cela se termine par une boucle morte. En dehors de cela, il n'y a aucune limitation pour les appels de fonction.

crsnape@btinternet.com:
Bon point. J'y jetterai un coup d'œil.

Une question sur les fonctions, est-il possible d'appeler une fonction dans une fonction ? Par exemple, j'ai cette fonction :

string GetWinLossPreviousShort (int LastOpenTicket, string WinLossPreviousShort)

{

si (... etc

Puis je l'appelle plus tard :

double GetLotsLong (int LowRisk, int HighRisk, double SLDistanceLong, string GetWinLossPreviousShort)
 

J'ai entré ce code pour récupérer la dernière commande ouverte :

//--- Fonction permettant de calculer le numéro de ticket de la dernière commande ouverte

int LastOpenTicket()

{

datetime lastTime = 0 ;

int lastTicket = -1 ; // Aucun ouvert.

int pos ;

for (pos = OrdersTotal() - 1 ; pos >= 0 ; pos--)

if (OrderSelect(pos, SELECT_BY_POS) // Seulement mes ordres w/

&& OrderMagicNumber() == MagicNumber // mon numéro magique

&& OrderSymbol() == Symbol() // et ma paire.

&& OrderOpenTime() > lastTime)

{

lastTime = OrderOpenTime() ;

lastTicket = OrderTicket() ;

}

return (lastTicket) ;

}

C'est une fonction qui est appelée à partir de ma fonction GetLots - le compilateur n'a pas d'erreur mais lorsque je fais un backtest, la section des résultats est complètement vide. Aucune transaction. Est-ce parce que la première transaction n'a pas de transaction précédente à laquelle faire appel dans le code ci-dessus ?

Dans le journal, il arrive à charger les variables externes (dont il charge le numéro magique 42, mais dans mon code, il s'agit de 42552... ?), mais rien ensuite.

 

...

Quelle est la déclaration de votre numéro magique ( il devrait être int MagicNumber ; )

crsnape@btinternet.com:
J'ai entré ce code pour récupérer le dernier ordre ouvert :

//--- Fonction permettant de calculer le numéro de ticket de la dernière commande ouverte

int LastOpenTicket()

{

datetime lastTime = 0 ;

int lastTicket = -1 ; // Aucun ouvert.

int pos ;

for (pos = OrdersTotal() - 1 ; pos >= 0 ; pos--)

if (OrderSelect(pos, SELECT_BY_POS) // Seulement mes ordres w/

&& OrderMagicNumber() == MagicNumber // mon numéro magique

&& OrderSymbol() == Symbol() // et ma paire.

&& OrderOpenTime() > lastTime)

{

lastTime = OrderOpenTime() ;

lastTicket = OrderTicket() ;

}

return (lastTicket) ;

}

C'est une fonction qui est appelée à partir de ma fonction GetLots - le compilateur n'a pas d'erreur mais lorsque je fais un backtest, la section des résultats est complètement vide. Aucune transaction. Est-ce parce que la première transaction n'a pas de transaction précédente à laquelle faire appel dans le code ci-dessus ?

Dans le journal, il arrive à charger les variables externes (dont il charge le numéro magique 42, mais dans mon code c'est 42552... ?) mais ensuite rien.
 

Oui, c'est int MagicNumber = 42557

 

...

Alors je ne peux pas dire à partir du code que vous avez posté pourquoi il ne fonctionne pas correctement (pourquoi il reçoit le mauvais MagicNumber par exemple). Le code devrait fonctionner s'il y a un ordre ouvert avec le MagicNumber spécifié (il va boucler à travers les ordres ouverts) S'il n'y a pas d'ordres ouverts ou si les MagicNumbers et les symboles ne correspondent pas, il retournera -1 (comme vous vous y attendez), donc ce code est correct (je l'ai testé maintenant, et il fonctionne comme il le devrait).

Désolé, mais c'est tout ce que je peux faire à partir du code que vous avez posté.

crsnape@btinternet.com:
Oui, c'est int MagicNumber = 42557
 

Que se passerait-il dans le cas où aucune commande précédente n'aurait été ouverte et que celle-ci serait la première ? Je sais qu'il renvoie -1 mais le code EA ne s'exécuterait-il pas parce que ma fonction GetLots repose sur l'appel du numéro de ticket de la dernière commande ouverte.

 

S'il repose sur l'existence d'au moins un ordre précédemment ouvert, alors il échouera.

Ajoutez quelque chose comme ceci dans votre condition :

si (LastOpenOrder()==-1)

... alors vous pouvez ouvrir un ordre si toutes les autres conditions sont remplies.

sinon

... vérifier le dernier ordre ouvert comme précédemment plus le reste des conditions

(je ne fais que deviner comment vous avez écrit les conditions de votre EA).

crsnape@btinternet.com:
Que se passerait-il dans le cas où aucun ordre précédent n'aurait été ouvert et que celui-ci serait le premier ? Je sais qu'il renvoie -1, mais le code EA échouerait-il à s'exécuter parce que ma fonction GetLots repose sur l'appel du numéro de ticket de la dernière commande ouverte.
 

Bonjour Mladen,

Savez-vous comment ouvrir un trade lorsque la ligne stochastique croise le niveau 20 ou 80 ?

Par exemple

Quand les stochastiques se croisent au niveau 20 (survente), Long

Quand les stochastiques se croisent au niveau 80 (surchauffe), Short.

Salutations

Ryan

 

J'ai ajouté quelques lignes à ce code - c'est ce qui utilise la fonction LastOpenTicket() mais il ne l'aime toujours pas. J'ai ajouté l'option -1. Est-ce que quelque chose vous semble anormal ici ?

//--- Déterminer si l'ordre de vente précédent est profitable

string GetWinLossPreviousShort (int LastOpenTicket, string WinLossPreviousShort)

{

si (OrderSelect(LastOpenTicket(), SELECT_BY_TICKET, MODE_TRADES) == TRUE)

{

si (OrderProfit() > 0 && OrderType() == OP_SELL)

{

WinLossPreviousShort = "W" ;

return (WinLossPreviousShort) ;

}

si ((OrderProfit() < 0 && OrderType() == OP_SELL) || LastOpenTicket() == -1)

{

WinLossPreviousShort = "L" ;

return (WinLossPreviousShort) ;

}

}

}

 

...

Pourquoi ne pas ajouter un autre résultat possible de cette fonction: quelque chose comme lorsque LastOpenTicket() == -1 alors WinLossPreviousShort="Na".

crsnape@btinternet.com:
J'ai ajouté quelques lignes à ce code - c'est ce qui utilise la fonction LastOpenTicket() mais il ne l'aime toujours pas. J'ai ajouté l'option -1. Y a-t-il quelque chose qui ne vous semble pas correct ?

//--- Déterminez si l'ordre de vente précédent est rentable.

string GetWinLossPreviousShort (int LastOpenTicket, string WinLossPreviousShort)

{

si (OrderSelect(LastOpenTicket(), SELECT_BY_TICKET, MODE_TRADES) == TRUE)

{

si (OrderProfit() > 0 && OrderType() == OP_SELL)

{

WinLossPreviousShort = "W" ;

return (WinLossPreviousShort) ;

}

si ((OrderProfit() < 0 && OrderType() == OP_SELL) || LastOpenTicket() == -1)

{

WinLossPreviousShort = "L" ;

return (WinLossPreviousShort) ;

}

}

}