¡Pide! - página 88

 
 

Gracias Ralph, lo intenté pero me dio otra lista de errores - decía que todas las variables en el archivo de inclusión no estaban definidas - pero sí lo estaban

Voy a tener otro intento en esto durante el fin de semana, me está frustrando un poco en el momento.

@faqcya - Sospecho que tienes razón en lo de ponerlo en un script, pero no sé cómo manejar la llamada a menos que tenga un shell EA para ponerlo.

Quizá le eche un vistazo a las plantillas y vea si puedo llamarlo desde ahí o incluso mejor posiblemente convertirlo en un EA, sólo lo quiero tal cual, no para hacer nada más.

Gracias por vuestra ayuda,

Kevin

ralph.ronnquist:
@pgtips: cambia la segunda línea para que sea sólo
#define MAGIC 20051120
es decir, sin signo de igualdad y sin coma.
 

Tratando de aprender a programar

En primer lugar, he leído todo el curso del Gurú de Corder y lo he encontrado muy interesante. He llegado a la conclusión de que la única forma razonable de probar una estrategia es escribiendo un programa para asegurarme de que es totalmente precisa. Por desgracia, soy un novato total cuando se trata de esto.

He intentado escribir un programa básico y ni siquiera consigo que funcione. Al menos ya no me da ningún error pero no coge ninguna orden. Soy persistente y seguiré intentándolo pero agradecería alguna ayuda de alguien que vea mi error

Todo lo que estoy tratando de hacer en este momento es seguir el precio más bajo (CurrentLow) y luego cuando se retrae por una cierta cantidad (Ret1), colocar una orden de venta con TP del punto bajo.

Por favor, no te rías, pero lo siguiente es lo que he escrito hasta ahora:

//---- parámetros de entrada

extern double TP1=75.0;

extern double Ret1=75.0;

extern double SL1=150.0;

extern double Lots=0.1;

//+------------------------------------------------------------------+

//| función de inicialización de expertos ||.

//+------------------------------------------------------------------+

int init()

{

//----

//----

return(0);

}

//+------------------------------------------------------------------+

//| función de desinicialización experta ||

//+------------------------------------------------------------------+

int deinit()

{

//----

//----

return(0);

}

//+------------------------------------------------------------------+

//| función de inicio experto ||

//+------------------------------------------------------------------+

int inicio()

{

int ticket=0;

if(Bares<100)

{

Print("barras menos de 100");

return(0);

}

doble CurrentLow,CurrentHigh;

if(Oferta < ActualMínimo)

{

CurrentLow = Bid;

if(Oferta > AltaCorriente)

{

CurrentHigh = Bid;

if(CurrentHigh >= CurrentLow+(Point*Ret1))

{

ticket=OrderSend(Symbol(),OP_SELL,Lots,Bid,3,Bid+(SL1*Point),Bid-(TP1*Point), "Albatross_v1",757575,0,Green);

return (0);

}

return (0);

}

return(0);

}

}

 
Putz:
En primer lugar, he leído todo el curso de Corder's Guru y me ha parecido muy interesante. He llegado a la conclusión de que la única forma razonable de probar una estrategia es escribiendo un programa para asegurarme de que es totalmente precisa. Desgraciadamente, soy un novato total en lo que a esto se refiere.

He intentado escribir un programa básico y ni siquiera consigo que funcione. Al menos ya no me da ningún error pero no coge ninguna orden. Soy persistente y seguiré intentándolo pero agradecería alguna ayuda de alguien que vea mi error

Todo lo que estoy tratando de hacer en este momento es seguir el precio más bajo (CurrentLow) y luego cuando se retrae por una cierta cantidad (Ret1), colocar una orden de venta con TP del punto bajo.

Por favor, no se rían, pero lo siguiente es lo que he escrito hasta ahora:

//---- parámetros de entrada

extern double TP1=75.0;

extern double Ret1=75.0;

extern double SL1=150.0;

extern double Lots=0.1;

//+------------------------------------------------------------------+

//| función de inicialización de expertos ||.

//+------------------------------------------------------------------+

int init()

{

//----

//----

return(0);

}

//+------------------------------------------------------------------+

//| función de desinicialización experta ||

//+------------------------------------------------------------------+

int deinit()

{

//----

//----

return(0);

}

//+------------------------------------------------------------------+

//| función de inicio experto ||

//+------------------------------------------------------------------+

int inicio()

{

int ticket=0;

if(Bares<100)

{

Print("barras menos de 100");

return(0);

}

doble CurrentLow,CurrentHigh;

if(Oferta < ActualMínimo)

{

CurrentLow = Bid;

if(Oferta > AltaCorriente)

{

CurrentHigh = Bid;

if(CurrentHigh >= CurrentLow+(Point*Ret1))

{

ticket=OrderSend(Symbol(),OP_SELL,Lots,Bid,3,Bid+(SL1*Point),Bid-(TP1*Point), "Albatross_v1",757575,0,Green);

return (0);

}

return (0);

}

return(0);

}

}

Me parece incorrecto comprobar si Bid > CurrentHigh dentro de la condición verdadera de que Bid < CurrentLow; creo que deberías tener pruebas independientes como esta :

double CurrentLow,CurrentHigh;

int start()

{

if(Bid < CurrentLow) CurrentLow = Bid;

if(Bid > CurrentHigh) CurrentHigh = Bid;

if(Bid >= CurrentLow+(Point*Ret1))

OrderSend(Symbol(),OP_SELL,Lots,Bid,3,Bid+(SL1*Point),Bid-(TP1*Point),"Albatross_v1",757575,0,Green);

return(0);

}

Ahora, tres observaciones:

- Tienes que declarar CurrentHigh y CurrentLow en una primicia global, es decir, fuera de cualquier función (y start() es una función) de lo contrario esas variables se inicializarán a 0 en cada llamada de la función.

- No necesitas CurrentHigh ya que no se utiliza.

- Tienes que implementar alguna lógica para restablecer/actualizar el valor de CurrentLow, y probablemente para limitar la apertura de órdenes en cada tick por encima de CurrentLow+(Point*Ret1))

 

Hola Michel,

Muchas gracias por tu rápida respuesta y ayuda.

He eliminado CurrentHigh y ahora lo entiendo mucho mejor. También he definido CurrentLow en la parte superior del programa y ahora realmente coloca órdenes.

También he añadido una segunda orden basada en un retroceso mayor y parece que funciona. Ahora tengo que averiguar cómo evitar que se cree una nueva orden en cada tick, pero voy a trabajar en eso por mi cuenta por ahora, ya que voy a aprender mejor de esa manera.

Estoy seguro de que volveré aquí con más preguntas.

Gracias de nuevo.

Putz

 
Putz:
Hola Michel,

Muchas gracias por su rápida respuesta y ayuda.

He eliminado CurrentHigh y ahora lo entiendo mucho mejor. También he definido CurrentLow en la parte superior del programa y ahora realmente coloca órdenes.

También he añadido una segunda orden basada en un retroceso mayor y parece que funciona. Ahora tengo que averiguar cómo evitar que se cree una nueva orden en cada tick, pero voy a trabajar en eso por mi cuenta por ahora, ya que voy a aprender mejor de esa manera.

Estoy seguro de que volveré aquí con más preguntas.

Gracias de nuevo.

Putz

No olvides inicializar CurrentLow con un valor grande (como 1000); si se inicializa con 0, nunca tendrás un Bid < 0

 

¿Qué lenguaje de programación debo aprender?

codersguru:
Hola amigos,

Tengo un montón de mensajes privados pidiéndome ayuda con algunos trozos de código.

Aquí podéis publicar vuestras preguntas relacionadas con MQL4, y haré lo posible por responderlas.

Estimado codersguru,

Si deseo aprender a escribir códigos MQL4, ¿qué lenguaje de programación debo aprender? ¿Visual basic o C++? Gracias por su respuesta.

 

Más ayuda, por favor

Hola,

Vuelvo a pedir más ayuda. He estado leyendo y mirando muchos otros EA para tratar de entenderlo pero sigo sin conseguir que funcione correctamente.

Lo que estoy tratando de hacer es colocar dos órdenes.

1) Vender 0.1 lote una vez que el precio retroceda por Ret1 (75 pips) con TP1 (75) y SL1 (150)

2) Vender 0.2 lotes una vez que el precio retroceda por Ret2 (150 pips) con TP1 (75) y SL1 (75)

A largo plazo, quiero conseguir que una orden de compra como la anterior se coloque en función de la dirección de la tendencia. Todavía no he determinado qué indicador usaré para determinar la tendencia, pero lo haré en algún momento.

Lo siguiente es lo que tengo actualmente. Parece colocar la primera orden correctamente pero la segunda nunca se activa. Cualquier ayuda será muy apreciada.

extern string Nombre_Experto = "Albatross v1";

extern int NúmeroMágico = 757575;

extern int Deslizamiento = 3.0;

//---- parámetros de entrada

extern double TP1=75.0;

extern double TP2=75,0;

extern double Ret1=75,0

extern double Ret2=150,0;

extern double SL1=150,0

extern double SL2=75,0;

extern double Lots=0,1

double CurrentLow=1000;

//double CurrentHigh=0;

int OpenOrders=0,cnt=0;

//+------------------------------------------------------------------+

//| Función de inicialización del indicador personalizada ||.

//+------------------------------------------------------------------+

//int init()

// {

//---- indicadores

//----

// return(0);

// }

//+------------------------------------------------------------------+

//| Función de desinicialización de indicadores personalizados ||

//+------------------------------------------------------------------+

// int deinit()

// {

//---- TODO: añada su código aquí

//----

// return(0);

//+------------------------------------------------------------------+

//| Función de iteración del indicador personalizada ||

//+------------------------------------------------------------------+

// int inicio()

// {

//---- TODO: añada su código aquí

//----

// return(0);

// }

//+------------------------------------------------------------------+

//+------------------------------------------------------------------+

//| función de inicialización de expertos |

//+------------------------------------------------------------------+

int init()

{

//----

//----

return(0);

}

//+------------------------------------------------------------------+

//| función de desinicialización experta ||

//+------------------------------------------------------------------+

int deinit()

{

//----

//----

return(0);

}

//+------------------------------------------------------------------+

//| Comprobar Controles de Posición Abierta ||

//+------------------------------------------------------------------+

int CheckOpenTrades()

{

int cnt;

int NumTrades; // Número de operaciones de compra y venta en este símbolo

NumTrades = 0;

for(cnt=TotalOrdenes()-1;cnt>=0;cnt--)

{

OrderSelect (cnt, SELECT_BY_POS, MODE_TRADES);

if ( OrderSymbol() != Symbol()) continuar;

if ( OrderMagicNumber() != MagicNumber) continue;

if(OrderType() == OP_BUY ) NumTrades++;

if(OrderType() == OP_SELL ) NumTrades++;

}

return (NumTrades);

}

//+------------------------------------------------------------------+

//| función de inicio de experto ||

//+------------------------------------------------------------------+

int inicio()

{

int cnt, ticket, total

doble TP;

if(Bares<100)

{

Print("barras menos de 100");

return(0);

}

total = CheckOpenTrades();

if(total < 1)

{

if(Bid < CurrentLow) CurrentLow = Bid;

if(Bid >= CurrentLow+(Point*Ret1))

OrderSend(Symbol(),OP_SELL,Lots,Bid,3,Bid+(SL1*Point),Bid-(TP1*Point), "Albatross_v1",MagicNumber,0,Green);

}

if(total < 2)

{

if(Bid >= CurrentLow+(Point*Ret2))

OrderSend(Symbol(),OP_SELL,Lots*2,Bid+(Point*Ret2),3,Bid+(SL2*Point),Bid-(TP2*Point), "Albatross_v1",MagicNumber,0,Green);

return(0);

}

}

//+------------------------------------------------------------------+

 

Siento molestarle con esta pregunta

¿Cómo se crea un objeto que se rellena con un color?

Dave

<<<

 

Hola a todos, soy un codificador y estado codificando durante mucho tiempo en C ++, pero mi knowledege de FX y MQL4 es muy básico. Estoy revisando un EA que alguien escribió y tratando de entender el código...

me podria explicar en ingles simple que es el parametro SHIFT en el metodo iMA?

double iMA(string symbol, int timeframe, int period, int ma_shift, int ma_method, int applied_price, int shift)

de acuerdo con la ayuda de MT4, su "Índice del valor tomado del búfer del indicador (desplazamiento relativo a la barra actual la cantidad dada de períodos atrás)". - ¿qué es el buffer del indicador?

también está haciendo lo siguiente...

int RealTime = 0;

if( UseCompletedBars )

{

if(timeprev==Time[0]){return(0);} timeprev = Time[0];

RealTime = 1;

}

double MA11 = iMA(NULL,0,MA1Periods,0,MA1MethodSelected, MA1ArraySelected,0+RealTime);

double MA12 = iMA(NULL,0,MA1Periods,0,MA1MethodSelected, MA1ArraySelected,1+RealTime);

double MA21 = iMA(NULL,0,MA2Periods,0,MA2MethodSelected, MA2ArraySelected,0+RealTime);

double MA22 = iMA(NULL,0,MA2Periods,0,MA2MethodSelected, MA2ArraySelected,1+RealTime);

if( MA11 > MA21 && MA12 < MA22 ) { EnterLong = True; }

if( MA11 MA22 ) { EnterShort = True; }

¿qué es lo que devuelve? ya que no conozco el desplazamiento, creo que por eso no puedo conseguirlo...

su respuesta será muy apreciada.

por favor, ayuda.