Comment coder ? - page 111

 
MrPip:
Soyez prudent lorsque vous utilisez OrderComment() pour identifier les transactions. Parfois, le courtier ajoute des caractères au commentaire.

Il est préférable d'utiliser

si (StringFind(OrderComment(), UserComment, 0) > 0)

{

// l'ordre identifié par UserComment est trouvé dans OrderComment

}

au lieu de

if (OrderComment() == UserComment)

{

// l'ordre peut être identifié par UserComment

// si OrderComment n'a pas été modifié par le courtier

}

Robert

Exactement ... Et aussi, parfois le commentaire original codé dans l'EA est trop long et sera tronqué par la plateforme (pas sûr que le reste du commentaire soit dans la "mémoire" mais il n'est pas affiché dans la colonne commentaire).

FerruFx

 

besoin d'aide avec mon EA

Bonjour,

Je travaille sur un EA qui ouvre des positions longues et courtes simultanément et je suis confronté à ce problème... lorsque les deux types de positions sont ouvertes, disons que la première est courte et la seconde est longue... l'EA ne fermera pas la position longue si la courte est encore ouverte, il attendra que la courte soit fermée puis fermera la longue lorsque les conditions seront remplies et vice versa. Voici la partie de l'EA où il devrait fermer les positions ouvertes :

//---- Fermer les positions ouvertes

for(int cnt=0 ; cnt<total ; cnt++)

{

OrderSelect(cnt, SELECT_BY_POS) ;

{

//-- Fermer les positions longues

if(OrderSymbol() == Symbol() && OrderType()==OP_BUY && rsi1>75 && rsi<75)

{

OrderClose(OrderTicket(),OrderLots(),Bid,5,Green) ;

LotL=Lot ;

}

//-- Fermer une position courte

if(OrderSymbol() == Symbol() && OrderType()==OP_SELL && rsi125)

{

OrderClose(OrderTicket(),OrderLots(),Ask,5,Red) ;

LotS=Lot ;

}

}

}

*où rsi1 est le rsi précédent et rsi est la lecture actuelle

*LotL & LotS est un multiplicateur du lot d'origine, j'ai configuré l'EA pour qu'il ouvre un maximum de 3 positions de chaque côté, de sorte que lors de la fermeture d'un type de positions ouvertes, LotL & LotS sera réinitialisé à la taille d'origine.

l'EA fonctionne comme prévu lors de l'ouverture des positions mais le problème est avec la fermeture des positions ouvertes, je pense que l'EA dans la partie boucle ne lit pas toutes les positions ouvertes mais seulement la première... toute aide pour résoudre ce problème est vraiment appréciée !

merci !

pete

 

J'essaie d'ajouter la fonction "Pips pour activer le Trailing stop". Ce que j'ai modifié est en rouge. Que faut-il encore ajouter ?

extern string Remark1 = "== Main Settings ==";

extern int MagicNumber = 54321;

extern bool SignalMail = False;

extern bool EachTickMode = true;

extern double Lots = 4;

extern int Slippage = 2;

extern bool UseStopLoss = false;

extern int StopLoss = 100;

extern bool UseTakeProfit = false;

extern int TakeProfit = 15;

extern bool UseTrailingStop = true;

extern int TrailingStop = 45;

extern double Pips_Activate_TS = 5;

extern bool MoveStopOnce = False;

extern int MoveStopWhenPrice = 50;

extern int MoveStopTo = 1;

extern int MaxConcurrentTrades = 2;

//Version 2.01

int BarCount;

int Current;

bool TickCheck = False;

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

//| expert initialization function |

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

int init() {

BarCount = Bars;

if (EachTickMode) Current = 0; else Current = 1;

return(0);

}

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

//| expert deinitialization function |

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

int deinit() {

return(0);

}

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

//| expert start function |

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

int start()

