Errori, bug, domande - pagina 1141

 

Ciao a tutti!

Un tale problema.

Ho ottenuto con successo il valore degli indicatori Bands e MA.

Bands_handle=iBands(NULL,0,BP_var_s,0,BDev_var_s,PRICE_CLOSE);
CopyBuffer(Bands_handle,0,0,1,Base);
CopyBuffer(Bands_handle,1,0,1,Upper);
CopyBuffer(Bands_handle,2,0,1,Lower);
B_med_s=Base[0];
B_up_s=Upper[0];
B_low_s=Lower[0];

MA_handle=iMA(NULL,0,MA_var_b,0,MODE_SMA,PRICE_TYPICAL);
CopyBuffer(MA_handle,0,0,1,MAv);
M_av_s=MAv[0];

Poi stampa: B_up_s = 1,264249475876921 M_av_s = 1,2595

Poi provo ad eseguire un'operazione di matrice B_up_s-M_av_s e ottengo il risultato 0.00000000.

Qual è il miracolo?

 
Alvin1976:

Ciao a tutti!

Un tale problema.

Ho ottenuto con successo il valore degli indicatori Bands e MA.

Bands_handle=iBands(NULL,0,BP_var_s,0,BDev_var_s,PRICE_CLOSE);
   CopyBuffer(Bands_handle,0,0,1,Base);
   CopyBuffer(Bands_handle,1,0,1,Upper);
   CopyBuffer(Bands_handle,2,0,1,Lower);
   B_med_s=Base[0];
   B_up_s=Upper[0];
   B_low_s=Lower[0];
   
   MA_handle=iMA(NULL,0,MA_var_b,0,MODE_SMA,PRICE_TYPICAL);
   CopyBuffer(MA_handle,0,0,1,MAv);
   M_av_s=MAv[0];  

Poi stampa: B_up_s = 1,264249475876921 M_av_s = 1,2595

Poi provo ad eseguire un'operazione di accoppiamento B_up_s-M_av_s e ottengo 0,00000000 come risultato.

Cosa c'è di strano?

1) Come inserire il codice.

2) In quale tipo di variabile memorizzate il risultato dell'operazione? O meglio ancora, datemi la parte di codice dove viene prodotto l'output.

 
MigVRN:

1) Come si inserisce il codice.

2) In che tipo di variabile memorizzate il risultato dell'operazione? Meglio ancora, date la parte di codice dove viene prodotto l'output.

Tutte le variabili sono di tipo doppio.

Non capisco perché Bands ha molte cifre mentre MA ha solo 4 cifre decimali. Non dovrebbe esserci affatto un risultato zero. Ecco perché l'algoritmo non funziona.

Tutto era così semplice in MQL4. Ora avete bisogno di una maggiore velocità di ottimizzazione e di un controllo multivaluta. Devo trasferire tutto a MQL5 (al diavolo)).

 double q=B_up_s-M_av_s;
 Print( B_up_s-M_av_s=", DoubleToString(q));
 
Alvin1976:

Tutte le variabili sono di tipo doppio.

Non è chiaro perché Bands ha molte cifre e MA solo 4 cifre decimali. E il risultato zero non dovrebbe esserci affatto. Questo è il motivo per cui l'algoritmo non funziona.

Tutto era così semplice in MQL4. Ora avete bisogno di una maggiore velocità di ottimizzazione e di un controllo multivaluta. Devo trasferire tutto a MQL5 (al diavolo)).

Dovrebbe funzionare. Qui sotto c'è uno script basato sul tuo codice e il suo risultato:

void OnStart()
  {
  
  double Base[1];
  double Upper[1];
  double Lower[1];  
  
  int BP_var_s = 20;
  int BDev_var_s = 30;
  int MA_var_b = 10;
  
  double M_av_s = 0;
  double MAv[1];
  
  double B_med_s, B_up_s, B_low_s;
  
  
   //---Далее Ваш код
   int Bands_handle=iBands(NULL,0,BP_var_s,0,BDev_var_s,PRICE_CLOSE);
   CopyBuffer(Bands_handle,0,0,1,Base);
   CopyBuffer(Bands_handle,1,0,1,Upper);
   CopyBuffer(Bands_handle,2,0,1,Lower);
   
   B_med_s=Base[0];
   B_up_s=Upper[0];
   B_low_s=Lower[0];
   
   int MA_handle=iMA(NULL,0,MA_var_b,0,MODE_SMA,PRICE_TYPICAL);
   
   CopyBuffer(MA_handle,0,0,1,MAv);
   M_av_s=MAv[0]; 
   
    double q = B_up_s - M_av_s;
    
    Print("B_up_s-M_av_s=", DoubleToString(q));
   
  }

 
Alvin1976:

Tutte le variabili sono di tipo doppio.

Non è chiaro perché Bands ha molte cifre e MA solo 4 cifre decimali. Il risultato di zero non dovrebbe esserci affatto. Ecco perché l'algoritmo non funziona.

Tutto era così semplice in MQL4. Ora avete bisogno di una maggiore velocità di ottimizzazione e di un controllo multivaluta. Ora devo trasferire tutto a MQL5 (al diavolo)).

Prima dell'operazione di "sottrazione" , stampa i valori delle variabili per vedere cosa c'è nei buffer:
Print("B_up_s= ",B_up_s,"; M_av_s=",M_av_s);
double q=B_up_s-M_av_s;
 
MigVRN:

Dovrebbe funzionare. Qui sotto c'è lo script secondo il tuo codice e il suo risultato:

Sì, lo script funziona.

Anche l'EA con questo esempio funziona.

Il mio EA, d'altra parte, sta dando zero ostinatamente. Cerchiamo un errore ......

 

Ciao a tutti!

Domanda, come fare un valore variabile da aggiornare su ogni tick di un minuto, e poi questa somma viene scritta in un valore separato, quando il minuto successivo si chiude, il valore della somma viene sostituito da quello nuovo?

int t = TimeSeconds();

mentre (t !=0)

double b - la variabile, che viene aggiornata per ogni minuto su ogni tick.

double b1 - valore della variabile b nel tick precedente.

doppio s - importo su tutti i tick entro un minuto.

double s1 - importo su tutti i tick nel minuto precedente.

b1=b;

s=b1+b;

se (t=0) s1=s;

Come fare il riepilogo dei dati su ogni tick e come scrivere tutto correttamente in generale?

 
Alvin1976:

Sì, lo script funziona.

Anche l'EA con questo esempio funziona.

Ma il mio Expert Advisor dà zero. Cerchiamo l'errore ......

Ecco cosa è stato rilevato.

Se si esegue solo l'EA, funziona bene ma nello Strategy Tester produce degli zeri all'inizio. Ma nella riga successiva gli zeri diventano magicamente un normale indicatore di dati. Non capisco cosa sta succedendo.....

Qui sotto c'è il codice.

Questo è ciò che riporta il tester.

CJ 0 19:40:47.022 Core 1 EURUSD,M15 (Alpari-Ltd-Demo): OHLC bar states generating. Esecuzione OnTick solo all'inizio della barra
IJ 0 19:40:47.022 Core 1 EURUSD,M15: test di esperti\tmp.ex5 da 2004.01.07 00:00 a 2004.02.02 00:00 iniziato
LK 0 19:40:47.022 Core 1 2004.01.07 00:00:00 B_up_s=0.0 M_av_s=0.0
IM 0 19:40:47.022 Core 1 2004.01.07 00:00:00 sbl_top=true B_up_s=0.0 M_av_s=0.0 B_up_s-M_av_s=0.00000000
OQ 0 19:40:47.022 Core 1 2004.01.07 00:15:00 B_up_s=1.279208140152992 M_av_s=1.2718
OI 0 19:40:47.022 Core 1 2004.01.07 00:15:00 sel=true B_up_s=1.279208140152992 M_av_s=1.2718 B_up_s-M_av_s=0.00740814
CJ 0 19:40:47.022 Core 1 2004.01.07 00:30:00 B_up_s=1.279239651523307 M_av_s=1.2721
LN 0 19:40:47.022 Core 1 2004.01.07 00:45:00 B_up_s=1.279382808470771 M_av_s=1.2714
DS 0 19:40:47.022 Core 1 2004.01.07 01:00:00 B_up_s=1.279407737043184 M_av_s=1.2719
OD 0 19:40:47.022 Core 1 2004.01.07 01:15:00 B_up_s=1.279398917431485 M_av_s=1.2727
NI 0 19:40:47.022 Core 1 2004.01.07 01:30:00 B_up_s=1.279380702214008 M_av_s=1.2731
IM 0 19:40:47.022 Core 1 2004.01.07 01:45:00 B_up_s=1.279440208228416 M_av_s=1.2723
LE 0 19:40:47.022 Core 1 2004.01.07 02:00:00 B_up_s=1.279473515350084 M_av_s=1.272
DK 0 19:40:47.022 Core 1 2004.01.07 02:15:00 B_up_s=1.279515146590278 M_av_s=1.2715
FL 0 19:40:47.022 Core 1 2004.01.07 02:30:00 B_up_s=1.279601656250741 M_av_s=1.2709
IQ 0 19:40:47.022 Core 1 2004.01.07 02:45:00 B_up_s=1.279656914787522 M_av_s=1.2709
CE 0 19:40:47.022 Core 1 2004.01.07 03:00:00 B_up_s=1.279579626541548 M_av_s=1.2707

//#property link      "http://www.mql5.com"
//#property version   "1.00"

//+------------------------------------------------------------------+

 double
   BDev_var_b=2,       
   BDev_var_s=2,       
   B_up_s=0, 
   B_low_s=0,
   B_med_s=0,
   M_av_s=0, 
   Base[1],
   Upper[1],
   Lower[1],
   MAv[1],   
   Dist_c=0.0015,
   Dist_d=0.002;
   
  bool 
    selord=false,  
    baiord=false,
    New_Bar=false, 
    sbl_top=false,    
    sbl_bot=false, 
    bai=false,  
    sel=false;
   
   int
    Bands_handle,    
    MA_handle,   
    MA_var_s=1,   
    BP_var_s=50;  

    
//=============================================================================================================
int OnInit()
  {

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


   Bands_handle=iBands(NULL,0,BP_var_s,0,BDev_var_s,PRICE_CLOSE);
   CopyBuffer(Bands_handle,0,0,1,Base);
   CopyBuffer(Bands_handle,1,0,1,Upper);
   CopyBuffer(Bands_handle,2,0,1,Lower);
   B_med_s=Base[0];
   B_up_s=Upper[0];
   B_low_s=Lower[0];
   
   MA_handle=iMA(NULL,0,MA_var_s,0,MODE_SMA,PRICE_TYPICAL);
   CopyBuffer(MA_handle,0,0,1,MAv);
   M_av_s=MAv[0];
   
   
  Print(" B_up_s=",B_up_s, "   M_av_s=", M_av_s);  

   
   // установка флагов
  if (sbl_top==false && (B_up_s-M_av_s)<Dist_c) 
     {
       sbl_top=true;
       Print("sbl_top=true   ","  B_up_s=",B_up_s, "  M_av_s=", M_av_s, "  B_up_s-M_av_s=", DoubleToString(B_up_s-M_av_s));
     }
  if (sbl_top==true && (B_up_s-M_av_s)>Dist_d)
       {
       sbl_top=false;
       Print("sel=true  ","  B_up_s=",B_up_s, "  M_av_s=", M_av_s, "  B_up_s-M_av_s=", DoubleToString(B_up_s-M_av_s));
       }
    


    return;                                   
   }


 
Alvin1976:

Ecco cosa è stato scoperto.

1) Non creare indicatori su ogni tick!

2) Controllare se l'indicatore è stato creato o meno, prima di accedere ai suoi valori.

3) Controllare se i valori richiesti sono stati copiati dall'indicatore.

4) Cancellate sempre la parte di calcolo dell'indicatore dopo il completamento dell'esperto, altrimenti potrebbe a un certo punto esaurire la RAM.

Il problema era perché hai cercato di copiare i valori dall'indicatore che non è stato ancora creato. Diventa una regola: controlla il risultato delle funzioni che chiami.

File:
 

Per favore, consigliatemi dove si trova l'errore.

Ekpert è in esecuzione su demo, 3 coppie. Ecco il registro:

PUSD,M15)       AUDUSD Request executed: delete buy Ticket: #729600  Price = 0.94794 Lots = 0.1 StopLoss = 0 TakeProfit = 0 Comment = BuyTP(4)
LH      0       08:45:05.881    Serendipity5.0 (GBPUSD,M15)     AUDUSD Request executed: delete buy Ticket: #729598  Price = 0.94514 Lots = 0.42 StopLoss = 0 TakeProfit = 0 Comment = BuyTP(4)
KM      0       08:45:06.053    Serendipity5.0 (GBPUSD,M15)     Error: AUDUSD Action: delete buy : Requested Volume: 0.42, Requested StopLoss:0, Requested TakeProfit:0, Requested Price:0.94514 Error:10013
OE      0       08:45:06.053    Serendipity5.0 (GBPUSD,M15)     Sleep() for 1 second, retry
LO      0       08:45:07.145    Serendipity5.0 (GBPUSD,M15)     DeletePendings(): AUDUSD Error deleting pending order: Error Code: 4756
CQ      0       08:45:07.145    Serendipity5.0 (GBPUSD,M15)     SendOrder(); OrderCheck() Error = 10013 Sleep() for 1 second, retry
GP      0       08:45:08.237    Serendipity5.0 (GBPUSD,M15)     DeletePendings(): AUDUSD Error deleting pending order: Error Code: 4756
PL      0       08:45:08.237    Serendipity5.0 (GBPUSD,M15)     SendOrder(); OrderCheck() Error = 10013 Sleep() for 1 second, retry

Ecco il codice.

bool SendTradeRequest(string symb,ENUM_ORDER_TYPE type,ENUM_TRADE_REQUEST_ACTIONS tradeAction,double price, 
   double lot,double stopLoss,double takeProfit,long const magic, string comment,ulong ticket){
//--- prepare a request
   MqlTradeRequest request={0};
   //ZeroMemory(request);
   
   request.action=tradeAction;        
   request.magic=magic;              
   request.symbol=symb;                 
   request.volume=lot;                         
   request.sl=stopLoss;                             
   request.tp=takeProfit;                                 
   request.type=type;              
   request.price=price;
   request.comment=comment;
   if(tradeAction==TRADE_ACTION_MODIFY || tradeAction==TRADE_ACTION_REMOVE)request.order=ticket;
      
//--- send a trade request
   MqlTradeResult result={0};
   MqlTradeCheckResult checkresult={0};
   //ZeroMemory(result);
   //ZeroMemory(checkresult);
   bool isSuccessful;
   isSuccessful=OrderCheck(request,checkresult);
   if(checkresult.retcode!=0 && checkresult.retcode!=10009 && checkresult.retcode!=10008){
      Print("SendOrder(); OrderCheck() Error = ",checkresult.retcode, " Sleep() for 1 second, retry"); 
      Sleep(1000); return(0);                                      
      }       
      
   isSuccessful=OrderSend(request,result);        
   if( (result.retcode == 10009 || result.retcode == 10008 || result.retcode == 0) ){
      //--- write the server reply to log  
      //Print(__FUNCTION__,":",result.comment);
      Print(symb," "+result.comment+": "+ConvertTradeActionToString(request.action)+" ",(string)ConvertOrderTypeToString(request.type)," Ticket: #",(string)result.order," Price = ",(string)request.price," Lots = ",(string)request.volume,
         " stopLoss = ",(string)request.sl," takeProfit = ",(string)request.tp," Comment = ",(string)request.comment);
      
      if(tradeAction==TRADE_ACTION_PENDING)   
         arrow_cntr=CreateSignalArrow("Open "+(string)ConvertOrderTypeToString(request.type)+" "+request.comment+" Ticket "+(string)result.order+
            " Lots "+DoubleToString(request.volume,2)+" Time "+TimeToString(TimeCurrent(),TIME_MINUTES),arrow_cntr,request.price,216,clrDarkViolet,symb);
      
      if(tradeAction==TRADE_ACTION_MODIFY)   
         arrow_cntr=CreateSignalArrow("OrderModify "+request.comment+" Ticket "+(string)request.order+" Lots "+DoubleToString(request.volume,2)+
            " Time "+TimeToString(TimeCurrent(),TIME_MINUTES),arrow_cntr,request.price,251,clrSilver,symb); 
      
      if(tradeAction==TRADE_ACTION_REMOVE)
         arrow_cntr=CreateSignalArrow("OrderDelete "+request.comment+" Ticket "+(string)request.order+" Lots "+DoubleToString(request.volume,2)+
            " Time "+TimeToString(TimeCurrent(),TIME_MINUTES),arrow_cntr,Close(1,symb),158,Red,symb);      
      
      CheckErrorMessage("SendTradeRequest():");
      return(1);  
      }  

Expert cerca di eseguire OrderDelete(), dà errore, SendTradeRequest() è in while loop, ekspert di conseguenza loops. Forse il prezzo è cambiato quando ho inviato l'ordine? Ho bisogno di RefreshRates() e come gestirlo correttamente? Ho cercato nel forum ma non ho trovato nessun esempio...

Grazie a tutti in anticipo

Motivazione: