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 de versión del indicador #property version "1.00" //---- representación del indicador en una ventana separada #property indicator_separate_window //---- número de búferes indicadores 1 #property indicator_buffers 1 //---- sólo se utilizó una construcción gráfica #property indicator_plots 1 //+----------------------------------------------+ //| Parámetros del dibujo del indicador | //+----------------------------------------------+ //---- dibujar el indicador como un histograma #property indicator_type1 DRAW_HISTOGRAM //---- ya que se utiliza el color del histograma #property indicator_color1 clrViolet //---- la línea indicadora es sólida #property indicator_style1 STYLE_SOLID //---- el grosor de la línea indicadora es 2 #property indicator_width1 2 //+----------------------------------------------+ //---- parámetros de los valores mínimo y máximo del indicador #property indicator_minimum -1.0 #property indicator_maximum +1.0 //+----------------------------------------------+ //|| Parámetros de entrada del 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; //+----------------------------------------------+ //---- Declaración de variables enteras del punto de inicio de datos int min_rates_total; //---- declaración de matrices dinámicas que se utilizarán posteriormente como búferes indicadores double IndBuffer[],ColorIndBuffer[]; double multiply; double R2[],TrueRanks[]; int PriceInt[],SortInt[],Maxrange_; //+------------------------------------------------------------------+ //| calcular la función 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); } //+------------------------------------------------------------------+ //| Función de clasificación de precios| //+------------------------------------------------------------------+ 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; } //+------------------------------------------------------------------+ //| Función de inicialización del indicador personalizada | //+------------------------------------------------------------------+ void OnInit() { //---- asignación de memoria para matrices de variables ArrayResize(R2,rangeN); ArrayResize(PriceInt,rangeN); ArrayResize(SortInt,rangeN); //---- cambio de indexación de elementos en el array de variables if(direction) ArraySetAsSeries(SortInt,true); ArrayResize(TrueRanks,rangeN); //---- inicialización de variables if(Maxrange<=0) Maxrange_=10; else Maxrange_=Maxrange; multiply=MathPow(10,_Digits); //---- convertir matriz dinámica IndBuffer en buffer indicador SetIndexBuffer(0,IndBuffer,INDICATOR_DATA); //---- desplazamiento del dibujo del indicador inicio de la cuenta atrás PlotIndexSetInteger(0,PLOT_DRAW_BEGIN,rangeN); //---- configuración de los valores de los indicadores que no serán visibles en el gráfico PlotIndexSetDouble(0,PLOT_EMPTY_VALUE,EMPTY_VALUE); //---- prohibición de mostrar los valores del indicador en la esquina superior izquierda de la ventana del indicador PlotIndexSetInteger(0,PLOT_SHOW_DATA,false); //---- indexación de los elementos en la memoria intermedia como en las series temporales ArraySetAsSeries(IndBuffer,true); //---- inicialización de la variable para el nombre corto del indicador string shortname; if(rangeN>Maxrange_) shortname="Decrease rangeN input!"; else StringConcatenate(shortname,"SpearmanRankCorrelation_Histogram(",rangeN,")"); //--- crear una etiqueta para mostrar en DataWindow PlotIndexSetString(0,PLOT_LABEL,shortname); //--- creación de un nombre que se mostrará en una subventana separada y en un tooltip IndicatorSetString(INDICATOR_SHORTNAME,shortname); //--- determinar la precisión de la visualización de los valores de los indicadores IndicatorSetInteger(INDICATOR_DIGITS,2); //---- número de niveles horizontales del indicador IndicatorSetInteger(INDICATOR_LEVELS,3); //---- valores de los niveles horizontales del indicador IndicatorSetDouble(INDICATOR_LEVELVALUE,0,inHighLevel); IndicatorSetDouble(INDICATOR_LEVELVALUE,1,0); IndicatorSetDouble(INDICATOR_LEVELVALUE,2,inLowLevel); //---- los colores rosa y azul se utilizan como colores de las líneas horizontales de nivel IndicatorSetInteger(INDICATOR_LEVELCOLOR,0,clrMagenta); IndicatorSetInteger(INDICATOR_LEVELCOLOR,1,clrGray); IndicatorSetInteger(INDICATOR_LEVELCOLOR,2,clrBlue); //---- se utiliza una línea discontinua corta en la línea horizontal de nivel IndicatorSetInteger(INDICATOR_LEVELSTYLE,0,STYLE_DASHDOTDOT); IndicatorSetInteger(INDICATOR_LEVELSTYLE,1,STYLE_DASH); IndicatorSetInteger(INDICATOR_LEVELSTYLE,2,STYLE_DASHDOTDOT); //---- } //+------------------------------------------------------------------+ //| Función de iteración del indicador personalizada | //+------------------------------------------------------------------+ int OnCalculate(const int rates_total, // cantidad de historia en barras en el tick actual const int prev_calculated,// cantidad de historia en barras en el tick anterior const datetime &time[], const double &open[], const double& high[], // matriz de precios máximos para el cálculo del indicador const double& low[], // matriz de precios mínimos para el cálculo del indicador const double &close[], const long &tick_volume[], const long &volume[], const int &spread[]) { //---- comprobar si el número de barras es suficiente para el cálculo if(rates_total<rangeN) return(0); if(rangeN>Maxrange_) return(0); //---- declaraciones de variables locales int limit; //---- cálculo del número límite de inicio del ciclo de recálculo de compases if(prev_calculated>rates_total || prev_calculated<=0) // comprobar el primer inicio del cálculo del indicador { limit=rates_total-2-rangeN; // número inicial para el cálculo de todas las barras } else { if(!CalculatedBars) limit = rates_total - prev_calculated; else limit = CalculatedBars; } //---- indexación de elementos en matrices como en timeseries ArraySetAsSeries(close,true); //---- ciclo de cálculo del 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); } //+------------------------------------------------------------------+
Archivos adjuntos:
Está perdiendo oportunidades comerciales:
- Aplicaciones de trading gratuitas
- 8 000+ señales para copiar
- Noticias económicas para analizar los mercados financieros
Registro
Entrada
Usted acepta la política del sitio web y las condiciones de uso
Si no tiene cuenta de usuario, regístrese
SpearmanRankCorrelation_Histogram:
Indicador SpearmanRankCorrelation en forma de un histograma de color
Autor: Nikolay Kositsin