Errores, fallos, preguntas - página 1141

 

Hola a todos.

Es un problema.

Consigo con éxito el valor de los indicadores Bands y MA.

Bands_handle=iBands(NULL,0,BP_var_s,0,BDev_var_s,PRICE_CLOSE);
CopyBuffer(Bandas_manejo,0,0,1,Base);
CopyBuffer(Bandas_manejo,1,0,1,Superior);
CopyBuffer(Bandas_manejo,2,0,1,Inferior);
B_med_s=Base[0];
B_up_s=Superior[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];

Entonces imprime: B_up_s = 1.264249475876921 M_av_s = 1.2595

Luego intento realizar una operación matricial B_up_s-M_av_s y obtengo el resultado 0,00000000.

¿Cuál es el milagro?

 
Alvin1976:

Hola a todos.

Es un problema.

Consigo con éxito el valor de los indicadores Bands y 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];  

Entonces imprime: B_up_s = 1.264249475876921 M_av_s = 1.2595

Luego intento realizar una operación de pareja B_up_s-M_av_s y obtengo como resultado 0,00000000.

¿Qué tiene de extraño?

1) Cómo insertar el código.

2) ¿En qué tipo de variable almacena el resultado de la operación? O mejor aún, por favor, dame la parte del código donde se produce la salida.

 
MigVRN:

1) ¿Cómo se inserta el código?

2) ¿En qué tipo de variable almacena el resultado de la operación? Mejor aún, indique la parte del código donde se produce la salida.

Todas las variables son de tipo double.

No entiendo por qué Bands tiene muchos dígitos mientras que MA sólo tiene 4 decimales. No debería haber ningún resultado cero. Por eso el algoritmo no funciona.

Todo era tan sencillo en MQL4. Ahora se necesita una mayor velocidad de optimización y una comprobación multidivisa. Tengo que transferir todo a MQL5 (al diablo)).

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

Todas las variables son de tipo double.

No está claro por qué Bands tiene muchos dígitos y MA sólo 4 decimales. Y el resultado cero no debería estar ahí en absoluto. Esta es la razón por la que el algoritmo no funciona.

Todo era tan sencillo en MQL4. Ahora se necesita una mayor velocidad de optimización y una comprobación multidivisa. Ahora tengo que transferir todo a MQL5 (al diablo)).

Debería funcionar. A continuación se muestra un script basado en su código y su resultado:

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:

Todas las variables son de tipo double.

No está claro por qué Bands tiene muchos dígitos y MA sólo 4 decimales. El resultado de cero no debería estar ahí en absoluto. Por eso el algoritmo no funciona.

Todo era tan sencillo en MQL4. Ahora se necesita una mayor velocidad de optimización y una comprobación multidivisa. Tengo que transferir todo a MQL5 (al diablo)).

Antes de la operación de "sustracción" , imprime los valores de las variables para ver qué hay en los buffers:
Print("B_up_s= ",B_up_s,"; M_av_s=",M_av_s);
double q=B_up_s-M_av_s;
 
MigVRN:

Debería funcionar. A continuación se muestra el script según su código y su resultado:

Sí, el guión funciona.

Incluso el EA con este ejemplo funciona.

Mi EA, en cambio, está dando cero porfiadamente. Busquemos un error ......

 

Hola a todos.

Pregunta, ¿cómo hacer que se actualice el valor de una variable en cada tick de un minuto, y que luego esta suma se escriba en un valor separado, cuando se cierre el siguiente minuto, el valor de la suma se sustituya por el nuevo?

int t = TiempoSegundos();

while (t !=0)

double b - la variable, que se actualiza por cada minuto en cada tick.

double b1 - valor de la variable b en el tick anterior.

doble s - cantidad en todos los ticks dentro de un minuto.

double s1 - cantidad en todos los ticks del minuto anterior.

b1=b;

s=b1+b;

si (t=0) s1=s;

¿Cómo hacer que los datos se resuman en cada tick y cómo escribirlo todo correctamente en general?

 
Alvin1976:

Sí, el script funciona.

Incluso el EA con este ejemplo funciona.

Pero mi Asesor Experto da cero. Busquemos el error ......

Esto es lo que se ha detectado.

Si sólo ejecutas el EA, funciona bien pero en el Probador de Estrategias produce ceros al principio. Pero en la siguiente línea los ceros se convierten mágicamente en un dato indicador normal. No entiendo lo que está pasando.....

A continuación se muestra el código.

Esto es lo que informa el probador.

CJ 0 19:40:47.022 Core 1 EURUSD,M15 (Alpari-Ltd-Demo): Generación de estados de barra OHLC. Ejecución de OnTick sólo en el inicio de la barra
IJ 0 19:40:47.022 Núcleo 1 EURUSD,M15: iniciada la prueba de experts\tmp.ex5 desde 2004.01.07 00:00 hasta 2004.02.02 00:00
LK 0 19:40:47.022 Núcleo 1 2004.01.07 00:00:00 B_up_s=0.0 M_av_s=0.0
IM 0 19:40:47.022 Núcleo 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 Núcleo 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 Núcleo 1 2004.01.07 00:30:00 B_up_s=1.279239651523307 M_av_s=1.2721
LN 0 19:40:47.022 Núcleo 1 2004.01.07 00:45:00 B_up_s=1.279382808470771 M_av_s=1.2714
DS 0 19:40:47.022 Núcleo 1 2004.01.07 01:00:00 B_up_s=1.279407737043184 M_av_s=1.2719
OD 0 19:40:47.022 Núcleo 1 2004.01.07 01:15:00 B_up_s=1.279398917431485 M_av_s=1.2727
NI 0 19:40:47.022 Núcleo 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 Núcleo 1 2004.01.07 02:00:00 B_up_s=1.279473515350084 M_av_s=1.272
DK 0 19:40:47.022 Núcleo 1 2004.01.07 02:15:00 B_up_s=1.279515146590278 M_av_s=1.2715
FL 0 19:40:47.022 Núcleo 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 Núcleo 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:

Esto es lo que se ha descubierto.

1) ¡No cree indicadores en cada tic!

2) Comprobar si el indicador fue creado o no, antes de acceder a sus valores.

3) Comprobar si los valores solicitados se copian del indicador.

4) Elimine siempre la parte de cálculo del indicador después de la finalización del experto, de lo contrario puede que en algún momento se quede sin RAM.

El problema se debe a que has intentado copiar los valores del indicador que aún no ha sido creado. Haz una regla: comprueba el resultado de las funciones que llamas.

Archivos adjuntos:
 

Por favor, indique dónde está el error.

Ekpert está funcionando en demo, 3 pares. Aquí está el 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

Aquí está el código.

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);  
      }  

El experto intenta ejecutar OrderDelete(), da error, SendTradeRequest() está en el bucle while, ekspert en consecuencia bucles. ¿Quizá el precio ha cambiado cuando he enviado el pedido? ¿Necesito RefreshRates() y cómo tratarlo correctamente? He buscado en el foro pero no he encontrado ningún ejemplo...

Gracias a todos por adelantado

Razón de la queja: