Erros, bugs, perguntas - página 936

 
#property indicator_separate_window
#property indicator_buffers 1
#property indicator_plots   1
//--- plot Label1
#property indicator_label1  "Label1"
#property indicator_type1   DRAW_LINE
#property indicator_color1  clrRed
#property indicator_style1  STYLE_SOLID
#property indicator_width1  1
//--- input parameters
input string symbol1="AUDUSD";
input string symbol2="NZDUSD";
input double mass_of_symbol1=1;
input double mass_of_symbol2=1;


int i,r1,r2,j;
double S,prs,k1,k2,d1,d2;
//--- indicator buffers
double        ind1[];
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- indicator buffers mapping
   SetIndexBuffer(0,ind1,INDICATOR_DATA);
//---
   return(0);
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int OnCalculate(const int rates_total,
                const int prev_calculated,
                const datetime &time[],
                const double &open[],
                const double &high[],
                const double &low[],
                const double &close[],
                const long &tick_volume[],
                const long &volume[],
                const int &spread[])
  {
//---
   ArraySetAsSeries(time,true);ArraySetAsSeries(open,true);ArraySetAsSeries(high,true);ArraySetAsSeries(low,true);
   ArraySetAsSeries(close,true);ArraySetAsSeries(tick_volume,true);ArraySetAsSeries(volume,true);ArraySetAsSeries(spread,true);

   ArraySetAsSeries(ind1,true);
   MqlRates rates1[]; ArraySetAsSeries(rates1,true);
   MqlRates rates2[]; ArraySetAsSeries(rates2,true);

   if(prev_calculated<rates_total)
     {
      for(i=0;i<rates_total;i++)
     // for(i=prev_calculated-1;i<rates_total;i++)
        {
         CopyRates(symbol1,0,time[i],1,rates1);
         CopyRates(symbol2,0,time[i],1,rates2);
         ind1[i]=mass_of_symbol1*rates1[0].close-mass_of_symbol2*rates2[0].close;
        }
     }



//--- return value of prev_calculated for next call
   return(rates_total);
 

Acima do código do indicador Spread_of_symbols ... Decidi reescrevê-lo para fazê-lo funcionar mais rapidamente.... e o código apareceu, ver abaixo ... os dados não são copiados ... se copiar dados de 1 a 0 no código, o indicador desenha muito rápido mas ocorre um erro fora da faixa de erro ... o que está errado no código ver abaixo ...?

#property indicator_separate_window
#property indicator_buffers 1
#property indicator_plots   1
//--- plot Label1
#property indicator_label1  "Label1"
#property indicator_type1   DRAW_LINE
#property indicator_color1  clrRed
#property indicator_style1  STYLE_SOLID
#property indicator_width1  1
//--- input parameters
input string symbol1="AUDUSD";
input string symbol2="NZDUSD";
input double mass_of_symbol1=1;
input double mass_of_symbol2=1;


int i,r1,r2,j;
double S,prs,k1,k2,d1,d2;
//--- indicator buffers
double        ind1[];
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- indicator buffers mapping
   SetIndexBuffer(0,ind1,INDICATOR_DATA);
//---
   return(0);
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int OnCalculate(const int rates_total,
                const int prev_calculated,
                const datetime &time[],
                const double &open[],
                const double &high[],
                const double &low[],
                const double &close[],
                const long &tick_volume[],
                const long &volume[],
                const int &spread[])
  {
//---
   ArraySetAsSeries(time,true);ArraySetAsSeries(open,true);ArraySetAsSeries(high,true);ArraySetAsSeries(low,true);
   ArraySetAsSeries(close,true);ArraySetAsSeries(tick_volume,true);ArraySetAsSeries(volume,true);ArraySetAsSeries(spread,true);

   ArraySetAsSeries(ind1,true);
   MqlRates rates1[]; ArraySetAsSeries(rates1,true);
   MqlRates rates2[]; ArraySetAsSeries(rates2,true);
   
   int to_copy;
   if(prev_calculated>rates_total || prev_calculated<0) to_copy=rates_total;
   else
     {
      to_copy=rates_total-prev_calculated;
      if(prev_calculated>0) 
      to_copy++;   
     }
   if(CopyRates(symbol1,0,0,to_copy,rates1)<=0)
     {
      Print("Данные по первому символу не скопированы, ошибка  ",GetLastError());
      return(0);
     }
   if(CopyRates(symbol2,0,0,to_copy,rates2)<=0)
     {
      Print("Данные по второму символу не скопированы, ошибка ",GetLastError());
      return(0);
     }
   if(prev_calculated<rates_total)
     {
     int limit;
   if(prev_calculated==0)
      limit=0;
   else limit=prev_calculated-1;
   for(int i=limit;i<rates_total;i++)
        {
         ind1[i]=mass_of_symbol1*rates1[i].close-mass_of_symbol2*rates2[i].close;
        }
     }
   return(rates_total);
  }
 
 
FinEngineer: mas o que é que está errado no código, veja abaixo...?
Ver se os valores de to_copy e limite coincidem entre si.
 
No modo de visualização, ao negociar em dois símbolos, após fechar negócios ao mesmo tempo, só aparecem no histórico os dados do símbolo em que o Expert Advisor está a funcionar. Os dados do outro símbolo só chegam ao separador do histórico após a abertura de novas transacções. Como resultado, há um período de tempo em que os dados sobre o comércio e os separadores de histórico são diferentes.
 
JF 0 Transacções 19:31:10 '***': cancelar a encomenda #3694236 comprar paragem 1.10 AUDJPY.m a 95.679<br / translate="no">DS 0 Transacções 19:31:10 '***': cancelar a encomenda #3694238 comprar limite 1.10 AUDJPY.m a 93.876
DH 0 Comércios 19:31:10 '***': cancelar encomenda #3694237 comprar paragem 0,36 AUDJPY.m a 95,679
FI 0 Comércios 19:31:10 '***': cancelar encomenda #3694239 limite de compra 0,36 AUDJPY.m a 93,876
FP 0 Comércios 19:31:10 '***': cancelar a encomenda #3694236 comprar paragem 1.10 AUDJPY.m a 95.679 feito
QE 0 Comércios 19:31:11 '***': cancelar encomenda #3694238 limite de compra 1.10 AUDJPY.m a 93.876 feito
CG 0 Comércios 19:31:11 '***': cancelar encomenda #3694237 comprar paragem 0.36 AUDJPY.m a 95.679 feito
OL 0 Comércios 19:31:11 '***': cancelar a encomenda #3694239 limite de compra 0.36 AUDJPY.m a 93.876 feito

Quatro ordens pendentes, de acordo com o registo, pareciam ter sido rapidamente eliminadas. Mas a onTradeTransaction, as respostas vieram em cerca de 15 segundos, as carraças estavam a chegar neste período.

KH 0 prp5 (EURUSD.m,M1) 19:31:23 TS=6 cancelar sl _ OnTrade PENDING id=84 m=3 b/s=SELLL Err= Encomenda feita
***

JG 0 prp5 (EURUSD.m,M1) 19:31:26 TS=6 Apagar tp _ OnTrade PENDING id=85 m=3 b/s=SELLL Err=Licitações concluídas
***
RL 0 prp5 (EURUSD.m,M1) 19:31:26 TS=6 Apagar sl _ OnTrade PENDING id=86 m=3 b/s=SELLL Err=Licitações concluídas
***

HK 0 prp5 (EURUSD.m,M1) 19:31:26 TS=6 Apagar tp _ OnTrade PENDING id=87 m=3 b/s=SELLL Err=Ordem executada

Embora, também aqui haja algo de estranho

IE 0 prp5 (EURUSD.m,M1) 19:31:26 TS=6 =O= Preço de fecho/reversão de negócio=95.648 m=3 b/s=SELL ... ==>Tempo antes de OrderSendAsync
ES 0 prp5 (EURUSD.m,M1) 19:31:29 TS=6 caso 8(real) m=3 b/s=SELL Err=Encomenda colocada ==>Após EncomendaSendadaSync, 3 seg. parece ser demasiado longo.

P.S. Parece que houve atrasos na execução do Expert, embora eu me interrogue quanto tempo os pacotes para a OnTradeTransaction podem ficar em fila de espera.

 
fyords:

A partir da referência:

Referência MQL5 / Biblioteca Standard / Classes para criação de painéis e diálogos / CWnd / StateFlagsSet

Que propriedades?

StateFlagsSet não propriedades, mas estado. Um método de grupo para mudar o estado. Logo acima dos métodos de mudança das bandeiras individuais do Estado.

Utilizar separadamente.

 

Olhando para a "organização de acesso aos dados", olhando para o guião de amostra que bombeia os dados e compreendeu tudo, surgiram as seguintes questões:

1. Porque não posso escrever este código no indicador na função OnInit, para que no início o indicador descarregue o seu próprio histórico e prepare as séries cronológicas? Posso passar um tal cheque no meu consultor especializado?

2. Quantas vezes tenho de fazer esta verificação: 1 para Conselheiros Peritos e 2 para indicadores? Se eu preparar apenas uma vez a história e as séries cronológicas para copiar, então no futuro não ocorrerão erros na cópia? Ou tenho de verificar cada vez ou de vez em quando se o histórico e as séries cronológicas estão prontos?

3. esta verificação é necessária apenas para indicadores e Conselheiros Especializados que utilizam vários prazos e símbolos, ou é desejável para todos?

Документация по MQL5: Основы языка / Функции / Функции обработки событий
Документация по MQL5: Основы языка / Функции / Функции обработки событий
  • www.mql5.com
Основы языка / Функции / Функции обработки событий - Документация по MQL5
 
Os processos de troca são assíncronos e o indicador não é permitido esperar pelos dados. Por conseguinte, é possível consultar inite, de forma alguma esperar ou abrandar e apenas em oncalculate para verificar a disponibilidade e a contagem.

Por favor note - o indicador não tem o direito de esperar ou loop, caso contrário matará o cálculo dos indicadores subsequentes.
 
Renat:
Os processos de troca são assíncronos e o indicador não é permitido esperar pelos dados. Assim, pode consultar no inite, de forma alguma esperar ou abrandar e apenas no oncalculate para verificar a disponibilidade e contagem.

Por favor note - o indicador não tem o direito de esperar ou loop, caso contrário matará o cálculo dos indicadores subsequentes.

1 Então, onde é que eu pagino os dados? Se eu quiser fazer um indicador com um cesto de pares de moedas, muitos símbolos...para cada um deles preciso de verificar e trocar os dados...devo executar um guião a partir do indicador? Porque é que um indicador mataria os cálculos dos subsequentes? Nos indicadores seguintes, é suficiente utilizar a verificação do cálculo do indicador anterior através do BarsCalculated(indicator1_Handle), deixá-lo calcular e descarregar os dados, ou estou errado?

2 Outra questão, de outro tipo - quando declaro o cabo indicador na função, ele começa a contar? Ou começa a contar antes de eu dar um comando para o copiar?

Razão: