Comment coder ? - page 299

 

Entrée de temps personnalisée à MQL4

Est-il possible d'écrire un code avec MQL4 qui puisse dessiner une ligne horizontale à partir d'une barre définie par l'utilisateur jusqu'à la fin du graphique ?

Voici le même code avec Metastock

{Customer Inputs}

Dy:=Input("Day",1,31,1);

Mn:=Input("Month",1,12,1);

Yr:=Input("Year",2000,2012,2010);

{Time Calculation}

Time:=Dy=DayOfMonth() AND Mn=Month() AND Yr=Year();

{Formula}

Start:= ValueWhen(1,Time,CLOSE);

{Output}

Start;

Et voici le résultat

J'espère pouvoir faire la même chose avec MQL4

 

Essayez comme ceci :

#property indicator_chart_window

extern string startFrom = "2012.07.06 00:00";

int init() { return(0); }

int deinit() { ObjectDelete("hLine"); return(0); }

int start()

{

string name = "hLine";

int barShift = iBarShift(NULL,0,StrToTime(startFrom));

ObjectCreate(name,OBJ_TREND,0,0,0,0,0);

ObjectSet(name,OBJPROP_PRICE1,Close);

ObjectSet(name,OBJPROP_PRICE2,Close);

ObjectSet(name,OBJPROP_TIME1,Time);

ObjectSet(name,OBJPROP_TIME2,Time[0]);

return (0);

}

Copiez et collez le code dans un indicateur (c'est un indicateur qui fonctionne déjà) et attachez-le au graphique.

kappari:
Est-il possible d'écrire un code avec MQL4 qui puisse dessiner une ligne horizontale à partir d'une barre définie par l'utilisateur jusqu'à la fin du graphique ?

Voici le même code avec Metastock

{Customer Inputs}

Dy:=Input("Day",1,31,1);

Mn:=Input("Month",1,12,1);

Yr:=Input("Year",2000,2012,2010);

{Time Calculation}

Time:=Dy=DayOfMonth() AND Mn=Month() AND Yr=Year();

{Formula}

Start:= ValueWhen(1,Time,CLOSE);

{Output}

Start;

Et voici le résultat

J'espère pouvoir faire la même chose avec MQL4.
 
mladen:
Essayez comme ceci :
#property indicator_chart_window

extern string startFrom = "2012.07.06 00:00";

int init() { return(0); }

int deinit() { ObjectDelete("hLine"); return(0); }

int start()

{

string name = "hLine";

int barShift = iBarShift(NULL,0,StrToTime(startFrom));

ObjectCreate(name,OBJ_TREND,0,0,0,0,0);

ObjectSet(name,OBJPROP_PRICE1,Close);

ObjectSet(name,OBJPROP_PRICE2,Close);

ObjectSet(name,OBJPROP_TIME1,Time);

ObjectSet(name,OBJPROP_TIME2,Time[0]);

return (0);

}
Il suffit de le copier et de le coller dans un indicateur (c'est un indicateur qui fonctionne déjà) et de l'attacher au graphique.

Vous êtes le meilleur merci beaucoup mladen

 

Bonjour Mladen,

Pouvez-vous m'en dire plus sur le raisonnement qui sous-tend ces fonctions? Je ne comprends toujours pas très bien. Merci

Terrance

mladen:
Essayez cette fonction :
int countOpenedOrders(int type)

{

int openedOrders = 0;

for(int i=0; i < OrdersTotal(); i++)

{

if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES) == false) break;

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

if(OrderMagicNumber() != MagicNumber) continue;

if(OrderType() == type) openedOrders++;

}

return(openedOrders);

}

[/PHP]

To count opened buy orders, call it like this :

int openedBuys = countOpened(OP_BUY);

to count opened sell orders, call it like this :

[PHP]int openedSells = countOpened(OP_SELL);
et ensuite vous pouvez vérifier
:if openedBuys==0 open buy

if openedSells==0 open sell

 

tkuan77

Vous vouliez limiter les ordres à 1 achat et 1 vente à la fois.

Donc, si vous appelez le compteur d'ordres ouverts avant d'ouvrir l'une des positions, vous pouvez contrôler le nombre d'achats ou de ventes ouverts que vous avez.

un exemple :

int openedBuys = countOpened(OP_BUY); if (openedBuys==0) code for open a buy order

si openedBuys uis est autre chose que 0, vous n'ouvrez pas de nouvel ordre d'achat. La même logique s'applique aux ventes (c'est le deuxième exemple dans ce post).

tkuan77:
Salut Mladen,

Pouvez-vous m'en dire plus sur le raisonnement qui sous-tend ces fonctions ? Je n'ai toujours pas compris. Merci

Terrance
 

Bonjour Mladen,

Je me suis peut-être mal exprimé. Ce que j'essaie de faire, c'est que lorsque mes critères d'achat sont remplis, cela déclenche un achat et si un autre critère d'achat est à nouveau rempli, cela déclenche un autre achat OU une vente si le critère de vente est rempli. Cependant, le nombre maximum de transactions que je pourrai avoir à tout moment sera de 2.

J'ai essayé votre méthode précédemment et je rencontre toujours le système ouvrant 2 transactions en même temps, c'est pourquoi j'ai essayé de le limiter avec la fonction Bars avec le même problème d'ouverture de 2 transactions en même temps par l'EA.

Quelle pourrait être la cause de ce problème ? Est-ce que cela a quelque chose à voir avec ma logique ?

Salutations

Terrance

mladen:
tkuan77

Vous vouliez limiter les ordres à 1 achat et 1 vente à la fois.

Donc, si vous appelez le compteur d'ordres ouverts avant d'ouvrir l'une des positions, vous pouvez contrôler combien d'achats ou de ventes ouverts vous avez.

un exemple :

int openedBuys = countOpened(OP_BUY); if (openedBuys==0) code for open a buy order
Si openedBuys est différent de 0, vous n'ouvrez pas de nouvel ordre d'achat. La même logique s'applique à la vente (c'est le deuxième exemple dans ce post).
 

Vous pouvez ajouter une vérification pour savoir si un ordre d'un certain type a déjà été ouvert sur une barre actuelle et de cette façon vous empêcherez l'ouverture d'un nouvel ordre sur un prochain tick. Si oui (un ordre a été ouvert sur la barre actuelle), alors il n'est pas possible d'ouvrir un nouvel ordre. Si non, vous pouvez ouvrir un nouvel ordre. Voici une fonction qui peut compter les ordres de type rewuired ouverts sur la barre actuelle.

int countOpenedOnACurrentBar(int type)

{

int openedAtBar = 0;

datetime startTime = Time[0];

datetime endTime = Time[0]+Period()*60;

for(int i=0; i < OrdersTotal(); i++)

{

if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES) == false) break;

if(OrderMagicNumber() != MagicNumber) continue;

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

if(OrderType() != type) continue;

if(OrderOpenTime()=endTime) continue;

openedAtBar++;

break;

}

return(openedAtBar);

}

tkuan77:
Bonjour Mladen,

Je me suis peut-être mal exprimé. Ce que j'essaie d'accomplir, c'est que lorsque mes critères d'achat sont remplis, cela déclenche un achat et si un autre critère d'achat est à nouveau rempli, cela déclenche un autre achat OU une vente si le critère de vente est rempli. Cependant, le nombre maximum de transactions que je pourrai avoir à tout moment sera de 2.

J'ai essayé votre méthode précédemment et je rencontre toujours le système ouvrant 2 transactions en même temps, c'est pourquoi j'ai essayé de le limiter avec la fonction Bars avec le même problème d'ouverture de 2 transactions en même temps par l'EA.

Quelle pourrait être la cause de ce problème ? Est-ce que cela a quelque chose à voir avec ma logique ?

Salutations

Terrance
 
tkuan77:
Bonjour Mladen,

Peut-être me suis-je mal exprimé. Ce que j'essaie de faire, c'est que lorsque mes critères d'achat sont remplis, cela déclenche un achat et si un autre critère d'achat est à nouveau rempli, cela déclenche un autre achat OU une vente si le critère de vente est rempli. Cependant, le nombre maximum de transactions que je pourrai avoir à tout moment sera de 2.

J'ai essayé votre méthode précédemment et je rencontre toujours le système ouvrant 2 transactions en même temps, c'est pourquoi j'ai essayé de le limiter avec la fonction Bars avec le même problème d'ouverture de 2 transactions en même temps par l'EA.

Quelle pourrait être la cause de ce problème ? Est-ce que cela a quelque chose à voir avec ma logique ?

Salutations

Terrance

C'est parce que vous n'avez pas spécifié comment vous voulez que le deuxième trade soit différent du premier. La différenciation peut prendre la forme d'un nombre x de barres ou d'un prix différent du FirstBuyPrice.

 

Merci Mladen pour l'aide, mais je veux juste vérifier avec vous, dois-je mettre le code avant ma fonction long/short, entre les deux ou ailleurs ? Parce qu'il semble qu'une erreur continue d'apparaître et je n'arrive pas à en trouver la source. Et est-ce que MagicNumber est censé être un nombre entier ?

Terrance

total = OrdersTotal() ;

si(total < 2)

{

int countOpenedOnACurrentBar(int type)

{

int openedAtBar = 0 ;

datetime startTime = Time[0] ;

datetime endTime = Time[0]+Period()*60 ;

for(int i=0 ; i < OrdersTotal() ; i++)

{

if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES) == false) break ;

if(OrderMagicNumber() != MagicNumber) continue ;

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

if(OrderType() != type) continue ;

if(OrderOpenTime()=endTime) continue ;

openedAtBar++ ;

pause ;

}

return(openedAtBar) ;

}

if(isCrossed == 1 && shortEma > mainshortEma && longEma > mainshortEma)

{

ticket=OrderSend(Symbol(),OP_BUY,Lots,Ask,1,Ask-StopLoss*Point,Ask+TakeProfit*Point,

"My EA",12345,0,Green) ;

if(ticket>0)

{

if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES))

Print("Ordre BUY ouvert : ",OrderOpenPrice()) ;

}

else Print("Erreur lors de l'ouverture de l'ordre BUY : ",GetLastError()) ;

return(0) ;

}

if(isCrossed == 2 && shortEma < mainshortEma && longEma < mainshortEma)

{

ticket=OrderSend(Symbol(),OP_SELL,Lots,Bid,1,Bid+StopLoss*Point,Bid-TakeProfit*Point,

"My EA",12345,0,Red) ;

if(ticket>0)

{

if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES))

Print("Ordre VENTE ouvert : ",OrderOpenPrice()) ;

}

else Print("Erreur lors de l'ouverture d'un ordre de VENTE : ",GetLastError()) ;

return(0) ;

}

return(0) ;

}

mladen:
Vous pouvez ajouter une vérification pour savoir si un ordre d'un certain type a déjà été ouvert sur une barre actuelle et ainsi empêcher l'ouverture d'un nouvel ordre au prochain tick. Si oui (il y a eu un ordre ouvert sur une barre courante), alors il n'y a pas d'ouverture de nouvel ordre. Si non, vous pouvez ouvrir un nouvel ordre. Voici une fonction qui peut compter les ordres de type rewuired ouverts sur la barre actuelle.
int countOpenedOnACurrentBar(int type)

{

int openedAtBar = 0;

datetime startTime = Time[0];

datetime endTime = Time[0]+Period()*60;

for(int i=0; i < OrdersTotal(); i++)

{

if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES) == false) break;

if(OrderMagicNumber() != MagicNumber) continue;

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

if(OrderType() != type) continue;

if(OrderOpenTime()=endTime) continue;

openedAtBar++;

break;

}

return(openedAtBar);

}

 

...

Terrance

Il s'agit d'une fonction. Placez-la à la fin de votre EA et placez des appels à cette fonction là où vous pensez qu'il est approprié de vérifier si un ordre est déjà ouvert sur une barre courante.

tkuan77:
Merci Mladen pour votre aide, mais je veux juste vérifier avec vous, dois-je mettre le code avant ma fonction long/short, entre les deux ou ailleurs ? Parce qu'il semble qu'une erreur continue d'apparaître et je n'arrive pas à en trouver la source. Et est-ce que MagicNumber est censé être un nombre entier ?

Terrance

total = OrdersTotal() ;

if(total < 2)

{

int countOpenedOnACurrentBar(int type)

{

int openedAtBar = 0 ;

datetime startTime = Time[0] ;

datetime endTime = Time[0]+Period()*60 ;

for(int i=0 ; i < OrdersTotal() ; i++)

{

if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES) == false) break ;

if(OrderMagicNumber() != MagicNumber) continue ;

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

if(OrderType() != type) continue ;

if(OrderOpenTime()=endTime) continue ;

openedAtBar++ ;

pause ;

}

return(openedAtBar) ;

}

if(isCrossed == 1 && shortEma > mainshortEma && longEma > mainshortEma)

{

ticket=OrderSend(Symbol(),OP_BUY,Lots,Ask,1,Ask-StopLoss*Point,Ask+TakeProfit*Point,

"My EA",12345,0,Green) ;

if(ticket>0)

{

if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES))

Print("Ordre BUY ouvert : ",OrderOpenPrice()) ;

}

else Print("Erreur lors de l'ouverture de l'ordre BUY : ",GetLastError()) ;

return(0) ;

}

if(isCrossed == 2 && shortEma < mainshortEma && longEma < mainshortEma)

{

ticket=OrderSend(Symbol(),OP_SELL,Lots,Bid,1,Bid+StopLoss*Point,Bid-TakeProfit*Point,

"My EA",12345,0,Red) ;

if(ticket>0)

{

if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES))

Print("Ordre VENTE ouvert : ",OrderOpenPrice()) ;

}

else Print("Erreur lors de l'ouverture de l'ordre VENTE : ",GetLastError()) ;

return(0) ;

}

return(0) ;

}
Raison: