Demandez ! - page 157

 

Essayez quelque chose comme ceci :

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");

}

}

Il retournera la chaîne"failed to make unique name" s'il échoue, auquel cas vous devez décider du nombre de fois que vous voulez qu'il réessaie.

PS : l'utilisation serait someFileName=uniqueFileName() ;

salutations

mladen

tedalagi:
Bonjour à tous,

Je suis un trader mais je ne connais pas le langage mq4 et j'essaie de faire ceci depuis mardi ...

J'ai besoin de sauvegarder mon graphique en format csv en utilisant un script. J'ai un joli script que je peux simplement faire glisser sur n'importe quel graphique et n'importe quelle période de temps et il fait tout simplement bien, sauf le nom de fichier.

J'aimerais qu'il puisse générer automatiquement un nom de fichier unique à chaque fois que j'enregistre le graphique afin que je n'aie pas à le renommer chaque fois que j'enregistre un autre fichier dans le même dossier.

string fname = [date au format AAAAMMJJ] + "_"+[date - heure uniquement]+"_" + Symbol() + Period() + ".csv" ;

Le code en question est en gras.

Si le code est correct, je pense que le nom du fichier de sortie ressemblera à ceci

20090924_10_GBPJPY15.csv

Désolé de ne pas pouvoir consacrer beaucoup de temps à la lecture des 157 pages de cet énorme fil de discussion (j'avais essayé et ma tête s'est mise à tourner).

Merci d'avance.
 
 
 
mladen:
Utilisez-le comme ceci (mql ne permet pas les fonctions ou procédures imbriquées donc la fonction ou la procédure doit être séparée)

Cela fonctionne parfaitement, merci beaucoup.

mladen :

Pour ce qui est de la sauvegarde des fichiers n'importe où : oui, cela peut être fait en utilisant l'API de Windows. Voici un lien avec un bon exemple et une bonne explication sur la façon de le faire : File Operations via WinAPI - MQL4 Articles

Je vais apprendre à le faire et je reviendrai certainement sur ce fil de discussion par la suite.

Que Dieu vous bénisse.

 

"Duplicate entry" : Pourquoi mon programme ne fonctionne-t-il pas ?

Désolé : j'ai posté ceci plus tôt, mais je ne peux pas relocaliser le message sur le Forum.

(Il ne permet pas non plus les "signets" de l'historique de mon ordinateur...)

Quoi qu'il en soit : j'ai écrit un programme simple, qui teste si deux barres consécutives sont "en hausse" ou "en baisse".

C'est-à-dire : en cas de "hausse", le haut de la barre 1 est supérieur à celui de la barre 2, et le bas de la barre 1 est également supérieur à celui de la barre 2.

est également plus élevé que celui de la barre 2. (La baisse est symétrique).

Le programme fonctionne avec les ruptures, donc à la hausse, le haut de la barre 1 moins le bas de la barre 2 doit être supérieur à un certain seuil.

de la barre 2 doit être supérieur à un certain seuil. ("Down" est symétrique.)

Je travaille maintenant avec la M30 GBPUSD. J'ai choisi ce ""seuil de rupture"" à l'œil,

comme pour le TakeProfit. Le StopLoss est comme indiqué dans le programme.

Donc : j'essaie d'acquérir de l'expérience avec MetaTrader et mql4.

Ensuite, je pourrai essayer d'autres programmes, optimiser certaines choses, etc.

J'ai réussi à compiler le programme et à l'exécuter sur le testeur de stratégie.

Mais, il n'arrive jamais à la deuxième moitié du programme, ou à imprimer qu'il a entré un ordre.

qu'il a saisi un ordre.

Pour quelqu'un d'expérimenté, l'erreur que j'ai est probablement évidente.

Elle n'est pas évidente pour moi.

Pourriez-vous m'aider ?

Merci.

Prog suit.

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

//| fonction d'initialisation de l'expert |

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

int init()

{

//----

//----

return(0) ;

}

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

//| fonction de désinitialisation experte |

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

int deinit()

{

//----

//----

return(0) ;

}

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

//| fonction de démarrage expert |

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

int start()

{

//----

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

bool OrdTot_OK;double lot;double slip ;

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 ;

//------------------------------------ début de l'ordre de descente

if (ABC == 0)// aucun ordre de sortie est vrai

OrdTot_OK = true ;

si (ABC == 0)// aucun ordre n'est sorti est vrai

Print ("sur la séquence d'ordre de descente, aucun ordre n'est sorti") ;

if ((C-D) > Size1)//high of 2 less low of 1 > .0063

BigDown = true ;

si ((C-D) > Taille1)//haut de 2 moins bas de 1 > .0063

Print ("on down order sequence, found a big breakout down") ;

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

High2down=true ;

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

Print ("sur la séquence d'ordre à la baisse, les barres consécutives ont des hauts décroissants") ;

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

Low2down=true ;

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

Print ("sur la séquence d'ordre descendant, les barres consécutives ont des bas décroissants") ;

if (High2down && Low2down)

TrendDown=true ;

si (High2down && Low2down)

Print ("sur une séquence d'ordre à la baisse, le drapeau TrendDown est activé") ;

if (TrendDown)

SL_Trailing_Down = High[1] ;

si (TrendDown)

Print ("sur la séquence d'ordre à la baisse, le stop_loss est activé") ;

if (TrendDown)

TakeProfitDown = Bid - (.005) ;

si (TrendDown)

Print ("sur la séquence d'ordre à la baisse, a obtenu 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)

Print ("on down order sequence, tried to enter a ticket", ticketdown) ;

if (ticketdown < 0)

Print("OrderSend_Down a échoué avec l'erreur #",GetLastError()) ;

return(0) ;

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

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

si (ABC == 0)

OrdTot_OK = true ;

si (ABC == 0)

Print ("sur la séquence montante, aucun ordre n'est sorti") ;

si ((A - B) > Taille1)

BigUp = true ;

si ((A - B) > Taille1)

Print ("sur la séquence ascendante, le test de taille pour les deux barres était correct") ;

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

High2Up = true;//44

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

Print ("sur la séquence montante, le test pour les hauts croissants était correct") ;

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

Low2Up=vrai ;

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

Print ("sur la séquence ascendante, le test pour les bas croissants était correct") ;

if (High2Up && Low2Up)

TrendUp1=vrai ;

if (High2Up && Low2Up)

Print ("sur la séquence de hausse, le drapeau de hausse a été activé") ;

si (TrendUp1)

SL_Trailing_Up = Low[1] ;

if (TrendUp1)

Print ("sur la séquence ascendante, a établi le stoploss") ;

if (TrendUp1)

TakeProfitUp = Ask + (.005) ;

si (TrendUp1)

Print ("sur la séquence ascendante, le takeprofit a été établi", TakeProfitUp) ;

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

Print ("sur la séquence de hausse, a essayé d'envoyer un ordre", ticketup) ;

si (ticketup < 0)

Print("OrderSend_Up failed with error #",GetLastError()) ;

return(0) ;

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

//----

return(0);// Cette ligne est peut-être superflue.

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

//----

return(0) ;

}

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

 

Utilisation de plusieurs CharToStr ????

Je voudrais placer deux caractères wingding. L'un au-dessus de l'autre. Voici le code que j'utilise pour définir le premier caractère : -----ObjectSetText("signal "+x+"0",CharToStr(104),symbolSize, "Wingdings",Yellow) ;.

Je voudrais ajouter (236) et utiliser une couleur différente pour lui.

Est-ce possible ? Si c'est le cas, merci de m'aider.

Merci de votre attention,

gever17

 

Sleep | IsTradeContextBusy

Salutations aux CodeMasters et à tous les autres !

J'ai un EA basé sur les fractales, il est utilisé sur 1 plateforme MT4, et sur plusieurs paires de devises, sur l'échelle de temps D1.

Comme plus d'une copie de l'EA effectue des transactions au même moment, je reçois la notification ''Trade Context Is Busy'' dans mon Journal.

Je voudrais insérer la fonction Sleep ou IsTradeContextBusy dans mon EA, mais je ne sais pas où la placer :

- après la fonction d'envoi d'ordre, séparément pour la fonction de vente et d'achat ?

- après la fonction d'envoi de l'ordre de vente et d'achat ?

- Comment résoudre ce problème - avec

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

? ??

Veuillez me conseiller ou m'indiquer la solution.

Merci beaucoup pour votre aide,

Amusez-vous bien,

Simon

EA ci-joint.

 

Besoin de conseils !

Bonjour,

J'apprécierais vraiment l'aide d'un programmeur pour un problème qui me fait perdre de l'argent. C'est juste que j'ai un EA qui devrait ouvrir des positions à un certain niveau de prix, mais parfois le whipsaw lui fait ouvrir trop de positions. Je voudrais qu'il n'en ouvre qu'une seule. Quelqu'un peut-il me dire si cela peut être résolu avec une ligne de code ou si je dois engager un programmeur ?

Merci.

 

Pls advs

Salut les gars, je ne sais vraiment pas comment MagicNumber fonctionne, car il semble que cela ne fonctionne pas ????. J'ai fait 2 EA simples ci-joint, je suis encore en train d'apprendre.

1. Acheter lorsque le prix est supérieur à 100SMA

2. Vendre lorsque le prix est également supérieur à 100SMA

Cela signifie que lorsque vous les attachez à 2 graphiques Eurusd différents, il devrait y avoir un achat et une vente en même temps. En théorie, chaque EA fonctionne de manière indépendante.

Mais ce n'est pas le cas... Il semble que lorsque la vente est exécutée en premier, l'EA d'achat ne fonctionne pas, et vice-versa.

Quelqu'un peut-il recoder mon EA, le MagicNumber de contrôle ? Un problème ?

Merci beaucoup

Dossiers :
buy100ma.mq4  9 kb
sell100ma.mq4  9 kb
 
Ghosthand:
Bonjour, je ne sais vraiment pas comment fonctionne le MagicNumber, car il semble qu'il ne fonctionne pas ? ???. J'ai fait 2 EA simples ci-joint, je suis encore en train d'apprendre.

1. Acheter lorsque le prix est supérieur à la 100SMA

2. Vendre lorsque le prix est également supérieur à 100SMA

Cela signifie que lorsque vous les attachez à 2 graphiques Eurusd différents, il devrait y avoir un achat et une vente en même temps. En théorie, chaque EA fonctionne de manière indépendante.

Mais ce n'est pas le cas... Il semble que lorsque la vente est exécutée en premier, l'EA d'achat ne fonctionne pas, et vice-versa.

Quelqu'un peut-il recoder mon EA, le MagicNumber de contrôle ? Une erreur ?

Merci beaucoup

Il semble que vous ayez mis le numéro magique correctement. Le seul problème est que vous ne vérifiez pas si l'ordre avec le même numéro magique existe dans le pool de transactions actuel. Vous devriez passer en revue tous les ordres ouverts et vérifier si OrderMagicNumber() == votre numéro magique avant d'entrer une nouvelle transaction.