Mon compte
Déjà membre ? S'identifier
Non inscrit ? S'inscrire
 
+ Répondre à la discussion
Affichage des résultats 1 à 8 sur 8
  1. #1
    Nouveau membre waldganger est sur la route de la réputation...
    Date d'inscription
    November 2011
    Messages
    5
    Pouvoir de réputation
    2

    Probleme de code MQL4 Probleme de code MQL4

    Bonjour à tous,

    Je me permets de vous solliciter car je suis un novice complet en MQL4 et la programmation va me rendre fou..
    Voila, en fait, j'aimerai faire un EA très simple dans lequel il puisse repérer les plus haut et les plus bas des 3 derniers chandeliers pour passer des ordre BuyStop et SellStop dès que le cours franchit l'une des extrémités.
    Les ordres devront constamment être actualisés.
    Bon, en soi, le robot n'est pas compliqué du tout...je pense...mais je n'arrive pas à compiler...
    Voila ce que j'ai écrit pour le moment :

    //+------------------------------------------------------------------+
    //| FM.mq4 |
    //| N |
    //| |
    //+------------------------------------------------------------------+
    #property copyright "N"
    #property link ""


    extern double lots = 0.01;
    extern int stop = 21;
    extern int limite = 7;
    int magic = 52565256;
    double TheHaut;
    double TheBas;
    int heure;
    int minute;
    int seconde;
    int jour;
    int mois;
    int annee;


    //+------------------------------------------------------------------+
    //| expert start function |
    //+------------------------------------------------------------------+
    int start()
    {
    //----
    heure= Hour();
    minute = Minute();
    seconde = Seconds();
    jour = Day();
    mois = Month();
    annee = Year();
    Comment("Heure: "+heure+":"+minute+":"+seconde+" "+"Date: "+jour+"/"+mois+"/"+annee);
    //----

    TheHaut=High[iHighest(NULL,0,MODE_HIGH,3,1)]; //peut etre est-ce que je dois garder val a la place de TheHaut?
    TheBas=Low[iLowest(NULL,0,MODE_LOW,3,1)];

    //----

    OrderSend(Symbol(), OP_BUYSTOP, "lots", "TheHaut", 3, "TheHaut" - ("stop" *
    Point), "TheHaut" + ("limite" * Point), "magic", 0, Blue);
    OrderSend(Symbol(), OP_SELLSTOP, "lots", "TheBas", 3, "TheBas" + ("stop" *
    Point), "TheBas" - ("limite" * Point), "magic", 0, Red);

    //----

    return(0);
    }
    //----
    Si l'un d'entre vous pouvait me renseigner, je lui en serai vraiment reconnaissant.

    Merci beaucoup pour votre aide.

  2. #2
    Membre Performance jeanjo est sur la route de la réputation...
    Date d'inscription
    November 2010
    Messages
    181
    Pouvoir de réputation
    3

    Boujour,

    Si vous enlevez les " ", vous pouvez compiler.
    Tous les chiffres sont des double, les " ", sont pour les "string", les lettres.
    Je n'ai pas regardé plus loin si le programme fonctionne.

    OrderSend(Symbol(), OP_BUYSTOP, lots, TheHaut, 3, TheHaut - (stop*Point), TheHaut + (limite*Point), magic, 0, Blue);
    OrderSend(Symbol(), OP_SELLSTOP, lots, TheBas, 3, TheBas + (stop*Point), TheBas - (limite*Point), magic, 0, Red);

  3. #3
    Nouveau membre waldganger est sur la route de la réputation...
    Date d'inscription
    November 2011
    Messages
    5
    Pouvoir de réputation
    2

    jeanjo,

    Merci beaucoup pour votre aide!
    J'ai effectivement pu compiler.
    Lorsque j'attache l'EA à un graphique, la date se met bien en place, mais il n'y a aucun pending order... J'ai l'impression que le robot ne trade pas ou qu'il ne scan pas le niveau le plus haut ou le plus bas des 3 derniers chandeliers.
    Ai je fait une erreur dans la programmation?

    Merci d'avance

  4. #4
    Membre Performance jeanjo est sur la route de la réputation...
    Date d'inscription
    November 2010
    Messages
    181
    Pouvoir de réputation
    3

    Boujour, je ne sais pas sur quel broker vous êtes, si vous avez 4 ou 5 Digits, ce n'est pas pareil;
    Vous pouvez modifiez ici :

    extern double lots = 0.1; // lot mini FxPro
    extern int stop = 70; // mini = 5 Pips ou 50 points

    TheHaut = High[iHighest(NULL,0,MODE_HIGH,20,1)];

    Et ici :

    int total = OrdersTotal();
    //----
    double LeHaut = NormalizeDouble(TheHaut, Digits);
    double SL_bs = NormalizeDouble( (TheHaut - stop*Point), Digits);
    double TP_bs = NormalizeDouble( (TheHaut + limite*Point), Digits);

    if( total == 0 ) // pour avoir un seul ordre à la fois
    OrderSend(Symbol(), OP_BUYSTOP, lots, TheHaut, 3, SL_bs, TP_bs, NULL,magic, 0, Lime );

    Ca va placer un pending order buy stop, mais ensuite il faut développer avec le OrderSelect, OrderType, OP_BUY ou OPBUYSTOP, même chose pour les ventes, pour vérifier le nombre et le type des ordres en cours, sinon ça fonctionne.

  5. #5
    Nouveau membre waldganger est sur la route de la réputation...
    Date d'inscription
    November 2011
    Messages
    5
    Pouvoir de réputation
    2

    Bonjour jeanjo,

    De nouveau merci pour votre aide.
    Effectivement mon broker a 5 digits, et autorise les microlots (0.01).
    J'ai donc changé les données TP et SL qui étaient trop petites.
    Les pending orders ne se déclenchent pas.
    Etant complètement noob en programmation, j'ai du omettre plusieurs paramètres ou fonctions.
    Qu'en pensez vous ? A l'heure d'aujourd'hui, voila le code que j'ai pu rédiger avec votre aide.


    //+------------------------------------------------------------------+
    //| FM.mq4 |
    //| Nicolas |
    //| |
    //+------------------------------------------------------------------+
    #property copyright "Nicolas"
    #property link ""


    extern double lots = 0.01;
    extern int stop = 270;
    extern int limite = 80;
    int magic = 52565256;
    double TheHaut;
    double TheBas;
    int heure;
    int minute;
    int seconde;
    int jour;
    int mois;
    int annee;


    //+------------------------------------------------------------------+
    //| expert start function |
    //+------------------------------------------------------------------+
    int start()
    {
    //----
    heure= Hour();
    minute = Minute();
    seconde = Seconds();
    jour = Day();
    mois = Month();
    annee = Year();
    Comment("Heure: "+heure+":"+minute+":"+seconde+" "+"Date: "+jour+"/"+mois+"/"+annee);
    //----

    int total = OrdersTotal();
    //----
    TheHaut=High[iHighest(NULL,0,MODE_HIGH,20,1)];
    double TheHaut = NormalizeDouble(TheHaut, Digits);
    double SL_bs = NormalizeDouble( (TheHaut - stop*Point), Digits);
    double TP_bs = NormalizeDouble( (TheHaut + limite*Point), Digits);
    //----

    TheBas=Low[iLowest(NULL,0,MODE_LOW,20,1)];
    double TheBas = NormalizeDouble(TheBas, Digits);



    //----

    if( total == 0 ) // pour avoir un seul ordre à la fois
    {
    OrderSend(Symbol(), OP_BUYSTOP, lots, TheHaut, 5, TheHaut - (stop *
    Point), TheHaut + (limite * Point), "aaa" ,magic, 0, Blue);
    OrderSend(Symbol(), OP_SELLSTOP, lots, TheBas, 5, TheBas + (stop *
    Point), TheBas - (limite * Point), "bbb" ,magic, 0, Red);
    }
    //----

    return(0);
    }
    //----

  6. #6
    Nouveau membre waldganger est sur la route de la réputation...
    Date d'inscription
    November 2011
    Messages
    5
    Pouvoir de réputation
    2

    A maintenant, ça fonctionne bien. J'ai enlevé deux trois choses. Je vais voir si les pending order se réactualisent en permanence si un précédent pending order devient une position ouverte.

    Jeanjo, dernière question, mettons que je veuille que les pending order soient réactualisés toutes les 15 mn, savez vous comment il faut faire ?


    #property copyright "Nicolas"
    #property link ""


    extern double lots = 0.01;
    extern int stop = 270;
    extern int limite = 80;
    int magic = 52565256;
    double TheHaut;
    double TheBas;
    int heure;
    int minute;
    int seconde;
    int jour;
    int mois;
    int annee;


    //+------------------------------------------------------------------+
    //| expert start function |
    //+------------------------------------------------------------------+
    int start()
    {
    //----
    heure= Hour();
    minute = Minute();
    seconde = Seconds();
    jour = Day();
    mois = Month();
    annee = Year();
    Comment("Heure: "+heure+":"+minute+":"+seconde+" "+"Date: "+jour+"/"+mois+"/"+annee);
    //----

    int total = OrdersTotal();
    //----
    TheHaut=High[iHighest(NULL,0,MODE_HIGH,8,1)];
    TheBas=Low[iLowest(NULL,0,MODE_LOW,8,1)];
    //----






    //----

    if( total == 0 ) // pour avoir un seul ordre à la fois
    {
    OrderSend(Symbol(), OP_BUYSTOP, lots, TheHaut, 5, TheHaut - (stop *
    Point), TheHaut + (limite * Point), "aaa" ,magic, 0, Blue);
    OrderSend(Symbol(), OP_SELLSTOP, lots, TheBas, 5, TheBas + (stop *
    Point), TheBas - (limite * Point), "bbb" ,magic, 0, Red);
    }
    //----

    return(0);
    }
    //----

  7. #7
    Membre Performance jeanjo est sur la route de la réputation...
    Date d'inscription
    November 2010
    Messages
    181
    Pouvoir de réputation
    3

    Boujour waldganger,

    Je ne sais pas ce que veut dire réactualiser.
    Pour la suite tout dépend de ce que vous voulez faire, mais il faut faire une boucle pour compter les ordres en cours.
    On fait une boucle dans ce style pour compter les ordres, et ensuite en fonction des résultats et de ce qu'on veut faire, on reprogramme :

    int nombre_de_buy =0;
    int nombre_de_buystop =0;

    for(i=0; i<total; i++)
    {
    if((OrderSelect(i,SELECT_BY_POS)==true) //If there is the next one
    && (OrderSymbol()==Symbol())) //.. and our currency pair
    {
    if(OrderType() == OP_BUY) nombre_de_buy++;
    if(OrderType() == OP_STOPBUY) nombre_de_stopbuy++;
    }
    }
    Voilà ensuite il suffit de dire la suite au programme. Le plus facile pour vérifier, c'est de faire un
    Print("nombre de buy en cours = ", nombre_de_buy);
    Et d'aller voir le résultat dans "expert".

  8. #8
    Membre Performance jeanjo est sur la route de la réputation...
    Date d'inscription
    November 2010
    Messages
    181
    Pouvoir de réputation
    3

    Ce plus haut va changer sans arrêt :

    TheHaut=High[iHighest(NULL,0,MODE_HIGH,8,1)];

    S'il y a un trend haussier, le plus haut sera le plus haut des 8 bougies, donc la 8eme bougie,
    il va prendre un ordre,puis la 9eme bougie, il va prendre un ordre, puis la 10eme bougie .....
    Si le trend est baissier, le plus haut va baisser à mesure que les cours baissent. Bonne chance.

Discussions similaires

  1. Code
    Par xmanns dans le forum Programmation
    Réponses: 2
    Dernier message: 03/11/2010, 15h42
  2. Ind Angle: transcription code PRT en MQL4
    Par Moebus dans le forum Programmation
    Réponses: 1
    Dernier message: 05/04/2010, 21h20
  3. Problème de codage MQL4
    Par TAAD dans le forum Programmation
    Réponses: 6
    Dernier message: 10/03/2010, 22h48
  4. PB de code
    Par pingoo dans le forum Systèmes de Trading Auto
    Réponses: 2
    Dernier message: 03/02/2009, 21h46
  5. PB de code
    Par pingoo dans le forum Systèmes de Trading Auto
    Réponses: 0
    Dernier message: 26/01/2009, 11h16

Ajouter aux Favoris | Plan du site | Archives | Forex | Contact