Gracias por otro buen artículo. Tradicionalmente, los artículos de la Comunidad MQL se han convertido en una manera para mí para obtener una educación post-secundaria (es decir, la guía del editor MQL incorporado).
Sobre el punto, me di cuenta de un pequeño defecto en el código. Según la idea del autor
//--- bandera para la salida única de valores price[]
variable
bool printed=false;
debería moverse fuera de la función OnCalculate(), de lo contrario la impresión del array ocurrirá en cada evento.
También hay una errata aquí
Правило передачи PLOT_DRAW_BEGIN в параметр begin: Значение входного параметра begin в OnCalculate(), при расчетах пользовательского индикатора A на данных другого (базового) индикатора B, всегда равно значению свойства PLOT_DRAW_BEGIN нулевого графического построения базового индикатора B.
Así, si creamos un indicador RSI (indicador A) con un periodo de 14 y luego construimos nuestro indicador personalizado True Strength Index (indicador B) sobre los datos del indicador RSI(14), entonces:
A juzgar por la regla y la lógica, el indicador A es TSI personalizado y el indicador B(básico) es RSI.

- www.mql5.com
Este artículo contiene el conocimiento detallado.
Gracias.
Hola,
Este artículo es realmente interesante y abrir nuevas oportunidades para gestionar los indicadores.
Como soy un principiante en MQL5, He tratado de poner en práctica la posibilidad de aplicar un indicador a otro. He escrito un pequeño código que sólo duplicar
una media móvil adaptativa con la esperanza de poder utilizarla en cualquier indicador del gráfico.
Desgraciadamente, en la lista de parámetros que aparece al lanzar el indicador no tengo el caso "aplicar a : datos del indicador anterior".
¿Cómo debería organizarse el código para tener la posibilidad de aplicarlo a otro indicador?
Aquí está mi código:
#property indicator_separate_window #property indicator_minimum 1.3 #property indicator_maximum 1.35 //#propiedad indicator_chart_window #property indicator_buffers 2 #property indicator_plots 1 //--- trazar dMA #property indicator_label1 "dAMA" #property indicator_type1 DRAW_LINE #property indicator_color1 Red #property indicator_style1 STYLE_SOLID #property indicator_width1 1 //--- parámetros de entrada input int AMAPeriod=9; input int FastEMA=2; input int SlowEMA=20; //--- tampones indicadores double AMABuffer[]; double dAMABuffer[]; int h_dAMA; int h_AMA; //+------------------------------------------------------------------+ //| Función de inicialización del indicador personalizada | //+------------------------------------------------------------------+ int OnInit() { //--- asignación de búferes indicadores SetIndexBuffer(0,dAMABuffer,INDICATOR_DATA); SetIndexBuffer(1,AMABuffer,INDICATOR_CALCULATIONS); //PlotIndexSetInteger(0,PLOT_DRAW_BEGIN,MAPeriod+1); h_AMA=iAMA(_Symbol,PERIOD_CURRENT,AMAPeriod,FastEMA,SlowEMA,0,PRICE_CLOSE); if(h_AMA == INVALID_HANDLE) { Print("AMA indicator initialization error, Code = ", GetLastError()); return(-1); } ArraySetAsSeries(AMABuffer,true); ArraySetAsSeries(dAMABuffer,true); PlotIndexSetInteger(0,PLOT_DRAW_BEGIN,MathMax(AMAPeriod,SlowEMA)); //--- return(0); } //+------------------------------------------------------------------+ //| Función de iteración del indicador personalizada| //+------------------------------------------------------------------+ int OnCalculate(const int rates_total, // tamaño de la matriz price[] const int prev_calculated,// número de barras procesadas en la llamada anterior const int begin, // de dónde parten los datos significativos const double &price[] // matriz para el cálculo ) { if(BarsCalculated(h_AMA)<rates_total) return(0); //--- podemos copiar no todos los datos int to_copy; if(prev_calculated>rates_total || prev_calculated<=0) { to_copy=rates_total; if(CopyBuffer(h_AMA,0,0,to_copy,AMABuffer)<=0) return(0); for (int i=0;i<to_copy-MathMax(AMAPeriod,SlowEMA);i++) { dAMABuffer[i]=AMABuffer[i]; } } else { to_copy=rates_total-prev_calculated+MathMax(AMAPeriod,SlowEMA)-1; //--- el último valor siempre se copia to_copy++; if(CopyBuffer(h_AMA,0,0,to_copy,AMABuffer)<=0) return(0); for (int i=0;i<to_copy;i++) { dAMABuffer[i]=AMABuffer[i]; } } //--- intenta copiar Print(dAMABuffer[0]); //para ver si llegamos hasta el final //--- valor de retorno de prev_calculado para la siguiente llamada //--- //--- valor de retorno de prev_calculado para la siguiente llamada return(rates_total); } //+------------------------------------------------------------------+
Hola,
He entendido el problema: sólo se puede aplicar un indicador a otro que esté en la misma ventana.
¿Tienes alguna idea de cómo aplicar un indicador (y mostrarlo en una ventana separada) a otro que está en la ventana principal?
Gracias
Saludos
¿Existe alguna posibilidad de crear un indicador mediante programación (a través de iCustom, por ejemplo) y decirle que tome los datos de otro indicador como entrada? O, mejor aún, para darle una matriz directa de los datos sobre los que se debe construir.
¿Existe alguna posibilidad de crear un indicador mediante programación (a través de iCustom, por ejemplo) y decirle que tome los datos de otro indicador como entrada? O, mejor aún, darle directamente un array de datos sobre el que debería construirse.
Véase la función iCustom:
Si se utiliza la primera forma de llamada en el indicador, al lanzar un indicador personalizado en la pestaña "Parámetros" puede especificar adicionalmente sobre qué datos se calculará. Si no se selecciona explícitamente el parámetro "Aplicar a", entonces por defecto el cálculo se realiza por valores de "Cierre".
Cuando se llama a un indicador personalizado desde un programa mql5, el parámetro Applied_Price o el handle de otro indicador debe pasarse en último lugar después de todas las variables de entrada proporcionadas por el indicador personalizado.
Hola,
Este es un artículo muy bueno, pero tengo algunas preguntas.
1. Sólo los indicadores que utiliza la forma corta de la OnCalculate() llamada a la función, puede ser applaied a otro indicador o los indicadores que utilizan la forma larga de la OnCalculate() llamada a la función se puede aplicar también? En caso afirmativo, ¿cómo se puede aplicar un indicador con la forma larga de la llamada a la funciónOnCalculate() a otro indicador?
2. La aplicación de un indicador a otro (TSI sobre RSI) genera algunos problemas de visualización (ver imagen adjunta). Mientras que el RSI se representa de 0 a 100, el segundo indicador (TSI) también tiene valores por debajo de 0, valores que no son visibles en el gráfico. Cual es el problema y porque el gráfico no se ajusta para mostrar correctamente ambos indicadores. ¿Podemos solucionar este problema o es un error de MetaTrader?
Decidí construir un indicador a partir de un indicador y me encontré con una confusión.
Ambos indicadores están construidos sobre la base
int OnCalculate (const int rates_total, // precio[] tamaño de la matriz const int prev_calculated, // barras procesadas en la llamada anterior const int begin, // índice a partir del cual comienzan los datos significativos в массиве price[] const double& price[] // matriz para el cálculo );
En consecuencia, el usuario tiene la posibilidad de establecer el campo applied_price en los parámetros.
Mi dificultad es ¿cómo pasar el campo applied_price al indicador interno (a partir del cual se construye el indicador externo)?
La solución más sencilla es hacer una entrada y advertir al usuario que la entrada applied_price y el parámetro applied_price deben ser el mismo, pero esto es un poco torcido.
¿Ha mirado el ejemplo de OnCalculate()?
Для получения значений пользовательского индикатора из других mql5-программ используется функция iCustom(), возвращающая хэндл индикатора для последующих операций. При этом также можно указать необходимый массив price[] или хэндл другого индикатора. Этот параметр должен передаваться последним в списке входных переменных пользовательского индикатора.
Пример:
void OnStart() { //--- string terminal_path=StatusInfoString(STATUS_TERMINAL_PATH); int handle_customMA=iCustom(Symbol(),PERIOD_CURRENT, "Custom Moving Average",13,0, MODE_EMA,PRICE_TYPICAL); if(handle_customMA>0) Print("handle_customMA = ",handle_customMA); else Print("Cannot open or not EX5 file '"+terminal_path+"\\MQL5\\Indicators\\"+"Custom Moving Average.ex5'"); }
En este ejemplo, el último parámetro pasado es el valor PRICE_TYPICAL (de la enumeración ENUM_APPLIED_PRICE ), que indica que el indicador personalizado se construirá por precios típicos obtenidos como (High+Low+Close)/3. Si no se especifica el parámetro, el indicador se construye por los valores de PRICE_CLOSE, es decir, por los precios de cierre de cada barra.
Sí, lo he mirado,
int handle_customMA=iCustom(Symbol(),PERIOD_CURRENT, "Custom Moving Average",13,0, MODE_EMA,PRICE_TYPICAL);
applied_price se especifica explícitamente cuando se llama a iCustom, pero en el indicador desde el que se llama a iCustom, ¿de dónde se saca?
Porque el usuario lo pone en los parámetros, no en las entradas.
int OnInit() { //--- asignación de búferes indicadores SetIndexBuffer(0,Buffer,INDICATOR_DATA); hndl=iCustom(_Symbol,_Period,"MyInd",param_ind,???? вот тут нужно указать аплиед_прайс который будет задавать пользователь); //--- return(0); } //+------------------------------------------------------------------+ //| Función de iteración del indicador personalizada | //+------------------------------------------------------------------+ int OnCalculate(const int rates_total, const int prev_calculated, const int begin, const double &price[]) { //... return(rates_total); }
PD el truco está en que el usuario habiendo fijado una vez el parámetro applied_price y no más no se molestó, en que este valor recorriera toda la pirámide de llamadas.

- Aplicaciones de trading gratuitas
- 8 000+ señales para copiar
- Noticias económicas para analizar los mercados financieros
Usted acepta la política del sitio web y las condiciones de uso
Artículo publicado Aplicar un Indicador a Otro:
Al escribir un indicador que usa la forma corta de la llamada de función OnCalculate(), puede que no se dé cuenta del hecho de que un indicador se puede calcular no solo por datos de precio, sino también por datos de otro indicador (independientemente de si viene incorporado o es personalizado). ¿Desea mejorar un indicador para su correcta aplicación a los datos del otro indicador? En este artículo, revisaremos todos los pasos para realizar tal modificación.
Autor: MetaQuotes Software Corp.