Há inicialização em OnCalculate() na primeira execução (pré-cálculo == 0). Pensa que mudá-lo para o OnInit() irá mudar alguma coisa? Bem, vou tentar, claro, mas isto é algo fora do reino da fantasia...
Corte. Como disse, em OnDeinit() as matrizes são inicializadas, que já não são utilizadas no próximo arranque (alteração dos parâmetros de entrada). Se isto (inicializando um array que não é utilizado como amortecedor) ajudar - seria também um bug MT. Acontece que não só as matrizes não são utilizadas, como ainda poderiam (não atribuídas) ser inicializadas e isso afectaria o mapeamento...
Sem código é difícil. Diga-nos depois o que diz o balcão de serviço.
Anatoli Kazharski: É difícil sem código. Avise-me aqui mais tarde o que diz o balcão de serviço.
Aqui está o código de teste, se estiver interessado.
Inicialmente, o parâmetro indicador é falso.
Colocamos o indicador no gráfico. Desenha um histograma.
Definimos os parâmetros como verdadeiros.
Desenha o histograma e as setas.
Tornar o parâmetro falso. Nas actuais setas TF desaparecem (nem sempre). Se mudarmos para diferentes TF, as setas aparecem caóticas em algumas delas, apesar dos amortecedores que se libertam na desinicialização.
#property indicator_separate_window#property indicator_plots3#property indicator_buffers4//+------------------------------------------------------------------+//| |//+------------------------------------------------------------------+inputbool inpUseArrows=false;
//+------------------------------------------------------------------+//| |//+------------------------------------------------------------------+double bufGisto[];
double bufGistoColor[];
double bufArrowUp[];
double bufArrowDn[];
//---constdoubleEMPTY=EMPTY_VALUE;
//+------------------------------------------------------------------+//| Custom indicator initialization function |//+------------------------------------------------------------------+intOnInit()
{
//--- Размечаем массив цветовcolor colors[2];
colors[ 0 ]= clrLime;
colors[ 1 ] = clrRed;
//--- Устанавливаем параметры графических серий
SetPlotParametersColorHistogram(0,0,bufGisto,bufGistoColor,false,"test gisto",colors,EMPTY,2);
//--- Проверяем, нужно ли отображать объемыif(inpUseArrows) // Если отображать нужно
{
SetPlotParametersArrow(1,2,bufArrowUp,false,"test up",EMPTY,clrLime,233,10);
SetPlotParametersArrow(2,3,bufArrowDn,false,"test dn",EMPTY,clrRed,234,-10);
}
//---IndicatorSetInteger(INDICATOR_DIGITS,0);
//---return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+//| |//+------------------------------------------------------------------+voidOnDeinit(constint reason)
{
if(inpUseArrows)
{
ArrayInitialize(bufArrowUp,EMPTY);
ArrayInitialize(bufArrowDn,EMPTY);
}
}
//+------------------------------------------------------------------+//| 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[])
{
//---if(prev_calculated==0)
{
ArrayInitialize(bufGisto,EMPTY);
//---if(inpUseArrows)
{
ArrayInitialize(bufArrowUp,EMPTY);
ArrayInitialize(bufArrowDn,EMPTY);
}
//---for(int i=0; i<rates_total; i++)
{
bufGisto[i]=(open[i]-close[i])/_Point;
bufGistoColor[i]=(bufGisto[i]<0) ? 1 : 0;
//---if(inpUseArrows)
{
if(bufGisto[i]>20)
bufArrowDn[i]=bufGisto[i];
elseif(bufGisto[i]<-20)
bufArrowUp[i]=bufGisto[i];
}
}
}
elseif(rates_total>prev_calculated)
{
bufGisto[rates_total-1]=EMPTY;
//---if(inpUseArrows)
{
bufArrowUp[ rates_total-1 ] = EMPTY;
bufArrowDn[ rates_total-1 ] = EMPTY;
}
}
//--- return value of prev_calculated for next callreturn(rates_total);
}
//+------------------------------------------------------------------+//| Параметры графического построения: цветная гист-а от 0 линии |//+------------------------------------------------------------------+void SetPlotParametersColorHistogram(constint plotIndex,// Индекс графической серииconstint bufferNum,// Номер первого буфера серииdouble& value[], // Буфер значенийdouble& clr[], // Буфер цветовconstbool asSeries, // Флаг нумерации как в таймсерииconststring label, // Имя серииconstcolor& colors[], // Цвета линииconstdouble emptyValue = EMPTY_VALUE, // Пустые значения серииconstint width = 0, // Толщина линииconstENUM_LINE_STYLE style = STYLE_SOLID, // Стиль линииconstint drawBegin = 0, // Количество баров без отрисовкиconstint shift=0// Сдвиг построения в барах
)
{
//--- Привязываем буферыSetIndexBuffer(bufferNum,value,INDICATOR_DATA);
SetIndexBuffer(bufferNum+1,clr,INDICATOR_COLOR_INDEX);
//--- Устанавливаем порядок нумерации в массивах-буферахArraySetAsSeries(value,asSeries);
ArraySetAsSeries(clr,asSeries);
//--- Устанавливаем тип графического построенияPlotIndexSetInteger(plotIndex,PLOT_DRAW_TYPE,DRAW_COLOR_HISTOGRAM);
//--- Устанавливаем имя графической серииPlotIndexSetString(plotIndex,PLOT_LABEL,label);
//--- Устанавливаем пустые значения в буферахPlotIndexSetDouble(plotIndex,PLOT_EMPTY_VALUE,emptyValue);
//--- Устанавливаем количество цветов индикатораconstint size=ArraySize(colors);
PlotIndexSetInteger(plotIndex,PLOT_COLOR_INDEXES,size);
//--- Устанавливаем цвета индикатораfor(int i=0; i<size; i++)
PlotIndexSetInteger(plotIndex,PLOT_LINE_COLOR,i,colors[i]);
//--- Устанавливаем толщину линииPlotIndexSetInteger(plotIndex,PLOT_LINE_WIDTH,width);
//--- Устанавливаем стиль линииPlotIndexSetInteger(plotIndex,PLOT_LINE_STYLE,style);
//--- Устанавливаем количество баров без отрисовки и значений в DataWindowPlotIndexSetInteger(plotIndex,PLOT_DRAW_BEGIN,drawBegin);
//--- Устанавливаем сдвиг графического построения по оси времени в барахPlotIndexSetInteger(plotIndex,PLOT_SHIFT,shift);
}
//+------------------------------------------------------------------+//| Параметры графического построения: стрелки |//+------------------------------------------------------------------+void SetPlotParametersArrow(constint plotIndex,// Индекс графической серииconstint bufferNum,// Номер первого буфера серииdouble &value[],// Буфер значенийconstbool asSeries,// Флаг нумерации как в таймсерииconststring label,// Имя серииconstdouble emptyValue=EMPTY_VALUE,// Пустые значения серииconstcolor clr=clrRed,// Цвет стрелокconstint arrowCode= 159,// Код стрелокconstint arrowShift = 0,// Сдвиг стрелок по вертикалиconstint width=0,// Толщина стрелокconstint drawBegin=0,// Количество баров без отрисовкиconstint shift=0// Сдвиг построения в барах
)
{
//--- Привязываем буферыSetIndexBuffer(bufferNum,value,INDICATOR_DATA);
//--- Устанавливаем порядок нумерации в массивах-буферахArraySetAsSeries(value,asSeries);
//--- Устанавливаем тип графического построенияPlotIndexSetInteger(plotIndex,PLOT_DRAW_TYPE,DRAW_ARROW);
//--- Устанавливаем имя графической серииPlotIndexSetString(plotIndex,PLOT_LABEL,label);
//--- Устанавливаем пустые значения в буферахPlotIndexSetDouble(plotIndex,PLOT_EMPTY_VALUE,emptyValue);
//--- Устанавливаем цвет индикатораPlotIndexSetInteger(plotIndex,PLOT_LINE_COLOR,0,clr);
//--- Устанавливаем код стрелокPlotIndexSetInteger(plotIndex,PLOT_ARROW,arrowCode);
//--- Устанавливаем смещение стрелок по вертикалиPlotIndexSetInteger(plotIndex,PLOT_ARROW_SHIFT,arrowShift);
//--- Устанавливаем толщину стрелокPlotIndexSetInteger(plotIndex,PLOT_LINE_WIDTH,width);
//--- Устанавливаем количество баров без отрисовки и значений в DataWindowPlotIndexSetInteger(plotIndex,PLOT_DRAW_BEGIN,drawBegin);
//--- Устанавливаем сдвиг графического построения по оси времени в барахPlotIndexSetInteger(plotIndex,PLOT_SHIFT,shift);
}
//+------------------------------------------------------------------+
Independentemente de se especificar arrays para as setas como amortecedores, elas continuam a estar ligadas por fios:
//---
Em alternativa, se as setas não precisarem de ser exibidas, podem simplesmente ser excluídas da exibição por DRAW_NONE.
Experimente esta variante:
Pensei nisso, mas há aqui uma desvantagem. As arrays serão automaticamente marcadas e expandidas, consumindo recursos. É melhor que os criadores deixem o bug ser corrigido.
E que tal ser codificado... Se não ligo os amortecedores às séries gráficas - porque é que vejo algum lixo desconhecido, do qual não me consigo livrar.
Caso contrário, verifica-se que os indicadores dinâmicos não podem ser construídos normalmente.
A opção mais ideal é limpar amortecedores em deinit e é isso. Mas a limpeza não ajuda...
Seria bom introduzir uma distinção no tipo de corda, uma vez que é usada noutras línguas para uma corda comum e uma corda "crua". Penso que chegaremos a isto de qualquer forma, mas na fase inicial eliminaria muitos problemas no futuro.
Por exemplo Python usa r "string" para criar uma string "crua
Qual é a razão para os registos não serem totalmente afixados no testador? Tudo o que pode ser examinado - examinado e verificado, não pode ser superado.
Há inicialização em OnCalculate() na primeira execução (pré-cálculo == 0). Pensa que mudá-lo para o OnInit() irá mudar alguma coisa? Bem, vou tentar, claro, mas isto é algo fora do reino da fantasia...
Corte. Como disse, em OnDeinit() as matrizes são inicializadas, que já não são utilizadas no próximo arranque (alteração dos parâmetros de entrada). Se isto (inicializando um array que não é utilizado como amortecedor) ajudar - seria também um bug MT. Acontece que não só as matrizes não são utilizadas, como ainda poderiam (não atribuídas) ser inicializadas e isso afectaria o mapeamento...
É difícil sem o código. Depois digam-me o que diz o departamento de serviço.
É difícil sem código. Avise-me aqui mais tarde o que diz o balcão de serviço.
Aqui está o código de teste, se estiver interessado.
Inicialmente, o parâmetro indicador é falso.
Colocamos o indicador no gráfico. Desenha um histograma.
Definimos os parâmetros como verdadeiros.
Desenha o histograma e as setas.
Tornar o parâmetro falso. Nas actuais setas TF desaparecem (nem sempre). Se mudarmos para diferentes TF, as setas aparecem caóticas em algumas delas, apesar dos amortecedores que se libertam na desinicialização.
Não vai de forma alguma. Balcão de serviço #1832411x64, 1643.
Independentemente de se especificar arrays para as setas como amortecedores, elas continuam a estar ligadas por fios:
//---
Em alternativa, se as setas não precisarem de ser exibidas, podem simplesmente ser excluídas da exibição por DRAW_NONE.
Tente desta forma:
Independentemente de se especificar arrays para as setas como amortecedores, elas continuam a estar ligadas por fios:
//---
Em alternativa, se as setas não precisarem de ser exibidas, podem simplesmente ser excluídas da exibição por DRAW_NONE.
Experimente esta variante:
Pensei nisso, mas há aqui uma desvantagem. As arrays serão automaticamente marcadas e expandidas, consumindo recursos. É melhor que os criadores deixem o bug ser corrigido.
E que tal ser codificado... Se não ligo os amortecedores às séries gráficas - porque é que vejo algum lixo desconhecido, do qual não me consigo livrar.
Caso contrário, verifica-se que os indicadores dinâmicos não podem ser construídos normalmente.
A opção mais ideal é limpar amortecedores em deinit e é isso. Mas a limpeza não ajuda...
Em ME, por favor mostrar ALT+M na lista de funções/métodos o tipo de valor de retorno.
Seria bom introduzir uma distinção no tipo de corda, uma vez que é usada noutras línguas para uma corda comum e uma corda "crua". Penso que chegaremos a isto de qualquer forma, mas na fase inicial eliminaria muitos problemas no futuro.
Por exemplo Python usa r "string" para criar uma string "cruaQual é a razão para não se produzirem totalmente os registos no testador? Tudo o que se pode ver foi examinado e verificado, não há melhor que isso.
Qual é a razão para os registos não serem totalmente afixados no testador? Tudo o que pode ser examinado - examinado e verificado, não pode ser superado.
Muitas entradas. Ver ficheiro de registo.