Erros, bugs, perguntas - página 33

 
Urain:

Estaé uma sugestão digna de nota,

Embora do ponto de vista da lógica comum seja como coçar a orelha esquerda com a mão direita (mas isso não depende de si, depende dos programadores),

porquê a possibilidade de chamar os dados de um instrumento não nativo?

se ainda precisar de criar indicadores personalizados e chamá-los a partir de um símbolo exigido, em geral, a conclusão é pensar cabeça que eu compro.

A possibilidade de tal chamada é necessária, os criadores certamente não poderiam supor tal abordagem ao escrever os índices.

Refiro-me à indicação da ferramenta nos parâmetros do indicador do utilizador (e não nos parâmetros iCustom() como deveria ser na sua opinião).


PS

A prioridade no trabalho com iCustom() parece ter sido inicialmente dada ao comércio mecânico que, de facto, pressupõe que alguns momentos serão considerados e algumas acções serão realizadas no Expert Advisor e só então iCustom() será chamado para o indicador personalizado.

Caso contrário todo o trabalho e responsabilidade recaem sobre o programador que implementa o código do indyke (o que pode levar a erros fatais e consequências, porque demasiada fantasia do indyke pode levar à travagem ou ao crash do sistema como um todo).

 
Urain:

Sugestão digna de atenção,

Mas mais uma vez, posso chamar o indicador pronto para EUR com dados sobre JPY (por exemplo, não há dados suficientes sobre o iene)

Não tenho quaisquer dados para esta extensão e o que me dirá ???? a mesma canção.

É muito mais fácil lidar com erros e estrangulamentos na ferramenta nativa, e a verificação preliminar e a verificação final são feitas antes e depois da chamada no Expert Advisor ou do indicador de pedido de dados.

Presumo que existe uma segunda via, que é fundamentalmente errada do meu ponto de vista. De acordo com a sua lógica, é necessário criar uma ou mais funções no indicador (chamadas a partir da calculadora), calcular tudo o que é necessário nelas e devolver o resultado à calculadora.

PS

Mas é o seguinte - pode calcular o número de barras sobre um símbolo arbitrário. Mas e quanto a outras coisas?

 
Prival:

Bug. Descrição. ATS sempre no mercado (capotamento por lote duplo 0,2).

Modo de teste todas as carraças. Tudo é normal.

modo teste, através da abertura de preços. a mesma peça.

Por alguma razão divide-se em 2 ofícios. talvez seja apenas a forma como é exibido, mas não é correcto. não deveria ser assim.

Reorganizar os comandos de abertura com os comandos de fecho. Deve ser por esta ordem

- posições próximas

- modificar posições

- posições em aberto

Então as suas posições próximas e abertas estarão no mesmo bar.

 
gpwr:

Reorganizar os comandos de abertura com os comandos de fecho. A ordem deve ser a seguinte

- posições próximas

- modificar posições

- posições em aberto

Depois, o seu fecho e abertura serão no mesmo bar.

Se o mercado é de compra 0,1, abro uma venda 0,2. O resultado desta operação deve ser 0,1,1 numa transacção, e não duas.

Penso que os criadores compreenderam o que eu estava a dizer.

 

Eu escrevi este código

#property indicator_separate_window
#property indicator_buffers 2
#property indicator_plots   2
//--- plot Label1
#property indicator_label1  "I1"
#property indicator_type1   DRAW_LINE
#property indicator_color1  Red
#property indicator_style1  STYLE_SOLID
#property indicator_width1  1
//--- plot Label2
#property indicator_label2  "I2"
#property indicator_type2   DRAW_LINE
#property indicator_color2  Green
#property indicator_style2  STYLE_SOLID
#property indicator_width2  1
//--- indicator buffers
double         I1Buffer[];
double         I2Buffer[];
int OnInit()
  {
   SetIndexBuffer(0,I1Buffer,INDICATOR_DATA);
   SetIndexBuffer(1,I2Buffer,INDICATOR_DATA);
   return(0);
  }

int OnCalculate (const int rates_total,      // размер массива price[]
                 const int prev_calculated,  // обработано баров на предыдущем вызове
                 const int begin,            // откуда начинаются значимые данные
                 const double& price[])      // массив для расчета
  {
   string Symbol_1="EURUSD",Symbol_2="GBPUSD";
   if(rates_total<1) return(0);
   double Arr1[],Arr2[];
   int end,rez0,rez1;
   end=MathMin((int)SeriesInfoInteger(Symbol_1,0,SERIES_BARS_COUNT)-1,(int)SeriesInfoInteger(Symbol_2,0,SERIES_BARS_COUNT)-1);
   end=MathMin(end,rates_total-prev_calculated+1);
   rez0=CopyClose(Symbol_1,PERIOD_CURRENT, 0,end, Arr1);
   if(rez0==-1){Print("Ошибка копирования ",Symbol_1," ",GetLastError()); return(0);}
   rez1=CopyClose(Symbol_2,PERIOD_CURRENT, 0,end, Arr2);
   if(rez1==-1){Print("Ошибка копирования ",Symbol_2," ",GetLastError()); return(0);}
   if(rez1!=rez0){Print("Ошибка Синхронизации"); return(0);}
  
   ArraySetAsSeries(Arr1,true);
   ArraySetAsSeries(Arr2,true);
     
   int li=rates_total-1;  
   for(int i=0;i<end;i++)
     {      
      I1Buffer[li]=Arr1[i]+0.26;
      I2Buffer[li]=Arr2[i];
      li--;
     }
   return(rates_total);
  }

Parece funcionar bem, mas se leva tudo em conta, não sei.
Se o fizer, aqui está uma variante para si.
Se não estiver correcto, por favor corrigi-lo.

 

Agora tenho uma pergunta a fazer.

Porque é que o indicador é chamado pelo Conselheiro Especialista, o valor não coincide com o indicador.

Ou seja, o indicador tem 1,5123 e a EA recebe 1,5117

Tentei usá-lo porque não sei lê-lo e não quero perdê-lo.

static int Handle;
int bars;
void OnInit()
  {
   Handle=iCustom(NULL,0,"proverka");
  }

void OnTick()
  {
   if(bars==Bars(_Symbol,_Period))return;
   bars=Bars(_Symbol,_Period);
   double buf1[],buf2[];    
   if(CopyBuffer(Handle,0,0,2,buf1)<0 || CopyBuffer(Handle,1,0,2,buf2)<0)Alert("Ошибка копирования значений индикаторных буферов ",GetLastError(),"!!");
   Print("Время "+TimeToString(TimeCurrent(),TIME_DATE|TIME_MINUTES),"   буф1-",buf1[0],"   буф2-",buf2[0]);
  }

e imagem

E o primeiro amortecedor, o instrumento sobre o qual está a funcionar, coincide.

Arquivos anexados:
prover.mq5  1 kb
proverka.mq5  2 kb
 
ddd06:

Agora tenho uma pergunta a fazer.

Porque é que o indicador é chamado pelo Conselheiro Especialista, o valor não coincide com o indicador.

Ou seja, o indicador tem 1,5123 e a EA recebe 1,5117

Aqui está o código da EA, para além de estar duplicado no anexo.

E olha-se para o valor anterior do indicador. Suspeito que seja exactamente 1,5117. Tomar o valor actual (último) pelo índice 1. Ou atribuir matrizes SetAsSeries(bufX,true)
 
stringo:
E olha-se para o valor do indicador anterior.
1.512380 - actual 1.512310 - anterior
 
ddd06:

Eu escrevi este código

Parece funcionar bem, mas se tem em conta tudo o que eu não sei.
Se o fizer, aqui está uma variante para si.
Se não estiver correcto, por favor corrigi-lo.

Sim, a minha versão retrabalhada também tem uma verificação do comprimento da matriz, mas perdi-me nas direcções da série, como de costume,

e verificou-se que o desenho continuou, mas como o comprimento da matriz é inferior ao comprimento do gráfico, o desenho passou do fim para o meio (ou por aí),

Foi por isso que tive a impressão de que não havia rendição.

Em geral, suspeito que haverá confusão neste local durante muito tempo,

porque o mesmo problema se verificou com os visitantes do mql4.com e agora estão a descarregar aqui.

 
Urain:

É isso mesmo.

Isso é óptimo. Penso que o código é simples e local, pelo que pode utilizá-lo como base.

Pergunta sobre a EA - devo escrever para o Service Desk?

Общайтесь с разработчиками через Сервисдеск!
Общайтесь с разработчиками через Сервисдеск!
  • www.mql5.com
Ваше сообщение сразу станет доступно нашим отделам тестирования, технической поддержки и разработчикам торговой платформы.
Razão: