Explicación detallada de iCustom - página 4

 
honest_knave: Nunca supe que se llamaba funda de camello. Gracias.
Parece que el moderador ha borrado mi post anterior porque tenía un enlace a la WikiPedia, así que haz una búsqueda en la WikiPedia (o en Google) para conocer la historia y los detalles del "caso del camello".
 
Fernando Carreiro:
Parece que el moderador ha borrado mi anterior post porque tenía un enlace a la WikiPedia, así que haz una búsqueda en la WikiPedia (o en Google) para conocer la historia y los detalles del "Caso Camello".
Tu post fue eliminado por ser doble. El mismo enlace ya está publicado.
 
Continuando desde #23 y encapsulando en una función #26, ahora muestro una estructura que funciona tanto en MT4 como en MT5. (Para el post-build 600, he cambiado los puntos inválidos(#29) en los nombres de las variables, y apropiar los ints a las enumeraciones estándar).
No compilado, no probado.
struct SFX{                            // SFX indicator at #1
   #define  SFX_NAME_PATH   "SFX"       // Indicator filename without extension,
                                       // including blanks if any.
   enum SFXbuffer{SFX_STD, SFX_STDMA};
   string                  PairName;
   ENUM_TIMEFRAMES         tf;
   int                     StdDev_MA_Period;
   int                     StdDev_MA_Shift;
   ENUM_MA_METHOD          StdDev_MA_Method;
   ENUM_APPLIED_PRICE      StdDev_MA_Price;
   int                     MA_Fast_Period;
   ENUM_MA_METHOD          MA_Fast_Method;
   int                     MA_Fast_Shift;
   #define  CheckOncePerBar true;
   void SFX()      : PairName(_Symbol),            tf(PERIOD_CURRENT),
                     StdDev_MA_Period(12),         StdDev_MA_Shift(0),
                     StdDev_MA_Method(MODE_SMA),   StdDev_MA_Price(PRICE_CLOSE),
                     MA_Fast_Period(3),            MA_Fast_Method(MODE_SMMA),
#ifndef __MQL5__
                     MA_Fast_Shift(0){}
   double get(SFXbuffer buf, int iBar = 0){
      return iCustom(PairName, tf, SFX_NAME_PATH,
                     StdDev_MA_Period,             StdDev_MA_Shift,
                     StdDev_MA_Method,             StdDev_MA_Price,
                     MA_Fast_Period,               MA_Fast_Method,
                     MA_Fast_Shift,                CheckOncePerBar,
                     buf, iBar);
   }  // get
#else // MQL5
                     MA_Fast_Shift(0),             Handle(INVALID_HANDLE){}
   void ~SFX(){   if(Handle != INVALID_HANDLE) IndicatorRelease(Handle);   }
   double get(SFXbuffer buf, int iBar = 0){
      if(Handle == INVALID_HANDLE){
         Handle = iCustom(PairName, tf, SFX_NAME_PATH,
                     StdDev_MA_Period,             StdDev_MA_Shift,
                     StdDev_MA_Method,             StdDev_MA_Price,
                     MA_Fast_Period,               MA_Fast_Method,
                     MA_Fast_Shift,                CheckOncePerBar);
         if(Handle == INVALID_HANDLE){
            PrintFormat("%s: iCustom(%s) Failed: %i",
                        __FUNCTION__, SFX_NAME_PATH, _LastError);
            return 0;
         }
      }
      double  value[1]; CopyBuffer(Handle, buf, iBar, 1, value);
      return  value[0];
   }  // get
 Private:
   int                  Handle;     // MT5 only
#endif   // __MQL5__
}; // SFX
///////////////////////////////////////////////////////////////////////////////
SFX   SFXindicator;
// SFXindicator.StdDev_MA_Period = ...;   // modification of default parameters.
:
double     STDBuffer = SFXindicator.get(SFX_STD,   0);   // example calls
double     stddevma  = SFXindicator.get(SFX_STDMA, 0);
No compilado, no probado.
 

Hola, tengo una pregunta rápida (e indolora, espero) sobre iCustom: digamos que tengo 3 indicadores llamados Ind_A, Ind_B e Ind_C, y tengo un Asesor Experto llamado EA.

el EA llama a los 3 indicadores usando icustom, pasando sus argumentos y obteniendo los resultados indexando sus buffers de respuesta.

Adjunto mis 3 indicadores en el gráfico EURUSD y ejecuto mi EA; centrémonos en el indicador Ind_A, se ejecuta como indicador pero al mismo tiempo es ejecutado por el EA: ¿la instancia es la misma o tenemos dos instancias de ind_A ejecutándose? (es decir, una instancia se ejecuta por sí misma y la otra instancia vive dentro del EA).

¿en este caso, cada instancia tiene su propio buffer? o ¿el buffer es compartido entre todas las instancias del indicador?

Muchas gracias.

 

Perdón por despertar este hilo de nuevo. Pero pensé que mi pregunta pertenece a este tema.

Intento acceder a 2 buffers de un indicador personalizado trend-target, el indicador tiene una entrada = 60, y dos buffers Band UP y Band LO

utilizando

double Value1 = iCustom(Symbol(),0,"TrendTarget.ex4",60,0,1,0);



double Value2 = iCustom(Symbol(),0,"TrendTarget.ex4",60,0,0,1);double Value1 = iCustom(Symbol(),0,"TrendTarget.ex4",60,0,1,0);



Comment("iCustom returned v1= "+Value1+ " and value2= ",Value2);

¿es correcta la forma en que configuro los parámetros para este iCustom? porque parece que no consigo que los valores de Band Up y Band LO no sean exactos a los buffers en el panel de observación de datos, por favor, compruebe la imagen adjunta. Solo los 2 o 3 primeros dígitos decimales o 3e correctos pero para una cotización FX los 4 dígitos deben ser correctos ¿es así?

Espero que el codificador y los usuarios experimentados en MQL5 puede ayudarme a corregir rápidamente este problema? Gracias de antemano

-----------------------------------------------------------------------------------------------------
A propósito de lo que es su indicador tiene 5 entradas y 4 buffers,

double Value1 = iCustom(Symbol(),0,"indicator",a1,a2,a3,a4,a5,1,0,0,0);

double Value2 = iCustom(Symbol(),0,"indicator",a1,a2,a3,a4,a5,0,2,0,0);

double Value3 = iCustom(Symbol(),0,"indicator",a1,a2,a3,a4,a5,0,0,3,0);

double Value4 = iCustom(Symbol(),0,"indicator",a1,a2,a3,a4,a5,0,0,0,4);


Al igual que esto por encima de?

 
ntk2017: Lo siento por despertar este hilo de nuevo. Pero

Por favor, edite su mensaje (original) y utilice el botón CODE (Alt-S). (Para grandes cantidades de código, adjúntelo.)
Reglas generales y mejores prácticas del Foro. - General- Foro de programación MQL5
Editor de mensajes

 
ntk2017: A propósito de lo que es su indicador tiene 5 entradas y 4 buffers,
double Value1 = iCustom(Symbol(),0,"indicator",a1,a2,a3,a4,a5,1,0,0,0);
double Value2 = iCustom(Symbol(),0,"indicator",a1,a2,a3,a4,a5,0,2,0,0);
double Value3 = iCustom(Symbol(),0,"indicator",a1,a2,a3,a4,a5,0,0,3,0);
double Value4 = iCustom(Symbol(),0,"indicator",a1,a2,a3,a4,a5,0,0,0,4);

¿Como esto de arriba?

No, en absoluto.

iCustom(Symbol(),0,"indicator",a1,a2,a3,a4,a5,BufferIndex,BarIndex);
 
William Roeder:

Por supuesto que no.

Debería usar como este
double value1 = iCustom(Symbol(),0,"indicator",a1,a2,a3,a4,a5,1,0,0,0,0); //with BarIndex=0, when only check on close or 1= when check on every tick;
 double value2 = iCustom(Symbol(),0,"indicator",a1,a2,a3,a4,a5,0,1,0,0,0);
double value3 = iCustom(Symbol(),0,"indicator",a1,a2,a3,a4,a5,0,0,1,0,0);
double value4 = iCustom(Symbol(),0,"indicator",a1,a2,a3,a4,a5,0,0,0,1,0);

gracias por tu corrección acabo de encontrar un ejemplo "Uso combinado de programas"(https://book.mql4.com/samples/shared) en mql5 creo que ese ejemplo en codig es lo que necesito. Voy a estudiar esa parte, si tengo dudas en mi programación espero que me ayudes a conseguir que funcione consiguiendo más estabilidad y más beneficio

Combined Use of Programs - Simple Programs in MQL4 - MQL4 Tutorial
Combined Use of Programs - Simple Programs in MQL4 - MQL4 Tutorial
  • book.mql4.com
It was said earlier that according to MQL4 rules trade functions cannot be used in custom indicators, that is why for automated trading Expert Advisors or scripts should be used. However, the resource-saving technology used for calculations in indicators (see Creation of Custom Indicators) is widely used when creating trading programs. In most...
 
William Roeder:

No es así.

Tengo el código de esta manera ahora puedo ver los búferes 1, 2 del TrendTarget (¡¡¡Pero todavía no son los 4 dígitos correctos!!!), pongo el valor de BarsIndex en cada palo a 1 porque me gusta volver a comprobar el TrendTarget

   double shortSma, longSma, ShortSL, ShortTP, LongSL, LongTP,Band_UP,Band_LO;

   double Value1,Value2 ;





   Value1 = iCustom(Symbol(),0,"TrendTarget.ex4",60,1,1);

   Value2 = iCustom(Symbol(),0,"TrendTarget.ex4",60,2,1);

   Band_UP = Value1;

   Band_LO = Value2;

   Comment(" !!!!!!! ICUSTOM returned Value1= "+Value1+ " and value2= ",Value2+"\n");

Pero sigo teniendo problemas. Yo uso TrendTarget como un filtro
if(tik <= 5 && Ask>Band_UP) ///////////////ONLY can open SELL////////////////
        {
         ////////////////////// TP1 SL1 ///////////////////////////////////
         openOrder(Symbol(), OP_SELLSTOP,LotSize,sellPrice,sellPrice+SL1*point(), sellPrice-TP1*point(),"_Sell_1",MagicNumber,exp,Crimson);
        }

      if(tik <= 5 && Bid<Band_LO)   ///////////////ONLY can open BUY////////////////

        {
         ////////////////////// TP1 SL1 ///////////////////////////////
         openOrder(Symbol(), OP_BUYSTOP,LotSize,buyPrice,buyPrice-SL1*point(), buyPrice+TP1*point(),"_Buy_1",MagicNumber,exp,Navy);
        }
¡¡¡¡¡pero después de su ejecución, adjunto el indicador TrendTarget y veo que el EA todavía abrió muchas operaciones entre el canal!!!!!

En la imagen añado el TrendTarget después de que se inicie. Cuando creo una plantilla de prueba con el TrendTarget incluido(parámetro TF=60) el canal sólo se muestra durante las primeras X barras, luego sólo puedo ver la curva de precios, ¿por qué?
¿Cómo puedo añadir simplemente el indicador Trend Target para comprobar visualmente dónde se abren las órdenes?

Me gustaría utilizar en el código el valor_UP en el pasado, similare el uso de cierre: antes de ayer Close[2], ayer Close[1], cierre actual Close[0]? ¿Es posible?
Archivos adjuntos:
 
El problema que todavía tengo con el EA de prueba scap son los siguientes:

1er problema:
Puedo ver los buffers 1, 2 del TrendTarget (Pero todavía no todos los 4 dígitos correctos!!!), ¿es importante? para la cotización de EURUSD 1.0907 Pensé que cuando el valor del precio debe ser comparado con el canal superior o el canal inferior de TrendTarget, esos valores de TrendTarget deben ser correctos exactos al menos 4 dígitos decimales.
He puesto el valor de BarsIndex en cada palo a 1 porque me gusta volver a comprobar el TrendTarget

segundo problema:
Pero todavía tengo problema.¡¡¡¡¡Utilizo el TrendTarget como un filtro.

pero después de su ejecución, adjunto el indicador TrendTarget y entonces veo que el EA sigue abriendo muchas operaciones entre el canal!!!!!

3er problema:
En la imagen adjunta tengo que añadir el TrendTarget después de que se inicie. Cuando creo una plantilla de prueba con inclusión de TrendTarget (parámetro TF=60) el canal TrendTarget sólo se muestra durante las primeras X barras, tal vez 100, luego sólo puedo ver la curva de precios, ¿por qué es?

4to problema:
¿Cómo puedo añadir simplemente el indicador Trend Target para comprobar visualmente en tiempo de ejecución dónde se abren las órdenes?

problema:
Me gustaría utilizar en el código el valor_UP en el pasado, similar al uso de cierre: antes de ayer Close[2], ayer Close[1], cierre actual Close[0]? ¿Es posible?¡Porque podría haber una ruptura de más de unas pocas barras, en ese caso me gustaría cambiar la estrategia para el comercio de ruptura, en cambio, sólo una teoría todavía no puedo saber cómo hacerlo en la codificación

6 º problema:
Cuando la condición se toca, por ejemplo, me gusta abrir sólo 1 orden, aquí porque el precio se mantiene muchas barras por encima del canal superior por lo que la condición es correcta siempre, se abre hasta que mi cuenta se agota! ¿Cómo hacer para enviar sólo una orden, y luego esperar a que la condición cambie?

7º problema:
¿Alguien sabe lo que es el trendtarget me parece una línea trrend o MA(x) del precio con +/- 1xATR(14) añadido a cada lado es eso correcto. ¿Tiene alguien el código para ello?