ProRealTime
Pour partager sur le trading automatique, nos algorithmes, nos backtests
Répondre • Page 1 sur 1

Mon Robot de Trading

par Jimoncj » 07 juil. 2018 17:23

Bonjour,

Comme promis, je créer ce post pour partager l'avancement de la programmation de mon EA afin d'appliquer ma stratégie de trading.

Stratégie :
Spoiler:
Mettre deux moyennes mobiles exponentielles du graphique horaire sur mon graphe UT5 a 8 et 32 périodes afin de connaitre la tendance. Lorsque le graphe de 8 périodes est au dessus de celui de 32 je ne me positionne qu'à l'achat et vice-versa.
Je me sert ensuite d'une 3eme moyenne mobile exponentielle de 8 périodes du graphe UT5 comme déclencheur. Je prend position lorsque le prix dépasse la moyenne mobile de 8 périodes de 5 minutes dans la direction de la tendance. Je met un stop loss juste au dessous de l'ancien swing de la periode opposée. Je fixe un montant de take profit qui me paraît adéquat ( au moins plus élevé que la valeur de perte de mon stop loss je pense) et me permet d'essayer d'augmenter mon gain avec un stop loss suiveur plutôt que le take profit lorsque je pense que le prix continuera de suivre la tendance.
La programmation avance plutôt bien :) mais je fais face à un premier problème :

Le programme est écrit en mql4.
Le programme étant écrit dans la fonction "Ontick" celui-ci s'exécute en boucle pour chaque tick. Je voudrais que le programme demande si il y a une position ouverte au début de la fonction "Ontick" pour ne pas ouvrir plusieurs positions en même temps. La valeur retournée pourrait être un true/false ou un nombre de positions ouvertes (avec 0 pour aucune position).

Ensuite je pensais mettre ceci au début de "Ontick"
while(laFonctionMystereQuiDitSiYaUnePosOuverte == 0)
{ Monprogramme}

Si vous avez besoin d'un bout du code du programme comprendre je peux le mettre.

Merci d'avance pour votre aide.

Re: Mon Robot de Trading

par Jimoncj » 07 juil. 2018 19:29

J'ai trouvé la fonction dont j'ai besoin : "OrdersTotal()", qui renvoi le nombre de positions ouvertes.

La fonction à l'air de remplir son rôle parfaitement à une exception près :
Elle semble prendre en compte toutes les positions ouvertes sur la plateforme et non celles ouvertes par l'EA ce qui empêche de trader manuellement en même temps que l'EA.
Je vais me contenter de cette fonction pour le moment et je verrai si j'arrive à bidouiller mieux plus tard :lol:

Re: Mon Robot de Trading

par lenanard » 08 juil. 2018 07:35

regardez la fonction "magic number" pour résoudre la prise en compte des ordres ouvert par que par l'ea.

Re: Mon Robot de Trading

par Jimoncj » 08 juil. 2018 13:51

Merci pour ton aide. J'avais bien vu cette fonction mais je ne comprenais pas comment l'utiliser. Après ton commentaire j'ai creusé un peu plus et j'ai compris :
int magicNumber = 0 en début de programme
magicNumber=1234 dans le OrderSend() lors d'une ouverture de position
magicNumber=0 lors d'une fermeture de position
if (magicNumber ==0) au début de Ontick()

Du coup j'ai fini de programmer mon EA en 164 lignes. Plus qu'à attendre l'ouverture des marchés lundi pour la tester :)

Re: Mon Robot de Trading

par Jimoncj » 09 juil. 2018 16:23

J'ai un problème dans le déroulement de mon programme.
Voici la partie du code (présent dans le OnTick) qui pose problème :

Code : #

 if (magicNumber ==0) // L'EA vérifie si il n'y a pas déja un ordre ouvert par l'EA
    {

       if ((MMA96>MMA384) && (Open[1]<MMA5) && (Close[1]>MMA5)&& (Close[1]<=(Open[1]+0.0010))) // Vérification du déclencheur d'achat
        {
         ticket=OrderSend(Symbol(),OP_BUY,lot,priceA=Ask,3,stoplossA=Low[2],NULL,"Ordre d'achat",magicNumber=1234,0,clrGreen); // Achat
         if(ticket<0) // Vérification d'erreur lors de l'achat
         Print("Ordre non placé. Error code #",GetLastError()); 
         else 
         Print("Ordre placé avec succès à : ",priceA); 
        }

       if ((MMA96<MMA384) && (Open[1]>MMA5) &&(Close[1]<MMA5)&& (Close[1]>=(Open[1]-0.0010))) //Vérification du déclencheur de vente
        {
         ticket=OrderSend(Symbol(),OP_SELL,lot,priceV=Bid,3,stoplossV=High[2],NULL,"Ordre de vente",magicNumber=1234,0,clrRed); // Vente
         if(ticket<0) // Vérification d'erreur lors de la vente
         Print("Ordre non placé. Error code #",GetLastError()); 
         else 
         Print("Ordre placé avec succès à : ",priceV);
        }
    }

   else if (ticket2>0)
   {
    if(OrderSelect(ticket2, SELECT_BY_TICKET)==true) //Recherche d'une position ouverte avec stoploss modifié
    {
      if((OrderType()==0) && (Ask>coursAchat)) // Recherche d'une position d'achat en hausse
       {
        // Incrémentation du stoploss
        bool res=OrderModify(ticket2=OrderTicket(),OrderOpenPrice(),stopSuiveurA=stopSuiveurA+(Ask-coursAchat),OrderTakeProfit(),0,Blue); 
            if(!res) // Vérification d'erreur
               Print("Echec de la hausse du stoploss suiveur. Error code #",GetLastError()); 
            else 
               Print("Hausse du stoplosssuiveur : ",stopSuiveurA);
       }
       
       if((OrderType()==1) && (Bid<coursVente)) // Recherche d'une position de vente en baisse
       {
        // Incrémentation du stoploss
        bool res=OrderModify(ticket2=OrderTicket(),OrderOpenPrice(),stopSuiveurV=stopSuiveurV-(Bid+coursVente),OrderTakeProfit(),0,Blue); 
            if(!res) // Vérification d'erreur
               Print("Echec de la hausse du stoploss suiveur. Error code #",GetLastError()); 
            else 
               Print("Hausse du stoplosssuiveur : ",stopSuiveurV);
       }
    }
   }

