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

E.A. Cross MOVING AVERAGE.

  • arka3579

    Bjr,

    J'ai un E.A. fonctionnel (sans erreur / modifiable et libre) ;
    >> Croisement de 2 Movings Averages.

    Je recherche quelqu'un qui accepterai d'ajouter certaines choses a ce Robot.

    Je souhaiterai l'ajout d'un MAGIC NUMBER.
    Remplacer ouverture fixe par "pourcentage du capital"
    Ainsi qu'une liste de choix multiple de Moving Average (et Mvwap)
    * SIMPLE / LINEAIRE / EXPO / SMOOTH / NLMA (Non Lag) et MVWAP

    Contactez-moi par message privé, pour en discuter !

    Merci par avance.
    Yohan.
  • arka3579 — en réponse à arka3579 dans son message #124513

    J'ai trouvé pour la Magic Number.
    >> extern int magic=0;

    Zero erreur à la compilation.. C'est bon ?
  • arka3579

    Alors voila..

    Il reste 2 chose a voir sur cet Expert.Ad.

    Ouverture a X% de la balance (J'y tiens vraiment)
    Je pense que le stopLoss ne fonctionne pas )=

    Je vous le donne ci-dessous ;

    //+------------------------------------------------------------------+
    //| MACross.mq4 |
    //| Copyright 2020, Signal Forex |
    //| https://signalforex.id |
    //+------------------------------------------------------------------+
    #property copyright "Copyright 2020, Signal Forex"
    #property link "https://signalforex.id"
    #property version "1.00"
    #property strict

    //--- input parameters
    input int period_ma_fast = 2; //Period Fast MA
    input int FasterMode = 0; // 0 = sma, 1 = ema, 2 = smma, 3 = lwma, 4 = nlma
    input int period_ma_slow = 18; //Period Slow MA
    input int SlowerMode = 0; // 0 = sma, 1 = ema, 2 = smma, 3 = lwma, 4 = nlma

    input double takeProfit = 250; //Take Profit (pips)
    input double stopLoss = 25; //Stop Loss (pips)

    input double lotSize = 0.1; //Lot Size
    input double minEquity = 100.0; //Min. Equity ($)

    input int Slippage = 3; //Slippage
    input int MagicNumber = 11; //Magic Number

    //Variabel Global
    double myPoint = 0.0;
    int mySlippage = 0;
    int BuyTicket = 0;
    int SellTicket = 0;

    //+------------------------------------------------------------------+
    //| Expert initialization function |
    //+------------------------------------------------------------------+
    int OnInit()
    {
    //validasi input, sebaiknya kita selalu melakukan validasi pada initialisasi data input
    if (period_ma_fast >= period_ma_slow || takeProfit < 0.0 || stopLoss < 0.0 || lotSize < 0.01 || minEquity < 10){
    Alert("WARNING - Input data inisial tidak valid";);
    return (INIT_PARAMETERS_INCORRECT);
    }

    double min_volume=SymbolInfoDouble(Symbol(),SYMBOL_VOLUME_MIN);
    if(lotSize<min_volume)
    {
    string pesan =StringFormat("Volume lebih kecil dari batas yang dibolehkan yaitu %.2f",min_volume);
    Alert (pesan);
    return(INIT_PARAMETERS_INCORRECT);
    }

    myPoint = GetPipPoint(Symbol());
    mySlippage = GetSlippage(Symbol(),Slippage);

    return(INIT_SUCCEEDED);
    }

    //+------------------------------------------------------------------+
    //| Expert deinitialization function |
    //+------------------------------------------------------------------+
    void OnDeinit(const int reason)
    {
    Print ("EA telah diberhentikan";);
    }

    //+------------------------------------------------------------------+
    //| Expert tick function |
    //+------------------------------------------------------------------+
    void OnTick()
    {
    if (cekMinEquity()){


    int signal = -1;
    bool isNewCandle = NewCandle(Period(), Symbol());

    signal = getSignal(isNewCandle);
    transaction(isNewCandle, signal);


    }else{
    //Stop trading, karena equity tidak cukup
    Print ("Vérifier Equity";);
    }
    }

    void transaction(bool isNewCandle, int signal){
    if (isNewCandle==false) return;

    int tOrder = 0;
    int tOrderBuy = 0, tOrderSell = 0;
    string strMN = "", pair = "";
    int tiketBuy = 0, tiketSell = 0;
    double lotBuy = 0.0, lotSell = 0.0;

    pair = Symbol();

    tOrder = OrdersTotal();
    for (int i=tOrder-1; i>=0; i--){
    bool hrsSelect = OrderSelect(i, SELECT_BY_POS, MODE_TRADES);
    strMN = IntegerToString(OrderMagicNumber());
    if (StringFind(strMN, IntegerToString(MagicNumber), 0) == 0 && StringFind(OrderSymbol(), pair, 0) == 0 ){
    if (OrderType() == OP_BUY){
    tOrderBuy++;
    tiketBuy = OrderTicket();
    lotBuy = OrderLots();
    }
    if (OrderType() == OP_SELL){
    tOrderSell++;
    tiketSell = OrderTicket();
    lotSell = OrderLots();
    }

    }//end if magic number && pair

    }//end for

    double lot = 0.0;
    double hargaOP = 0.0;
    double sl = 0.0, tp = 0.0;
    int tiket = 0;
    int orderType = -1;

    //Open pertama kali
    if (signal == OP_BUY && tOrderBuy == 0){
    lot = getLotSize();
    orderType = signal;
    hargaOP = Ask;
    tiket = OrderSend(Symbol(), orderType, lot, hargaOP, mySlippage, sl, tp, "OP BUY", MagicNumber, 0, clrBlue);
    if (tiketSell > 0){
    if (OrderClose(tiketSell, lotSell, Ask, mySlippage, clrRed)){
    Print ("Close successful";);
    }
    }
    }else if (signal == OP_SELL && tOrderSell == 0){
    lot = getLotSize();
    orderType = signal;
    hargaOP = Bid;
    tiket = OrderSend(Symbol(), orderType, lot, hargaOP, mySlippage, sl, tp, "OP SELL", MagicNumber, 0, clrRed);
    if (tiketBuy > 0){
    if (OrderClose(tiketBuy, lotBuy, Bid, mySlippage, clrRed)){
    Print ("Close successful";);
    }
    }
    }

    }

    int getSignal(bool isNewCandle){
    int signal = -1;

    if (isNewCandle==true){
    //Moving Averages
    double maFast1 = iMA(NULL, 0, period_ma_fast, 0, FasterMode, 0, 1);
    double maSlow1 = iMA(NULL, 0, period_ma_slow, 0, SlowerMode, 0, 1);
    double maFast2 = iMA(NULL, 0, period_ma_fast, 0, FasterMode, 0, 2);
    double maSlow2 = iMA(NULL, 0, period_ma_slow, 0, SlowerMode, 0, 2);

    if(maFast2 <= maSlow2 && maFast1 > maSlow1){
    signal = OP_BUY;
    }else if(maFast2 >= maSlow2 && maFast1 < maSlow1){
    signal = OP_SELL;
    }
    }

    return (signal);
    }

    double getLotSize(){
    double lot = 0.0;
    lot = NormalizeDouble(lotSize, 2);
    return (lot);
    }

    //fungsi tambahan untuk cek equity minimum
    bool cekMinEquity(){
    bool valid = false;
    double equity = 0.0;
    equity = AccountEquity();

    if (equity > minEquity){
    valid = true;
    }
    return (valid);
    }

    // Fungsi GetPipPoint
    double GetPipPoint(string pair)
    {
    double point= 0.0;
    int digits = (int) MarketInfo(pair, MODE_DIGITS);
    if(digits == 2 || digits== 3) point= 0.01;
    else if(digits== 4 || digits== 5) point= 0.0001;
    return(point);
    }

    // Fungsi GetSlippage
    int GetSlippage(string pair, int SlippagePips)
    {
    int slippage = 0;
    int digit = (int) MarketInfo(pair,MODE_DIGITS);
    if(digit == 2 || digit == 4) slippage = SlippagePips;
    else if(digit == 3 || digit == 5) slippage = SlippagePips * 10;
    return(slippage );
    }

    bool NewCandle(int tf, string pair = "" ){
    bool isNewCS = false;
    static datetime prevTime = TimeCurrent();
    if (pair == "";) pair = Symbol();
    if (prevTime < iTime(pair, tf, 0)){
    isNewCS = true;
    prevTime = iTime(pair, tf, 0);
    }
    return isNewCS;
    }
  • arka3579

    Dites moi quelle parti sera a modifier pour passer de lot à % Balance svp.
  • lefeuvr3

    Je suggère de remplacer
    Code
    lot par
    Code
    (AccountBalance() * 0.01 /LotFactor) et de mettre
    Code
    extern double LotFactor=1000; dans les parametres du haut
  • arka3579

    Je vais regarder cela. Merci.
    As tu essayer de compiler ? Pour Test..
  • arka3579

    Trop compliqué "pas grave". Je ne ne sais même pas sur quel ligne changé. MINCE.
    Modifié le 2021-06-17 18:18:02 par arka3579
  • arka3579

    Ce qui manque a ce robot c'est donc ouverture a X% du capital (merci pour l'aide mais j'arrive pas)
    et j'aimerai tout simplement qu'on lui ajoute un filtre de stop loss suiveur ATR.
    Ce Robot tel qu'il est fait, la, clôture aux croisements M.A. suivant et ouvre par la même occasion une nouvelle position.
    Si le S.Loss. A.T.R. coupe la position avant le croisement, c'est un gain supplémentaire garantie s'il est bien réglé.

    EN CLAIR ; Il ouvre au croisements M.A, mais les conditions de fermeture se feront par A.T.R.
    Ce Robot m'a révélé de belles surprises en combinant toutes les paires FOREX en M30.
    J'aimerai vraiment qu'on l'améliore.

    Go ?
  • arka3579 — en réponse à arka3579 dans son message #124609

    On oublie pour l'ATR (fermeture)
    Apres analyse plus poussé, ca servirait a rien.

    CEPENDANT on ajouterai simplement une condition au travers d'une MA SIMPLE ou EXPO 190 ou 361. (modifiable ou pas)
    En clair ; si Prix au dessus de MA 190 alors.. ouvrir LONG et oublier SHORT et inversement
    Les 2 autre MOVING AVERAGE font leur travail comme dab, mais s'ouvre uniquement dans le sens du prix mis en rapport avec la MOV AV 190.

    On ouvrirai a X% du capital ou equity.
    arka3579 a joint une image
    e-a-cross-moving-average-13559
  • arka3579

    lefeuvr3, le 09/06/2021 dit :
    Je suggère de remplacer Code lot par Code(AccountBalance() * 0.01 /LotFactor) et de mettre Codeextern double LotFactor=1000; dans les parametres du haut


    Ca fonctionne Merci.
    Modifié le 2021-06-21 11:52:09 par arka3579
  • gilbertgonzales

    Pas si familier avec les robots conseillers experts en trading forex. Mais votre article sur EA donne plus d'idées à ce sujet.
  • evieknowles

    Wow ! beaucoup de codes à vérifier pour un trader débutant comme moi utilisant des conseillers experts.