Rejoindre la communauté
banner_forum
Devenez membre de la plus grande
communauté francophone sur le Forex
Partagez, échangez et apprenez en gagnant des crédits sur votre compte de trading

Comment on fait en MQL pour ...

  • Lorka85

    la syntaxe est t'elle correct ?

    Code
    bool buy; Buy = MA3 > MA4 && (RSI1 > RSIbuyLevel || RSI1 > RSIsellLevel);

    en gros : si la MA3 et supérieur a la MA4 ET SI le rsi est superieur a son niveau sur acheté OU BIEN supérieur a son niveau sur acheté !
  • Lorka85

    supérieure a son niveau sur vendu pardon.
  • Brrtony (invité)

    Et oui encore moi :(

    Je voudrais savoir comment rajouter cette option dans un EA "une perte maximum autorisee par paire"

    Exemple :

    Si l'EA fait 3 pertes sur eur/usd il ne trade plus sur cette paire pour la journée.

    Si quelqu'un a une solution :s MERCI.
  • furynick

    Pour commencer tu n'as pas besoin de préciser la paire à moins que tu ne fasse un EA multipaire, ton EA ne travaillant que sur la paire sur laquelle il a été déposé.

    Donc, il te suffit de compter les positions perdantes avant d'en ouvrir une nouvelle
    Code
    int total = OrdersTotal(); int loss = 0; for (int i = 0 ; i < total ; i++) if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES) if (OrderProfit() < 0 && OrderMagicNumber() == magicNumber && OrderSymbol() == Symbol()) loss++; buySignal = buySignal && loss < maxLostOrders; sellSignal = sellSignal && loss < maxLostOrders;

    buySignal/sellSignal étant des booléens précédemment définis et signalant un signal d'achat/vente, maxLostOrders étant ta limite déclarée en paramètre externe.
  • Brrtony (invité)

    Merci @furynick ça marche :). Mais sais tu comment remettre le compteur "loss++" à zero toutes les heures par exemple ?
    MERCI :D.
  • furynick

    il suffit de vérifier si les minutes sont à 0 dans un bloc soumis à condition de formation d'une nouvelle barre :

    Code
    //+------------------------------------------------------------------+ //| detect new bar formed | //+------------------------------------------------------------------+ bool newBarFormed() { double vol = iVolume(Symbol(), Period(), 0); bool ret = vol < savedVolume; savedVolume = vol; return(ret); } int start () { if (newBarFormed() && TimeMinute(TimeCurrent()) == 0) loss = 0; }
  • Lorka85

    Bonjour

    j'aimerais incrementer une valeur si tel ou tel indicateur est positif ou negatif !

    imaginons que j'ai 10 indicateur (rsi, macd, stochastic, etc) pour chaque indicateur en tendance positif, j'aimerais qu'il incrémente une valeur integer de 10, donc si les 10 son en positif, on atteint le chiffre 100 (100%).
    si 7 son en positif, et 3 en négatif, la valeur sera donc de 70 (70%). simple non ?

    voici la structure de mon code, tous se met a jours a chaque tick, donc dans la section start :

    Code
    int finalresult = 0; int start() { finalresult = 0; //------------------- MACD trend ---------------------- if (macdval > macdcross) finalresult = finalresult+10; else finalresult = finalresult-10; //-------------------RSI --------------------------- if (rsival > 50) finalresult = finalresult+10 else finalresult = finalresult-10; ETC.... pour les 8 autres indicateurs return(0); }

    bref, le probleme est que ca ne marche pas comme je voudrais, j'ai des -29, des +10%, donc je ne comprend pas trop comment réglé ce probleme qui je pense est assez simple, et si je n'initialise pas le finalresult = 0; au début ça s'incremente a chaque tick pour atteindre les 1025 % ou - 5210% a l'infini....
    Une piste peu être ? :)
    merci

  • NYKOES

    Peut être indiqué que finalresult ne pas être inférieur à 0% et supérieur à 100% ?

    [code]
    if (rsival > 50)

    finalresult = finalresult+10
    if (finaresult >=100) finalresult = 100;
    else

    finalresult = finalresult-10;
    if (finaresult <=0) finalresult = 0;
  • Lorka85

    merci nykoes. mais cela ne résout pas le fait que j'ai des valeurs qui ne correspondent pas, par exemple au lieu d'avoir 60 si 6 indicateur son positif, j'ai 20, sans comprendre pourquoi :(
  • Lorka85

    bon j'ai compris, en fait j'ai enlever les finalresult = finalresult-10; :)
  • Lorka85

    :)
    Lorka85 a joint une image
    G3479CA
  • furynick

    En algo ça donnerai ça :
    Code
    scoreachat = 0 scorevente = 0 pour chaque indicateur si (indicateur est haussier) scoreachat = scoreachat + 1; fin si si (indicateur est baissier) scorevente = scorevente + 1; fin si fin pour scoreachat = 100 * scoreachat / nombreIndicateurs scorevente = 100 * scorevente / nombreIndicateurs

    Ensuite tu n'affiches que le le score le plus important et cet algo te permet d'avoir autant d'indicateurs que tu souhaites (pas seulement 10 pour faire 100 à la fin).

    Le "scoreachat = scoreachat + 1" se traduit par un "scoreachat++;" en MQL ;)
  • NYKOES

    ooh un indicateur made in Lorka ! moi j'aime et n'en veut ! :)
  • NYKOES

    Quelqu'un pourrait me confirmer que ce bout de code fera bien ce que l'on lui demande le vendredi à 8 heures du mat' ? :

    Code
    if(TimeDayOfWeek(TimeCurrent()==5) && (TimeHour(TimeCurrent() >= 8))) { Print("Friday time !"); }

    Merci !
  • NYKOES

    ...car cela ne fonctionne évidemment pas en BT puisque le code considère l'heure et la date du serveur.
  • furynick

    Tout faux, les parenthèses sont mal placées et il y en a trop :
    Code
    if(TimeDayOfWeek(TimeCurrent())==5 && TimeHour(TimeCurrent()) >= 8) { Print("Friday time !"); }

    Si tu veux utiliser l'heure du PC (moins fiable car pas nécessairement synchronisée) utilises TimeLocal()
  • NYKOES

    Ah oui merci, effectivement, c'était très mal fichu dis donc .... oups je sors ... :)
  • Lorka85

    Dite moi, il lest possible de rajouter une alerte sur ce bbsqueeze quand l'histograme croise la ligne zero ?

    http://www.megaupload.com/?d=QL6YWA69

    il y a deja une alerte sur la barre horizontale au changement de couleur (quand les kelktner channel sort de la bollinger band)

    Merci
    P.S : de préférence a la cloture de la bougie ou il y a le signal.
  • Lorka85

    laissez tomber mon message précédent :)

    autre question, voici le code de l'indicateur trendlord, assez court :

    Code
    /* Generated by EX4-TO-MQ4 decompiler V4.0.224.1 [] Website: http://purebeam.biz E-mail : [email protected] */ #property indicator_separate_window #property indicator_buffers 3 #property indicator_color1 White #property indicator_color2 SteelBlue #property indicator_color3 Crimson extern int period = 50; int g_ma_method_80 = MODE_LWMA; int g_applied_price_84 = PRICE_CLOSE; double g_ibuf_88[]; double g_ibuf_92[]; double g_ibuf_96[]; double gda_100[]; int init() { IndicatorBuffers(3); SetIndexBuffer(1, g_ibuf_88); SetIndexBuffer(2, g_ibuf_92); SetIndexBuffer(0, g_ibuf_96); ArraySetAsSeries(g_ibuf_96, TRUE); SetIndexStyle(0, DRAW_HISTOGRAM, STYLE_DASHDOT, 2); SetIndexStyle(1, DRAW_HISTOGRAM, STYLE_DASHDOT, 2); SetIndexStyle(2, DRAW_HISTOGRAM, STYLE_DASHDOT, 2); IndicatorShortName("Trend Lord"); return (0); } int deinit() { return (0); } double WMA(int ai_0, int a_period_4) { return (iMA(NULL, 0, a_period_4, 0, g_ma_method_80, g_applied_price_84, ai_0)); } int start() { double lda_16[]; double lda_20[]; int l_ind_counted_0 = IndicatorCounted(); if (l_ind_counted_0 < 0) return (-1); int li_4 = 0; int l_period_8 = MathSqrt(period); int li_12 = Bars - l_ind_counted_0 + period + 1; if (li_12 > Bars) li_12 = Bars; ArrayResize(lda_16, li_12); ArraySetAsSeries(lda_16, TRUE); ArrayResize(lda_20, li_12); ArraySetAsSeries(lda_20, TRUE); for (li_4 = 0; li_4 < li_12; li_4++) lda_16[li_4] = 2.0 * WMA(li_4, period / 1) - WMA(li_4, period); for (li_4 = 0; li_4 < li_12 - period; li_4++) g_ibuf_96[li_4] = iMAOnArray(lda_16, 0, l_period_8, 0, g_ma_method_80, li_4); for (li_4 = li_12 - period; li_4 >= 0; li_4--) { lda_20[li_4] = lda_20[li_4 + 1]; if (g_ibuf_96[li_4] > g_ibuf_96[li_4 + 1]) lda_20[li_4] = 1; if (g_ibuf_96[li_4] < g_ibuf_96[li_4 + 1]) lda_20[li_4] = -1; if (lda_20[li_4] > 0.0) { //Alert("-- TrendLord Up - BUY - " ,Symbol()," ",Period()," @ ",Bid); g_ibuf_88[li_4] = g_ibuf_96[li_4]; if (lda_20[li_4 + 1] < 0.0) g_ibuf_88[li_4 + 1] = g_ibuf_96[li_4 + 1]; g_ibuf_92[li_4] = EMPTY_VALUE; } else { if (lda_20[li_4] < 0.0) { g_ibuf_92[li_4] = g_ibuf_96[li_4]; if (lda_20[li_4 + 1] > 0.0) g_ibuf_92[li_4 + 1] = g_ibuf_96[li_4 + 1]; g_ibuf_88[li_4] = EMPTY_VALUE; } } gda_100[li_4] = lda_20[li_4]; } return (0); }

    le probleme est que la dernière barre fermé sur l'histograme repeint ! savez vous ce qu'il faudrait modifier ?
  • furynick

    Comme la plupart des indics qui repeignent alors qu'ils ne devraient pas, le pb vient du décompte de barres à repeindre :
    Code
    int li_12 = Bars - l_ind_counted_0 + period + 1;

    Le l_ind_counted_0 issu du IndicatorCounted indique le nombre de barre qui ont déjà été calculées. La plupart du temps cette valeur est égale à Bars, c'est pour cette raison qu'il faut lui soustraire 1 systématiquement pour que la barre courante soit recalculée.
    Dans ce cas ce sont "period" barres qui sont recalculées en plus de la barre courante, donc pas seulement l'avant dernière.
    Cette erreur que je qualifierai de classique provient du fait que le codeur veut bien faire et souhaite démarrer le comptage "period" barres après le début de l'historique ... mais ce raisonnement ne tient que pour le premier comptage à l'initialisation de l'indic. Il faut donc supprimer l'addition de "period" pour éviter la repeinture et idéalement utiliser le SetIndexDrawBegin pour limiter l'affichage de l'indic en début d'historique.

    Pour le reste, on voit que l'indicateur est codé correctement peut être dans le but de ne pas repeindre justement ... paradoxal
    Code
    for (li_4 = li_12 - period; li_4 >= 0; li_4--)