¿Cómo codificar? - página 271

 

Necesito ayuda con la función iCustom para este EA puede llamar a un indicador personalizado.

Hola a todos,

Me gustaría añadir este (Entry.mq4) indi a este (swb grid 4.1.0.3_EA) EA con

iCustom función para que yo y podríamos utilizar este indicador en la estrategia de la EA.

el EA ya utiliza 3 indicadores MT4 Bandas de Bollinger, Estocástico y RSI y tienen

interruptores , por lo que puede seleccionar cualquiera o todos ellos para ser utilizado , mediante la selección de TRUE o FALSE

y me gustaría añadir este 4º indi(Entry.mq4) al EA.

Agradecería mucho si alguien me pudiera ayudar.

Gracias.

el EA y el indi adjunto abajo.

Archivos adjuntos:
 

Noob MQL4 ayuda necesaria para entender esta matriz

Hola, codificadores

¿Alguien podría instruirme en el tema de los arrays?

O tal vez estoy teniendo más problemas para entender este bucle en lo que respecta a esta matriz.

int i=Barras;

#property copyright "Unfinished POS by Agent86"

double v1[];

double v2[];

double val1;

double val2;

int inicio()

{

while(i>=0)

{

val1=iFractals(NULL, 0, MODE_UPPER,i);

si (val1 > 0)

{

v1=Alto;

}

si no

{

v1=v1;

}

val2=iFractals(NULL, 0, MODE_LOWER,i);

si (val2 > 0)

{

v2=Bajo;

}

si no v2=v2;

i--;

}

return(0);

}

Es un fractal básico, y sin embargo no puedo referirme a ningún elemento del array.

Quiero ser capaz de incrementar i++ de alguna manera y Print (v1); o imprimir el valor anterior al 0 o EMPTY_VALUE.

Si es que voy en la dirección correcta con esto.

Estoy teniendo problemas.

Print (v1): siempre == 0 e imprime 0

Entiendo un poco porque en realidad está haciendo un bucle hasta -1 que == 0

¿Cómo y dónde puedo poner las sentencias Print para poder ver lo que está pasando?

He probado multitud de métodos y he reiniciado i=0 para intentar un bucle alternativo para poder referirme a los elementos v1 pero todos los intentos han fallado.

Básicamente quiero ver los fractales anteriores o marcarlos como A alto, B bajo, etc. para su posible uso futuro en un esquema ABCD tipo de EA

Por ahora, principalmente quiero Imprimir v1 para poder ver lo que está haciendo.

Tal vez podría diseñar algo para seleccionar un Fractal anterior como A_high y/o B_low o algún esquema de este tipo.

¿Estoy en el camino equivocado con esto?

Por favor, aconseja

Gracias

 

Yo optaría por un bucle FOR en su lugar. Los bucles while pueden llevar a bloqueos si te olvidas de incluir el i--. Como sabes el número exacto de barras, es más fácil de usar, además el i nunca será < 0. Ayuda a evitar confusiones.

For (int i=Barras-1;i>0;i--) {

// código

}

Pruebe a poner todos los valores del array a 0, y luego vuelva a asignar los valores de los indicadores. También, intente un print() directamente después de asignar el valor de su indicador. Vea si realmente devuelve algo en absoluto.

Su mejor apuesta, en mi opinión, es asignar un tamaño a la matriz. Digamos, 1000 posiciones. Es poco probable que necesites esa cantidad, además de que reducirá los cálculos que estás haciendo. Todo lo que necesitas hacer entonces es un bucle a través de las últimas 999 barras a 0 y asignar valores. Creo recordar que MT4 tiene problemas con las iniciaciones de arrays y demás.

 

Preguntas de la matriz

Trader5050-Deployed:
Yo optaría por un bucle FOR en su lugar. Los bucles while pueden dar lugar a bloqueos si te olvidas de incluir el i--. Dado que usted sabe el número exacto de barras, es más fácil de usar, además de la i nunca será < 0. Ayuda a evitar la confusión.

For (int i=Bars-1;i>0;i--) {

// código

}

Trate de establecer todos los valores de la matriz a 0, y luego volver a través y asignar los valores de los indicadores. También, intente un print() directamente después de asignar el valor de su indicador. Mira si realmente devuelve algo.

Su mejor apuesta, en mi opinión, es asignar un tamaño a la matriz. Digamos, 1000 posiciones. Es poco probable que necesites esa cantidad, además de que reducirá los cálculos que estás haciendo. Todo lo que necesitas hacer entonces es un bucle a través de las últimas 999 barras a 0 y asignar valores. Creo recordar que MT4 tiene problemas con las iniciaciones de arrays y demás.

Ok, gracias lo probaré.

Aunque las sentencias while funcionan bien, no me ayudan a obtener los elementos del array que quiero imprimir / ver, etc.

Voy a trabajar en lo que dijiste y hacer algunas pruebas y publicar de nuevo.

Gracias

 
Trader5050-Deployed:
Yo iría con un bucle FOR en su lugar. Los bucles while pueden llevar a bloqueos si te olvidas de incluir el i--. Como sabes el número exacto de barras, es más fácil de usar, además la i nunca será < 0. Ayuda a evitar confusiones.

For (int i=Bars-1;i>0;i--) {

// código

}

Trate de establecer todos los valores de la matriz a 0, a continuación, volver a través y asignar los valores de los indicadores. También, intente un print() directamente después de asignar el valor de su indicador. Vea si realmente devuelve algo.

Su mejor apuesta, en mi opinión, es asignar un tamaño a la matriz. Digamos, 1000 posiciones. Es poco probable que necesites esa cantidad, además de que reducirá los cálculos que estás haciendo. Todo lo que necesitas hacer entonces es un bucle a través de las últimas 999 barras a 0 y asignar valores. Creo recordar que MT4 tiene problemas con las iniciaciones de arrays y demás.

Sigue imprimiendo el array con todas las entradas a 0

Extraño

 

Argent86,

Hay un par de errores en su código:

- los arrays que usas no son arrays todavía (si no especificas el tamaño del array, como hiciste en el código, entonces es un array dinámico y el tamaño del array debe ser gestionado en tiempo de ejecución) por lo que estás teniendo arrays de tamaño 0 (esa es la primera razón para tener siempre 0 - es la rutina de manejo de errores de metatrader que previene el error fatal y devuelve 0 como resultado para tales casos - en C/C++ causaría un crash)

- si no se especifica que el array es "tipo serie" (en "tipo serie" el elemento 0 es el último mientras que en los arrays normales el elemento 0 es el primero) entonces la expresión i+1 es el siguiente elemento de un array en ese caso no el anterior. Puedes usar los arrays de forma "similar a las series", pero entonces tienes que hacer un par de cosas más para que funcione en tiempo de ejecución, e incluso entonces cuando los números de las barras cambien vas a tener código de rastreo, así que es mejor usar los arrays en su modo nativo - "como C".

- también asegúrate de que empiezas al menos desde la 3ª barra en un nuevo tick (ahí es donde aparecerá un nuevo fractal, no en una barra actual)


Esto es lo que está tratando de hacer sin esos problemas
#property indicator_chart_window

double v1[];

double v2[];

int start()

{

int i,a,limit,counted_bars=IndicatorCounted();

if(counted_bars<0) return(-1);

if(counted_bars>0) counted_bars--;

limit = MathMin(Bars-counted_bars,Bars-1);

if (ArraySize(v1)!=Bars) ArrayResize(v1,Bars);

if (ArraySize(v2)!=Bars) ArrayResize(v2,Bars);

//

//

//

//

//

for (i=limit, a=Bars-i-1; i>=0; i--,a++)

{

v1[a]=v1[a-1]; if (iFractals(NULL,0,MODE_UPPER,i) > 0) v1[a]=High;

v2[a]=v2[a-1]; if (iFractals(NULL,0,MODE_LOWER,i) > 0) v2[a]=Low;

}

Comment("current upper frctal : "+DoubleToStr(v1,Digits)+"\n"+

"current lower frctal : "+DoubleToStr(v2,Digits));

return(0);

}
 

Acceder desde MQ4 a una función dll con: listas de argumentos variables

Hola,

Alguien sabe si es posible: importar una función dll que utiliza como argumento una: lista de argumentos variables

por ejemplo vprintf - Referencia C++

int vprintf ( const char * format, va_list arg );

si es así ¿cómo se haría?

Gracias

MJ

 

Cómo llamar a una función sin valor de retorno

Hola chicos y chicas.

En algún momento de mi programa me gustaría llamar a una función.

Sin embargo la función no tiene valor de retorno (void). Entonces, ¿cómo puedo llamar a la función,

para que se ejecute el código dentro de la función exactamente en el lugar donde la llamo,

como si estuviera escrito en ese mismo lugar?

Hice un código de ejemplo abajo.. donde compruebo algunos parámetros, y si está bien, quiero ejecutar la función...

Espero que alguien me pueda ayudar con esto, tx de antemano, Jonkie76

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

//| función de inicio experta ||

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

int inicio()

{

//----

if (Precio >= PRICE_CLOSE)

llamar a la función ; // En este punto me gustaría llamar a la función, ¿cómo lo hago?

else

Alert("No hacer nada"); //

//----

return(0);

}

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

//===================================================================+

//FUNCIONES

//===================================================================+

//----------------------- FUNCIÓN DE CIERRE DE LA ORDEN ----------------------+

void subCloseOrder()

{

int

i,

total = 0,

ticket = 0,

err = 0,

c = 0;

total = OrdersTotal();

for(i=total-1;i>=0;i--)

{

OrderSelect(i, SELECT_BY_POS, MODE_TRADES);

if(OrderSymbol()==Symbol() &&

OrderMagicNumber()==Magic)

{

switch(OrderType())

{

case OP_BUY :

for(c=0;c<NúmeroDeIntentos;c++)

{

ticket=OrderClose(OrderTicket(),OrderLots(),Bid,Slippage,Violet);

err=GetLastError();

if(err==0)

{

if(ticket>0) break;

}

else

{

if(err==0 || err==4 || err==136 || err==137 || err==138 || err==146) //Errores de ocupación

{

Sleep(5000);

continuar;

}

else //Error normal

{

if(ticket>0) break;

}

}

}

break;

}

}

}

}

 

Es muy simple. Sólo necesitas llamarlo como si devolviera algo, sólo que no necesitas guardar ningún resultado porque no hay ningún resultado con el tipo void. (devuelve nada) Así:

int start()

{

//----

if (Price >= PRICE_CLOSE)

subCloseOrder(); // At this point I'd like to call the function.How do I do that?

else

Alert("Do nothing"); //

//----

return(0);

}

 

Usa "void" en su lugar. Así:

void someFunction(someParameters)

{

...

//

//

// no need to place return at the end, but if you want then use "just" return, like this

//

//

return;

}

Void significa que no va a devolver valor de una función y de esa manera se convierte efectivamente en un procedimiento, no una función

Jonkie76:
Hola chicos y chicas.

En algún momento de mi programa me gustaría llamar a una función.

Sin embargo, la función no tiene valor de retorno (void). Entonces, ¿cómo puedo llamar a la función?

para que se ejecute el código dentro de la función exactamente en el lugar donde la llamo,

como si estuviera escrito en ese mismo lugar?

Hice un código de ejemplo abajo.. donde compruebo algunos parámetros, y si está bien, quiero ejecutar la función...

Espero que alguien me pueda ayudar con esto, tx de antemano, Jonkie76

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

//| función de inicio experta ||

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

int inicio()

{

//----

if (Precio >= PRICE_CLOSE)

llamar a la función ; // En este punto me gustaría llamar a la función, ¿cómo lo hago?

else

Alert("No hacer nada"); //

//----

return(0);

}

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

//===================================================================+

//FUNCIONES

//===================================================================+

//----------------------- FUNCIÓN DE CIERRE DE LA ORDEN ----------------------+

void subCloseOrder()

{

int

i,

total = 0,

ticket = 0,

err = 0,

c = 0;

total = OrdersTotal();

for(i=total-1;i>=0;i--)

{

OrderSelect(i, SELECT_BY_POS, MODE_TRADES);

if(OrderSymbol()==Symbol() &&

OrderMagicNumber()==Magic)

{

switch(OrderType())

{

case OP_BUY :

for(c=0;c<NúmeroDeIntentos;c++)

{

ticket=OrderClose(OrderTicket(),OrderLots(),Bid,Slippage,Violet);

err=GetLastError();

if(err==0)

{

if(ticket>0) break;

}

else

{

if(err==0 || err==4 || err==136 || err==137 || err==138 || err==146) //Errores de ocupación

{

Sleep(5000);

continuar;

}

else //Error normal

{

if(ticket>0) break;

}

}

}

break;

}

}

}

}
Razón de la queja: