Comment coder ? - page 151

 
luxinterior:
Utilisez le fichier d'inclusion OrderReliable. Lux

Il semble qu'il manque un peu d'éléments pour la fonction OrderSendReliable. Avez-vous une version plus récente ?

 

Comment utiliser le temps dans les calculs

Je suis nouveau sur MQL4 et j'essayais juste de voir si je pouvais faire un EA simple qui utiliserait quelques fonctions de base. Je connais bien le C++ mais je dois être mauvais en MQL4 parce que quelque chose ne va pas avec ce code et je pense que cela a à voir avec les fonctions de temps ou peut-être les fonctions d'achat/vente, voici le code : ...et d'ailleurs ce code n'a pas été conçu pour faire de l'argent, juste pour tester les fonctions Merci !

int start()

{

//----

double currenttimeN, currentvalue ;

double timeM = TimeMinute (TimeCurrent()) ;

double timeH = TimeHour(TimeCurrent()) ;

currenttimeN = (timeH / 24) + (timeM / 1440);//donne l'heure de la journée en pourcentage ou 1 (1 = un jour complet) donc toujours inférieur à 1

currentvalue = Ask ;

si (currentvalue > currenttimeN){

OrderSend(Symbol(),OP_SELL,1,Ask,3,Ask-25*Point,Ask+25*Point, "Mon ordre #2",16384,0,Green) ;

}

/* ORDRE D'ACHAT */

else if (currentvalue < currenttimeN){

OrderSend(Symbol(),OP_BUY,1,Ask,3,Ask-25*Point,Ask+25*Point, "Mon ordre n°2",16384,0,Green) ;

}

//----

retour(0) ;

}

 

...................

 

Mauvaise chaîne :

currenttimeN = (timeH / 24) + (timeM / 1440);//gives the time of day as a percent or 1 (1 = one complete day) so always less than 1[/CODE]

could be:

[CODE]currenttimeN = (timeH *60 + timeM) / 1440;

Comment pouvez-vous comparer le moment de la journée et le prix ?

 

acheter et vendre en même temps

quelqu'un peut-il m'aider à programmer pour que je puisse acheter et vendre en même temps...quelques scripts ou etc....

Je l'apprécie...

exemple :

si (Stoch1>=Stoch2)

{

ticket=OrderSend(Symbol(), OP_BUY, Lots, Ask, 3, Ask-Stoploss*Point, Ask+TakeProfit*Point, "-", 0, 0, Green) ;

ticket=OrderSend(Symbol(), OP_SELL, Lots, Bid, 3, Ask-Stoploss*Point, Bid-TakeProfit*Point, "-", 0, 0, Rouge) ;

}

le problème est qu'il ne veut que l'achat...mais j'ai besoin qu'il exécute les deux ordres...merci....

 
kk81:
quelqu'un peut-il m'aider à programmer pour que je puisse acheter et vendre en même temps...des scripts ou autres....

je l'apprécie...

exemple :

if (Stoch1>=Stoch2)

{

ticket=OrderSend(Symbol(), OP_BUY, Lots, Ask, 3, Ask-Stoploss*Point, Ask+TakeProfit*Point, "-", 0, 0, Green) ;

ticket=OrderSend(Symbol(), OP_SELL, Lots, Bid, 3, Ask-Stoploss*Point, Bid-TakeProfit*Point, "-", 0, 0, Red) ;

}

Le problème est qu'il n'achète qu'un seul ordre, mais j'ai besoin qu'il exécute les deux ordres... Merci.

https://www.mql5.com/en/forum/177583/page37

 

Comment obtenir le prix de retour d'OrderClose ?

Je veux savoir à quel prix l'ordre a été fermé.

Dossiers :
closeorder.jpg  62 kb
 

Forex freedom Bar

Bonjour

Merci beaucoup à tous les amis, en particulier Roger09

Je veux un expert (commerce automatique) ForexFreedomBars .

quand la case 5m , 15m ,30m ,1H est Rouge , envoyer un ordre de VENTE par 10-20 TP

quand le carré 5m , 15m ,30m ,1H est Bleu , envoyer un ordre d'ACHAT par 10-20 TP

(TP, SL, lot, maxtrade) la capacité doit changer

S'il vous plaît, aidez-moi.

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

//| Les barres de liberté du Forex

//|

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

#property copyright "Programmé par Eli hayun"

#property indicator_separate_window

#property indicator_minimum -0.5

//#property indicator_maximum 5

#property indicator_buffers 8

#property indicator_color1 Red

#property indicator_color2 DodgerBlue

#property indicator_color3 Red

#property indicator_color4 DodgerBlue

#property indicateur_color5 Rouge

#property indicateur_color6 DodgerBlue

#property indicateur_color7 Rouge

#property indicator_color8 DodgerBlue

//---- tampons

double buf4_up[] ;

double buf4_down[] ;

double buf3_up[] ;

double buf3_down[] ;

double buf2_up[] ;

double buf2_down[] ;

double buf1_up[] ;

double buf1_down[] ;

extern double Gap = 1 ; // Ecart entre les lignes de barres

extern int Period_1 = PERIOD_M5;//M15

extern int Period_2 = PERIOD_M15;//M30

extern int Period_3 = PERIOD_M30;//H1

extern int Period_4 = PERIOD_H1;//H4

extern int cci_1 = 2;//50

extern int cci_2 = 2;//14

extern int cci_3 = 2 ;

extern int cci_4 = 2 ;

extern int StopLoss=100 ;

extern int TakeProfit=100 ;

extern double Lots=0.1 ;

extern bool AutoDisplay = false ;

string shortname = "" ;

bool firstTime = true ;

int UniqueNum = 228 ;

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

//| Fonction d'initialisation de l'indicateur personnalisé

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

int init()

{

SetAutoDisplay() ;

shortname = "# Forex Freedom("+Period_1+", "+Period_2+", "+Period_3+", "+Period_4+")" ;

firstTime = true ;

IndicatorShortName(shortname) ;

//---- indicateurs

SetIndexStyle(0,DRAW_ARROW) ;

SetIndexArrow(0,110) ;

SetIndexBuffer(0,buf4_up) ;

SetIndexEmptyValue(0,0.0) ;

SetIndexStyle(1,DRAW_ARROW) ;

SetIndexArrow(1,110) ;

SetIndexBuffer(1,buf4_down) ;

SetIndexEmptyValue(1,0.0) ;

SetIndexStyle(2,DRAW_ARROW) ;

SetIndexArrow(2,110) ;

SetIndexBuffer(2,buf3_up) ;

SetIndexEmptyValue(2,0.0) ;

SetIndexStyle(3,DRAW_ARROW) ;

SetIndexArrow(3,110) ;

SetIndexBuffer(3,buf3_down) ;

SetIndexEmptyValue(3,0.0) ;

SetIndexStyle(4,DRAW_ARROW) ;

SetIndexArrow(4,110) ;

SetIndexBuffer(4,buf2_up) ;

SetIndexEmptyValue(4,0.0) ;

SetIndexStyle(5,DRAW_ARROW) ;

SetIndexArrow(5,110) ;

SetIndexBuffer(5,buf2_down) ;

SetIndexEmptyValue(5,0.0) ;

SetIndexStyle(6,DRAW_ARROW) ;

SetIndexArrow(6,110) ;

SetIndexBuffer(6,buf1_up) ;

SetIndexEmptyValue(6,0.0) ;

SetIndexStyle(7,DRAW_ARROW) ;

SetIndexArrow(7,110) ;

SetIndexBuffer(7,buf1_down) ;

SetIndexEmptyValue(7,0.0) ;

//----

return(0) ;

}

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

//| Fonction personnalisée de désinitialisation de l'indicateur |

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

int deinit()

{

//----

SetAutoDisplay() ;

shortname = "# Forex Freedom("+Period_1+", "+Period_2+", "+Period_3+", "+Period_4+")" ;

firstTime = true ;

//----

retour(0) ;

}

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

//| Fonction d'itération de l'indicateur personnalisée |

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

int start()

{

int counted_bars=IndicatorCounted() ;

int i=0, y5m=0, y1h=0, y30m=0, y15m=0, yy ;

int limit=Bars-counted_bars ;

datetime TimeArray_1H[], TimeArray_30M[], TimeArray_15M[], TimeArray_5M[] ;

//----

if (firstTime || NewBar())

{

firstTime = false ;

int win = UniqueNum ; // WindowFind(shortname) ;

double dif = Time[0] - Time[1] ;

for (int ii=ObjectsTotal()-1 ; ii>-1 ; ii--)

{

if (StringFind(ObjectName(ii), "FF_"+win+"_") >= 0)

ObjectDelete(ObjectName(ii)) ;

sinon

ii=-1 ;

}

double shift = 0,2 ;

pour (ii=0 ; ii<4 ; ii++)

{

string txt = " ??";

double gp ;

switch (ii)

{

cas 0 : txt = tf2txt(Period_1) ; gp = 1 + shift ; break ;

cas 1 : txt = tf2txt(Period_2) ; gp = 1 + Gap + shift ; break ;

cas 2 : txt = tf2txt(Period_3) ; gp = 1 + Gap*2 + shift ; break ;

cas 3 : txt = tf2txt(Period_4) ; gp = 1 + Gap*3 + shift ; break ;

}

string name = "FF_"+win+"_"+ii+"_"+txt ;

ObjectCreate(name, OBJ_TEXT, WindowFind(shortname), iTime(NULL,0,0)+dif*3, gp) ;

ObjectSetText(name, txt,8, "Arial", Silver) ;

}

}

ArrayCopySeries(TimeArray_1H,MODE_TIME,Symbol(),Period_4) ;

ArrayCopySeries(TimeArray_30M,MODE_TIME,Symbol(),Period_3) ;

ArrayCopySeries(TimeArray_15M,MODE_TIME,Symbol(),Period_2) ;

ArrayCopySeries(TimeArray_5M,MODE_TIME,Symbol(),Period_1) ;

for(i=0, y5m=0, y1h=0, y30m=0, y15m=0;i<limit;i++)

{

si (Time<TimeArray_5M[y5m]) y5m++ ;

si (Time<TimeArray_1H[y1h]) y1h++ ;

if (Time<TimeArray_30M[y30m]) y30m++ ;

si (Time<TimeArray_15M[y15m]) y15m++ ;

int cci_n = cci_1 ;

for (int tf = 0 ; tf < 4 ; tf++)

{

int prd ;

switch (tf)

{

cas 0 : prd = Période_1 ; cci_n = cci_1 ; yy = y5m ; break ;

cas 1 : prd = Période_2 ; cci_n = cci_2 ; yy = y15m ; break ;

cas 2 : prd = Période_3 ; cci_n = cci_3 ; yy = y30m ; break ;

case 3 : prd = Period_4 ; cci_n = cci_4 ; yy = y1h ; break ;

}

double cci = iCCI(NULL, prd, cci_n,PRICE_TYPICAL, yy) ;

double dUp = EMPTY_VALUE ; // iCustom(NULL, prd, "SuperTrend", false, 1, yy) ;

double dDn = EMPTY_VALUE ; //iCustom(NULL, prd, "SuperTrend", false, 0, yy) ;

si (cci < 0) dUp = 1 ; sinon dDn = 1 ;

switch (tf)

{

case 0 : if (dUp == EMPTY_VALUE) buf1_down = 1 ; else buf1_up = 1 ; break ;

cas 1 : if (dUp == EMPTY_VALUE) buf2_down = 1 + Gap * 1 ; else buf2_up = 1 + Gap * 1 ; break ;

cas 2 : if (dUp == EMPTY_VALUE) buf3_down = 1 + Gap * 2 ; else buf3_up = 1 + Gap * 2 ; break ;

cas 3 : if (dUp == EMPTY_VALUE) buf4_down = 1 + Gap * 3 ; else buf4_up = 1 + Gap * 3 ; break ;

}

if (NewBar())

{

string sDir = "" ;

si (buf1_up[0] + buf2_up[0] + buf3_up[0] + buf4_up[0] == 4)

sDir = "Up" ;

si (buf1_down[0] + buf2_down[0] + buf3_down[0] + buf4_down[0] == 4)

sDir = "Down" ;

si (sDir != "")

{

PlaySound("alert1.wav") ;

Print("Autoroute du Forex - Direction ",sDir) ;

}

}

}

}

si (buf1_up[0] + buf2_up[0] + buf3_up[0] + buf4_up[0] == 4)

OrderSend(Symbol(),OP_BUY,Lots,Ask,3,StopLoss ,TakeProfit) ; sinon

retour(0) ;

}

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

string tf2txt(int tf)

{

if (tf == PERIOD_M1) return("M1") ;

if (tf == PERIOD_M5) return("M5") ;

if (tf == PERIOD_M15) return("M15") ;

si (tf == PERIOD_M30) return("M30") ;

si (tf == PERIOD_H1) return("H1") ;

si (tf == PERIOD_H4) return("H4") ;

si (tf == PERIOD_D1) return("D1") ;

si (tf == PERIOD_W1) return("W1") ;

if (tf == PERIOD_MN1) return("MN1") ;

return(" ??") ;

}

void SetValues(int p1, int p2, int p3, int p4)

{

Période_1 = p1 ; Période_2 = p2 ; Période_3 = p3 ; Période_4 = p4 ;

}

void SetAutoDisplay()

{

if (AutoDisplay)

{

switch (Période())

{

case PERIOD_M1 : SetValues(PERIOD_M1, PERIOD_M5, PERIOD_M15,PERIOD_M30) ; break ;

case PERIOD_M5 : SetValues(PERIOD_M5, PERIOD_M15,PERIOD_M30,PERIOD_H1) ; break ;

case PERIOD_M15 : SetValues(PERIOD_M5, PERIOD_M15,PERIOD_M30,PERIOD_H1) ; break ;

case PERIOD_M30 : SetValues(PERIOD_M5, PERIOD_M15,PERIOD_M30, PERIOD_H1) ; break ;

case PERIOD_H1 : SetValues(PERIOD_M15, PERIOD_M30,PERIOD_H1, PERIOD_H4) ; break ;

case PERIOD_H4 : SetValues(PERIOD_M30, PERIOD_H1, PERIOD_H4, PERIOD_D1) ; break ;

case PERIOD_D1 : SetValues(PERIOD_H1, PERIOD_H4, PERIOD_D1, PERIOD_W1) ; break ;

case PERIOD_W1 : SetValues(PERIOD_H4, PERIOD_D1, PERIOD_W1,PERIOD_MN1) ; break ;

case PERIOD_MN1 : SetValues(PERIOD_H4, PERIOD_D1, PERIOD_W1,PERIOD_MN1) ; break ;

}

}

}

bool NewBar()

{

static datetime dt = 0 ;

if (Time[0] != dt)

{

dt = Time[0] ;

return(true) ;

}

return(false) ;

}

 

Problème de migration d'un indicateur dans l'EA comme fonction de filtre

En essayant d'utiliser une partie d'un indicateur comme fonction dans mon EA, je me suis rendu compte qu'il existe trois types de fonctions. Le premier type est un vide qui effectue un traitement et renvoie 0. Le deuxième type effectue des calculs et renvoie un résultat. Le troisième type attend qu'on lui donne un ensemble de valeurs spécifiques à traiter et renvoie un résultat.

Que puis-je faire si mes calculs produisent trois résultats qui doivent être utilisés au moins de deux manières différentes ? Ces calculs peuvent avoir besoin d'être situés dans la fonction Start() pour la raison suivante : les informations circulent des variables externes (qui peuvent être ajustées manuellement) et des variables globales (qui restent statiques à moins d'être recompilées) vers les différentes fonctions de l'EA. La fonction Start() est le cerveau de l'EA et s'adresse aux autres fonctions pour obtenir leurs informations. Elle peut transmettre un ensemble de variables à une fonction en tant qu'arguments de cette fonction si celle-ci a déclaré ces variables entre ses crochets (). Elle reçoit ensuite un résultat en retour et peut transmettre d'autres variables à une autre fonction pour terminer son processus.

Une fois que j'ai appris à passer des variables comme arguments à d'autres fonctions, j'espérais avoir un certain succès avec mon codage EA. Malheureusement, j'ai créé une erreur de division par zéro, peut-être parce que j'ai essayé de transmettre une valeur en tant qu'argument d'une fonction à une autre, de sorte que la valeur n'est pas arrivée là où elle était nécessaire. Comme elle était en fait manquante, j'ai obtenu l'erreur de division par zéro. Ma révision suivante a supprimé les étapes intermédiaires et livré les valeurs directement aux fonctions où elles étaient utilisées.

(Je ne pense pas m'être rendu service en enregistrant ce point dans mes deux premiers mois d'expérience d'apprentissage du codage MQL4. Cependant, tous ceux qui pourraient chercher sur Google "MQL4 zero divide error" pourraient être heureux de savoir comment j'ai réussi à le résoudre).

La révision suivante de mon EA a permis de résoudre mon erreur de division par zéro, mais le commentaire du journal de mon testeur de stratégie indiquait maintenant un dépassement de pile. Pour ceux qui cherchent "MQL4 stack overrun", je vais publier la cause que j'ai trouvée. Il s'agissait de l'échec de la conversion des lots en leur équivalent décimal par l'utilisation de la constante "Points" lors de la modification d'un prix pour l'ouverture ou la modification d'un ordre.

La dernière astuce que je voudrais poster ici (après mes deux premiers mois d'expérience de codage et plus de 12 réécritures d'EA) est une façon dont j'ai pu résoudre une parenthèse "inégale entre parenthèses gauches" difficile à trouver. Le MetaEditor ne met pas en évidence le texte des crochets en couleur. Si vous avez un produit AutoDesk avec Visual LISP Editor, vous pouvez ouvrir votre fichier MQ4 dans cet éditeur et voir presque toutes les paires de crochets en couleur. Il est ainsi beaucoup plus facile de vérifier si une parenthèse manque.

Merci à tous ceux qui partagent leurs réponses sur ce forum,

Bon codage !

 

Une aide ?

J'aimerais également savoir si les ordres Metatrader peuvent être exécutés à partir de la ligne de commande. Ou en général s'il est possible d'interfacer des applications externes avec Metatrader en utilisant une sorte d'API.

Merci

Jeff

Raison: