Erros, bugs, perguntas - página 1141

 

Olá a todos!

Um tal problema.

Consigo o valor das Bandas e dos indicadores de MA com sucesso.

Bandas_handle=iBand(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=Cima[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];

Depois imprimir: B_up_s = 1.264249475876921 M_av_s = 1.2595

Depois tento realizar uma operação matricial B_up_s-M_av_s e obter o resultado 0,00000000.

O que é o milagre?

 
Alvin1976:

Olá a todos!

Um tal problema.

Consigo o valor das Bandas e dos indicadores de MA com sucesso.

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];  

Depois imprimir: B_up_s = 1.264249475876921 M_av_s = 1.2595

Depois tento realizar uma operação B_up_s-M_av_s mate e obter 0,00000000 como resultado.

O que é que é tão estranho?

1) Como inserir o código.

2) Em que tipo de variável se guarda o resultado da operação? Ou melhor ainda, dê-me por favor a parte do código onde a saída é produzida.

 
MigVRN:

1) Como é que se insere o código.

2) Em que tipo de variável se armazena o resultado da operação? Melhor ainda, dar a parte do código onde a saída é produzida.

Todas as variáveis são do tipo duplo.

Não percebo porque é que as Bandas têm muitos dígitos enquanto que a MA tem apenas 4 casas decimais. Não deve haver qualquer resultado zero. É por esta razão que o algoritmo não funciona.

Tudo era tão simples na MQL4. Agora precisa da velocidade de optimização e da verificação de múltiplas moedas. Tenho de transferir tudo para a MQL5 (aparafusar)).

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

Todas as variáveis são do tipo duplo.

Não é claro porque é que as Bandas têm muitos dígitos e MA apenas 4 casas decimais. E o resultado zero não deve estar de todo presente. Esta é a razão pela qual o algoritmo não funciona.

Tudo era tão simples na MQL4. Agora é necessária uma maior velocidade de optimização e verificação de múltiplas moedas. Tenho de transferir tudo para a MQL5 (aparafusar)).

Deve funcionar. Abaixo está um guião baseado no seu código e no seu 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 as variáveis são do tipo duplo.

Não é claro porque é que as Bandas têm muitos dígitos e MA apenas 4 casas decimais. O resultado de zero não deve estar aí de todo. É por esta razão que o algoritmo não funciona.

Tudo era tão simples na MQL4. Agora é necessária uma maior velocidade de optimização e verificação de múltiplas moedas. Agora tenho de transferir tudo para a MQL5 (aparafusar)).

Antes da operação "subtrair" , imprimir os valores das variáveis para ver o que está nos amortecedores:
Print("B_up_s= ",B_up_s,"; M_av_s=",M_av_s);
double q=B_up_s-M_av_s;
 
MigVRN:

Deve funcionar. Abaixo está o guião de acordo com o seu código e o seu resultado:

Sim, o guião funciona.

Até a EA com este exemplo funciona.

A minha EA, por outro lado, dá zero teimosamente. Vamos procurar por um erro ......

 

Olá a todos!

Pergunta, como fazer um valor variável a ser actualizado em cada tick num minuto, e depois esta soma é escrita para um valor separado, quando o minuto seguinte fecha, o valor da soma é substituído pelo novo valor?

int t = TimeSeconds();

enquanto (t !=0)

duplo b - a variável, que é actualizada durante cada minuto em cada tic.

duplo b1 - valor da variável b no tick anterior.

duplo s - quantidade em todas as carraças no espaço de um minuto.

duplo s1 - quantidade em todas as carraças dentro do minuto anterior.

b1=b;

s=b1+b

se (t=0) s1=s;

Como fazer um resumo dos dados em cada tic e como escrevê-los todos correctamente em geral?

 
Alvin1976:

Sim, o guião funciona.

Até a EA com este exemplo funciona.

Mas o meu Conselheiro Especialista dá zero. Vamos procurar o erro ......

Eis o que foi detectado.

Se apenas executar a EA, funciona bem mas no Testador de Estratégia produz zeros logo no início. Mas na linha seguinte, os zeros tornam-se magicamente um dado indicador normal. Não entendo o que se está a passar.....

Abaixo está o código.

Isto é o que o testador relata.

CJ 0 19:40:47.022 Core 1 EURUSD,M15 (Alpari-Ltd-Demo): OHLC bar states geradores. OnTick execução no bar só começa
IJ 0 19:40:47.022 Core 1 EURUSD,M15: início dos testes de peritos\tmp.ex5 de 2004.01.07 00:00 a 2004.02.02 00:00
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=verdadeiro 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=verdadeiro 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,27957962626541548 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:

Eis o que foi descoberto.

1) Não crie indicadores em cada tick!

2) Verificar se o indicador foi criado ou não, antes de aceder aos seus valores.

3) Verificar se os valores solicitados são copiados do indicador.

4) Apagar sempre a parte de cálculo do indicador após a conclusão do perito, caso contrário poderá, em algum momento, ficar sem RAM.

O problema foi porque se tentou copiar os valores do indicador que ainda não tinha sido criado. Faça disso uma regra - verifique o resultado das funções que chama.

Arquivos anexados:
 

Por favor, informe onde reside o erro.

Ekpert está a correr em demonstração, 3 pares. Aqui está o Diário de Bordo:

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

Aqui está o 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);  
      }  

Expert tenta executar OrderDelete(), dá erro, SendTradeRequest() está em loop, ekspert em conformidade com loops. Talvez o preço tenha mudado quando eu submeti a encomenda? Preciso de RefreshRates() e como lidar correctamente com isso? Procurei no fórum mas não encontrei nenhum exemplo...

Obrigado a todos de antemão