Primo EA, problema che non capisco

 

Salve a tutti,

sto iniziando ora con il trading automatico e mi sto documentando da mesi con libri, articoli, video ecc. 

Quando ho raggiunto un pò di confidenza con il codice ho provato a scrivere il mio primo EA. Tuttavia, non riesco a farlo funzionare. Il problema è che non mi emette gli ordini, quando faccio il back test non mi escono le freccette rosse e verdi per capirci e se lo metto su grafico live mi esce la finestra di avviso che non è stato possibile emettere l'ordine.

Ho modificato e rivisto il codice tante volte ma non riesco a venirne a capo. 

Vi allelo il codice, qualcuno potrebbe almeno indirizzarmi su dove sta il problema?

Grazie!

bool SetupBUY = false;
bool FullConditionBUY = false
double PriceBreak 
datetime TimeBarMinRel;          
datetime TimeBarCurrent;  
int NumBars;                     
   
   ZeroMemory(TimeBarMinRel);
   ZeroMemory(PriceBreak);


   if(mrate[4].low>maVal[4] &&   
   mrate[3].low>maVal[3] &&   
   mrate[2].low>maVal[2] &&
   mrate[1].low>maVal[1])
     {
      if(mrate[4].low<mrate[3].low &&   
          mrate[3].low<mrate[2].low &&
          mrate[2].low>mrate[1].low)
          {
           SetupBUY = true;   
           PriceBreak=mrate[1].high;
          TimeBarMinRel = iTime(_Symbol,_Period,1);  
         }
      }
        
   if(SetupBUY = true)   
      {
       TimeBarCurrent = iTime(_Symbol,_Period,0);
      NumBars=Bars(_Symbol,_Period,TimeBarMinRel,TimeBarCurrent);   
      if(NumBars<=MaxBars &&
         SymbolInfoTick(_Symbol,latest_price)>PriceBreak)
          {
           FullConditionBUY = true; 
           SetupBUY = false;   
          }
      
       if(NumBars>MaxBars)   
          { 
           SetupBUY = false;   
          }
      }
      
  
   if(FullConditionBUY = true
     {
      if(Buy_opened) 
        {
         Alert("C'è già una posizione BUY aperta!!!"); 
         return;    
        }
         
         mrequest.action = TRADE_ACTION_DEAL;                                           
         mrequest.price = NormalizeDouble(latest_price.ask,_Digits);
         mrequest.sl = NormalizeDouble(latest_price.ask - SL*_Point,_Digits);           
         mrequest.tp = NormalizeDouble(latest_price.ask + TakeProfit*_Point,_Digits);
         mrequest.symbol = _Symbol;                                                     
         mrequest.volume = Lot;
         mrequest.magic = EA_Magic;
         mrequest.type = ORDER_TYPE_BUY;
         mrequest.type_filling = ORDER_FILLING_FOK;
         mrequest.deviation=100; 
         
         if(!OrderSend(mrequest,mresult))
            PrintFormat("OrderSend error %d",GetLastError());       
            PrintFormat("retcode=%u  deal=%I64u  order=%I64u",mresult.retcode,mresult.deal,mresult.order);
            FullConditionBUY = false;
     }
}
 
IoMarenero:

Salve a tutti,

sto iniziando ora con il trading automatico e mi sto documentando da mesi con libri, articoli, video ecc. 

Quando ho raggiunto un pò di confidenza con il codice ho provato a scrivere il mio primo EA. Tuttavia, non riesco a farlo funzionare. Il problema è che non mi emette gli ordini, quando faccio il back test non mi escono le freccette rosse e verdi per capirci e se lo metto su grafico live mi esce la finestra di avviso che non è stato possibile emettere l'ordine.

Ho modificato e rivisto il codice tante volte ma non riesco a venirne a capo. 

Vi allelo il codice, qualcuno potrebbe almeno indirizzarmi su dove sta il problema?

Grazie!

Guarda prima che tipo di errore viene riportato. 
 
Michele Catanzaro #:
Guarda prima che tipo di errore viene riportato. 

Nessun errore, semplicemente non emette gli ordini buy o sell. 

Non capisco il perchè.

 
Jack Cool #:

Nessun errore, semplicemente non emette gli ordini buy o sell. 

Non capisco il perchè.

Le if hanno bisogno dell"operatore di confronto == e non del singolo =. 
 
IoMarenero:

Salve a tutti,

sto iniziando ora con il trading automatico e mi sto documentando da mesi con libri, articoli, video ecc. 

Quando ho raggiunto un pò di confidenza con il codice ho provato a scrivere il mio primo EA. Tuttavia, non riesco a farlo funzionare. Il problema è che non mi emette gli ordini, quando faccio il back test non mi escono le freccette rosse e verdi per capirci e se lo metto su grafico live mi esce la finestra di avviso che non è stato possibile emettere l'ordine.

Ho modificato e rivisto il codice tante volte ma non riesco a venirne a capo. 

Vi allelo il codice, qualcuno potrebbe almeno indirizzarmi su dove sta il problema?

Grazie!

C'e' almeno un errore che il compilatore sicuramente ti segnala ma probabilmente non l'hai notato. Se non compila (a causa dell'errore) allora non produce un eseguibile e quindi non può testare niente.

