¡Pide! - página 157

 

Pruebe algo como esto:

string uniqueFileName()

{

string sname=TimeToStr(TimeCurrent(),TIME_DATE|TIME_SECONDS);

string tname="";

for (int i=0;i<StringLen(sname);i++)

{

string char = StringSubstr(sname,i,1);

if (char!="." && char!=":")

if (char==" ")

tname = tname+"_";

else tname = tname+char;

}

return(tname+"_"+Symbol()+Period()+".csv");

}[/php]this one adds hour, minute and seconds in the middle to make it more or less unique (so something like this "20090924_102541_EURUSD15.csv"). To make it really sure that the file does not exist it would have to be a bit more complicated (something like this :

[php]string uniqueFileName()

{

string sname=TimeToStr(TimeCurrent(),TIME_DATE|TIME_SECONDS);

string tname="";

int thand;

for (int i=0;i<StringLen(sname);i++)

{

string char = StringSubstr(sname,i,1);

if (char!="." && char!=":")

if (char==" ")

tname = tname+"_";

else tname = tname+char;

}

//

//

//

//

//

tname = tname+"_"+Symbol()+Period()+".csv";

thand = FileOpen(tname,FILE_BIN|FILE_READ);

if (thand==-1)

return(tname);

else

{

FileClose(thand);

return("failed to make unique name");

}

}

Devolverá la cadena"failed to make unique name" si falla, en cuyo caso tienes que decidir cuántas veces quieres que lo intente de nuevo

PS: el uso sería someFileName=uniqueFileName();

saludos

mladen

tedalagi:
Hola a todos,

Soy trader pero no conozco el lenguaje mq4 y llevo desde el martes intentando hacer esto...

Necesito guardar mi gráfico en formato csv mediante un script. Tengo un buen script que puedo simplemente arrastrarlo en cualquier gráfico y cualquier marco de tiempo y lo hace simplemente bien, excepto el nombre del archivo.

Me gustaría que pudiera generar automáticamente un nombre de archivo único cada vez que guardo el gráfico para no tener que renombrarlo cada vez que guardo otro archivo en la misma carpeta.

string fname = [fecha en formato AAAAMMDD] + "_"+[fecha - hora solamente]+"_" + Symbol() + Period() + ".csv";

El código en cuestión está en negrita.

Cuando tengo el código correcto, creo que el nombre del archivo de salida se verá así

20090924_10_GBPJPY15.csv

Perdonad que no pueda dedicar mucho tiempo a leer 157 páginas de este enorme hilo (lo había intentado y mi cabeza se ha mareado)

Gracias de antemano.
 
 
 
mladen:
Utilízalo así (mql no permite funciones o procedimientos anidados por lo que la función o procedimiento debe ser uno aparte)

Funciona perfectamente, muchas gracias.

mladen:

De guardar archivos en cualquier lugar : sí, se puede hacer usando la API de windows. Aquí hay un enlace con un buen ejemplo y una buena explicación de cómo hacerlo : Operaciones de archivo a través de WinAPI - Artículos MQL4

Voy a aprender sobre ello, y seguro que después vuelvo a este hilo

Que Dios te bendiga.

 

"Entrada duplicada": ¿Por qué mi programa no funciona?

Lo siento: he publicado esto antes, pero no puedo reubicar el post en el Foro.

(Tampoco permite los "marcadores" del historial de mi ordenador...)

De todos modos: escribí un programa simple, que comprueba si dos barras consecutivas son "arriba" o "abajo".

Es decir: en "arriba", el máximo de la barra 1 es mayor que el de la barra 2, y el mínimo de la barra 1

es también mayor que la de la barra 2. (La bajada es simétrica).

El programa funciona con rupturas, por lo que en "arriba", el máximo de la barra 1 menos el mínimo de la barra 2 debe estar por encima de algún umbral.

de la barra 2 debe estar por encima de algún umbral. ("Down" es simétrico.)

Ahora trabajo con M30 GBPUSD. Escogí este "umbral de ruptura" a ojo,

al igual que para el TakeProfit. StopLoss es como se indica en el prog.

Así que: tratando de ganar experiencia w / MetaTrader y mql4.

Entonces, puede probar otros progs, optimizar las cosas, etc.

Así que: llegó tan lejos como tener el prog compilar, y ejecutar en el probador de la estrategia.

Pero, nunca llega a la segunda mitad del prog, o imprimir que

ha introducido una orden.

Para alguien con experiencia, el error que tengo es probablemente obvio.

No es evidente para mí.

Así que: ¿podría ayudarme con esto?

Gracias.

El prog sigue.

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

//| 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()

{

//----

bool TrendUp1; double TakeProfitUp; double EE = .00500;

bool OrdTot_OK;double lote;double deslizamiento

double SL_Trailing_Up;bool High2Up;bool Low2Up;

int ticketup;int ticketdown;bool DownAndBig; bool UpAndBig;

bool TrendDown; double SL_Trailing_Down;double TakeProfitDown;

bool High2down; bool Low2down;

int ABC = OrdersTotal();

double Size1 = .00630;bool BigUp; double A = High[1];double B= Low[2];

double C= High[2]; double D= Low[1];bool BigDown;

//------------------------------------down inicio de la orden

if (ABC == 0)// no hay órdenes fuera es verdadero

OrdTot_OK = true

si (ABC == 0)// no hay órdenes fuera es verdadero

Imprime ("en la secuencia de órdenes down, no hubo órdenes out");

si ((C-D) > Tamaño1)/máximo de 2 menos mínimo de 1 > .0063

BigDown = true;

si ((C-D) > Tamaño1)/alto de 2 menos bajo de 1 > .0063

Imprime ("en la secuencia de órdenes bajistas, encontró una gran ruptura a la baja");

si (Alto[1]< Alto[2])

High2down=true;

si (Alto[1]< Alto[2])

Print ("en la secuencia de órdenes a la baja, las barras consecutivas tienen máximos decrecientes")

if(Bajo[1]< Bajo[2])

Low2down=true;

if(Mínimo[1]< Mínimo[2])

Print ("en la secuencia de órdenes descendentes, las barras consecutivas tienen mínimos decrecientes");

if (High2down && Low2down)

TrendDown=true;

si (Alto2abajo && Bajo2abajo)

Imprimir ("en la secuencia de órdenes descendentes, la bandera TrendDown está activada");

si (TrendDown)

SL_Trailing_Down = High[1];

si (TrendDown)

Print ("en la secuencia de órdenes bajistas, se ha establecido el stop_loss")

si (TrendDown)

TakeProfitDown = Oferta - (.005);

si (TrendDown)

Imprime ("en la secuencia de órdenes bajistas, obtuvo un takeprofit", TakeProfitDown);

si (TrendDown && BigDown)

DownAndBig = true;

if (DownAndBig && OrdTot_OK)

ticketdown= OrderSend(Symbol(),OP_SELL,lot, Bid,slip,SL_Trailing_Down,TakeProfitDown,Blue);

if (DownAndBig && OrdTot_OK)

Imprime ("en la secuencia de órdenes a la baja, ha intentado introducir un ticket", ticketdown);

if (ticketdown < 0)

Print("OrderSend_Down falló con el error #",GetLastError());

return(0);

//----------------------------------------------down order done

//---------------------------------------------------up order start

si (ABC == 0)

OrdTot_OK = true;

si (ABC == 0)

Imprime ("en la secuencia de subida, no ha salido ninguna orden");

si ((A - B) > Tamaño1)

BigUp = true

si ((A - B) > Tamaño1)

Imprime ("en la secuencia que sube, la prueba de tamaño de las dos barras fue correcta");

if (High[1] > High[2])

High2Up = true;//44

si (High[1] > High[2])

Print ("en la secuencia ascendente, la prueba de máximos crecientes fue correcta")

if(Bajo[1] > Bajo[2])

Low2Up=true;

if(Mínimo[1] > Mínimo[2])

Print ("en la secuencia ascendente, la prueba de mínimos crecientes fue correcta");

if (High2Up && Low2Up)

TrendUp1=true;

if (Alta2Subida && Baja2Subida)

Print ("en la secuencia de subidas, se activó la bandera de subidas");

si (TrendUp1)

SL_Trailing_Up = Low[1] ;

si (TrendUp1)

Print ("en la secuencia de subida, estableció el stoploss")

si (TrendUp1)

TakeProfitUp = Ask + (.005);

si (TrendUp1)

Print ("en la secuencia alcista, se establece el takeprofit", TakeProfitUp);

si (TrendUp1 && BigUp)

UpAndBig = true;

if ( UpAndBig && OrdTot_OK)

ticketup = OrderSend(Symbol(), OP_BUY,lot, Ask,slip, SL_Trailing_Up,TakeProfitUp,Red);

if (UpAndBig && OrdTot_OK)

Imprime ("en la secuencia de subida, intentó enviar una orden", ticketup);

if (ticketup < 0)

Print("OrderSend_Up falló con el error #",GetLastError());

return(0);

//-------------------------------------------------up order done

//----

return(0);// esta línea puede ser superflua

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

//----

return(0);

}

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

 

Uso de múltiples CharToStr????

Me gustaría colocar dos caracteres wingding. Uno encima del otro. Este es el código que estoy usando para colocar el primer carácter-----ObjectSetText("signal "+x+"0",CharToStr(104),symbolSize, "Wingdings",Yellow);.

Me gustaría añadir (236) y utilizar un color diferente para ello.

¿Es posible hacerlo? Si lo es, por favor, ayuda.

Gracias por su ayuda,

gever17

 

Sleep | IsTradeContextBusy

¡Saludos a CodeMasters y a todos los demás!

Tengo un EA basado en Fractales, se utiliza en 1 plataforma MT4, y en múltiples pares de divisas, en el marco de tiempo D1.

Como más de una copia del EA opera al mismo tiempo, recibo la notificación ''Trade Context Is Busy'' en mi Journal.

Me gustaría insertar la función Sleep o IsTradeContextBusy en mi EA, pero no sé dónde ponerla:

- después de la función Enviar orden, por separado para la función Vender y Comprar?

- ¿después de la función de envío de órdenes de compra y venta?

- como resolver este problema - con

if (IsTradeContextBusy() == true) Sleep (5000); return;

???

Por favor, aconsejen o indíqueme la solución.

Muchas gracias por su ayuda,

Que se diviertan,

Simon

EA adjunto.

Archivos adjuntos:
 

¡Se necesita consejo!

Hola,

Agradecería mucho la ayuda de un programador con un problema por el que estoy perdiendo dinero. Es que tengo un EA que debería abrir posiciones a un determinado nivel de precios, pero a veces el whipsaw hace que abra demasiadas posiciones. Me gustaría que abriera sólo una. ¿Alguien puede decirme si esto se puede arreglar con una línea de código o tengo que contratar a un programador?

Gracias.

 

Por favor, aconsejen

Hola chicos, estoy realmente dont unstd cómo MagicNumber obras, bcos parece como DOESNT WORK???? He hecho 2 simple EA adjunto, todavía estoy aprendiendo.

1. Comprar cuando el precio por encima de 100SMA

2. Vender cuando el precio también por encima de 100SMA

significa cuando u adjuntarlos a 2 diffrent gráfico de Eurusd, debe uno Comprar y uno Vender mismo tiempo. Como la teoría, cada EA trabaja indepently .

Pero no es así... Parece que cuando la venta se ejecuta en primer lugar, la compra de EA no funciona, y vise-versa.

¿Puede alguien recodificar mi EA, el MagicNumber de control? ¿Algún error?

Muchas gracias

Archivos adjuntos:
buy100ma.mq4  9 kb
sell100ma.mq4  9 kb
 
Ghosthand:
Hola Chicos, yo realmente no unstd cómo MagicNumber obras, bcos parece como DOESNT WORK???? He hecho 2 simples EA adjunto, todavía estoy aprendiendo.

1. Comprar cuando el precio esté por encima de la 100SMA

2. Vender cuando el precio también está por encima de 100SMA

Esto significa que cuando se adjuntan a 2 gráficos de Eurusd diferentes, se debe comprar y vender al mismo tiempo. Como la teoría, cada EA trabaja indepently .

Pero no es así... Parece que cuando la venta se ejecuta en primer lugar, la compra de EA no funciona, y vise-versa.

¿Puede alguien recodificar mi EA, el MagicNumber de control? ¿Algún error?

Muchas gracias

Parece que has puesto el número mágico correctamente. El único problema es que no estás comprobando SI la orden con el mismo número mágico existe en el pool de operaciones actual. Debería recorrer todas las órdenes abiertas y comprobar si OrderMagicNumber() == Su número mágico antes de introducir una nueva operación.