{

int Order = SIGNAL_NONE;

int Total, Ticket;

double StopLossLevel, TakeProfitLevel;

if (EachTickMode && Bars != BarCount) TickCheck = False;

Total = OrdersTotal();

Order = SIGNAL_NONE;

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

//| Variable Begin |

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

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

//| Variable End |

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

//Check position

bool IsTrade = False;

for (int i = 0; i < Total; i ++) {

OrderSelect(i, SELECT_BY_POS, MODE_TRADES);

if(OrderType() <= OP_SELL && OrderSymbol() == Symbol() && OrderMagicNumber() == MagicNumber) {

IsTrade = True;

if(OrderType() == OP_BUY) {

//Close

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

//| Signal Begin(Exit Buy) |

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

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

//| Signal End(Exit Buy) |

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

if (Order == SIGNAL_CLOSEBUY && ((EachTickMode && !TickCheck) || (!EachTickMode && (Bars != BarCount)))) {

OrderClose(OrderTicket(), OrderLots(), Bid, Slippage, MediumSeaGreen);

if (SignalMail) SendMail("[Signal Alert]", "[" + Symbol() + "] " + DoubleToStr(Bid, Digits) + " Close Buy");

if (!EachTickMode) BarCount = Bars;

IsTrade = False;

continue;

}

//MoveOnce

if(MoveStopOnce && MoveStopWhenPrice > 0) {

if(Bid - OrderOpenPrice() >= Point * MoveStopWhenPrice) {

if(OrderStopLoss() < OrderOpenPrice() + Point * MoveStopTo) {

OrderModify(OrderTicket(),OrderOpenPrice(), OrderOpenPrice() + Point * MoveStopTo, OrderTakeProfit(), 0, Red);

if (!EachTickMode) BarCount = Bars;

continue;

}

}

}

//Trailing stop

if(UseTrailingStop && TrailingStop > 0) {

if(Bid - OrderOpenPrice() > Point * TrailingStop) {

if(OrderStopLoss() < Bid - Point * TrailingStop) {

OrderModify(OrderTicket(), OrderOpenPrice(), Bid - Point * TrailingStop, OrderTakeProfit(), 0, MediumSeaGreen);

if (!EachTickMode) BarCount = Bars;

continue;

}

}

}

} else {

//Close

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

//| Signal End(Exit Sell) |

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

if (Order == SIGNAL_CLOSESELL && ((EachTickMode && !TickCheck) || (!EachTickMode && (Bars != BarCount)))) {

OrderClose(OrderTicket(), OrderLots(), Ask, Slippage, DarkOrange);

if (SignalMail) SendMail("[Signal Alert]", "[" + Symbol() + "] " + DoubleToStr(Ask, Digits) + " Close Sell");

if (!EachTickMode) BarCount = Bars;

IsTrade = False;

continue;

}

//MoveOnce

if(MoveStopOnce && MoveStopWhenPrice > 0) {

if(OrderOpenPrice() - Ask >= Point * MoveStopWhenPrice) {

if(OrderStopLoss() > OrderOpenPrice() - Point * MoveStopTo) {

OrderModify(OrderTicket(),OrderOpenPrice(), OrderOpenPrice() - Point * MoveStopTo, OrderTakeProfit(), 0, Red);

if (!EachTickMode) BarCount = Bars;

continue;

}

}

}

//Trailing stop

if(UseTrailingStop && TrailingStop > 0) {

if((OrderOpenPrice() - Ask) > (Point * TrailingStop)) {

if((OrderStopLoss() > (Ask + Point * TrailingStop)) || (OrderStopLoss() == 0)) {

OrderModify(OrderTicket(), OrderOpenPrice(), Ask + Point * TrailingStop, OrderTakeProfit(), 0, DarkOrange);

if (!EachTickMode) BarCount = Bars;

continue;

}

}

}

}

}

}

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

//| Signal Begin(Entry) |

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

if(Open[0] > Open[0+1] &&

Open[0+1] >= Open[0+2] &&

Open[0+2]>= Open[0+3] &&

Open[0+3] >= Open[0+4] &&

Open[0+4] >= Open[0+5] &&

Open[0+5] >= Open[0+6]) Order = SIGNAL_SELL;

if(Open[0] < Open[0+1] &&

Open[0+1] <= Open[0+2] &&

Open[0+2]<= Open[0+3] &&

Open[0+3] <= Open[0+4] &&

Open[0+4] <= Open[0+5] &&

Open[0+5] <= Open[0+6]) Order = SIGNAL_BUY;

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

//| Signal End |

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

//Buy

if (Order == SIGNAL_BUY && ((EachTickMode && !TickCheck) || (!EachTickMode && (Bars != BarCount)))) {

if(DecideToOpenTrade(OP_BUY) && TradeSlotsAvailable()) {

//Check free margin

if (AccountFreeMargin() < (1000 * Lots)) {

Print("We have no money. Free Margin = ", AccountFreeMargin());

return(0);

}

if (UseStopLoss) StopLossLevel = Ask - StopLoss * Point; else StopLossLevel = 0.0;

if (UseTakeProfit) TakeProfitLevel = Ask + TakeProfit * Point; else TakeProfitLevel = 0.0;

Ticket = OrderSend(Symbol(), OP_BUY, Lots, Ask, Slippage, StopLossLevel, TakeProfitLevel, "Buy(#" + MagicNumber + ")", MagicNumber, 0, DodgerBlue);

if(Ticket > 0) {

if (OrderSelect(Ticket, SELECT_BY_TICKET, MODE_TRADES)) {

Print("BUY order opened : ", OrderOpenPrice());

if (SignalMail) SendMail("[Signal Alert]", "[" + Symbol() + "] " + DoubleToStr(Ask, Digits) + " Open Buy");

} else {

Print("Error opening BUY order : ", GetLastError());

}

}

if (EachTickMode) TickCheck = True;

if (!EachTickMode) BarCount = Bars;

return(0);

}

}

//Sell

if (Order == SIGNAL_SELL && ((EachTickMode && !TickCheck) || (!EachTickMode && (Bars != BarCount)))) {

if(DecideToOpenTrade(OP_SELL) && TradeSlotsAvailable()) {

//Check free margin

if (AccountFreeMargin() < (1000 * Lots)) {

Print("We have no money. Free Margin = ", AccountFreeMargin());

return(0);

}

if (UseStopLoss) StopLossLevel = Bid + StopLoss * Point; else StopLossLevel = 0.0;

if (UseTakeProfit) TakeProfitLevel = Bid - TakeProfit * Point; else TakeProfitLevel = 0.0;

Ticket = OrderSend(Symbol(), OP_SELL, Lots, Bid, Slippage, StopLossLevel, TakeProfitLevel, "Sell(#" + MagicNumber + ")", MagicNumber, 0, DeepPink);

if(Ticket > 0) {

if (OrderSelect(Ticket, SELECT_BY_TICKET, MODE_TRADES)) {

Print("SELL order opened : ", OrderOpenPrice());

if (SignalMail) SendMail("[Signal Alert]", "[" + Symbol() + "] " + DoubleToStr(Bid, Digits) + " Open Sell");

} else {

Print("Error opening SELL order : ", GetLastError());

}

}

if (EachTickMode) TickCheck = True;

if (!EachTickMode) BarCount = Bars;

return(0);

}

}

if (!EachTickMode) BarCount = Bars;

return(0);

}

 
 
mifiglo:
Bonjour à tous les traders,

J'ai ce petit problème pour développer un Expert Advisor à partir d'un indicateur personnalisé, j'ai essayé la fonction "iCustom" mais mon indicateur renvoie toujours la même valeur.

Il renvoie quelque chose comme 21473..., comme ça...

Je veux que l'EA soit capable de reconnaître quand les signaux de flèches de vente et d'achat sont générés et qu'il effectue l'action commerciale correspondante (c'est-à-dire acheter quand l'indicateur indique une hausse et vendre quand il indique une baisse).

Voici le code de l'indicateur. J'apprécierais beaucoup si quelqu'un pouvait trouver une solution le plus rapidement possible.

Veuillez également poster les lignes de code de votre fonction iCustom().

FerruFx

 

Désolé, c'est tout ce que j'ai...

 
 

Rsi Ea

Ceci est mon premier EA. Il utilise 2 rsi qui se croisent dans 3 cadres temporels. J'ai un problème avec l'EA qui prend des positions contre les croisements. Il achète quand il est censé vendre et vend quand il est censé acheter. Quelqu'un pourrait-il regarder le code et me dire où je me suis trompé ? Je n'ai pas été capable de voir ce qui n'allait pas.

J'ai joint l'application et une photo du problème.

Dossiers :
 

Besoin d'aide pour le code EA !

Bonjour à tous,

Comme vous le savez, le marché des changes est ouvert 24 heures sur 24, je ne suis pas à l'aise pour trader la nuit sans être assis devant mon ordinateur. Je pense donc que le meilleur moyen est un programme pour protéger le trade si le prix se déplace vers ma direction préférée. Par exemple, si j'ai ouvert 5 lots au total, lorsque le profit est supérieur à 50 pips, il déplace automatiquement le stop loss pour atteindre le seuil de rentabilité. Lorsque le bénéfice est supérieur à 100 pips, il se déplace pour protéger 30 pips, lorsque le bénéfice est supérieur à 200 pips, il se déplace pour protéger 50 pips, et ainsi de suite.