Dovresti sostituire le linee nello screenshot


con 

if(FullConditionBUY == true )
     {
       if (Buy_opened)
...
 

Ciao a tutti,

sto provando a cimentarmi nella creazione di un algoritmo, ma seppur non ho errori di compilazione, una fvolta che faccio partire il backtesting ho il seguente errore:

2023.02.05 10:38:01.985 2023.01.05 16:07:19   failed exchange sell 1K  at market sl: -0 tp: 0 [Invalid request]

Potreste aiutarmi a capire dove sbaglio?

Di seguito il codice che ho costruito:

//+------------------------------------------------------------------+
//|                                                        test4.mq5 |
//|                                           Copyright 2023, Bobone |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2023, Bobone"
#property link      "https://www.mql5.com"
#property version   "1.00"
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+

#include <Trade/Trade.mqh>

int Ask;
int Bid;

int OnInit()
  {
//---
   
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---
   
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
 {
    // Calcolare le medie mobili
    double ma14_1h = iMA(NULL, PERIOD_H1, 14, 0, MODE_SMA, PRICE_CLOSE);
    double ma28_1h = iMA(NULL, PERIOD_H1, 28, 0, MODE_SMA, PRICE_CLOSE);
    double ma56_1h = iMA(NULL, PERIOD_H1, 56, 0, MODE_SMA, PRICE_CLOSE);

    double ma14_1d = iMA(NULL, PERIOD_D1, 14, 0, MODE_SMA, PRICE_CLOSE);
    double ma28_1d = iMA(NULL, PERIOD_D1, 28, 0, MODE_SMA, PRICE_CLOSE);
    double ma56_1d = iMA(NULL, PERIOD_D1, 56, 0, MODE_SMA, PRICE_CLOSE);

    // Verificare se c'è un ordine aperto
    if (OrdersTotal() == 0)
    {
        // Condizione per aprire un ordine d'acquisto
        if (ma14_1h > ma28_1h && ma28_1h > ma56_1h && ma14_1d > ma28_1d && ma28_1d > ma56_1d)
        {
            if (Ask >= ma56_1h || Ask >= ma56_1d)
            {
                // Variabili per l'ordine d'acquisto
                double deposit = AccountInfoDouble(ACCOUNT_BALANCE) + AccountInfoDouble(ACCOUNT_PROFIT);
                double investment = NormalizeDouble(deposit * 0.1, 2);;
                double takeProfit = 30;
                double stopLoss = 40;
                // Creare un ordine d'acquisto
                MqlTradeRequest request;
                request.type = ORDER_TYPE_BUY;
                request.price = Ask;
                request.sl = Ask - stopLoss * Point();
                request.tp = Ask + takeProfit * Point();
                request.volume = investment;

                MqlTradeResult result;
                if (OrderSend(request, result))
                {
                    int ticket = (int)result.order;
                    Print("Ordine d'acquisto aperto con successo. Ticket: ", ticket);
                }
            }
        }
        
        // Condizione per aprire un ordine di vendita
        if (ma14_1h < ma28_1h && ma28_1h < ma56_1h && ma14_1d < ma28_1d && ma28_1d < ma56_1d)
        {
if (Bid <= ma56_1h || Bid <= ma56_1d)
{
// Variabili per l'ordine di vendita
double deposit = AccountInfoDouble(ACCOUNT_BALANCE) + AccountInfoDouble(ACCOUNT_PROFIT);
double investment = NormalizeDouble(deposit * 0.1, 2);
double takeProfit = 30;
double stopLoss = 40;
            
            // Creare un ordine di vendita
            MqlTradeRequest request;
            request.type = ORDER_TYPE_SELL;
            request.price = Bid;
            request.sl = Bid - stopLoss * Point();
            request.tp = Bid + takeProfit * Point();
            request.volume = investment;

            MqlTradeResult result;
            if (OrderSend(request, result))
            {
                int ticket = (int)result.order;
                Print("Ordine di vendita aperto con successo. Ticket: ", ticket);
            }
        }
    }
}
}




Discover new MetaTrader 5 opportunities with MQL5 community and services
Discover new MetaTrader 5 opportunities with MQL5 community and services
  • 2023.02.05
  • www.mql5.com
MQL5: language of trade strategies built-in the MetaTrader 5 Trading Platform, allows writing your own trading robots, technical indicators, scripts and libraries of functions
 
Arturo Errico #:

Ciao a tutti,

sto provando a cimentarmi nella creazione di un algoritmo, ma seppur non ho errori di compilazione, una fvolta che faccio partire il backtesting ho il seguente errore:

2023.02.05 10:38:01.985 2023.01.05 16:07:19   failed exchange sell 1K  at market sl: -0 tp: 0 [Invalid request]

Potreste aiutarmi a capire dove sbaglio?

Di seguito il codice che ho costruito:

Ciao Arturo, Ask e Bid sono valori double e non int, in nessun punto del codice fai richiesta di quei valori e il take profit e lo stop loss vanno indicati come parte del prezzo ovvero 30 pip sono 0,0030 o 0,30 in caso di tre cifre decimali come per USDJPY. Anche l'approccio con cui vuoi ricavare i dati della media mobile sono sbagliati. Stai attento a non confondere gli ordini con le posizioni, sono due cose differenti.