Toutes les variables sont bien déclarées et initialisées à 0 en début de programme.

Le premier "if" se lance donc car la variable "magicNumber" est bien égale à 0.
Le programme vérifie un déclencheur, ouvre un ordre si le déclencheur est ok, et il stock le numéro de ticket dans la variable "ticket" et créer un magicNumber qu'il stock dans la variable magicNumber. Si le déclencheur n'est pas bon, la suite du programme n'étant que des "else if" il lance ce "if" en boucle jusqu'à ouvrir une position.
Jusque la tout va bien, c'est ce que je veux :lol:

Une fois la position ouverte, "magicNumber" n'est plus égal à 0, il passe donc au "else if" suivant. La variable "ticket2" n'a pas été modifiée et est donc toujours égale à 0 (c'est la variable "ticket" qui a été modifiée)

Le "else if (ticket2>0)" ne devrait donc pas s'exécuter et le programme devrait passer au "else if" suivant.

Seulement en lisant le journal de l'expert, je vois que celui-ci a bien été exécuté et a abouti à une erreur (ça c'est normal car il n'était pas censé s'exécuté à ce moment la donc il lui manque des variables).

Alors peut être le problème est devant mon nez et je ne vois rien mais j'ai beau réfléchir je comprend pas pourquoi l'EA exécute ce "else if" si la condition n'est pas remplie...

Si quelqu'un pouvait éclairer ma lanterne :)

Re: Mon Robot de Trading

par planglois » 09 juil. 2018 23:32

Tu peux peut-être debugger abec un trace ou un print. Je sais pas dans mql4 si ca se fait, dans python tu peut printer le state actuel et voir pourquoi le if passe pas.

Ta ligne if((MMA96>MMA384) && (Open[1]<MMA5) && (Close[1]>MMA5)&& (Close[1]<=(Open[1]+0.0010)) est trop longue pour raisonner dessu. On es juste des humains! Découpe la en variable boolean.

Par exemple

tendance = (MMA96>MMA384)
open_ma = (Open[1]<MMA5)
...

apres tu peux probablement faire

print(open_ma)
print(tendance)
print(...)
...

et ton if devient

if(tendance && open_ma && ... && ...) {}

Et tu verras ce qui se passe et qui trigger ton else if

Re: Mon Robot de Trading

par ouf2finance » 10 juil. 2018 09:02

Ça fait hyper longtemps que j'ai pas fait de mql4, mais si ça peut aider, pour débugguer je "plottais" mes variables à tester soit sur le graphe des cours soit en dessous comme un indicateur en fonction en fonction des valeurs (pour avoir une échelle cohérente).
Des fois, je trouve que graphiquement ça aide beaucoup à comprendre les erreurs que l'on peut faire.

Re: Mon Robot de Trading

par JFLB » 25 oct. 2018 16:03

déjà 'jouer' avec les magic numbers c'est pas conseillé. tu dois le mettre en extern et ne pas y toucher.

aussi avec ton algo que se passe-t-il si tu dois changer un paramètre ou si ton VPS redémarrre ? eh bien magicnumber retourne à zero, et ça réouvre un ordre alors qu'il y en a déjà un d'ouvert !

tu dois passer en revue tous les trades ouverts et changer les variables à partir de là

Re: Mon Robot de Trading

par VB6backtester » 01 nov. 2018 17:07

Coucou, je découvre ton sujet en retard, mais j'ai l'impression que nos EA ont des points en commun. Le mien tourne depuis 1 an sur le DAX. Mais en même temps je l'améliore encore !
Ca marche ? Tu es aussi sur le Dax ?

Sujets similaires
Deep Learning Trading robot
Fichier(s) joint(s) par JFLB » 01 janv. 2018 15:19 (41 Réponses)
Quel langage apprendre pour coder un robot de trading ?
par Anewa » 28 mars 2018 21:05 (11 Réponses)
Fiscalité signal et robot de trading
Fichier(s) joint(s) par Benoist Rousseau » 29 juil. 2018 21:41 (16 Réponses)
Trading automatique , robot et broker
par Jim » 20 avr. 2019 21:19 (6 Réponses)
Performance de mon robot de trading [INTRADAY]
Fichier(s) joint(s) par olivier19 » 23 juin 2019 14:06 (32 Réponses)
Robot de Trading Miracle pour trader perdant.
par farwest » 13 août 2019 15:21 (16 Réponses)
TakaButiner : nouveau petit robot de trading expérimental
Fichier(s) joint(s) par takapoto » 01 oct. 2019 16:00 (31 Réponses)
Robot de Trading
Fichier(s) joint(s) par Benoist Rousseau » 23 juin 2020 11:33 (25 Réponses)
Takashi Kotegawa (BNF) Trading Robot
par Amarantine » 31 déc. 2020 17:51 (2 Réponses)
Méthode de trading et robot
par FxJumper » 23 déc. 2023 22:47 (0 Réponses)