Announcement

Collapse
No announcement yet.

EA non apre posizioni

Collapse
X
 
  • Filter
  • Time
  • Show
Clear All
new posts

    EA non apre posizioni

    Buongiorno,
    sono un neofita del linguaggio MQL4 e del trading.
    Non ho esperienza come programmatore, salvo esperienze minime.
    Sto studiando da diversi mesi su libri e webinar.
    Sono nuovo di questo forum quindi spero di scrivere questo post nel modo corretto.
    Ho scritto un expert che riporto sotto.
    MT4 non mi da errori in fase di compilazione, però se faccio "girare" l'EA (in backtest) , questo non apre posizioni.
    Potete darmi qualche suggerimento ?
    Per il momento l'EA è impostato solo per ordini Long, in un secondo momento sistemerò anche la parte per gli ordini Short.
    Allego copia del file per semplicità.
    Grazie.

    //+------------------------------------------------------------------+
    //| Expert initialization function |
    //+------------------------------------------------------------------+


    int OnInit()
    {
    //---

    //---
    return(INIT_SUCCEEDED);
    }
    //+------------------------------------------------------------------+
    //| Expert deinitialization function |
    //+------------------------------------------------------------------+
    void OnDeinit(const int reason)
    {
    //---

    }
    //+------------------------------------------------------------------+
    //| Expert tick function |
    //+------------------------------------------------------------------+


    void OnTick()
    {

    if(OrdersTotal() == 0){
    Apri_BUY ();
    Chiudi_BUY ();
    Comment ("prezzo chiusura ultima candela " , Prezzo_chiusura_BUY_recente, "\n SMA 10 Periodi: ", SMA10_corrente);

    }

    }

    //++++++++++++++++
    int Ticket=0;
    double media_veloce_vecchia = iMA(Symbol(),PERIOD_CURRENT ,10, 0,MODE_SMA, PRICE_CLOSE,2); //EMA 10 periodi su 2 candele fa;
    double media_veloce_nuova = iMA(Symbol(),PERIOD_CURRENT ,10, 0,MODE_SMA, PRICE_CLOSE,1); //EMA 10 periodi su 1 candele fa;
    double media_lenta_vecchia = iMA(Symbol(),PERIOD_CURRENT ,50, 0,MODE_SMA, PRICE_CLOSE,2); //EMA 50 periodi su 2 candele fa;
    double media_lenta_nuova = iMA(Symbol(),PERIOD_CURRENT ,50, 0,MODE_SMA, PRICE_CLOSE,1); //EMA 50 periodi su 1 candele fa;
    int val_index_recente=iClose (Symbol(),PERIOD_CURRENT,-1);
    int val_index_passato=iClose (Symbol(),PERIOD_CURRENT,-2);
    double Prezzo_chiusura_BUY_recente = Close [val_index_recente];
    double Prezzo_chiusura_BUY_passato = Close [val_index_recente];
    double SMA10_corrente = iMA(Symbol(),PERIOD_CURRENT ,10, 0,MODE_SMA, PRICE_CLOSE,0);

    //+++++++++++++++

    void Apri_BUY () {

    if ((media_veloce_vecchia < media_lenta_vecchia)&& (media_veloce_nuova > media_lenta_nuova))
    {
    OrderSelect(Ticket,SELECT_BY_TICKET, MODE_TRADES);
    if((OrderCloseTime() == 0) && (OrderType() == OP_SELL))
    {
    OrderClose(OrderTicket (),OrderLots(),Ask,1,clrMagenta);
    Ticket= OrderSend(Symbol(),OP_BUY, 1, Ask, 0, NULL, NULL, NULL, 123456,0, clrGreen);
    }
    else if (OrderCloseTime() != 0) {
    Ticket= OrderSend(Symbol(),OP_BUY, 1, Ask, 0, NULL, NULL, NULL, 123456,0, clrGreen);}

    }

    }

    void Chiudi_BUY () {
    if ((Prezzo_chiusura_BUY_recente < SMA10_corrente) &&
    (Prezzo_chiusura_BUY_passato >= SMA10_corrente)); { //se il prezzo incrocia la media veloce corrente
    OrderSelect(Ticket,SELECT_BY_TICKET, MODE_TRADES);
    if((OrderCloseTime() == 0) && (OrderType() == OP_BUY))
    {
    OrderClose(OrderTicket (),OrderLots(),Bid,1,clrBeige);
    }

    }
    }
    //+------------------------------------------------------------------+

    Attached Files

    #2
    Ciao Gino2000,
    così ad occhio ti dico che difficilmente puoi ottenere quel genere di incrocio medie nello "spazio di due candele".
    Nel dettaglio:
    PHP Code:
    if ((media_veloce_vecchia media_lenta_vecchia)&& (media_veloce_nuova media_lenta_nuova)) 
    In questa riga hai definito un doppio incrocio.

    Comment


      #3
      senapazio Grazie mille per la tua rapida risposta, ho provato anche ad aumentare i periodi di riferimento delle medie mobili ma il risultato non cambia ...

      Comment


        #4
        ciao Gino, ci sono molti tutorial gratuiti su Internet, anche in italiano, prova a vedere ad esempio questo qui, in cui spiega l'incrocio dell medie: https://www.youtube.com/watch?v=iNFF2wn_kgc

        La vita non è un giro di prova, cogli l’attimo..
        Realizzazione per Metatrader4 di trading system, indicatori, pattern grafici, Ottimizzazioni IS-OOS su Forex e CFD, Analisi di Portafoglio .

        Comment


          #5
          Originally posted by Gino2000 View Post
          senapazio Grazie mille per la tua rapida risposta, ho provato anche ad aumentare i periodi di riferimento delle medie mobili ma il risultato non cambia ...
          scusami, ho forse scritto una sciocchezza. E' più probabile che l'errore stia in questi if

          PHP Code:
          {
          OrderSelect(Ticket,SELECT_BY_TICKETMODE_TRADES);
          if((
          OrderCloseTime() == 0) && (OrderType() == OP_SELL))
          {
              
          OrderClose(OrderTicket (),OrderLots(),Ask,1,clrMagenta);
              
          TicketOrderSend(Symbol(),OP_BUY1Ask0NULLNULLNULL123456,0clrGreen);
          }
          else if (
          OrderCloseTime() != 0)
          {
              
          TicketOrderSend(Symbol(),OP_BUY1Ask0NULLNULLNULL123456,0clrGreen);
          }


          non ho mai considerato di usare la OrderCloseTime() in questi contesti, prova a toglierla dalla seconda condizione

          PHP Code:
          {
          OrderSelect(Ticket,SELECT_BY_TICKETMODE_TRADES);
          if((
          OrderCloseTime() == 0) && (OrderType() == OP_SELL))
          {
              
          OrderClose(OrderTicket (),OrderLots(),Ask,1,clrMagenta);
              
          TicketOrderSend(Symbol(),OP_BUY1Ask0NULLNULLNULL123456,0clrGreen);
          }
          else
          {
              
          TicketOrderSend(Symbol(),OP_BUY1Ask0NULLNULLNULL123456,0clrGreen);
          }


          Last edited by senapazio; 06-12-2020, 12:10.

          Comment


            #6
            Originally posted by umbertosm View Post
            ciao Gino, ci sono molti tutorial gratuiti su Internet, anche in italiano, prova a vedere ad esempio questo qui, in cui spiega l'incrocio dell medie: https://www.youtube.com/watch?v=iNFF2wn_kgc
            Grazie per la tua risposta, proprio quel video ho preso come spunto e prevede 2 condizioni nel codice if.

            Comment


              #7
              Originally posted by senapazio View Post

              dovresti mettere una sola condizione per definire un incrocio in maniera corretta

              tipo
              PHP Code:
              if (media_veloce_vecchia media_lenta_vecchia
              sarebbe piu' corretto utilizzare un IF per ciascuna condizione, giusto ?
              Grazie.

              Comment


                #8
                Originally posted by senapazio View Post

                scusami, ho forse scritto una sciocchezza. E' più probabile che l'errore stia in questi if

                PHP Code:
                {
                OrderSelect(Ticket,SELECT_BY_TICKETMODE_TRADES);
                if((
                OrderCloseTime() == 0) && (OrderType() == OP_SELL))
                {
                OrderClose(OrderTicket (),OrderLots(),Ask,1,clrMagenta);
                TicketOrderSend(Symbol(),OP_BUY1Ask0NULLNULLNULL123456,0clrGreen);
                }
                else if (
                OrderCloseTime() != 0)
                {
                TicketOrderSend(Symbol(),OP_BUY1Ask0NULLNULLNULL123456,0clrGreen);
                }


                non ho mai considerato di usare la OrderCloseTime() in questi contesti, prova a toglierla dalla seconda condizione

                PHP Code:
                {
                OrderSelect(Ticket,SELECT_BY_TICKETMODE_TRADES);
                if((
                OrderCloseTime() == 0) && (OrderType() == OP_SELL))
                {
                OrderClose(OrderTicket (),OrderLots(),Ask,1,clrMagenta);
                TicketOrderSend(Symbol(),OP_BUY1Ask0NULLNULLNULL123456,0clrGreen);
                }
                else
                {
                TicketOrderSend(Symbol(),OP_BUY1Ask0NULLNULLNULL123456,0clrGreen);
                }


                Grazie per la tua risposta, purtroppo non funziona...

                Comment


                  #9
                  Originally posted by Gino2000 View Post

                  Grazie per la tua risposta, proprio quel video ho preso come spunto e prevede 2 condizioni nel codice if.
                  Comunque il tizio alla fine del video non prova la strategia, quindi non verifica se tutto funziona. In più nei commenti youtube si legge che chi ha provato riceve errori nel provare il codice che descrive lui.

                  Comment


                    #10
                    Originally posted by senapazio View Post

                    Comunque il tizio alla fine del video non prova la strategia, quindi non verifica se tutto funziona. In più nei commenti youtube si legge che chi ha provato riceve errori nel provare il codice che descrive lui.
                    Se intendi la strategia descritta in questo video https://www.youtube.com/watch?v=iNFF2wn_kgc , il codice è scaricabile e a me funziona senza problemi. In ogni caso io sono neofita e sicuramente qualcosa mi sfugge. In ogni caso grazie per il tuo supporto.

                    Comment

                    Working...
                    X