Preguntas de los principiantes MQL5 MT5 MetaTrader 5 - página 838

 

En mql4 utilicé iCustom para hacer indicadores que utilizan los indicadores ya hechos de otra persona, aunque no sé nada de programación... Ya he tenido suficiente con la intuición. Estoy utilizando mql5 pero no funciona nada, por mucho que intente entenderlo. Por favor, ayúdeme, por favor.

Tengo este indicador en ex5. Lo puse en mi carpeta de descargas. Quiero tomar sus dos líneas y dibujarlas en el gráfico en otros periodos, es decir, hacerlo multitime frame con iCustom.

Como no puedo escribir un indicador desde cero, he tomado el código de un simple indicador Bears Power. Ahí no he cambiado nada, salvo cambiar indicator_chart_window y DRAW_LINE y la línea, que, a mi entender, debería sacar los datos del primer buffer con parámetros por defecto del TF actual:

ExtBearsBuffer[i]=iCustom(NULL,0,"Downloads\\RSI Analytics");

Todo se compila, nada se dibuja. ¿Qué más necesita? :(

#property copyright   "2009, MetaQuotes Software Corp."
#property link        "http://www.mql5.com"
#property description "Bears Power"
//--- indicator settings
#property indicator_chart_window                      //---------------------------------
#property indicator_buffers 2
#property indicator_plots   1
#property indicator_type1   DRAW_LINE                 //---------------------------------------
#property indicator_color1  Silver
#property indicator_width1  2
//--- input parameters
input int InpBearsPeriod=13; // Period
//--- indicator buffers
double    ExtBearsBuffer[];
double    ExtTempBuffer[];
//--- handle of EMA 
int       ExtEmaHandle;
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
void OnInit()
  {
//--- indicator buffers mapping
   SetIndexBuffer(0,ExtBearsBuffer,INDICATOR_DATA);
   SetIndexBuffer(1,ExtTempBuffer,INDICATOR_CALCULATIONS);
//---
   IndicatorSetInteger(INDICATOR_DIGITS,_Digits+1);
//--- sets first bar from what index will be drawn
   PlotIndexSetInteger(0,PLOT_DRAW_BEGIN,InpBearsPeriod-1);
//--- name for DataWindow and indicator subwindow label
   IndicatorSetString(INDICATOR_SHORTNAME,"Bears("+(string)InpBearsPeriod+")");
//--- get MA handle
   ExtEmaHandle=iMA(NULL,0,InpBearsPeriod,0,MODE_EMA,PRICE_CLOSE);
//--- initialization done
  }
//+------------------------------------------------------------------+
//| Average True Range                                               |
//+------------------------------------------------------------------+
int OnCalculate(const int rates_total,
                const int prev_calculated,
                const datetime &Time[],
                const double &Open[],
                const double &High[],
                const double &Low[],
                const double &Close[],
                const long &TickVolume[],
                const long &Volume[],
                const int &Spread[])
  {
   int i,limit;
//--- check for bars count
   if(rates_total<InpBearsPeriod)
      return(0);// not enough bars for calculation   
//--- not all data may be calculated
   int calculated=BarsCalculated(ExtEmaHandle);
   if(calculated<rates_total)
     {
      Print("Not all data of ExtEmaHandle is calculated (",calculated,"bars ). Error",GetLastError());
      return(0);
     }
//--- we can copy not all data
   int to_copy;
   if(prev_calculated>rates_total || prev_calculated<0) to_copy=rates_total;
   else
     {
      to_copy=rates_total-prev_calculated;
      if(prev_calculated>0) to_copy++;
     }
//---- get ma buffers
   if(IsStopped()) return(0); //Checking for stop flag
   if(CopyBuffer(ExtEmaHandle,0,0,to_copy,ExtTempBuffer)<=0)
     {
      Print("getting ExtEmaHandle is failed! Error",GetLastError());
      return(0);
     }
//--- first calculation or number of bars was changed
   if(prev_calculated<InpBearsPeriod)
      limit=InpBearsPeriod;
   else limit=prev_calculated-1;
//--- the main loop of calculations
   for(i=limit;i<rates_total && !IsStopped();i++)
     {
      ExtBearsBuffer[i]=iCustom(NULL,0,"Downloads\\RSI Analytics"); \\--------------------------------------------
     }
//--- return value of prev_calculated for next call
   return(rates_total);
  }
//+------------------------------------------------------------------+
Технический индикатор RSI ANALYTICS
Технический индикатор RSI ANALYTICS
  • comentarios: 5
  • 2013.11.01
  • STRAT ANALYTICS
  • www.mql5.com
Зачем нам RSI в отдельном окне, если его можно построить в основном окне графика, что гораздо более понятно? RSI ANALYTICS - это индикатор, следящий за рынком, созданный на основе той же идеи, что и традиционный RSI (индекс относительной силы). При этом он строится не в отдельном подокне, а в том же окне, что и график цены финансового...
 
Nilog:

En mql4 utilicé iCustom para hacer indicadores que utilizan los indicadores ya hechos de otra persona, aunque no sé nada de programación... Ya he tenido suficiente con la intuición. Estoy usando mql5 pero nada funciona, por más que intente entenderlo. Por favor, ayúdeme, por favor.

Tengo este indicador en ex5. Lo puse en mi carpeta de descargas. Quiero tomar sus dos líneas y dibujarlas en el gráfico en otros periodos, es decir, hacerlo multitime frame con iCustom.

Como no puedo escribir un indicador desde cero, he tomado el código de un simple indicador Bears Power. Ahí no he cambiado nada, salvo cambiar indicator_chart_window y DRAW_LINE y la línea, que, a mi entender, debería sacar los datos del primer buffer con parámetros por defecto del TF actual:

Todo se compila, nada se dibuja. ¿Qué más necesita? :(

En mql5 el trabajo con los indicadores personalizados y estándar está organizado de forma diferente que en mql4. Si en mql4 sólo se puede obtener un valor de indicador a través de iCustom, en mql5 se pueden obtener valores de indicador para toda la profundidad de la historia en el array. La segunda diferencia importante es el sentido de la indexación en los topes de los indicadores.

Es tedioso revisar todo el código y cotejarlo con el original, así que sólo señalaré los principales:

El archivo debe estar ubicado en la carpeta de Indicadores o en una subcarpeta ubicada en la misma de Indicadores.

Esta es la cadena para obtener la manija del indicador MA

ExtEmaHandle=iMA(NULL,0,InpBearsPeriod,0,MODE_EMA,PRICE_CLOSE);

y esta es la cadena para obtener el valor del indicador MA

if(CopyBuffer(ExtEmaHandle,0,0,to_copy,ExtTempBuffer)<=0)

en este caso a un buffer o array adicional.

Resulta que para obtener los datos del indicador personalizado

ExtBearsHandle=iCustom(NULL,0,"RSI Analytics");
CopyBuffer(ExtBearsHandle,0,0,to_copy,ExtTempBuffer)

Y entonces puedes procesar los valores del indicador desde este buffer adicional de alguna manera, o puedes ponerlos en el buffer del indicador sin olvidar la dirección de la indexación.

 
Alexey Viktorov:


Gracias. Escribí algo como lo entendí, y ahora sólo aparece un error al compilar. En la línea

CopyBuffer(ExtBearsHandle,0,0,to_copy,ExtTempBuffer);

errorto_copy - identificador no declarado.

¿En qué sección y cómo lo declaro?

 
Nilog:

Gracias. Escribí algo como lo entendí, y ahora sólo aparece un error al compilar. En la línea

errorto_copy - identificador no declarado.

¿En qué sección y cómo lo declaro?

Tienes que comparar mis pistas con tu código y con el código fuente que ya has arreglado. Esta variable se declara en esos códigos. Y además de mis observaciones, deberías tratar de entender la lógica de los indicadores de construcción en general, y no sólo cambiar una mierda por otra.

 
En MetaTrader 5, ¿puede un EA trabajar de forma diferente en una moneda que, por ejemplo, en el índice RTS?
 
lil_lil:
En MetaTrader 5, ¿puede el rendimiento de un EA en un par de divisas ser radicalmente diferente del rendimiento, por ejemplo, en el índice RTS?

El consejero trabajará como está escrito. Y no de otra manera.

En cuanto a los matices que hay que tener en cuenta: el RTS es una bolsa, de ahí que las posiciones contables sean del tipo NETTING. Si el EA no está diseñado originalmente para trabajar en la red, el resultado es imprevisible.

 
Vladimir Karputov:

El consejero trabajará como está escrito. Y no de otra manera.

En cuanto a los matices que hay que tener en cuenta: el RTS es una bolsa, de ahí que las posiciones contables sean del tipo NETTING. Si el EA no está diseñado originalmente para trabajar en la red, el resultado es imprevisible.

Si su EA no está pensadopara trabajar en red, el resultado es imprevisible.

No hay posiciones multidireccionales en la estrategia.

 
lil_lil:

Gracias, cómo se sabe con seguridad por el código si está diseñadopara trabajar en la red o no.

En la estrategia no hay posiciones dirigidas en sentido contrario.

Y, si es así (siempre una posición en el trabajo), entonces no hay ninguna diferencia, ya sea por compensación o por cobertura.

 
Vladimir Karputov:

Si este es el caso (siempre hay UNA posición en funcionamiento), no hay ninguna diferencia entre la compensación o la cobertura.

En una señal inversa en divisas (Forex) las posiciones se cierran, pero no en la bolsa. ¿Dónde buscar, qué buscar?

 
lil_lil:

En una señal inversa en divisas, las posiciones se cierran, pero no en la bolsa. ¿Dónde buscar, qué buscar?

Buscar el lugar de donde proviene la orden de cerrar la posición.