Então você só pode emitir o buffer, mas não a variável separadamente?
Sim, essa é a única maneira. E mais um truque que pode ser útil, se você definir SetIndexLabel(0, ""); então estes valores não serão exibidos na janela de dados. E mesmo a função iCustom() não estará disponível.
Eu peguei o código do exemplo em https://www.mql5.com/ru/docs/strings/stringadd e o colei no roteiro. O resultado é o mesmo na MQL4 e MQL5:
HE 022:42:49.015 Test Script (EURUSD,H1) time for 'c = a + b' = 235 milliseconds, i = 1000000
OH 022:42:50.187 Test Script (EURUSD,H1) time for 'StringAdd(a,b)' = 1156 milliseconds, i = 1000000
EP 022:42:50.781 Test Script (EURUSD,H1) time for 'StringConcatenate(c,a,b)' = 594 milliseconds, i = 1000000
Pensei que StringAdd() e StringConcatenate() deveriam correr mais rápido que "+". Por que não é assim?
O iCustom geralmente retarda os testes do Expert Advisor.
não é verdade, geralmente é o contrário, porque a alocação de memória para os buffers do indicador é feita pelo terminal, não pelo script MQL, geralmente estes problemas são o problema de cálculo não otimizado no indicador, muitos novatos em uma chamada do indicador - tick, calcular todo o comprimento dos dados históricos
Se você entendeu o básico da MQL, leia os artigos, está tudo escrito.
ZSYZZ: a sub-janela pode ser obtida aplicando um modelo, houve um tópico há alguns meses, mas acho que você tem um problema com outras coisas até agora
Когда программист создает советник, который получает сигналы от индикаторов, он всякий раз сталкивается с вопросом: использовать обращение к индикатору или перенести код индикатора в советник? Причины этому могут быть различные: желание сохранить в тайне используемые индикаторы и стратегию в целом, необходимость распространения советника единым...
não é verdade, geralmente é o contrário, porque a alocação de memória para buffers indicadores é feita pelo terminal, não pelo script MQL, geralmente esses problemas são o problema de cálculo não otimizado no indicador, muitos novatos em uma chamada de indicador - tick, eles calculam toda a extensão dos dados históricos
Se você já entendeu o básico da MQL, leia os artigos, já foi escrito há muito tempo.
ninguém tem, leia qual é a diferença entre um Consultor Especialista e um indicador, quem tem buffers de indicador e quem não tem, quem tem funções comerciais e quem faz ....
Artem afixou aqui um modelo indicador, aqui está a parte daOnCalculate
//--- Проверка количества доступных баров (1 - минимально, 4 - оптимально для большинства расчётов. Но всё "по месту"...)if(rates_total<4) return0;
//--- Проверка и расчёт количества просчитываемых баровint limit=rates_total-prev_calculated; // 0 - пришел новый тик, новый бар формироваться не начал. 1 - пришел новый тик и начал формироваться новый бар.if(limit>1)
// если вписать "limit>0", то на нулевом баре будет расчёт только нулевого бара, на каждом новом баре будет полный перерасчёт всей истории// если вписать "limit>1", то на нулевом баре будет расчёт только нулевого бара, на открытии нового бара - пересчёт первого и нулевого,// при подгрузке истории и на первом запуске - перерасчёт всей истории
{
limit=rates_total-1;
// здесь должна быть инициализация всех используемых буферов индикатора необходимыми значениями (обычно EMPTY_VALUE и 0)
}
Estou usando-o, mas tenho uma pergunta)
Por que eu usolimit=taxas_total-1 para o cálculo do histórico completo enãolimit=taxas_total?
Por quelimit=rates_total-1 é usado para o cálculo do histórico completo enãolimit=rates_total?
Tente verificá-lo, você estará imediatamente "fora de alcance " - numeração das barras de zero a ... Total -1 , uma situação comum na programação - a numeração começa com 0. Como um exemplo óbvio, declare array duplo x[5] e tente escrever algo no último elemento x[5] = 100;
ZS: respondendo à pergunta que você ainda não fez.... OrderTotal() também números de zero a OrderTotal()-1;)
ZS: respondendo a uma pergunta que ainda não foi feita.... OrderTotal() muito numerado de zero a OrderTotal()-1 ;)
A propósito, a questão surgiu, agora eu não posso ganhar uma média na matriz, embora o faça em cinco, mas em que tema escrever, eu não sei, que esteja aqui.
O indicador calcula a diferença de abertura e fechamento e constrói МА sobre ela. Eu escolhi MA=2 para depuração mas usando SimpleMAOnBuffer e iMAOnArray eu recebo mudanças de linha inexplicáveis e iMAOnArray mostra valor zero na última barra.
//+------------------------------------------------------------------+//| _null.mq4 |//| Copyright 2014, MetaQuotes Software Corp. |//| http://www.mql5.com |//+------------------------------------------------------------------+#property copyright"Copyright 2014, MetaQuotes Software Corp."#property link"http://www.mql5.com"#property version"1.00"#property strict#property indicator_separate_window#include <MovingAverages.mqh>
#property indicator_buffers4#property indicator_plots2//--- plot OC#property indicator_label1"OC"#property indicator_type1DRAW_COLOR_HISTOGRAM#property indicator_color1clrSteelBlue, clrRed,clrGreen#property indicator_style1STYLE_SOLID#property indicator_width11#property indicator_label2"MA1"#property indicator_type2DRAW_LINE#property indicator_color2clrBrown#property indicator_style2STYLE_SOLID#property indicator_width21//--- indicator buffersdouble OC[], OC_color[], MA1_buf[];
inputint MA1=2;
intOnInit()
{
IndicatorSetString(INDICATOR_SHORTNAME,"t1");
SetIndexBuffer(0,OC,INDICATOR_DATA);
SetIndexBuffer(1,OC_color,INDICATOR_COLOR_INDEX);
SetIndexBuffer(2, MA1_buf,INDICATOR_DATA);
//PlotIndexSetInteger(2,PLOT_DRAW_BEGIN,50);//--- indicator buffers mapping//---return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+//| Custom indicator iteration function |//+------------------------------------------------------------------+intOnCalculate(constint rates_total,
constint prev_calculated,
constdatetime &time[],
constdouble &open[],
constdouble &high[],
constdouble &low[],
constdouble &close[],
constlong &tick_volume[],
constlong &volume[],
constint &spread[])
{
//--- Проверка количества доступных баров (1 - минимально, 4 - оптимально для большинства расчётов. Но всё "по месту"...)if(rates_total<4) return0;
//--- Проверка и расчёт количества просчитываемых баровint limit=rates_total-prev_calculated; // 0 - пришел новый тик, новый бар формироваться не начал. 1 - пришел новый тик и начал формироваться новый бар.//if(limit>1) // если вписать "limit>0", то на нулевом баре будет расчёт только нулевого бара, на каждом новом баре будет полный перерасчёт всей истории// если вписать "limit>1", то на нулевом баре будет расчёт только нулевого бара, на открытии нового бара - пересчёт первого и нулевого,// при подгрузке истории и на первом запуске - перерасчёт всей истории
{
limit=rates_total-1;
// здесь должна быть инициализация всех используемых буферов индикатора необходимыми значениями (обычно EMPTY_VALUE и 0)
}
for(int i=limit; i>=0 && !IsStopped(); i--)
{
// необходимые действия по расчёту индикатора
OC[i]=fmax(open[i],close[i])-fmin(open[i],close[i]);
if(OC[i]>0.001)
{ OC_color[i]=1;
}
}
/* for(int k=limit; k>=0 && !IsStopped(); k--)
{
MA1_buf[k]=iMAOnArray(OC,0,MA1,k,MODE_SMA,0);
}
*/
SimpleMAOnBuffer(rates_total,prev_calculated,0,MA1,OC,MA1_buf);
//--- return value of prev_calculated for next callreturn(rates_total);
}
double iMAOnArray(double &array[],
int total,
int period,
int ma_shift,
int ma_method,
int shift)
{
double buf[],arr[];
if(total==0) total=ArraySize(array);
if(total>0 && total<=period) return(0);
if(shift>total-period-ma_shift) return(0);
switch(ma_method)
{
caseMODE_SMA :
{
total=ArrayCopy(arr,array,0,shift+ma_shift,period);
if(ArrayResize(buf,total)<0) return(0);
double sum=0;
int i,pos=total-1;
for(i=1;i<period;i++,pos--)
sum+=arr[pos];
while(pos>=0)
{
sum+=arr[pos];
buf[pos]=sum/period;
sum-=arr[pos+period-1];
pos--;
}
return(buf[0]);
}
caseMODE_EMA :
{
if(ArrayResize(buf,total)<0) return(0);
double pr=2.0/(period+1);
int pos=total-2;
while(pos>=0)
{
if(pos==total-2) buf[pos+1]=array[pos+1];
buf[pos]=array[pos]*pr+buf[pos+1]*(1-pr);
pos--;
}
return(buf[shift+ma_shift]);
}
caseMODE_SMMA :
{
if(ArrayResize(buf,total)<0) return(0);
double sum=0;
int i,k,pos;
pos=total-period;
while(pos>=0)
{
if(pos==total-period)
{
for(i=0,k=pos;i<period;i++,k++)
{
sum+=array[k];
buf[k]=0;
}
}
else sum=buf[pos+1]*(period-1)+array[pos];
buf[pos]=sum/period;
pos--;
}
return(buf[shift+ma_shift]);
}
caseMODE_LWMA :
{
if(ArrayResize(buf,total)<0) return(0);
double sum=0.0,lsum=0.0;
double price;
int i,weight=0,pos=total-1;
for(i=1;i<=period;i++,pos--)
{
price=array[pos];
sum+=price*i;
lsum+=price;
weight+=i;
}
pos++;
i=pos+period;
while(pos>=0)
{
buf[pos]=sum/weight;
if(pos==0) break;
pos--;
i--;
price=array[pos];
sum=sum-lsum+price*period;
lsum-=array[i];
lsum+=price;
}
return(buf[shift+ma_shift]);
}
default: return(0);
}
return(0);
}
Tenho uma pergunta relacionada, ainda estou lutando com a média da matriz, embora o esteja fazendo em 5, mas não sei em que assunto escrevê-la, deixe-a estar aqui.
Tenho a sensação de que na MQL5 os buffers indicadores e as séries temporais estão "desdobrados" da forma oposta, por padrão a barra mais à esquerda na MT5 é a barra 0 e na MT4 a barra mais à direita é a barra 0 e os buffers indicadores têm a mesma numeração
ZS: infelizmente, não quero me envolver com o MT5, o MT4 é suficiente para eu verificar minhas idéias, só olho para os preparativos no MT5, se eu escrever alguma coisa usando o MT5 eu nunca o mostro a ninguém ))))
Para login e uso do site MQL5.com, você deve ativar o uso de cookies.
Ative esta opção no seu navegador, caso contrário você não poderá fazer login.
Você entrou na conta. A autenticação de dois fatores foi desativada. Configure-a novamente e escaneie um novo código QR ou continue com a autenticação de dois fatores desativada.
Ajuste a cor do display para clrNONE.
Então você só pode emitir o buffer, mas não a variável separadamente?
Então você só pode emitir o buffer, mas não a variável separadamente?
Obrigado por responder.
Então o que eu entendo é criar um buffer e depois preenchê-lo com
com valores RSI e depois alimentar este buffer comiMAOnArray().
Alguém já fez isso para a EA e ele será exibido ao testar a EA na sub janela?
Normalmente os testes da EA através do iCustom são lentos.
Eu peguei o código do exemplo em https://www.mql5.com/ru/docs/strings/stringadd e o colei no roteiro. O resultado é o mesmo na MQL4 e MQL5:
Pensei que StringAdd() e StringConcatenate() deveriam correr mais rápido que "+". Por que não é assim?
O iCustom geralmente retarda os testes do Expert Advisor.
não é verdade, geralmente é o contrário, porque a alocação de memória para os buffers do indicador é feita pelo terminal, não pelo script MQL, geralmente estes problemas são o problema de cálculo não otimizado no indicador, muitos novatos em uma chamada do indicador - tick, calcular todo o comprimento dos dados históricos
Se você entendeu o básico da MQL, leia os artigos, está tudo escrito.
https://www.mql5.com/ru/articles/4602
Quem fez isso para uma EA e ela será exibida ao testar a EA em uma sub janela?
ninguém tem, leia qual é a diferença entre um EA e um indicador, quem tem e quem não tem indicadores, quem tem funções comerciais e quem faz....
ZZY: uma subjanela só pode criar um indicador. Se você criar uma subjanela, então você pode adicionar objetos gráficos a esta subjanela usando o Expert Advisorhttps://www.mql5.com/ru/docs/constants/objectconstants/enum_object
ZSYZZ: a sub-janela pode ser obtida aplicando um modelo, houve um tópico há alguns meses, mas acho que você tem um problema com outras coisas até agora
não é verdade, geralmente é o contrário, porque a alocação de memória para buffers indicadores é feita pelo terminal, não pelo script MQL, geralmente esses problemas são o problema de cálculo não otimizado no indicador, muitos novatos em uma chamada de indicador - tick, eles calculam toda a extensão dos dados históricos
Se você já entendeu o básico da MQL, leia os artigos, já foi escrito há muito tempo.
https://www.mql5.com/ru/articles/4602
ninguém tem, leia qual é a diferença entre um Consultor Especialista e um indicador, quem tem buffers de indicador e quem não tem, quem tem funções comerciais e quem faz ....
ZZY: uma subjanela só pode criar um indicador, se você criar uma subjanela, então você pode adicionar objetos gráficos a esta subjanela usando o Expert Advisorhttps://www.mql5.com/ru/docs/constants/objectconstants/enum_object
ZSYZZ: a sub-janela pode ser obtida aplicando um modelo, foi um tópico há alguns meses, mas acho que você tem um problema com outra coisa até agora
Desculpe. Talvez eu não tenha dito bem, mas
Não pretendo usá-lo para testes, mas não pretendo executá-lo.
Quanto à visualização na tabela de indicadores durante os testes, se você usar
Quando você usa funções indicadoras em linha, elas são desenhadas no gráfico no processo de teste
É exatamente isso que eu quero dizer.
Mas se você usar algum tipo de código personalizado de cálculo de indicador que está integrado no código da EA, então este indicador
não serão exibidos no processo de teste da EA.
Quanto ao iCustom, quando você o utiliza no processo de teste, a EA será exibida no gráfico
qualquer indicador e o código do indicador pode ser compilado com a EA em um ex4, mas eu não preciso dele.
Só queria saber se existe uma maneira de contornar o iCustom neste assunto, mas se não, também não é um problema.
Muito obrigado pela resposta abrangente.
Artem afixou aqui um modelo indicador, aqui está a parte daOnCalculate
Estou usando-o, mas tenho uma pergunta)
Por que eu usolimit=taxas_total-1 para o cálculo do histórico completo enãolimit=taxas_total?
Por quelimit=rates_total-1 é usado para o cálculo do histórico completo enãolimit=rates_total?
Tente verificá-lo, você estará imediatamente "fora de alcance " - numeração das barras de zero a ... Total -1 , uma situação comum na programação - a numeração começa com 0. Como um exemplo óbvio, declare array duplo x[5] e tente escrever algo no último elemento x[5] = 100;
ZS: respondendo à pergunta que você ainda não fez.... OrderTotal() também números de zero a OrderTotal()-1 ;)
ZS: respondendo a uma pergunta que ainda não foi feita.... OrderTotal() muito numerado de zero a OrderTotal()-1 ;)
A propósito, a questão surgiu, agora eu não posso ganhar uma média na matriz, embora o faça em cinco, mas em que tema escrever, eu não sei, que esteja aqui.
O indicador calcula a diferença de abertura e fechamento e constrói МА sobre ela. Eu escolhi MA=2 para depuração mas usando SimpleMAOnBuffer e iMAOnArray eu recebo mudanças de linha inexplicáveis e iMAOnArray mostra valor zero na última barra.
Tenho uma pergunta relacionada, ainda estou lutando com a média da matriz, embora o esteja fazendo em 5, mas não sei em que assunto escrevê-la, deixe-a estar aqui.
Tenho a sensação de que na MQL5 os buffers indicadores e as séries temporais estão "desdobrados" da forma oposta, por padrão a barra mais à esquerda na MT5 é a barra 0 e na MT4 a barra mais à direita é a barra 0 e os buffers indicadores têm a mesma numeração
ZS: infelizmente, não quero me envolver com o MT5, o MT4 é suficiente para eu verificar minhas idéias, só olho para os preparativos no MT5, se eu escrever alguma coisa usando o MT5 eu nunca o mostro a ninguém ))))