Página 1 de 2

Ayuda iCustom

Publicado: 19 May 2009 09:58
por nostrasladamus
Buenos dias!

Ando con un EA, con llamadas a iCustom y veo:
1.- En cada llamada me aparece que "carga" el iCustom" (loaded). Al de unas cuantas barras, parece que ya no tiene mas memoria y que tiene que eliminarlos (removed). Es esto normal?
Ya se que los iCustom ralentizan, pero este es una pasada.
Aparte de lo lento que va y de los warnings, puede llegar a producir error?
(las llamadas son a la ultima barra terminada (1))

2.- Al hacer las llamadas al iCustom, en la pantalla principal aparece el indicador de ese iCustom. Hasta ahi normal. Pero si chequeo los valores del Indicador en el momento en que se lanza una orden (es decir, el valor del Indic al ejecutarse el EA) no coincide con el valor de la curva del Indicador en la pantalla principal. O sea, que cuando en la pantalla se me cruzan las medias y me da señal, los valores (uno de ellos) que da el EA no coincide y la señal salta mal.
Yo me he entendido, espero que vosotros tambien :(

Saludo2

Publicado: 19 May 2009 11:07
por nstrader
1.- En cada llamada me aparece que "carga" el iCustom" (loaded). Al de unas cuantas barras, parece que ya no tiene mas memoria y que tiene que eliminarlos (removed). Es esto normal?
Ya se que los iCustom ralentizan, pero este es una pasada.
Aparte de lo lento que va y de los warnings, puede llegar a producir error?
(las llamadas son a la ultima barra terminada (1))
Yo lo que hago es no llamar a iCustom en cada tick, si no en cada nueva vela cerrada. Para ello debes guardar en una variable el tiempo de apertura de la vela en formación una vez llamado el indicador, y al proximo tick comparar el tiempo guardado con el de la vela en formación. Si coinciden los tiempos no se llama al indicador porque ya tienes los datos, y si no coinciden es que se ha abierto una nueva vela y se vuelve a llamar al indicador.
Ejemplo:

Código: Seleccionar todo

if(NewBar2())
  {
      //Llamada a iCustom
      Print(StringConcatenate("Nueva Vela, ",TimeToStr(TimeCurrent(),TIME_MINUTES|TIME_SECONDS)));
  }
Y la función:

Código: Seleccionar todo

bool NewBar2()
{
   static datetime lastbar = 0;
   datetime curbar = iTime(NULL,0,0);
   
   if(lastbar != curbar)
   {
      lastbar = curbar;
      return(true);
   }
   else return(false);

}

2.- Al hacer las llamadas al iCustom, en la pantalla principal aparece el indicador de ese iCustom. Hasta ahi normal. Pero si chequeo los valores del Indicador en el momento en que se lanza una orden (es decir, el valor del Indic al ejecutarse el EA) no coincide con el valor de la curva del Indicador en la pantalla principal. O sea, que cuando en la pantalla se me cruzan las medias y me da señal, los valores (uno de ellos) que da el EA no coincide y la señal salta mal.
Yo me he entendido, espero que vosotros tambien
Eso de que no coincide el valor del Ea con el indicador depende de como esté programado el indicador y como extraes esos datos. Yo suelo poner un simple Comment con los valores que da el indicador para ver si son correctos en todo momento en el Ea en Visual test. Y a veces tengo que modificar el indicador para adaptarlo al Ea, por ejemplo no es lo mismo que de Empty_Value que cero para el Ea .

Publicado: 19 May 2009 12:27
por nostrasladamus
gracias de nuevo nstrader

ahorrare algo de tiempo con el codigo ese.
Pero entiendo que en principio, por muchas veces que se llame a un iCustom no debe dar error, ira mas lento pero sin error.
de momento me da igual el tiempo, quiero ver que tal tira
si va bien habra que copiar el indic en el ea y ya ta!

del pto 2, ya he puesto los comentarios y por eso se que algun hay algun decalaje, porque los valores del EA no coinciden con el visual....

ya me ocurrio lo mismo hace tiempo, tendre que mirarlo de nuevo, lo importante es que el visual este bien :lol:

Salu2

Publicado: 20 May 2009 08:40
por nostrasladamus
buenos dias,

bueno, he puesto tu codigo y se acelera bastante, muy interesante el tema de los tiempos, nunca lo habia tocado...

pero el iCustom me sigue sin funcionar bien
lanzo el EA y la primera vez que llamo al iCustom, me responde bien, pero las siguientes veces, la variable devuelve valor 0.
Ya no me sale el "loaded succesfully"

Cerre el Metatrader a ver si se "habia quedado" algo en memoria. Pero nada. Hoy apagare el ordenador (era un portatil y estaba "hibernando").


De todas formas, buscando en la red, podria ser algun bug por usar vbles bool en el indicator? http://www.metatrader4.com/forum/938/page2

Os ha pasado algo similar? (que el indic devuelva 0 a partir de la segunda consulta)

Salu2

Publicado: 20 May 2009 14:12
por nstrader
Por que no posteas el indicador, así a ciegas no puedo ayudarte

Publicado: 26 May 2009 18:02
por nostrasladamus
hola!

bueno, pues no funciono el iCustom, al final tuve que "meter" el indicador en el EA

no entiendo por que....

te posteo el mensaje que sale en el log:
22:59:32 SD Line-MultiTime-03 EURUSD,M1: removed
22:59:32 I-MA-Multitime-01 EURUSD,M1: removed
22:59:32 I-MA-Multitime-01 EURUSD,M1: removed
22:59:32 I-MA-Multi-01 EURUSD,M1: removed
23:05:12 I-MA-Multi-01: loaded successfully
23:05:12 I-MA-Multi-01 inputs: Lots=0.1; TimeFrame=3; period=30; method=3; price=0; Periods=3;
23:05:12 2008.01.03 00:01 I-MA-Multitime-01 EURUSD,M1: loaded successfully
23:05:12 2008.01.03 00:01 I-MA-Multitime-01 EURUSD,M1: loaded successfully
23:05:12 2008.01.03 00:01 SD Line-MultiTime-03 EURUSD,M1: loaded successfully
23:05:12 2008.01.03 00:01 I-Slope-MA-Multi-01 EURUSD,M1: Sl30 3 3 0 1.4715 1.4723 1.4718
23:05:12 2008.01.03 00:01 I-Slope-MA-Multi-01 EURUSD,M1: MA3 3 1.4715 1.4722 1.4718
23:05:12 2008.01.03 00:01 I-Slope-MA-Multi-01 EURUSD,M1: Sl30 3 3 0 0 0 0
23:05:12 2008.01.03 00:01 I-Slope-MA-Multi-01 EURUSD,M1: MA3 3 0 1.4722 1.4718
23:05:12 2008.01.03 00:02 I-Slope-MA-Multi-01 EURUSD,M1: Sl30 3 3 0 0 0 0
23:05:12 2008.01.03 00:02 I-Slope-MA-Multi-01 EURUSD,M1: MA3 3 0 0 0
23:05:12 2008.01.03 00:02 I-Slope-MA-Multi-01 EURUSD,M1: Sl30 3 3 0 0 0 0
23:05:12 2008.01.03 00:02 I-Slope-MA-Multi-01 EURUSD,M1: MA3 3 0 0 0
23:05:12 2008.01.03 00:02 I-Slope-MA-Multi-01 EURUSD,M1: Sl30 3 3 0 0 0 0
23:05:12 2008.01.03 00:02 I-Slope-MA-Multi-01 EURUSD,M1: MA3 3 0 0 0

se ha llamado a 2 indic.
pongo parte del EA, donde se les llama
int start()
{
..

..
double A1,B1,C1;
double A0,B0,C0;


//===================================================================

B0=iCustom(NULL,0,"I-MA-Multitime-01",Periods,TimeFrame,2,3,1,0,2);//------MA del High
C0=iCustom(NULL,0,"I-MA-Multitime-01",Periods,TimeFrame,3,3,1,0,2);//--MA del Low

A1=iCustom(NULL,0,"SD Line-MultiTime-03",period,TimeFrame,method,price,2,1);
B1=iCustom(NULL,0,"I-MA-Multitime-01",Periods,TimeFrame,2,3,1,0,1);//------MA del High
C1=iCustom(NULL,0,"I-MA-Multitime-01",Periods,TimeFrame,3,3,1,0,1);//--MA del Low
Print("Sl",period," ",TimeFrame," ",method," ",price," ",A1," ",B1," ",C1);
Print("MA",Periods," ",TimeFrame," ",A1," ",B0," ",C0);
if(NewBar2()) {
Buy=0; Sell=0;
total=OrdersTotal();
Print(StringConcatenate("Nueva Vela,",TimeToStr(TimeCurrent(),TIME_MINUTES|TIME_SECONDS)));

y el indicador, que calcula la media en un timeframe diferente (lo hice yo, asi que no sera nada ortodoxo, pero bueno :)
//+------------------------------------------------------------------+
//| I-MA-Multitime.mq4 |
//| Copyright © 2008, MetaQuotes Software Corp. |
//| http://www.metaquotes.net |
//+------------------------------------------------------------------+
#property indicator_chart_window
//#property indicator_separate_window
#property indicator_buffers 1
#property indicator_color1 Red
#property indicator_color2 Yellow
#property indicator_color3 Blue
//
extern int period=80;
extern int TimeFrame=15;
extern int price=0; // PRICE_CLOSE
extern int method=3; // MODE_SMA
extern bool Smooth=1;

double Curve1[],Curve2[],Curve3[],Curve4[];
//+------------------------------------------------------------------+
//| Custom indicator initialization function |
//+------------------------------------------------------------------+
void init() {
IndicatorBuffers(1);
IndicatorShortName("I-MA-Multitime");
//
SetIndexStyle(0,DRAW_LINE);
SetIndexBuffer(0,Curve1);
SetIndexStyle(1,DRAW_LINE);
SetIndexBuffer(1,Curve2);
SetIndexStyle(2,DRAW_LINE);
SetIndexBuffer(2,Curve3);
SetIndexStyle(3,DRAW_LINE);
SetIndexBuffer(3,Curve4);
return;
}
//+------------------------------------------------------------------+
//| Custom indicator deinitialization function |
//+------------------------------------------------------------------+
void deinit() {

return;
}
//+------------------------------------------------------------------+
//| Custom indicator iteration function |
//+------------------------------------------------------------------+
void start() {
int i,j,limit,cbars,a,x,e;
double maxA,maxC,minL;
//---------------------------------------------------
int counted_bars = IndicatorCounted();
if(counted_bars < 0)
return(-1);
e = Bars-counted_bars;
limit=e;
//----------------------------------------------------
// ---------- CALCULO DE ARRAYS EN TIMEFRAME EQUIVALENTES
double MFClose[],MFOpen[],MFMax[],MFMin[];
ArrayResize(MFClose, e);
ArraySetAsSeries(MFClose, true);
ArrayResize(MFOpen, e);
ArraySetAsSeries(MFOpen, true);
ArrayResize(MFMax, e);
ArraySetAsSeries(MFMax, true);
ArrayResize(MFMin, e);
ArraySetAsSeries(MFMin, true);
//----------------------------------------------------
for(i=0;i<=e;i++) {
MFClose=0;
MFOpen=0;
MFMax=0;
MFMin=0;
}

for(i=0;i<=e;i++) {
if(MathFloor(i/TimeFrame)*100==(i*100/TimeFrame)) {
maxA=0;
minL=2;
for(j=0;j<TimeFrame>maxA) maxA=High[i+j];
if(Low[i+j]<minL) minL=Low[i+j];
}
}
a=(MathFloor(i/TimeFrame)+1)*TimeFrame;
MFClose=Close[a];
a=(MathFloor(i/TimeFrame)+1)*TimeFrame;
MFOpen=Open[a];
MFMax=maxA;
MFMin=minL;
}
//----------------------------------------------------
// ----- CALCULO de los vect Aux1 y 2 (los del period y period/2)
double Aux1[],Aux2[],Aux3[];
ArrayResize(Aux1, e);
ArraySetAsSeries(Aux1, true);
ArrayResize(Aux2, e);
ArraySetAsSeries(Aux2, true);
ArrayResize(Aux3, e);
ArraySetAsSeries(Aux3, true);
//----------------------------------------------------
if(price==0) {// CLOSE prices
for(x = 0; x < e; x++) {
Aux1[x]=iMAOnArray(MFClose,0,period*TimeFrame,0,method,x);// Subida
}
}
//----------------------------------------------------
if(price==1) {// OPEN prices
for(x = 0; x < e; x++) {
Aux1[x]=iMAOnArray(MFOpen,0,period*TimeFrame,0,method,x);// Subida
}
}
//----------------------------------------------------
if(price==2) {// HIGH prices
for(x = 0; x < e; x++) {
Aux1[x]=iMAOnArray(MFMax,0,period*TimeFrame,0,method,x);// Subida
}
}
//----------------------------------------------------
if(price==3) {// LOW prices
for(x = 0; x < e; x++) {
Aux1[x]=iMAOnArray(MFMin,0,period*TimeFrame,0,method,x);// Subida
}
}
//----------------------------------------------------
if(price==4) {// MEDIAN prices
for(x = 0; x < e; x++) {
Aux3[x]=(MFMax[x]+MFMin[x])/2;
}
for(x = 0; x < e; x++) {
Aux1[x]=iMAOnArray(Aux3,0,period*TimeFrame,0,method,x);// Subida
}
}
//----------------------------------------------------
if(price==5) {// TYPICAL prices
for(x = 0; x < e; x++) {
Aux3[x]=(MFMax[x]+MFMin[x]+MFClose[x])/3;
}
for(x = 0; x < e; x++) {
Aux1[x]=iMAOnArray(Aux3,0,period*TimeFrame,0,method,x);// Subida
}
}
//----------------------------------------------------
if(price==6) {// WEIGHTED prices
for(x = 0; x < e; x++) {
Aux3[x]=(MFMax[x]+MFMin[x]+MFClose[x]+MFClose[x])/4;
}
for(x = 0; x < e; x++) {
Aux1[x]=iMAOnArray(Aux3,0,period*TimeFrame,0,method,x);// Subida
}
}
//----------------------------------------------------
//CALCULAMOS LA FUNCION A REPRESENTAR
//----------------------------------------------------

if(Smooth==0) {
for(i=0;i<=limit;i++) {
if(MathFloor(i/TimeFrame)*100==(i*100/TimeFrame)) {
for(j=0;j<=TimeFrame;j++) {
Curve1[i+j]=Aux1;
}
}
}
}
if(Smooth==1) {
for(i=0;i<=limit;i++) {
Curve1=Aux1[i];
}
}

//
//-----------------------------------------------------------
return(0);
}
//+------------------------------------------------------------------+


asi que problema resuelto, pero no asi la filosofia, que ya me jod*%&/ tener que meter un indic en el EA cada vez que lo necesite, no lo entiendo

Salu2,

Publicado: 26 May 2009 21:19
por nstrader
Ese indicador tiene bastantes errores, no lo puedo compilar, parece un popurri de varios indicadores.
Solo utilizas un buffer y programas 4...

Y porque no coges una media de otro TF y la cargas en M1 y ya está?

Código: Seleccionar todo

iMA(NULL,PERIOD_M15,80,0,MODE_SMA,PRICE_CLOSE,1)

Publicado: 27 May 2009 09:48
por nostrasladamus
si, programo 4 buffers, es una "plantilla general" que tengo, pero aqui solo uso 1 buffer

lo que no entiendo es por que te da error al compilar, a mi me funciona, voy a chequearlo esta noche (en medio del partido), porque creo que es la version que uso

para coger la media de otro TF, debe estar cargado en la sesion de metatrader?, o solo es necesario que ese otro TF este en el historial?, creo que lo probe y no me funciono

de todas maneras la estructura del indicador colgado la uso con otros indicadores no "estandards"

Salu2,

Ayuda sobre el icuston

Publicado: 01 Jun 2009 14:41
por elrinconin
hola,
Tengo un indicador, al qque quiero usarlo desde mi Ea.
Las llamadas al indicador desde la Ea, no creo que tenga problemas.
¿Que variable declaro en el indicador para que me la devuelva? ¿hay alguna variable predefinida que es la que llama el icustom?
La variable a devolver seria algo sencillo, 1 compra 0 vender

un saludo

Publicado: 01 Jun 2009 15:36
por nostrasladamus
el indicador devuelve en la pantalla del precio o en otra separada curvas, que son los arrays definidos en "IndicatorBuffers(1)" .

cuando llamas al iCustom (al indicador), le tienes que decir cual de las curvas quieres que te devuelva. Esa es la forma de comunicarse entre el EA y el indicador

En el ejemplo:
B0=iCustom(NULL,0,"I-MA-Multitime-01",Periods,TimeFrame,2,3,1,0,2);

el 0 (segundo parametro por el final) le dice que en B0 debe tener el valor de la primera curva del indicador.

el 2 (ultimo parametro) dice que devolvera el valor tomado en la segunda barra terminada, contada desde la barra actual del EA

Salu2,

Publicado: 01 Jun 2009 17:04
por elrinconin
Entiendo un poco,
El indicador usa varios buffers, pero yo calculaba en otra variable el estado (compra o venta)
Por lo que veo, en vez de usar una variable, usaria un array donde en la posicion 1 almaceno 0 vender y 1 compra, por ejemplo.

Re: Ayuda iCustom

Publicado: 11 Feb 2011 22:04
por Butch
Hola

Es necesario que el EA cargue y "remueva" el indicador llamado por el iCustom cada vez que lo llama?

Re: Ayuda iCustom

Publicado: 12 Feb 2011 14:04
por Fer137
No.

Re: Ayuda iCustom

Publicado: 13 Feb 2011 02:44
por Butch
Testeando un EA que llama a un iCustom me he dado cuenta de que este abre una ventana de indicador para el iCustom cada vez que lo llama. Como se puede evitar esto?

Re: Ayuda iCustom

Publicado: 13 Feb 2011 12:37
por Fer137
Butch escribió:Testeando un EA que llama a un iCustom me he dado cuenta de que este abre una ventana de indicador para el iCustom cada vez que lo llama. Como se puede evitar esto?
Cada indicador abre una sola ventana salvo que se cambien los parametros. (Lo mismo sucede con lo de cargar/remove que preguntaban en este hilo). Por cada conjunto de parametros sale un indicador dibujado.

Para evitar que los dibuje incluye: HideTestIndicators(true);