Atascado al crear un EA

 

Publi

Atascado al crear un EA

 

Publi

Página 1 de 3 123 ÚltimoÚltimo
Resultados 1 al 10 de 23


  1. #1




    Reputación:
    Poder de reputación: 7

    Bahamas
    Mensajes: 136
    Créditos: 768

    Re: Atascado al crear un EA


    Publi
    Ciertamente es una situación que se presenta con regularidad, es decir que un indicador presente la condición y los otros todavía no. En casos simples se pueden utilizar banderas (flags) o variables que permiten almacenar el valor una vez se presenta. Por ejemplo, algo así:
    Código:
    If (condition1) then flag =1; // aquí por ejemplo el valor del buffer se presenta (Buffeer=3)
    If condition2 && flag=1) then buy to market && flag=0; // aquí pese a que el buffer ya vale cero el algoritmo ya sabe que previamente se presento buffer=3 ejecuta la acción y restablece el flag

    Y dado que en general los algoritmos con cierto grado de robustez tienden a ser muy complejos, porque necesitan verificar muchas condiciones, es bueno segmentar las condiciones, es decir

    Condition1 ()…….Condition(2)…………..Condition(3) que pueden ser valores booleanos o enteros, es decir las condiciones en si misma pueden ser tan complejas que pueden devolver falso o verdadero o un entero (ejemplo condition1=1 o… = 2 o…. =3) de acuerdo a una situación específica.

    Aunque no hay una norma o estándar como tal, porque la programación puede ser tan flexible y ajustada a la personalidad del programador, siempre es buena practica llevar un orden y una secuencia de los pasos lógicos dentro del código, que permita no solo revisiones y modificaciones posteriores, sino que otros programadores puedan entenderlo.

    Saludos,
    Foro de Forex Trading United

  2. Gracias donpeliculero Gracias por este post
  3. Publi
    Publi


  4. #2




    Reputación:
    Poder de reputación: 7

    Bahamas
    Mensajes: 136
    Créditos: 768

    Re: Atascado al crear un EA

    Cita Iniciado por Zamir Ver mensaje
    Ok entiendo. Bueno entrando en materia que es lo que importa le veo varios detalles:


    1. No le puede decir al indicador que tiene un valor menor a 1 (Buffer <1) como criterio para abrir (cerrar) operación porque él está calculado sobre valores del precio por tanto son positivos.
    2. Tampoco es correcto decirle al indicador que tenga un valor mayor a 1 (Buffer>1) porque seguramente encontrará pares de Forex cuya cotización es inferior a 1 por ejemplo NZDUSD. Etc..
    3. Entonces lo correcto sería decirle Buffer > 0. (buffer mayor a cero)
    4. Si solamente calcula el indicador basado en el criterio de “Una nueva Barra”, seguramente el indicador va a dejar de tomar muchas operaciones, porque este indicador tiende a formas el semáforo en una base intra bar, es decir muy pocas veces encontrara que el buffer tiene un valor en el primer tick de la nueva barra.

    Si corrige estos puntos, seguramente el EA tomará las operaciones de acuerdo a cada criterio.

    Espero esto ayude!
    Perdón quise decir Buffer>0 ()Buffer mayor a cero)
    Foro de Forex Trading United

  5. #3




    Reputación:
    Poder de reputación: 7

    Bahamas
    Mensajes: 136
    Créditos: 768

    Re: Atascado al crear un EA

    Ok. relamente las banderas son transparentes aqui. El detalle esta en el planteamiento de la condición, usted dice:
    Entrada en largo:
    - Que no exista una orden de compra previamente.
    - Que en el primer indicador, el BufferUp sea mayor a cero (Buffer4>0)
    - Que en el segundo indicador, el BufferUp sea mayor que el BufferDown (Buffer1>Buffer2)
    .

    Para el caso de compra deberia ser Buffer5>0
    Para el caso de Venta deberia ser Buffer4>0

    Aqui le hice la modificación:

    Código:
    //-------------------------------------------------------------
    //  GNUSoft Ltda. Forex EA and Script Generator version 6.2  EA
    //-------------------------------------------------------------
    // Keywords: MT4, Forex EA builder, create EA, expert advisor developer
    
    
    
    
    #property copyright "Copyright © 2014-2017, GNUSoft. Forex EA Generator v6.2"
    #property link      "http://www.generador-mql.com"
    
    
    
    
    #include <stdlib.mqh>
    #include <WinUser32.mqh>
    
    
    
    
    // exported variables
    extern double BuyLots10 = 0.1;
    extern int BuyStoploss10 = 0;
    extern int BuyTakeprofit10 = 0;
    extern string BuyExpertName10 = "";
    extern double SellLots11 = 0.1;
    extern int SellStoploss11 = 0;
    extern int SellTakeprofit11 = 0;
    extern string SellExpertName11 = "";
    
    
    
    
    
    
    
    
    // local variables
    double PipValue=1;    // this variable is here to support 5-digit brokers
    bool Terminated = false;
    string LF = "\n";  // use this in custom or utility blocks where you need line feeds
    int NDigits = 4;   // used mostly for NormalizeDouble in Flex type blocks
    int ObjCount = 0;  // count of all objects created on the chart, allows creation of objects with unique names
    int current = 0;   // current bar index, used by Cross Up, Cross Down and many other blocks
    int varylots[101]; // used by Buy Order Varying, Sell Order Varying and similar
    int flag1=0,flag2=0; //
    
    
    
    
    
    
    
    
    
    
    int init()
    {
        NDigits = Digits;
        
        if (false) ObjectsDeleteAll();      // clear the chart
        
        
        Comment("");    // clear the chart
        return (0);
    }
    
    
    
    
    // Expert start
    int start()
    {
        if (Bars < 10)
        {
            Comment("Not enough bars");
            return (0);
        }
        if (Terminated == true)
        {
            Comment("EA Terminated.");
            return (0);
        }
        
        OnEveryTick1();
        return (0);
    }
    
    
    
    
    void OnEveryTick1()
    {
        PipValue = 1;
        if (NDigits == 3 || NDigits == 5) PipValue = 10;
        
        IfOrderExists12();
        IfOrderExists13();
        IfOrderDoesNotExist2();
        IfOrderDoesNotExist3();
        
    }
    
    
    
    
    void IfOrderExists12()
    {
        bool exists = false;
        for (int i=OrdersTotal()-1; i >= 0; i--)
        if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
        {
            if (OrderType() == OP_BUY && OrderSymbol() == Symbol() && OrderMagicNumber() == 1)
            {
                exists = true;
            }
        }
        else
        {
            Print("OrderSelect() error - ", ErrorDescription(GetLastError()));
        }
        
        if (exists)
        {
            TechnicalAnalysis14();
            
        }
    }
    
    
    
    
    void TechnicalAnalysis14()
    {
        if (iCustom(NULL, PERIOD_CURRENT, "3_Level_ZZ_Semafor",4,current) > 0)
        {
            CloseOrder16();
            flag1=0;
            
        }
    }
    
    
    
    
    void CloseOrder16()
    {
        int orderstotal = OrdersTotal();
        int orders = 0;
        int ordticket[90][2];
        for (int i = 0; i < orderstotal; i++)
        {
            bool sel = OrderSelect(i, SELECT_BY_POS, MODE_TRADES);
            if (OrderType() != OP_BUY || OrderSymbol() != Symbol() || OrderMagicNumber() != 1)
            {
                continue;
            }
            ordticket[orders][0] = OrderOpenTime();
            ordticket[orders][1] = OrderTicket();
            orders++;
        }
        if (orders > 1)
        {
            ArrayResize(ordticket,orders);
            ArraySort(ordticket);
        }
        for (i = 0; i < orders; i++)
        {
            if (OrderSelect(ordticket[i][1], SELECT_BY_TICKET) == true)
            {
                bool ret = OrderClose(OrderTicket(), OrderLots(), OrderClosePrice(), 4, Blue);
                if (ret == false)
                Print("OrderClose() error - ", ErrorDescription(GetLastError()));
            }
        }
        
    }
    
    
    
    
    void IfOrderExists13()
    {
        bool exists = false;
        for (int i=OrdersTotal()-1; i >= 0; i--)
        if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
        {
            if (OrderType() == OP_SELL && OrderSymbol() == Symbol() && OrderMagicNumber() == 1)
            {
                exists = true;
            }
        }
        else
        {
            Print("OrderSelect() error - ", ErrorDescription(GetLastError()));
        }
        
        if (exists)
        {
            TechnicalAnalysis15();
            flag2=0;
            
        }
    }
    
    
    
    
    void TechnicalAnalysis15()
    {
        if (iCustom(NULL, PERIOD_CURRENT, "3_Level_ZZ_Semafor",5,current) > 0)
        {
            CloseOrder17();
            
        }
    }
    
    
    
    
    void CloseOrder17()
    {
        int orderstotal = OrdersTotal();
        int orders = 0;
        int ordticket[90][2];
        for (int i = 0; i < orderstotal; i++)
        {
            bool sel = OrderSelect(i, SELECT_BY_POS, MODE_TRADES);
            if (OrderType() != OP_SELL || OrderSymbol() != Symbol() || OrderMagicNumber() != 1)
            {
                continue;
            }
            ordticket[orders][0] = OrderOpenTime();
            ordticket[orders][1] = OrderTicket();
            orders++;
        }
        if (orders > 1)
        {
            ArrayResize(ordticket,orders);
            ArraySort(ordticket);
        }
        for (i = 0; i < orders; i++)
        {
            if (OrderSelect(ordticket[i][1], SELECT_BY_TICKET) == true)
            {
                bool ret = OrderClose(OrderTicket(), OrderLots(), OrderClosePrice(), 4, Red);
                if (ret == false)
                Print("OrderClose() error - ", ErrorDescription(GetLastError()));
            }
        }
        
    }
    
    
    
    
    void IfOrderDoesNotExist2()
    {
        bool exists = false;
        for (int i=OrdersTotal()-1; i >= 0; i--)
        if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
        {
            if (OrderType() == OP_BUY && OrderSymbol() == Symbol() && OrderMagicNumber() == 1)
            {
                exists = true;
            }
        }
        else
        {
            Print("OrderSelect() error - ", ErrorDescription(GetLastError()));
        }
        
        if (exists == false)
        {
            TechnicalAnalysis4();
            
        }
         if (exists == false && flag1 == 1)
        {
            TechnicalAnalysis5();
            
        }
    }
    
    
    
    
    void TechnicalAnalysis4()
    {
        if (iCustom(NULL, PERIOD_CURRENT, "3_Level_ZZ_Semafor",5,current) > 0)
        {
            
            flag1=1;
            flag2=0;
            Print(flag1," flag1 ",flag2 );
            
        }
    }
    
    
    
    
    void TechnicalAnalysis5()
    {
        if (iCustom(NULL, PERIOD_CURRENT, "KRSI",9,1,current) > iCustom(NULL, PERIOD_CURRENT, "KRSI",9,2,current))
        {
            BuyOrder10();
            
        }
    }
    
    
    
    
    void BuyOrder10()
    {
        double SL = Ask - BuyStoploss10*PipValue*Point;
        if (BuyStoploss10 == 0) SL = 0;
        double TP = Ask + BuyTakeprofit10*PipValue*Point;
        if (BuyTakeprofit10 == 0) TP = 0;
        int ticket = -1;
        if (true)
        ticket = OrderSend(Symbol(), OP_BUY, BuyLots10, Ask, 4, 0, 0, BuyExpertName10, 1, 0, Blue);
        else
        ticket = OrderSend(Symbol(), OP_BUY, BuyLots10, Ask, 4, SL, TP, BuyExpertName10, 1, 0, Blue);
        if (ticket > -1)
        {
            if (true)
            {
                bool sel = OrderSelect(ticket, SELECT_BY_TICKET);
                bool ret = OrderModify(OrderTicket(), OrderOpenPrice(), SL, TP, 0, Blue);
                if (ret == false)
                Print("OrderModify() error - ", ErrorDescription(GetLastError()));
            }
                
        }
        else
        {
            Print("OrderSend() error - ", ErrorDescription(GetLastError()));
        }
    }
    
    
    
    
    void IfOrderDoesNotExist3()
    {
        bool exists = false;
        for (int i=OrdersTotal()-1; i >= 0; i--)
        if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
        {
            if (OrderType() == OP_SELL && OrderSymbol() == Symbol() && OrderMagicNumber() == 1)
            {
                exists = true;
            }
        }
        else
        {
            Print("OrderSelect() error - ", ErrorDescription(GetLastError()));
        }
        
        if (exists == false)
        {
            TechnicalAnalysis6();
            
        }
        if (exists == false && flag2 == 1)
        {
            TechnicalAnalysis7();
            
        }
    }
    
    
    
    
    void TechnicalAnalysis6()
    {
        if (iCustom(NULL, PERIOD_CURRENT, "3_Level_ZZ_Semafor",4,current) > 0)
        {
            flag2=1;
            flag1=0;
             Print(flag1," flag2 ",flag2 );
        }
    }
    
    
    
    
    void TechnicalAnalysis7()
    {
        if (iCustom(NULL, PERIOD_CURRENT, "KRSI",9,2,current) > iCustom(NULL, PERIOD_CURRENT, "KRSI",9,1,current))
        {
            SellOrder11();
            
        }
    }
    
    
    
    
    void SellOrder11()
    {
        double SL = Bid + SellStoploss11*PipValue*Point;
        if (SellStoploss11 == 0) SL = 0;
        double TP = Bid - SellTakeprofit11*PipValue*Point;
        if (SellTakeprofit11 == 0) TP = 0;
        int ticket = -1;
        if (true)
        ticket = OrderSend(Symbol(), OP_SELL, SellLots11, Bid, 4, 0, 0, SellExpertName11, 1, 0, Red);
        else
        ticket = OrderSend(Symbol(), OP_SELL, SellLots11, Bid, 4, SL, TP, SellExpertName11, 1, 0, Red);
        if (ticket > -1)
        {
            if (true)
            {
                bool sel = OrderSelect(ticket, SELECT_BY_TICKET);
                bool ret = OrderModify(OrderTicket(), OrderOpenPrice(), SL, TP, 0, Red);
                if (ret == false)
                Print("OrderModify() error - ", ErrorDescription(GetLastError()));
            }
                
        }
        else
        {
            Print("OrderSend() error - ", ErrorDescription(GetLastError()));
        }
    }
    
    
    
    
    
    
    
    
    
    
    
    
    int deinit()
    {
        if (false) ObjectsDeleteAll();
        
        
        return (0);
    }

    ahora bien como funciona la bandera, por ejemplo flag1:
    - flag1 indica que la primera condición para comprar se ha presentado (Buffer5>0) (TechnicalAnalysis4) . Ella (flag1) solo se "resetea" a cero cuando se presenta alguna de estas dos situaciones:

    - Cuando la orden de compra se cierra. (TechnicalAnalysis14)
    -Cuando la condición inversa se presenta antes de ejecutar la orden de compra. (es decir aparece Buffer4>0) (TechnicalAnalysis6)

    Cuando yo tenga un espacio de tiempo, le subo el código de como se haría sin utilizar el generador y sin utilizar flags.

    Saludos,
    Foro de Forex Trading United

  6. Gracias donpeliculero Gracias por este post
  7. #4




    Reputación:
    Poder de reputación: 7

    Bahamas
    Mensajes: 136
    Créditos: 768

    Re: Atascado al crear un EA

    Ok. Esta seria la forma como seria sobre este código con dos simples flags:
    Código:
    //-------------------------------------------------------------
    //  GNUSoft Ltda. Forex EA and Script Generator version 6.2  EA
    //-------------------------------------------------------------
    // Keywords: MT4, Forex EA builder, create EA, expert advisor developer
    
    
    
    
    #property copyright "Copyright © 2014-2017, GNUSoft. Forex EA Generator v6.2"
    #property link      "http://www.generador-mql.com"
    
    
    
    
    #include <stdlib.mqh>
    #include <WinUser32.mqh>
    
    
    
    
    // exported variables
    extern double BuyLots10 = 0.1;
    extern int BuyStoploss10 = 0;
    extern int BuyTakeprofit10 = 0;
    extern string BuyExpertName10 = "";
    extern double SellLots11 = 0.1;
    extern int SellStoploss11 = 0;
    extern int SellTakeprofit11 = 0;
    extern string SellExpertName11 = "";
    
    
    
    
    
    
    
    
    // local variables
    double PipValue=1;    // this variable is here to support 5-digit brokers
    bool Terminated = false;
    string LF = "\n";  // use this in custom or utility blocks where you need line feeds
    int NDigits = 4;   // used mostly for NormalizeDouble in Flex type blocks
    int ObjCount = 0;  // count of all objects created on the chart, allows creation of objects with unique names
    int current = 0;   // current bar index, used by Cross Up, Cross Down and many other blocks
    int varylots[101]; // used by Buy Order Varying, Sell Order Varying and similar
    int flag1=0,flag2=0; //
    
    
    
    
    
    
    
    
    
    
    int init()
    {
        NDigits = Digits;
        
        if (false) ObjectsDeleteAll();      // clear the chart
        
        
        Comment("");    // clear the chart
        return (0);
    }
    
    
    
    
    // Expert start
    int start()
    {
        if (Bars < 10)
        {
            Comment("Not enough bars");
            return (0);
        }
        if (Terminated == true)
        {
            Comment("EA Terminated.");
            return (0);
        }
        
        OnEveryTick1();
        return (0);
    }
    
    
    
    
    void OnEveryTick1()
    {
        PipValue = 1;
        if (NDigits == 3 || NDigits == 5) PipValue = 10;
        
        IfOrderExists12();
        IfOrderExists13();
        IfOrderDoesNotExist2();
        IfOrderDoesNotExist3();
        
    }
    
    
    
    
    void IfOrderExists12()
    {
        bool exists = false;
        for (int i=OrdersTotal()-1; i >= 0; i--)
        if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
        {
            if (OrderType() == OP_BUY && OrderSymbol() == Symbol() && OrderMagicNumber() == 1)
            {
                exists = true;
            }
        }
        else
        {
            Print("OrderSelect() error - ", ErrorDescription(GetLastError()));
        }
        
        if (exists)
        {
            TechnicalAnalysis14();
            
        }
    }
    
    
    
    
    void TechnicalAnalysis14()
    {
        if (iCustom(NULL, PERIOD_CURRENT, "3_Level_ZZ_Semafor",5,current) > 0)
        {
            CloseOrder16();
            flag1=0;
            
        }
    }
    
    
    
    
    void CloseOrder16()
    {
        int orderstotal = OrdersTotal();
        int orders = 0;
        int ordticket[90][2];
        for (int i = 0; i < orderstotal; i++)
        {
            bool sel = OrderSelect(i, SELECT_BY_POS, MODE_TRADES);
            if (OrderType() != OP_BUY || OrderSymbol() != Symbol() || OrderMagicNumber() != 1)
            {
                continue;
            }
            ordticket[orders][0] = OrderOpenTime();
            ordticket[orders][1] = OrderTicket();
            orders++;
        }
        if (orders > 1)
        {
            ArrayResize(ordticket,orders);
            ArraySort(ordticket);
        }
        for (i = 0; i < orders; i++)
        {
            if (OrderSelect(ordticket[i][1], SELECT_BY_TICKET) == true)
            {
                bool ret = OrderClose(OrderTicket(), OrderLots(), OrderClosePrice(), 4, Blue);
                if (ret == false)
                Print("OrderClose() error - ", ErrorDescription(GetLastError()));
            }
        }
        
    }
    
    
    
    
    void IfOrderExists13()
    {
        bool exists = false;
        for (int i=OrdersTotal()-1; i >= 0; i--)
        if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
        {
            if (OrderType() == OP_SELL && OrderSymbol() == Symbol() && OrderMagicNumber() == 1)
            {
                exists = true;
            }
        }
        else
        {
            Print("OrderSelect() error - ", ErrorDescription(GetLastError()));
        }
        
        if (exists)
        {
            TechnicalAnalysis15();
            flag2=0;
            
        }
    }
    
    
    
    
    void TechnicalAnalysis15()
    {
        if (iCustom(NULL, PERIOD_CURRENT, "3_Level_ZZ_Semafor",4,current) > 0)
        {
            CloseOrder17();
            
        }
    }
    
    
    
    
    void CloseOrder17()
    {
        int orderstotal = OrdersTotal();
        int orders = 0;
        int ordticket[90][2];
        for (int i = 0; i < orderstotal; i++)
        {
            bool sel = OrderSelect(i, SELECT_BY_POS, MODE_TRADES);
            if (OrderType() != OP_SELL || OrderSymbol() != Symbol() || OrderMagicNumber() != 1)
            {
                continue;
            }
            ordticket[orders][0] = OrderOpenTime();
            ordticket[orders][1] = OrderTicket();
            orders++;
        }
        if (orders > 1)
        {
            ArrayResize(ordticket,orders);
            ArraySort(ordticket);
        }
        for (i = 0; i < orders; i++)
        {
            if (OrderSelect(ordticket[i][1], SELECT_BY_TICKET) == true)
            {
                bool ret = OrderClose(OrderTicket(), OrderLots(), OrderClosePrice(), 4, Red);
                if (ret == false)
                Print("OrderClose() error - ", ErrorDescription(GetLastError()));
            }
        }
        
    }
    
    
    
    
    void IfOrderDoesNotExist2()
    {
        bool exists = false;
        for (int i=OrdersTotal()-1; i >= 0; i--)
        if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
        {
            if (OrderType() == OP_BUY && OrderSymbol() == Symbol() && OrderMagicNumber() == 1)
            {
                exists = true;
            }
        }
        else
        {
            Print("OrderSelect() error - ", ErrorDescription(GetLastError()));
        }
        
        if (exists == false)
        {
            TechnicalAnalysis4();
            
        }
         if (exists == false && flag1 == 1)
        {
            TechnicalAnalysis5();
            
        }
    }
    
    
    
    
    void TechnicalAnalysis4()
    {
        if (iCustom(NULL, PERIOD_CURRENT, "3_Level_ZZ_Semafor",4,current) > 0)
        {
            
            flag1=1;
            
        }
    }
    
    
    
    
    void TechnicalAnalysis5()
    {
        if (iCustom(NULL, PERIOD_CURRENT, "KRSI",9,1,current) > iCustom(NULL, PERIOD_CURRENT, "KRSI",9,2,current))
        {
            BuyOrder10();
            
        }
    }
    
    
    
    
    void BuyOrder10()
    {
        double SL = Ask - BuyStoploss10*PipValue*Point;
        if (BuyStoploss10 == 0) SL = 0;
        double TP = Ask + BuyTakeprofit10*PipValue*Point;
        if (BuyTakeprofit10 == 0) TP = 0;
        int ticket = -1;
        if (true)
        ticket = OrderSend(Symbol(), OP_BUY, BuyLots10, Ask, 4, 0, 0, BuyExpertName10, 1, 0, Blue);
        else
        ticket = OrderSend(Symbol(), OP_BUY, BuyLots10, Ask, 4, SL, TP, BuyExpertName10, 1, 0, Blue);
        if (ticket > -1)
        {
            if (true)
            {
                bool sel = OrderSelect(ticket, SELECT_BY_TICKET);
                bool ret = OrderModify(OrderTicket(), OrderOpenPrice(), SL, TP, 0, Blue);
                if (ret == false)
                Print("OrderModify() error - ", ErrorDescription(GetLastError()));
            }
                
        }
        else
        {
            Print("OrderSend() error - ", ErrorDescription(GetLastError()));
        }
    }
    
    
    
    
    void IfOrderDoesNotExist3()
    {
        bool exists = false;
        for (int i=OrdersTotal()-1; i >= 0; i--)
        if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
        {
            if (OrderType() == OP_SELL && OrderSymbol() == Symbol() && OrderMagicNumber() == 1)
            {
                exists = true;
            }
        }
        else
        {
            Print("OrderSelect() error - ", ErrorDescription(GetLastError()));
        }
        
        if (exists == false)
        {
            TechnicalAnalysis6();
            
        }
        if (exists == false && flag2 == 1)
        {
            TechnicalAnalysis7();
            
        }
    }
    
    
    
    
    void TechnicalAnalysis6()
    {
        if (iCustom(NULL, PERIOD_CURRENT, "3_Level_ZZ_Semafor",5,current) > 0)
        {
            flag2=1;
            
        }
    }
    
    
    
    
    void TechnicalAnalysis7()
    {
        if (iCustom(NULL, PERIOD_CURRENT, "KRSI",9,2,current) > iCustom(NULL, PERIOD_CURRENT, "KRSI",9,1,current))
        {
            SellOrder11();
            
        }
    }
    
    
    
    
    void SellOrder11()
    {
        double SL = Bid + SellStoploss11*PipValue*Point;
        if (SellStoploss11 == 0) SL = 0;
        double TP = Bid - SellTakeprofit11*PipValue*Point;
        if (SellTakeprofit11 == 0) TP = 0;
        int ticket = -1;
        if (true)
        ticket = OrderSend(Symbol(), OP_SELL, SellLots11, Bid, 4, 0, 0, SellExpertName11, 1, 0, Red);
        else
        ticket = OrderSend(Symbol(), OP_SELL, SellLots11, Bid, 4, SL, TP, SellExpertName11, 1, 0, Red);
        if (ticket > -1)
        {
            if (true)
            {
                bool sel = OrderSelect(ticket, SELECT_BY_TICKET);
                bool ret = OrderModify(OrderTicket(), OrderOpenPrice(), SL, TP, 0, Red);
                if (ret == false)
                Print("OrderModify() error - ", ErrorDescription(GetLastError()));
            }
                
        }
        else
        {
            Print("OrderSend() error - ", ErrorDescription(GetLastError()));
        }
    }
    
    
    
    
    
    
    
    
    
    
    
    
    int deinit()
    {
        if (false) ObjectsDeleteAll();
        
        
        return (0);
    }
    Saludos,
    Foro de Forex Trading United

  8. Gracias donpeliculero Gracias por este post
  9. #5




    Reputación:
    Poder de reputación: 6

    Espana
    Mensajes: 18
    Créditos: 684

    Re: Atascado al crear un EA

    Hola de nuevo, Zamir.
    Agradezco, como siempre, su buena disposición y, por supuesto, acepto su ofrecimiento. Así pues, vamos a ello... Planteo un escenario con dos indicadores: Como primer indicador, el famoso senáforo (con los valores que trae por defecto). Como segundo indicador, el KRSI (con el valor 9 en la variable KPeriod).


    Entrada en largo:
    - Que no exista una orden de compra previamente.
    - Que en el primer indicador, el BufferUp sea mayor a cero (Buffer4>0)
    - Que en el segundo indicador, el BufferUp sea mayor que el BufferDown (Buffer1>Buffer2)
    - Con esas condiciones, la orden de compra debería abrirse.
    Salida en largo:
    - Que exista una operación de compra abierta previamente.
    - Que en el primer indicador, el BufferDown sea mayor a cero (Buffer5>0)


    Entrada en corto:
    - Que no exista una orden de venta previamente.
    - Que en el primer indicador, el BufferDown sea mayor a cero (Buffer5>0)
    - Que en el segundo indicador, el BufferDown sea mayor que el BufferUp (Buffer2>Buffer1)
    - Con esas condiciones, la orden de venta debería abrirse.
    Salida en corto:
    - Que exista una operación de venta abierta previamente.
    - Que en el primer indicador, el BufferUp sea mayor a cero (Buffer4>0)


    Con la ayuda del software que suelo utilizar, he programado los parámetros propuestos. Ahora, faltaría implementar la bandera que permita abrir una operación cuando la segunda condición se sume a la primera, aunque el Buffer del primer indicador ya presente un valor cero. Dejo aquí el código que he obtenido. También adjunto una imagen de una prueba de estrategia. La captura muestra el momento en el que debería abrirse una operación en corto, pero no se abre porque el BufferDown del primer indicador ya presenta un valor cero.


    Como siempre, le agradezco muy sinceramente su ayuda.

    Código:
    //-------------------------------------------------------------
    //  GNUSoft Ltda. Forex EA and Script Generator version 6.2  EA
    //-------------------------------------------------------------
    // Keywords: MT4, Forex EA builder, create EA, expert advisor developer
    
    
    #property copyright "Copyright © 2014-2017, GNUSoft. Forex EA Generator v6.2"
    #property link      "http://www.generador-mql.com"
    
    
    #include <stdlib.mqh>
    #include <WinUser32.mqh>
    
    
    // exported variables
    extern double BuyLots10 = 0.1;
    extern int BuyStoploss10 = 0;
    extern int BuyTakeprofit10 = 0;
    extern string BuyExpertName10 = "";
    extern double SellLots11 = 0.1;
    extern int SellStoploss11 = 0;
    extern int SellTakeprofit11 = 0;
    extern string SellExpertName11 = "";
    
    
    
    
    // local variables
    double PipValue=1;    // this variable is here to support 5-digit brokers
    bool Terminated = false;
    string LF = "\n";  // use this in custom or utility blocks where you need line feeds
    int NDigits = 4;   // used mostly for NormalizeDouble in Flex type blocks
    int ObjCount = 0;  // count of all objects created on the chart, allows creation of objects with unique names
    int current = 0;   // current bar index, used by Cross Up, Cross Down and many other blocks
    int varylots[101]; // used by Buy Order Varying, Sell Order Varying and similar
    
    
    
    
    
    
    int init()
    {
        NDigits = Digits;
        
        if (false) ObjectsDeleteAll();      // clear the chart
        
        
        Comment("");    // clear the chart
        return (0);
    }
    
    
    // Expert start
    int start()
    {
        if (Bars < 10)
        {
            Comment("Not enough bars");
            return (0);
        }
        if (Terminated == true)
        {
            Comment("EA Terminated.");
            return (0);
        }
        
        OnEveryTick1();
        return (0);
    }
    
    
    void OnEveryTick1()
    {
        PipValue = 1;
        if (NDigits == 3 || NDigits == 5) PipValue = 10;
        
        IfOrderExists12();
        IfOrderExists13();
        IfOrderDoesNotExist2();
        IfOrderDoesNotExist3();
        
    }
    
    
    void IfOrderExists12()
    {
        bool exists = false;
        for (int i=OrdersTotal()-1; i >= 0; i--)
        if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
        {
            if (OrderType() == OP_BUY && OrderSymbol() == Symbol() && OrderMagicNumber() == 1)
            {
                exists = true;
            }
        }
        else
        {
            Print("OrderSelect() error - ", ErrorDescription(GetLastError()));
        }
        
        if (exists)
        {
            TechnicalAnalysis14();
            
        }
    }
    
    
    void TechnicalAnalysis14()
    {
        if (iCustom(NULL, PERIOD_CURRENT, "3_Level_ZZ_Semafor",5,current) > 0)
        {
            CloseOrder16();
            
        }
    }
    
    
    void CloseOrder16()
    {
        int orderstotal = OrdersTotal();
        int orders = 0;
        int ordticket[90][2];
        for (int i = 0; i < orderstotal; i++)
        {
            bool sel = OrderSelect(i, SELECT_BY_POS, MODE_TRADES);
            if (OrderType() != OP_BUY || OrderSymbol() != Symbol() || OrderMagicNumber() != 1)
            {
                continue;
            }
            ordticket[orders][0] = OrderOpenTime();
            ordticket[orders][1] = OrderTicket();
            orders++;
        }
        if (orders > 1)
        {
            ArrayResize(ordticket,orders);
            ArraySort(ordticket);
        }
        for (i = 0; i < orders; i++)
        {
            if (OrderSelect(ordticket[i][1], SELECT_BY_TICKET) == true)
            {
                bool ret = OrderClose(OrderTicket(), OrderLots(), OrderClosePrice(), 4, Blue);
                if (ret == false)
                Print("OrderClose() error - ", ErrorDescription(GetLastError()));
            }
        }
        
    }
    
    
    void IfOrderExists13()
    {
        bool exists = false;
        for (int i=OrdersTotal()-1; i >= 0; i--)
        if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
        {
            if (OrderType() == OP_SELL && OrderSymbol() == Symbol() && OrderMagicNumber() == 1)
            {
                exists = true;
            }
        }
        else
        {
            Print("OrderSelect() error - ", ErrorDescription(GetLastError()));
        }
        
        if (exists)
        {
            TechnicalAnalysis15();
            
        }
    }
    
    
    void TechnicalAnalysis15()
    {
        if (iCustom(NULL, PERIOD_CURRENT, "3_Level_ZZ_Semafor",4,current) > 0)
        {
            CloseOrder17();
            
        }
    }
    
    
    void CloseOrder17()
    {
        int orderstotal = OrdersTotal();
        int orders = 0;
        int ordticket[90][2];
        for (int i = 0; i < orderstotal; i++)
        {
            bool sel = OrderSelect(i, SELECT_BY_POS, MODE_TRADES);
            if (OrderType() != OP_SELL || OrderSymbol() != Symbol() || OrderMagicNumber() != 1)
            {
                continue;
            }
            ordticket[orders][0] = OrderOpenTime();
            ordticket[orders][1] = OrderTicket();
            orders++;
        }
        if (orders > 1)
        {
            ArrayResize(ordticket,orders);
            ArraySort(ordticket);
        }
        for (i = 0; i < orders; i++)
        {
            if (OrderSelect(ordticket[i][1], SELECT_BY_TICKET) == true)
            {
                bool ret = OrderClose(OrderTicket(), OrderLots(), OrderClosePrice(), 4, Red);
                if (ret == false)
                Print("OrderClose() error - ", ErrorDescription(GetLastError()));
            }
        }
        
    }
    
    
    void IfOrderDoesNotExist2()
    {
        bool exists = false;
        for (int i=OrdersTotal()-1; i >= 0; i--)
        if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
        {
            if (OrderType() == OP_BUY && OrderSymbol() == Symbol() && OrderMagicNumber() == 1)
            {
                exists = true;
            }
        }
        else
        {
            Print("OrderSelect() error - ", ErrorDescription(GetLastError()));
        }
        
        if (exists == false)
        {
            TechnicalAnalysis4();
            
        }
    }
    
    
    void TechnicalAnalysis4()
    {
        if (iCustom(NULL, PERIOD_CURRENT, "3_Level_ZZ_Semafor",4,current) > 0)
        {
            TechnicalAnalysis5();
            
        }
    }
    
    
    void TechnicalAnalysis5()
    {
        if (iCustom(NULL, PERIOD_CURRENT, "KRSI",9,1,current) > iCustom(NULL, PERIOD_CURRENT, "KRSI",9,2,current))
        {
            BuyOrder10();
            
        }
    }
    
    
    void BuyOrder10()
    {
        double SL = Ask - BuyStoploss10*PipValue*Point;
        if (BuyStoploss10 == 0) SL = 0;
        double TP = Ask + BuyTakeprofit10*PipValue*Point;
        if (BuyTakeprofit10 == 0) TP = 0;
        int ticket = -1;
        if (true)
        ticket = OrderSend(Symbol(), OP_BUY, BuyLots10, Ask, 4, 0, 0, BuyExpertName10, 1, 0, Blue);
        else
        ticket = OrderSend(Symbol(), OP_BUY, BuyLots10, Ask, 4, SL, TP, BuyExpertName10, 1, 0, Blue);
        if (ticket > -1)
        {
            if (true)
            {
                bool sel = OrderSelect(ticket, SELECT_BY_TICKET);
                bool ret = OrderModify(OrderTicket(), OrderOpenPrice(), SL, TP, 0, Blue);
                if (ret == false)
                Print("OrderModify() error - ", ErrorDescription(GetLastError()));
            }
                
        }
        else
        {
            Print("OrderSend() error - ", ErrorDescription(GetLastError()));
        }
    }
    
    
    void IfOrderDoesNotExist3()
    {
        bool exists = false;
        for (int i=OrdersTotal()-1; i >= 0; i--)
        if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
        {
            if (OrderType() == OP_SELL && OrderSymbol() == Symbol() && OrderMagicNumber() == 1)
            {
                exists = true;
            }
        }
        else
        {
            Print("OrderSelect() error - ", ErrorDescription(GetLastError()));
        }
        
        if (exists == false)
        {
            TechnicalAnalysis6();
            
        }
    }
    
    
    void TechnicalAnalysis6()
    {
        if (iCustom(NULL, PERIOD_CURRENT, "3_Level_ZZ_Semafor",5,current) > 0)
        {
            TechnicalAnalysis7();
            
        }
    }
    
    
    void TechnicalAnalysis7()
    {
        if (iCustom(NULL, PERIOD_CURRENT, "KRSI",9,2,current) > iCustom(NULL, PERIOD_CURRENT, "KRSI",9,1,current))
        {
            SellOrder11();
            
        }
    }
    
    
    void SellOrder11()
    {
        double SL = Bid + SellStoploss11*PipValue*Point;
        if (SellStoploss11 == 0) SL = 0;
        double TP = Bid - SellTakeprofit11*PipValue*Point;
        if (SellTakeprofit11 == 0) TP = 0;
        int ticket = -1;
        if (true)
        ticket = OrderSend(Symbol(), OP_SELL, SellLots11, Bid, 4, 0, 0, SellExpertName11, 1, 0, Red);
        else
        ticket = OrderSend(Symbol(), OP_SELL, SellLots11, Bid, 4, SL, TP, SellExpertName11, 1, 0, Red);
        if (ticket > -1)
        {
            if (true)
            {
                bool sel = OrderSelect(ticket, SELECT_BY_TICKET);
                bool ret = OrderModify(OrderTicket(), OrderOpenPrice(), SL, TP, 0, Red);
                if (ret == false)
                Print("OrderModify() error - ", ErrorDescription(GetLastError()));
            }
                
        }
        else
        {
            Print("OrderSend() error - ", ErrorDescription(GetLastError()));
        }
    }
    
    
    
    
    
    
    int deinit()
    {
        if (false) ObjectsDeleteAll();
        
        
        return (0);
    }
    - - - Updated - - -

    Adjunto también el indicador KRSI, por si es necesario.
    Foro de Forex Trading United
    Miniaturas adjuntadas Miniaturas adjuntadas Atascado al crear un EA-imagen.jpg  
    Archivos adjuntados Archivos adjuntados

  10. #6




    Reputación:
    Poder de reputación: 6

    Espana
    Mensajes: 18
    Créditos: 684

    Atascado al crear un EA

    Hola a todos.


    Me he iniciado hace poco en este mundillo y, de momento, estoy aprendiendo en plan autodidacta de todo aquello que me parece útil. Una de las cosas que me parecen más interesantes es la posiblidad de crear un EA para trabajar con él en MT4. Como no tengo conocimientos de programación, estoy utiizando Forex Generator. De momento, hago cosas sencillas, para ir aprendiendo. Cojo un indicador, le doy orden de entrada y salida, y en una cuenta demo compruebo si responde bien a las órdenes... independientemente del balance económico. De momento no me interesa tanto el resultado económico como el aprender a crear un EA.


    El caso es que me he topado con un indicador que no sé por donde cogerlo. Es el 3LevelZZSemafor. Lo que intento es que abra una oeracion de compra cuando salga el 3 amarillo que indica un inicio de tendencia al alza y que la cierre cuando salga el 3 amarillo que indica un inicio de tendencia a la baja. Paralelamente, quiero que abra una operación de venta cuando salga el 3 amarillo que indica un inicio de tendencia a la baja y la cierre cuando salga el 3 amarillo que indica un inicio de tendencia al alza.


    Si no estoy equivocado, los buffers que me interesan son el 4 para abrir la compra y el 5 para abrir la venta. Inversamente, con el buffer 4 quiero cerrar la venta y con el 5 quiero cerrar la compra. He probado con muchos valores... y no lo consigo. La última prueba que he hecho es... buffer 4>1 para abrir compra y buffer 5<1 para abrir venta... pero nada. La compra no se abre y la venta se abre... pero no cuando debería.


    Alguien puede explicarme qué estoy haciendo mal? Estoy atascado y me gustaría averiguar dónde está el error. Por si sirve de ayuda, pego el código.


    Muchas gracias de antemano.


    -------------------------------
    //-------------------------------------------------------------
    // GNUSoft Ltda. Forex EA and Script Generator version 6.2 EA
    //-------------------------------------------------------------
    // Keywords: MT4, Forex EA builder, create EA, expert advisor developer


    #property copyright "Copyright © 2014-2017, GNUSoft. Forex EA Generator v6.2"
    #property link "http://www.generador-mql.com"


    #include <stdlib.mqh>
    #include <WinUser32.mqh>


    // exported variables
    extern double BuyLots21 = 0.5;
    extern int BuyStoploss21 = 0;
    extern int BuyTakeprofit21 = 0;
    extern double SellLots25 = 0.5;
    extern int SellStoploss25 = 0;
    extern int SellTakeprofit25 = 0;




    // local variables
    double PipValue=1; // this variable is here to support 5-digit brokers
    bool Terminated = false;
    string LF = "\n"; // use this in custom or utility blocks where you need line feeds
    int NDigits = 4; // used mostly for NormalizeDouble in Flex type blocks
    int ObjCount = 0; // count of all objects created on the chart, allows creation of objects with unique names
    int current = 0; // current bar index, used by Cross Up, Cross Down and many other blocks
    int varylots[101]; // used by Buy Order Varying, Sell Order Varying and similar


    datetime BarTime17 = 0;




    int init()
    {
    NDigits = Digits;

    if (true) ObjectsDeleteAll(); // clear the chart


    Comment(""); // clear the chart
    return (0);
    }


    // Expert start
    int start()
    {
    if (Bars < 10)
    {
    Comment("Not enough bars");
    return (0);
    }
    if (Terminated == true)
    {
    Comment("EA Terminated.");
    return (0);
    }

    OnEveryNewBar17();
    return (0);
    }


    void OnEveryNewBar17()
    {
    PipValue = 1;
    if (NDigits == 3 || NDigits == 5) PipValue = 10;
    if (BarTime17 < Time[0])
    {
    // we have a new bar opened
    BarTime17 = Time[0]; // keep the new bar open time
    IfOrderDoesNotExist20();
    IfOrderExists22();
    IfOrderDoesNotExist24();
    IfOrderExists18();

    }
    }


    void IfOrderDoesNotExist20()
    {
    bool exists = false;
    for (int i=OrdersTotal()-1; i >= 0; i--)
    if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
    {
    if (OrderType() == OP_BUY && OrderSymbol() == Symbol() && OrderMagicNumber() == 1)
    {
    exists = true;
    }
    }
    else
    {
    Print("OrderSelect() error - ", ErrorDescription(GetLastError()));
    }

    if (exists == false)
    {
    TechnicalAnalysis28();

    }
    }


    void TechnicalAnalysis28()
    {
    if (iCustom(NULL, PERIOD_CURRENT, "3_Level_ZZ_Semafor",4,current) > 1)
    {
    BuyOrder21();

    }
    }


    void BuyOrder21()
    {
    double SL = Ask - BuyStoploss21*PipValue*Point;
    if (BuyStoploss21 == 0) SL = 0;
    double TP = Ask + BuyTakeprofit21*PipValue*Point;
    if (BuyTakeprofit21 == 0) TP = 0;
    int ticket = -1;
    if (false)
    ticket = OrderSend(Symbol(), OP_BUY, BuyLots21, Ask, 4, 0, 0, "My Expert", 1, 0, Blue);
    else
    ticket = OrderSend(Symbol(), OP_BUY, BuyLots21, Ask, 4, SL, TP, "My Expert", 1, 0, Blue);
    if (ticket > -1)
    {
    if (false)
    {
    bool sel = OrderSelect(ticket, SELECT_BY_TICKET);
    bool ret = OrderModify(OrderTicket(), OrderOpenPrice(), SL, TP, 0, Blue);
    if (ret == false)
    Print("OrderModify() error - ", ErrorDescription(GetLastError()));
    }

    }
    else
    {
    Print("OrderSend() error - ", ErrorDescription(GetLastError()));
    }
    }


    void IfOrderExists22()
    {
    bool exists = false;
    for (int i=OrdersTotal()-1; i >= 0; i--)
    if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
    {
    if (OrderType() == OP_BUY && OrderSymbol() == Symbol() && OrderMagicNumber() == 1)
    {
    exists = true;
    }
    }
    else
    {
    Print("OrderSelect() error - ", ErrorDescription(GetLastError()));
    }

    if (exists)
    {
    TechnicalAnalysis26();

    }
    }


    void TechnicalAnalysis26()
    {
    if (iCustom(NULL, PERIOD_CURRENT, "3_Level_ZZ_Semafor",5,current) < 1)
    {
    CloseOrder23();

    }
    }


    void CloseOrder23()
    {
    int orderstotal = OrdersTotal();
    int orders = 0;
    int ordticket[90][2];
    for (int i = 0; i < orderstotal; i++)
    {
    bool sel = OrderSelect(i, SELECT_BY_POS, MODE_TRADES);
    if (OrderType() != OP_BUY || OrderSymbol() != Symbol() || OrderMagicNumber() != 1)
    {
    continue;
    }
    ordticket[orders][0] = OrderOpenTime();
    ordticket[orders][1] = OrderTicket();
    orders++;
    }
    if (orders > 1)
    {
    ArrayResize(ordticket,orders);
    ArraySort(ordticket);
    }
    for (i = 0; i < orders; i++)
    {
    if (OrderSelect(ordticket[i][1], SELECT_BY_TICKET) == true)
    {
    bool ret = OrderClose(OrderTicket(), OrderLots(), OrderClosePrice(), 4, Blue);
    if (ret == false)
    Print("OrderClose() error - ", ErrorDescription(GetLastError()));
    }
    }

    }


    void IfOrderDoesNotExist24()
    {
    bool exists = false;
    for (int i=OrdersTotal()-1; i >= 0; i--)
    if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
    {
    if (OrderType() == OP_SELL && OrderSymbol() == Symbol() && OrderMagicNumber() == 2)
    {
    exists = true;
    }
    }
    else
    {
    Print("OrderSelect() error - ", ErrorDescription(GetLastError()));
    }

    if (exists == false)
    {
    TechnicalAnalysis29();

    }
    }


    void TechnicalAnalysis29()
    {
    if (iCustom(NULL, PERIOD_CURRENT, "3_Level_ZZ_Semafor",5,current) < 1)
    {
    SellOrder25();

    }
    }


    void SellOrder25()
    {
    double SL = Bid + SellStoploss25*PipValue*Point;
    if (SellStoploss25 == 0) SL = 0;
    double TP = Bid - SellTakeprofit25*PipValue*Point;
    if (SellTakeprofit25 == 0) TP = 0;
    int ticket = -1;
    if (false)
    ticket = OrderSend(Symbol(), OP_SELL, SellLots25, Bid, 4, 0, 0, "My Expert", 2, 0, Red);
    else
    ticket = OrderSend(Symbol(), OP_SELL, SellLots25, Bid, 4, SL, TP, "My Expert", 2, 0, Red);
    if (ticket > -1)
    {
    if (false)
    {
    bool sel = OrderSelect(ticket, SELECT_BY_TICKET);
    bool ret = OrderModify(OrderTicket(), OrderOpenPrice(), SL, TP, 0, Red);
    if (ret == false)
    Print("OrderModify() error - ", ErrorDescription(GetLastError()));
    }

    }
    else
    {
    Print("OrderSend() error - ", ErrorDescription(GetLastError()));
    }
    }


    void IfOrderExists18()
    {
    bool exists = false;
    for (int i=OrdersTotal()-1; i >= 0; i--)
    if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
    {
    if (OrderType() == OP_SELL && OrderSymbol() == Symbol() && OrderMagicNumber() == 2)
    {
    exists = true;
    }
    }
    else
    {
    Print("OrderSelect() error - ", ErrorDescription(GetLastError()));
    }

    if (exists)
    {
    TechnicalAnalysis27();

    }
    }


    void TechnicalAnalysis27()
    {
    if (iCustom(NULL, PERIOD_CURRENT, "3_Level_ZZ_Semafor",4,current) > 1)
    {
    CloseOrder19();

    }
    }


    void CloseOrder19()
    {
    int orderstotal = OrdersTotal();
    int orders = 0;
    int ordticket[90][2];
    for (int i = 0; i < orderstotal; i++)
    {
    bool sel = OrderSelect(i, SELECT_BY_POS, MODE_TRADES);
    if (OrderType() != OP_SELL || OrderSymbol() != Symbol() || OrderMagicNumber() != 2)
    {
    continue;
    }
    ordticket[orders][0] = OrderOpenTime();
    ordticket[orders][1] = OrderTicket();
    orders++;
    }
    if (orders > 1)
    {
    ArrayResize(ordticket,orders);
    ArraySort(ordticket);
    }
    for (i = 0; i < orders; i++)
    {
    if (OrderSelect(ordticket[i][1], SELECT_BY_TICKET) == true)
    {
    bool ret = OrderClose(OrderTicket(), OrderLots(), OrderClosePrice(), 4, Red);
    if (ret == false)
    Print("OrderClose() error - ", ErrorDescription(GetLastError()));
    }
    }

    }






    int deinit()
    {
    if (true) ObjectsDeleteAll();


    return (0);
    }
    Foro de Forex Trading United

  11. #7




    Reputación:
    Poder de reputación: 6

    Colombia
    Mensajes: 6
    Créditos: 129

    Re: Atascado al crear un EA

    Cita Iniciado por donpeliculero Ver mensaje
    Acabo de darme cuenta de que, posiblemente, sea necesario ver el código del indicador. Por si acaso, dejo el archivo por aquí...
    Una recomendación... antes de compilar un código es buena idea traducir los comentarios del creador original, algunas veces tienen pistas sobre el funcionamiento del código y facilita cualquier modificación, adaptación o consulta
    Foro de Forex Trading United

  12. Gracias donpeliculero Gracias por este post
  13. #8




    Reputación:
    Poder de reputación: 7

    Bahamas
    Mensajes: 136
    Créditos: 768

    Re: Atascado al crear un EA

    Le propongo lo siguiente: plantee aquí un escenario, es decir una "hipotética" estrategia que utilice dos indicadores, Defina el plan de como seria las condiciones para entrada en largo y en corto, de acuerdo a lo que ha visto del indicador y la posible combinación con otro indicador y la desarrollamos en código.

    Saludos,
    Foro de Forex Trading United

  14. Gracias donpeliculero Gracias por este post
  15. #9




    Reputación:
    Poder de reputación: 6

    Espana
    Mensajes: 18
    Créditos: 684

    Re: Atascado al crear un EA

    Hola de nuevo, Zamir.

    Muchas gracias por su respuesta, que he leído con mucha atención. Y, sobre todo, gracias por explicarla y argumentarla de un modo tan didáctico. Se lo agradezco sinceramente.

    Ya había probado esa opción (buffer>0) pero no abría operaciones. Ahora entiendo por qué. Porque el criterio estaba fijado "en cada nueva barra". Lo hice así para que las pruebas, en el probador de estrategias, fueran más rápidas con la opción de "inicio de barra" en lugar de "en cada tick". Con eso ganaba en velocidad pero, como usted me explica, el cálculo se salta muchas operaciones. Por eso no las abría.

    Probaré implementando los dos cambios que usted me sugiere: buffer>0 y cálculo en cada tick. En cuanto tenga el resultado lo comentaré por aquí.

    Gracias de nuevo por su tiempo y generosidad. Un saludo
    Foro de Forex Trading United

  16. #10




    Reputación:
    Poder de reputación: 6

    Espana
    Mensajes: 18
    Créditos: 684

    Re: Atascado al crear un EA


    Publi
    Hola Zamir.
    Muchas gracias por el tiempo que se ha tomado en buscar una solución para mi pregunta. He borrado el indicador, lo he vuelto a meter en la carpeta de la plataforma y, efectivamente ahora sí va. También he probado su código y funciona perfectamente abriendo y cerrando operaciones.

    Ahora me surge una duda que, tal vez, usted me pueda responder... En otros indicadores que he probado, los buffer aportan valores continuamente. En cambio, en este indicador, los buffer correspondientes al número 3 amarillo solo presentan un valor en el momento mismo en el que sale ese 3 amarillo. El resto del tiempo están en 0. Adjunto imagen ilustrativa.

    Mi pregunta está relacionada con un hipotético EA en el que ese indicador aparezca combinado con otros. Mientras los buffer presentan un valor 0.... el EA no lo tiene en cuenta?

    Supongamos, por ejemplo, que queremos combinar este indicador con otro que aporte un cruce de medias. Si el cruce de medias que buscamos se da cuando el buffer del 3 amarillo ya está en 0... la operación no se abriría? En mi opinión, en este caso, lo interesante sería mantener el valor del BufferUp hasta que aparezca el BufferDown y viceversa. De otro modo, no se podría abrir (o cerrar) una operación con condicionantes adicionales a la aparición del 3 amarillo.

    Supongo que estoy equivocado y que, efectivamente, esto tiene alguna explicación. Apelo, de nuevo a su paciencia y generosidad.

    Un saludo
    Foro de Forex Trading United
    Miniaturas adjuntadas Miniaturas adjuntadas Atascado al crear un EA-imagen.jpg  

Página 1 de 3 123 ÚltimoÚltimo
This website uses cookies
Utilizamos cookies propias y de terceros para elaborar información estadística y mostrarle publicidad personalizada a través del análisis de su navegación. Si continúa navegando acepta su uso. Más información y política de cookies.
     

 

Publi


Aviso Legal
Ley Orgánica 15/1999, de 13 de diciembre, de Protección de Datos de Carácter Personal