Ayuda iCustom

Foro dedicado a todo lo relacionado con la versión 4 de la plataforma de Metaquotes.
Avatar de Usuario
nostrasladamus
Mensajes: 313
Registrado: 09 Feb 2009 13:27
Ubicación: Sistema Referencia Inercial

Ayuda iCustom

Mensaje 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
Avatar de Usuario
nstrader
Mensajes: 257
Registrado: 24 Mar 2007 19:33

Mensaje 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 .
Avatar de Usuario
nostrasladamus
Mensajes: 313
Registrado: 09 Feb 2009 13:27
Ubicación: Sistema Referencia Inercial

Mensaje 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
Si vis pacem, para bellum.
Dios me libre de los mansos, que de los fieros ya me libro yo.
Avatar de Usuario
nostrasladamus
Mensajes: 313
Registrado: 09 Feb 2009 13:27
Ubicación: Sistema Referencia Inercial

Mensaje 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
Si vis pacem, para bellum.
Dios me libre de los mansos, que de los fieros ya me libro yo.
Avatar de Usuario
nstrader
Mensajes: 257
Registrado: 24 Mar 2007 19:33

Mensaje por nstrader »

Por que no posteas el indicador, así a ciegas no puedo ayudarte

Avatar de Usuario
nostrasladamus
Mensajes: 313
Registrado: 09 Feb 2009 13:27
Ubicación: Sistema Referencia Inercial

Mensaje 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,
Avatar de Usuario
nstrader
Mensajes: 257
Registrado: 24 Mar 2007 19:33

Mensaje 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)
Avatar de Usuario
nostrasladamus
Mensajes: 313
Registrado: 09 Feb 2009 13:27
Ubicación: Sistema Referencia Inercial

Mensaje 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,
Si vis pacem, para bellum.
Dios me libre de los mansos, que de los fieros ya me libro yo.
elrinconin
Mensajes: 99
Registrado: 22 Ago 2006 00:13
Ubicación: Asturias

Ayuda sobre el icuston

Mensaje 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
Avatar de Usuario
nostrasladamus
Mensajes: 313
Registrado: 09 Feb 2009 13:27
Ubicación: Sistema Referencia Inercial

Mensaje 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,
Si vis pacem, para bellum.
Dios me libre de los mansos, que de los fieros ya me libro yo.
elrinconin
Mensajes: 99
Registrado: 22 Ago 2006 00:13
Ubicación: Asturias

Mensaje 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.
Avatar de Usuario
Butch
Mensajes: 132
Registrado: 04 Sep 2007 12:45

Re: Ayuda iCustom

Mensaje por Butch »

Hola

Es necesario que el EA cargue y "remueva" el indicador llamado por el iCustom cada vez que lo llama?
BRRRRR! Humanos!!!
Avatar de Usuario
Fer137
Mensajes: 1371
Registrado: 12 Nov 2007 18:43

Re: Ayuda iCustom

Mensaje por Fer137 »

No.
Avatar de Usuario
Butch
Mensajes: 132
Registrado: 04 Sep 2007 12:45

Re: Ayuda iCustom

Mensaje 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?
BRRRRR! Humanos!!!
Avatar de Usuario
Fer137
Mensajes: 1371
Registrado: 12 Nov 2007 18:43

Re: Ayuda iCustom

Mensaje 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);
Si te ha gustado este hilo del Foro, ¡compártelo en redes!


Responder

Volver a “Metatrader 4”