Código Mql4
//+------------------------------------------------------------------+ //| SpearmanRankCorrelation_Histogram.mq4 | //| Copyright © 2007, MetaQuotes Software Corp. //| http://www.metaquotes.net //+------------------------------------------------------------------+ // http://www.infamed.com/stat/s05.html #property copyright "Copyright © 2007, MetaQuotes Software Corp." #property link "http://www.metaquotes.net" //---- número da versão do indicador #property version "1.00" //---- renderização do indicador em uma janela separada #property indicator_separate_window //---- número de buffers indicadores 1 #property indicator_buffers 1 //---- apenas uma construção gráfica foi usada #property indicator_plots 1 //+----------------------------------------------+ //| Parâmetros do desenho do indicador //+----------------------------------------------+ //---- desenhando o indicador como um histograma #property indicator_type1 DRAW_HISTOGRAM //----, pois a cor do histograma é usada #property indicator_color1 clrViolet //---- linha do indicador é sólida #property indicator_style1 STYLE_SOLID //---- espessura da linha do indicador é 2 #property indicator_width1 2 //+----------------------------------------------+ //---- parâmetros de valores mínimos e máximos do indicador #property indicator_minimum -1.0 #property indicator_maximum +1.0 //+----------------------------------------------+ //|| Parâmetros de entrada do indicador //+----------------------------------------------+ input int rangeN=14; input int CalculatedBars=0; input int Maxrange=30; input bool direction=true; input double inHighLevel=+0.5; input double inLowLevel=-0.5; //+----------------------------------------------+ //---- Declaração de variáveis inteiras do ponto inicial de dados int min_rates_total; //---- declaração de matrizes dinâmicas que serão usadas posteriormente como buffers de indicadores double IndBuffer[],ColorIndBuffer[]; double multiply; double R2[],TrueRanks[]; int PriceInt[],SortInt[],Maxrange_; //+------------------------------------------------------------------+ //| calcular a função RSP| //+------------------------------------------------------------------+ double SpearmanRankCorrelation(double &Ranks[],int N) { //---- double res,z2=0.0; for(int iii=0; iii<N; iii++) z2+=MathPow(Ranks[iii]-iii-1,2); res=1-6*z2/(MathPow(N,3)-N); //---- return(res); } //+------------------------------------------------------------------+ //| Função de matriz de classificação de preços| //+------------------------------------------------------------------+ void RankPrices(double &TrueRanks_[],int &InitialArray[]) { //---- int i,k,m,dublicat,counter,etalon; double dcounter,averageRank; ArrayCopy(SortInt,InitialArray,0,0,WHOLE_ARRAY); for(i=0; i<rangeN; i++) TrueRanks_[i]=i+1; ArraySort(SortInt); for(i=0; i<rangeN-1; i++) { if(SortInt[i]!=SortInt[i+1]) continue; dublicat=SortInt[i]; k=i+1; counter=1; averageRank=i+1; while(k<rangeN) { if(SortInt[k]==dublicat) { counter++; averageRank+=k+1; k++; } else break; } dcounter=counter; averageRank=averageRank/dcounter; for(m=i; m<k; m++) TrueRanks_[m]=averageRank; i=k; } for(i=0; i<rangeN; i++) { etalon=InitialArray[i]; k=0; while(k<rangeN) { if(etalon==SortInt[k]) { R2[i]=TrueRanks_[k]; break; } k++; } } //---- return; } //+------------------------------------------------------------------+ //| Função de inicialização do indicador personalizado //+------------------------------------------------------------------+ void OnInit() { //---- alocação de memória para matrizes variáveis ArrayResize(R2,rangeN); ArrayResize(PriceInt,rangeN); ArrayResize(SortInt,rangeN); //---- alteração da indexação de elementos na matriz de variáveis if(direction) ArraySetAsSeries(SortInt,true); ArrayResize(TrueRanks,rangeN); //---- inicialização de variáveis if(Maxrange<=0) Maxrange_=10; else Maxrange_=Maxrange; multiply=MathPow(10,_Digits); //---- transformando a matriz dinâmica IndBuffer em um buffer de indicador SetIndexBuffer(0,IndBuffer,INDICATOR_DATA); //---- deslocamento da contagem regressiva do início do desenho do indicador PlotIndexSetInteger(0,PLOT_DRAW_BEGIN,rangeN); //---- configuração de valores de indicadores que não serão visíveis no gráfico PlotIndexSetDouble(0,PLOT_EMPTY_VALUE,EMPTY_VALUE); //---- proibição de exibir valores do indicador no canto superior esquerdo da janela do indicador PlotIndexSetInteger(0,PLOT_SHOW_DATA,false); //---- indexação de itens no buffer como em séries temporais ArraySetAsSeries(IndBuffer,true); //---- inicialização da variável para o nome curto do indicador string shortname; if(rangeN>Maxrange_) shortname="Decrease rangeN input!"; else StringConcatenate(shortname,"SpearmanRankCorrelation_Histogram(",rangeN,")"); //--- criando um rótulo a ser exibido na DataWindow PlotIndexSetString(0,PLOT_LABEL,shortname); //--- criação de um nome a ser exibido em uma subjanela e dica de ferramenta separadas IndicatorSetString(INDICATOR_SHORTNAME,shortname); //--- determinar a precisão da exibição dos valores do indicador IndicatorSetInteger(INDICATOR_DIGITS,2); //---- número de níveis horizontais do indicador IndicatorSetInteger(INDICATOR_LEVELS,3); //---- valores dos níveis horizontais do indicador IndicatorSetDouble(INDICATOR_LEVELVALUE,0,inHighLevel); IndicatorSetDouble(INDICATOR_LEVELVALUE,1,0); IndicatorSetDouble(INDICATOR_LEVELVALUE,2,inLowLevel); //---- cores rosa e azul são usadas como cores das linhas de nível horizontais IndicatorSetInteger(INDICATOR_LEVELCOLOR,0,clrMagenta); IndicatorSetInteger(INDICATOR_LEVELCOLOR,1,clrGray); IndicatorSetInteger(INDICATOR_LEVELCOLOR,2,clrBlue); //---- uma linha tracejada curta é usada na linha de nível horizontal IndicatorSetInteger(INDICATOR_LEVELSTYLE,0,STYLE_DASHDOTDOT); IndicatorSetInteger(INDICATOR_LEVELSTYLE,1,STYLE_DASH); IndicatorSetInteger(INDICATOR_LEVELSTYLE,2,STYLE_DASHDOTDOT); //---- } //+------------------------------------------------------------------+ //| Função de iteração de indicador personalizado //+------------------------------------------------------------------+ int OnCalculate(const int rates_total, // quantidade de histórico em barras no tique atual const int prev_calculated,// quantidade de histórico em barras no tique anterior const datetime &time[], const double &open[], const double& high[], // array de preços máximos para o cálculo do indicador const double& low[], // matriz de preços mínimos para o cálculo do indicador const double &close[], const long &tick_volume[], const long &volume[], const int &spread[]) { //---- verificar se o número de barras é suficiente para o cálculo if(rates_total<rangeN) return(0); if(rangeN>Maxrange_) return(0); //---- declarações de variáveis locais int limit; //---- calculando o número do limite inicial para o ciclo de recálculo da barra if(prev_calculated>rates_total || prev_calculated<=0) // verificar o primeiro início do cálculo do indicador { limit=rates_total-2-rangeN; // número inicial para o cálculo de todas as barras } else { if(!CalculatedBars) limit = rates_total - prev_calculated; else limit = CalculatedBars; } //---- indexação de elementos em matrizes como em séries temporais ArraySetAsSeries(close,true); //---- ciclo de cálculo do indicador principal for(int bar=limit; bar>=0 && !IsStopped(); bar--) { for(int k=0; k<rangeN; k++) PriceInt[k]=int(close[bar+k]*multiply); RankPrices(TrueRanks,PriceInt); IndBuffer[bar]=SpearmanRankCorrelation(R2,rangeN); } //---- return(rates_total); } //+------------------------------------------------------------------+
Arquivos anexados:
Você está perdendo oportunidades de negociação:
- Aplicativos de negociação gratuitos
- 8 000+ sinais para cópia
- Notícias econômicas para análise dos mercados financeiros
Registro
Login
Você concorda com a política do site e com os termos de uso
Se você não tem uma conta, por favor registre-se
SpearmanRankCorrelation_Histogram:
Indicador SpearmanRankCorrelation implementado na forma de histograma colorido.
Autor: Nikolay Kositsin