Es posible escribir una utilidad que cambie cualquier línea/histograma (etc.) de un indicador arbitrario según el principio mostrado en el vídeo.
¡Bien hecho! ¡Muchas gracias!
He adaptado el código para incluir los ajustes de peso de línea y estilo:
//+------------------------------------------------------------------+ //| Custom Moving Average Input Colour.mq5 | //| Copyright 2009-2017, MetaQuotes Software Corp. //|http://www.mql5.com //+------------------------------------------------------------------+ #property copyright "2009-2017, MetaQuotes Software Corp." #property link "http://www.mql5.com" #property version "1.001" //--- configuración del indicador #property indicator_chart_window #property indicator_buffers 1 #property indicator_plots 1 #property indicator_type1 DRAW_LINE #property indicator_color1 clrRed //--- parámetros de entrada input int InpMAPeriod=13; // Período input int InpMAShift=0; // Turno input ENUM_MA_METHOD InpMAMethod=MODE_SMMA; // Método input color InpColor=clrYellow; // Color input ENUM_LINE_STYLE InpMAStyle=STYLE_SOLID; // Estilo input int InpMAWidth=1; // Anchura //--- tampones indicadores double ExtLineBuffer[]; //+------------------------------------------------------------------+ //| media móvil simple| //+------------------------------------------------------------------+ void CalculateSimpleMA(int rates_total,int prev_calculated,int begin,const double &price[]) { int i,limit; //--- se modificó el primer cálculo o el número de compases if(prev_calculated==0)// primer cálculo { limit=InpMAPeriod+begin; //--- fijar valor vacío para las primeras barras límite for(i=0;i<limit-1;i++) ExtLineBuffer[i]=0.0; //--- calcula el primer valor visible double firstValue=0; for(i=begin;i<limit;i++) firstValue+=price[i]; firstValue/=InpMAPeriod; ExtLineBuffer[limit-1]=firstValue; } else limit=prev_calculated-1; //--- bucle principal for(i=limit;i<rates_total && !IsStopped();i++) ExtLineBuffer[i]=ExtLineBuffer[i-1]+(price[i]-price[i-InpMAPeriod])/InpMAPeriod; //--- } //+------------------------------------------------------------------+ //| media móvil exponencial| //+------------------------------------------------------------------+ void CalculateEMA(int rates_total,int prev_calculated,int begin,const double &price[]) { int i,limit; double SmoothFactor=2.0/(1.0+InpMAPeriod); //--- se modificó el primer cálculo o el número de compases if(prev_calculated==0) { limit=InpMAPeriod+begin; ExtLineBuffer[begin]=price[begin]; for(i=begin+1;i<limit;i++) ExtLineBuffer[i]=price[i]*SmoothFactor+ExtLineBuffer[i-1]*(1.0-SmoothFactor); } else limit=prev_calculated-1; //--- bucle principal for(i=limit;i<rates_total && !IsStopped();i++) ExtLineBuffer[i]=price[i]*SmoothFactor+ExtLineBuffer[i-1]*(1.0-SmoothFactor); //--- } //+------------------------------------------------------------------+ //| media móvil ponderada lineal| //+------------------------------------------------------------------+ void CalculateLWMA(int rates_total,int prev_calculated,int begin,const double &price[]) { int i,limit; static int weightsum; double sum; //--- se modificó el primer cálculo o el número de compases if(prev_calculated==0) { weightsum=0; limit=InpMAPeriod+begin; //--- fijar valor vacío para las primeras barras límite for(i=0;i<limit;i++) ExtLineBuffer[i]=0.0; //--- calcula el primer valor visible double firstValue=0; for(i=begin;i<limit;i++) { int k=i-begin+1; weightsum+=k; firstValue+=k*price[i]; } firstValue/=(double)weightsum; ExtLineBuffer[limit-1]=firstValue; } else limit=prev_calculated-1; //--- bucle principal for(i=limit;i<rates_total && !IsStopped();i++) { sum=0; for(int j=0;j<InpMAPeriod;j++) sum+=(InpMAPeriod-j)*price[i-j]; ExtLineBuffer[i]=sum/weightsum; } //--- } //+------------------------------------------------------------------+ //| media móvil suavizada| //+------------------------------------------------------------------+ void CalculateSmoothedMA(int rates_total,int prev_calculated,int begin,const double &price[]) { int i,limit; //--- se modificó el primer cálculo o el número de compases if(prev_calculated==0) { limit=InpMAPeriod+begin; //--- fijar valor vacío para las primeras barras límite for(i=0;i<limit-1;i++) ExtLineBuffer[i]=0.0; //--- calcula el primer valor visible double firstValue=0; for(i=begin;i<limit;i++) firstValue+=price[i]; firstValue/=InpMAPeriod; ExtLineBuffer[limit-1]=firstValue; } else limit=prev_calculated-1; //--- bucle principal for(i=limit;i<rates_total && !IsStopped();i++) ExtLineBuffer[i]=(ExtLineBuffer[i-1]*(InpMAPeriod-1)+price[i])/InpMAPeriod; //--- } //+------------------------------------------------------------------+ //| Función de inicialización del indicador personalizada | //+------------------------------------------------------------------+ void OnInit() { //--- asignación de búferes indicadores SetIndexBuffer(0,ExtLineBuffer,INDICATOR_DATA); //--- fijar precisión IndicatorSetInteger(INDICATOR_DIGITS,_Digits+1); //--- establece la primera barra a partir de la cual se dibujará el índice PlotIndexSetInteger(0,PLOT_DRAW_BEGIN,InpMAPeriod); //---- la línea se desplaza al dibujar PlotIndexSetInteger(0,PLOT_SHIFT,InpMAShift); //--- línea de color PlotIndexSetInteger(0,PLOT_LINE_COLOR,InpColor); //--- línea de estilo PlotIndexSetInteger(0,PLOT_LINE_STYLE,InpMAStyle); //--- línea de anchura PlotIndexSetInteger(0,PLOT_LINE_WIDTH,InpMAWidth); //--- nombre para DataWindow string short_name="unknown ma"; switch(InpMAMethod) { case MODE_EMA : short_name="EMA"; break; case MODE_LWMA : short_name="LWMA"; break; case MODE_SMA : short_name="SMA"; break; case MODE_SMMA : short_name="SMMA"; break; } IndicatorSetString(INDICATOR_SHORTNAME,short_name+"("+string(InpMAPeriod)+")"); //---- establece la línea de dibujo valor vacío-- PlotIndexSetDouble(0,PLOT_EMPTY_VALUE,0.0); //---- inicialización realizada } //+------------------------------------------------------------------+ //| Media móvil| //+------------------------------------------------------------------+ int OnCalculate(const int rates_total, const int prev_calculated, const int begin, const double &price[]) { //--- comprobar el recuento de barras if(rates_total<InpMAPeriod-1+begin) return(0);// no hay suficientes barras para el cálculo //--- se modificó el primer cálculo o el número de compases if(prev_calculated==0) ArrayInitialize(ExtLineBuffer,0); //--- fija la primera barra a partir de la cual se dibujará el índice PlotIndexSetInteger(0,PLOT_DRAW_BEGIN,InpMAPeriod-1+begin); //--- cálculo switch(InpMAMethod) { case MODE_EMA: CalculateEMA(rates_total,prev_calculated,begin,price); break; case MODE_LWMA: CalculateLWMA(rates_total,prev_calculated,begin,price); break; case MODE_SMMA: CalculateSmoothedMA(rates_total,prev_calculated,begin,price); break; case MODE_SMA: CalculateSimpleMA(rates_total,prev_calculated,begin,price); break; } //--- valor de retorno de prev_calculado para la siguiente llamada return(rates_total); } //+------------------------------------------------------------------+
¿Y podríamos añadir la posibilidad de modificar el grosor de la línea desde el EA?
¿Y cómo se modifica a partir del código EA?
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

Custom Moving Average Input Color:
Modificación del indicador "Custom Moving Average": ahora, se puede indicar el color de la línea en los parámetros de entrada.
Autor: Vladimir Karputov