J'ai essayé de coder moi-même. Mais cela ne fonctionne pas lorsque je le glisse dans mon graphique et que je le configure pour le trading en direct. Quelqu'un pourrait-il m'aider à regarder mon code et à le corriger ? Merci beaucoup.

#property copyright "x li"

#property link ""

#property show_confirm

//---- paramètres d'entrée

extern int cible1 =50 ;

extern int target2 =100 ;

external int target3 =150 ;

extern int target4 =200 ;

extern int target5 =300 ;

extern int protect1 =0 ;

extern int protect2 =5 ;

extern int protect3 =50 ;

extern int protect4 =100 ;

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

//| script "déplacez le stoploss vers protect(50->0;100->5;150->50;200->50;300->100)" |

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

int start()

{

bool résultat ;

double stop_loss,point,EntryPrice,profit ;

int cmd,total,erreur,i ;

//----

total=OrdersTotal() ;

point=MarketInfo(Symbol(),MODE_POINT) ;

//----

for(i=0 ; i<total ; i++)

{

if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))

{

cmd=OrderType() ;

EntryPrice=OrderOpenPrice() ;

//---- ordres d'achat sont pris en compte

if(cmd==OP_BUY)

{

profit=Bid-EntryPrice ;

if(profit>target1*point && profit<target2*point)

{

stop_loss=Prix d'entrée+protection1*point ;

result=OrderModify(OrderTicket(),0,stop_loss,0,0,CLR_NONE) ;

}

if(profit>target2*point && profit<target3*point)

{

stop_loss=Prix d'entrée+protection2*point ;

result=OrderModify(OrderTicket(),0,stop_loss,0,0,CLR_NONE) ;

}

if(profit>target3*point && profit<target4*point)

{

stop_loss=Prix d'entrée+protection3*point ;

result=OrderModify(OrderTicket(),0,stop_loss,0,0,CLR_NONE) ;

}

if(profit>target4*point && profit<target5*point)

{

stop_loss=Prix d'entrée+protection3*point ;

result=OrderModify(OrderTicket(),0,stop_loss,0,0,CLR_NONE) ;

}

if(profit>target5*point)

{

stop_loss=Prix d'entrée+protection4*point ;

result=OrderModify(OrderTicket(),0,stop_loss,0,0,CLR_NONE) ;

}

}

//---- ordres de vente sont pris en compte

if(cmd==OP_SELL))

{

profit=Prix d'entrée-Ask ;

if(profit>target1*point && profit<target2*point)

{

stop_loss=EntryPrice-protect1*point ;

result=OrderModify(OrderTicket(),0,stop_loss,0,0,CLR_NONE) ;

}

if(profit>target2*point && profit<target3*point)

{

stop_loss=Prix d'entrée-protection2*point ;

result=OrderModify(OrderTicket(),0,stop_loss,0,0,CLR_NONE) ;

}

if(profit>target3*point && profit<target4*point)

{

stop_loss=Prix d'entrée-protection3*point ;

result=OrderModify(OrderTicket(),0,stop_loss,0,0,CLR_NONE) ;

}

if(profit>target4*point && profit<target5*point)

{

stop_loss=Prix d'entrée-protection3*point ;

result=OrderModify(OrderTicket(),0,stop_loss,0,0,CLR_NONE) ;

}

if(profit>target5*point)

{

stop_loss=Prix d'entrée-protection4*point ;

result=OrderModify(OrderTicket(),0,stop_loss,0,0,CLR_NONE) ;

}

}

}

else { Print( "Error when order select ", GetLastError()) ; break ; } }

}

//----

retour(0) ;

}

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

 

Rsi Ea

Je ne vois pas pourquoi vous utilisez la même variable pour ouvrir et fermer des transactions, mais cela peut fonctionner.

Ceci peut être le problème :

"Ordre" est une variable globale. Ainsi, à la fin de chaque exécution de la fonction Start, elle sera définie sur la dernière valeur qui lui a été attribuée et utilisera cette valeur au début de l'exécution suivante. Si vous la rendez locale (en la déplaçant à l'intérieur de Start), cela peut résoudre le problème. Sinon, vous devrez le réinitialiser après sa dernière utilisation.

Bonne chasse,

Big Be