Aide au codage - page 143

 
arroganzmaschine:
Hey mladen, une autre question :

Comment puis-je vérifier tous les ordres ouverts, si leur profit est inférieur à -20 et les fermer ensuite ?

Quelque chose comme ceci ?

//int currentTicket ;

for(int i0=OrdersTotal()-1 ; i0>=0 ; i0--) {

//currentTicket = OrderSelect(i0, SELECT_BY_POS, MODE_TRADES) ;

if(OrderProfit() <= -20) {

OrderClose(OrderTicket(),OrderLots(),0,0, CLR_NONE) ;

}

}

arroganzmaschine

Oui, cela devrait faire l'affaire.

Vous pourriez changer la ligne où vous vérifiez le profit en ceci :

si ((OrderProfit()+OrderSwap()+OrderCommission()) <= -20)

pour être sûr que c'est un profit "pur" que vous vérifiez.

 

Dois-je définir un Bid ou un Ask à OrderClose ? Ou la ligne est-elle correcte ?

 

Hm, il y a un problème. Le backtest ne ferme pas les ordres qui sont en profit négatif. A la fin du test, il y a des ordres ouverts avec un profit de -230.

 

int start()

{

for(int i0=OrdersTotal()-1 ; i0>=0 ; i0--) {

if((OrderProfit()+OrderSwap()+OrderCommission()) <= -20) {

OrderClose(OrderTicket(),OrderLots(),0,0, CLR_NONE) ;

}

}

}

Cela ne fonctionne pas.

 
arroganzmaschine:
int start()

{

for(int i0=OrdersTotal()-1 ; i0>=0 ; i0--) {

if((OrderProfit()+OrderSwap()+OrderCommission()) <= -20) {

OrderClose(OrderTicket(),OrderLots(),0,0, CLR_NONE) ;

}

}

}

Ça ne marche pas.

Vous avez oublié la fonction OrderSelect() (vous devez toujours sélectionner la commande avant de faire quoi que ce soit avec elle). Il serait également judicieux d'ajouter une partie qui vérifie le type d'ordre que vous essayez de clôturer.

Quelque chose comme ceci :

for(int i0=OrdersTotal()-1; i0>=0; i0--) {

if (OrderSelect(u0,SELECT_BY_POS,MODE_TRADES))

if((OrderProfit()+OrderSwap()+OrderCommission()) <= -20)

{

if (OrderType()==OP_BUY) OrderClose(OrderTicket(),OrderLots(),Bid,0,CLR_NONE);

if (OrderType()==OP_SELL) OrderClose(OrderTicket(),OrderLots(),Ask,0,CLR_NONE);

}

 

Quelqu'un pourrait-il m'aider à convertir l'histogramme en barres dans l'indicateur TrendHistogram ? J'aimerais obtenir les mêmes barres que celles de l'indicateur TrendFilter ci-joint.

TrendHistogram a besoin de l'indicateur EMA_Adaptive pour fonctionner correctement.

 
freakout:
Quelqu'un pourrait-il m'aider à convertir l'histogramme en barres dans l'indicateur TrendHistogram ? Je voudrais obtenir les mêmes barres que celles de l'indicateur TrendFilter ci-joint TrendHistogram a besoin de l'indicateur EMA_Adaptive pour fonctionner correctement

freakout

Voici ce que vous pouvez faire

Définissez le paramètre DrawAsBars à true et le dessin se fera comme vous l'avez décrit. Si vous laissez ce paramètre à false, il fonctionnera comme l'original.

Dossiers :
 

Bonjour,

Est-ce que quelqu'un peut m'aider à modifier ce code ? Le back-testing est bon mais l'EA ne fonctionne pas sur le compte démo / réel.

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

//| Hans123Trader v1 |

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

#include

#property copyright "hans123"

#property link ""

// programmé par fukinagashi

extern int BeginSession1=6 ;(pendant le backtest, j'ai modifié et mis 0 pour toutes les sessions, ce qui a permis d'obtenir les meilleurs résultats)

extern int EndSession1=10 ;

extern int BeginSession2=10 ;

extern int EndSession2=14 ;

extern double TrailingStop = 0 ;

extern double TakeProfit = 452 ;

extern double InitialStopLoss=40 ;

double Lots = 0.1 ;

datetime bartime = 0 ;

double Slippage=3 ;

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

//| |

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

int start()

{

int cnt, ticket, err, i, j, cmd ;

int MagicNumber ;

double ts, tp, LowestPrice, HighestPrice, Price ;

bool Order[5] ;

chaîne de caractères setup ;

datetime Validity=0 ;

if(IsTesting() && Bars<100) return(0) ;

MagicNumber = 50000 + func_Symbol2Val(Symbol())*100 ;

setup="H123_" + Symbole() ;

if (bartime == Time[0]) {

return(0) ;

} else {

bartime = Time[0] ;

}

/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

///////////////// MODIFICATIONS SUR LES ORDRES OUVERTS ////////////////////////////////////////////////////////////////////

/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

for(cnt=OrdersTotal();cnt>=0;cnt--)

{

OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES) ;

if(OrderType()==OP_BUY && (OrderMagicNumber()==MagicNumber+1 || OrderMagicNumber()==MagicNumber+3)) {

if(TimeDay(OrderOpenTime())!=TimeDay(Time[0])) {

Print(".") ;

OrderClose(OrderTicket(), Lots, Bid, 3, Red) ;

if (err>1) { Print("Error closing buy order [" + setup + "] : (" + err + ") " + ErrorDescription(err)) ; }

} else if (OrderStopLoss()==0) {

si (TakeProfit>0) { tp=OrderOpenPrice()+TakeProfit*Point ;

} else { tp=0 ; }

si (InitialStopLoss>0) { ts=OrderOpenPrice()-InitialStopLoss*Point ;

} else { ts=0 ; }

OrderModify(OrderTicket(),OrderOpenPrice(),ts,tp,0,White) ;

if (err>1) { Print("Erreur de modification de l'ordre d'achat [" + setup + "] : (" + err + ") " + ErrorDescription(err)) ; }

} else if (TrailingStop>0) {

ts = Bid-Point*TrailingStop ;

si (OrderStopLoss()0) OrderModify(OrderTicket(),OrderOpenPrice(),ts,OrderTakeProfit(),0,White) ;

}

} else if(OrderType()==OP_SELL && (OrderMagicNumber()==MagicNumber+2 || OrderMagicNumber()==MagicNumber+4)) {

if(TimeDay(OrderOpenTime())!=TimeDay(Time[0])) {

Print(".") ;

OrderClose(OrderTicket(), Lots, Ask, 3, Red) ;

if (err>1) { Print("Error closing Sell order [" + setup + "] : (" + err + ") " + ErrorDescription(err)) ; }

} else if (OrderStopLoss()==0) {

si (TakeProfit>0) { tp=OrderOpenPrice()-TakeProfit*Point ;

} else { tp=0 ; }

si (InitialStopLoss>0) { ts=OrderOpenPrice()+InitialStopLoss*Point ;

} else { ts=0 ; }

OrderModify(OrderTicket(),OrderOpenPrice(),ts,tp,0,White) ;

if (err>1) { Print("Error modifying Sell order [" + setup + "] : (" + err + ") " + ErrorDescription(err)) ; }

} else if (TrailingStop>0) {

ts = Ask+Point*TrailingStop ;

si (OrderStopLoss()>ts && OrderProfit()>0) OrderModify(OrderTicket(),OrderOpenPrice(),ts,OrderTakeProfit(),0,White) ;

}

}

}

/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

///////////////// RÉGLAGE DES ORDRES ////////////////////////////////////////////////////////////////////

/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

if(AccountFreeMargin()<(1000*Lots)) return(0) ;

Validity=StrToTime(TimeYear(Time[0]) + "." + TimeMonth(Time[0]) + ".". + TimeDay(Time[0]) + " 23:59") ;

si (TimeHour(Time[0])==EndSession1 && TimeMinute(Time[0])==0) {

LowestPrice=Low[Lowest(NULL, PERIOD_M5, MODE_LOW, 80, 0)] ;

HighestPrice=High ;

//// ce qui suit est nécessaire, pour éviter un prix BUYSTOP/SELLSTOP trop proche du Bid/Ask,

//// dans ce cas on obtient 130 stops invalides.

//// J'ai essayé de changer les OP_BUY et OP_SELL, mais les résultats ne sont pas satisfaisants.

//si (HighestPrice+5*Point<Ask+Spread*Point) {

// cmd=OP_BUY ;

// Prix=Ask ;

//} else {

cmd=OP_BUYSTOP ;

Price=HighestPrice+5*Point ;

//}

ticket=OrderSendExtended(Symbol(),cmd,Lots,Price,Slippage,0,0,setup,MagicNumber+1,Validity,Green) ;

err = GetLastError() ;

if (err>1) { Print("Error modifying Sell order [" + setup + "] : (" + err + ") " + ErrorDescription(err)) ; }

//if (LowestPrice-5*Point>Bid-Spread*Point) {

// cmd=OP_SELL ;

// Price=Bid ;

//} else {

cmd=OP_SELLSTOP ;

Price=LowestPrice-5*Point ;

//}

ticket=OrderSendExtended(Symbol(),OP_SELLSTOP,Lots,Price,Slippage,0,0,setup,MagicNumber+2,Validity,Green) ;

err = GetLastError() ;

if (err>1) { Print("Erreur lors de la modification de l'ordre de vente [" + setup + "] : (" + err + ") " + ErrorDescription(err)) ; }

}

if (TimeHour(Time[0])==EndSession2 && TimeMinute(Time[0])==0) {

LowestPrice=Low[Lowest(NULL, PERIOD_M5, MODE_LOW, 80, 0)] ;

HighestPrice=High ;

//si (HighestPrice+5*Point<Ask+Spread*Point) {

// cmd=OP_BUY ;

// Price=Ask ;

//} else {

cmd=OP_BUYSTOP ;

Price=HighestPrice+5*Point ;

//}

ticket=OrderSendExtended(Symbol(),cmd,Lots,Price,Slippage,0,0,setup,MagicNumber+3,Validity,Green) ;

err = GetLastError() ;

if (err>1) { Print("Error modifying Sell order [" + setup + "] : (" + err + ") " + ErrorDescription(err)) ; }

//if (LowestPrice-5*Point>Bid-Spread*Point) {

// cmd=OP_SELL ;

// Price=Bid ;

//} else {

cmd=OP_SELLSTOP ;

Price=LowestPrice-5*Point ;

//}

ticket=OrderSendExtended(Symbol(),cmd,Lots,Price,Slippage,0,0,setup,MagicNumber+4,Validity,Green) ;

err = GetLastError() ;

if (err>1) { Print("Error modifying Sell order [" + setup + "] : (" + err + ") " + ErrorDescription(err)) ; }

}

}

/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

///////////////// DIVERSES SOUS-ROUTINES /////////////////////////////////////////////////////////////////////////////

/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

int func_Symbol2Val(string symbol) {

if(symbol=="AUDUSD") { return(01) ;

} else if(symbol=="CHFJPY") { return(10) ;

} else if(symbol=="EURAUD") { return(10) ;

} else if(symbol=="EURCAD") { return(11) ;

} else if(symbol=="EURCHF") { return(12) ;

} else if(symbol=="EURGBP") { return(13) ;

} else if(symbol=="EURJPY") { return(14) ;

} else if(symbol=="EURUSDm") { return(15) ;

} else if(symbol=="GBPCHF") { return(20) ;

} else if(symbol=="GBPJPY") { return(21) ;

} else if(symbol=="GBPUSD") { return(22) ;

} else if(symbol=="USDCAD") { return(40) ;

} else if(symbol=="USDCHF") { return(41) ;

} else if(symbol=="USDJPY") { return(42) ;

} else if(symbol=="GOLD") { return(90) ;

} else { Comment("Symbole inattendu") ; return(0) ;

}

}

int OrderSendExtended(string symbol, int cmd, double volume, double price, int slippage, double stoploss, double takeprofit, string comment, int magic, datetime expiration=0, color arrow_color=CLR_NONE) {

datetime OldCurTime ;

int timeout=30 ;

int ticket ;

OldCurTime=CurTime() ;

while (GlobalVariableCheck("InTrade") && !IsTradeAllowed()) {

if(OldCurTime+timeout<=CurTime()) {

Print("Erreur dans OrderSendExtended() : Timeout encountered") ;

return(0) ;

}

Sleep(1000) ;

}

GlobalVariableSet("InTrade", CurTime()) ; // définit l'indicateur de verrouillage

ticket = OrderSend(symbol, cmd, volume, price, slippage, stoploss, takeprofit, comment, magic, expiration, arrow_color) ;

GlobalVariableDel("InTrade") ; // efface l'indicateur de verrouillage

retour(ticket) ;

}

 
ccd:
Bonjour,

Est-ce que quelqu'un peut m'aider à modifier ce code ? Le back-testing est bon mais l'EA ne fonctionne pas sur le compte démo / réel.

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

//| Hans123Trader v1 |

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

#include

#property copyright "hans123"

#property link ""

// programmé par fukinagashi

extern int BeginSession1=6 ;(pendant le backtest, j'ai modifié et mis 0 pour toutes les sessions, ce qui a permis d'obtenir les meilleurs résultats)

extern int EndSession1=10 ;

extern int BeginSession2=10 ;

extern int EndSession2=14 ;

extern double TrailingStop = 0 ;

extern double TakeProfit = 452 ;

extern double InitialStopLoss=40 ;

double Lots = 0.1 ;

datetime bartime = 0 ;

double Slippage=3 ;

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

//| |

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

int start()

{

int cnt, ticket, err, i, j, cmd ;

int MagicNumber ;

double ts, tp, LowestPrice, HighestPrice, Price ;

bool Order[5] ;

chaîne de caractères setup ;

datetime Validity=0 ;

if(IsTesting() && Bars<100) return(0) ;

MagicNumber = 50000 + func_Symbol2Val(Symbol())*100 ;

setup="H123_" + Symbole() ;

if (bartime == Time[0]) {

return(0) ;

} else {

bartime = Time[0] ;

}

/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

///////////////// MODIFICATIONS SUR LES ORDRES OUVERTS ////////////////////////////////////////////////////////////////////

/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

for(cnt=OrdersTotal();cnt>=0;cnt--)

{

OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES) ;

if(OrderType()==OP_BUY && (OrderMagicNumber()==MagicNumber+1 || OrderMagicNumber()==MagicNumber+3)) {

if(TimeDay(OrderOpenTime())!=TimeDay(Time[0])) {

Print(".") ;

OrderClose(OrderTicket(), Lots, Bid, 3, Red) ;

if (err>1) { Print("Error closing buy order [" + setup + "] : (" + err + ") " + ErrorDescription(err)) ; }

} else if (OrderStopLoss()==0) {

si (TakeProfit>0) { tp=OrderOpenPrice()+TakeProfit*Point ;

} else { tp=0 ; }

si (InitialStopLoss>0) { ts=OrderOpenPrice()-InitialStopLoss*Point ;

} else { ts=0 ; }

OrderModify(OrderTicket(),OrderOpenPrice(),ts,tp,0,White) ;

if (err>1) { Print("Erreur de modification de l'ordre d'achat [" + setup + "] : (" + err + ") " + ErrorDescription(err)) ; }

} else if (TrailingStop>0) {

ts = Bid-Point*TrailingStop ;

si (OrderStopLoss()0) OrderModify(OrderTicket(),OrderOpenPrice(),ts,OrderTakeProfit(),0,White) ;

}

} else if(OrderType()==OP_SELL && (OrderMagicNumber()==MagicNumber+2 || OrderMagicNumber()==MagicNumber+4)) {

if(TimeDay(OrderOpenTime())!=TimeDay(Time[0])) {

Print(".") ;

OrderClose(OrderTicket(), Lots, Ask, 3, Red) ;

if (err>1) { Print("Error closing Sell order [" + setup + "] : (" + err + ") " + ErrorDescription(err)) ; }

} else if (OrderStopLoss()==0) {

si (TakeProfit>0) { tp=OrderOpenPrice()-TakeProfit*Point ;

} else { tp=0 ; }

si (InitialStopLoss>0) { ts=OrderOpenPrice()+InitialStopLoss*Point ;

} else { ts=0 ; }

OrderModify(OrderTicket(),OrderOpenPrice(),ts,tp,0,White) ;

if (err>1) { Print("Error modifying Sell order [" + setup + "] : (" + err + ") " + ErrorDescription(err)) ; }

} else if (TrailingStop>0) {

ts = Ask+Point*TrailingStop ;

si (OrderStopLoss()>ts && OrderProfit()>0) OrderModify(OrderTicket(),OrderOpenPrice(),ts,OrderTakeProfit(),0,White) ;

}

}

}

/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

///////////////// RÉGLAGE DES ORDRES ////////////////////////////////////////////////////////////////////

/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

if(AccountFreeMargin()<(1000*Lots)) return(0) ;

Validity=StrToTime(TimeYear(Time[0]) + "." + TimeMonth(Time[0]) + ".". + TimeDay(Time[0]) + " 23:59") ;

si (TimeHour(Time[0])==EndSession1 && TimeMinute(Time[0])==0) {

LowestPrice=Low[Lowest(NULL, PERIOD_M5, MODE_LOW, 80, 0)] ;

HighestPrice=High ;

//// ce qui suit est nécessaire, pour éviter un prix BUYSTOP/SELLSTOP trop proche du Bid/Ask,

//// dans ce cas on obtient 130 stops invalides.

//// J'ai essayé de changer les OP_BUY et OP_SELL, mais les résultats ne sont pas satisfaisants.

//si (HighestPrice+5*Point<Ask+Spread*Point) {

// cmd=OP_BUY ;

// Prix=Ask ;

//} else {

cmd=OP_BUYSTOP ;

Price=HighestPrice+5*Point ;

//}

ticket=OrderSendExtended(Symbol(),cmd,Lots,Price,Slippage,0,0,setup,MagicNumber+1,Validity,Green) ;

err = GetLastError() ;

if (err>1) { Print("Error modifying Sell order [" + setup + "] : (" + err + ") " + ErrorDescription(err)) ; }

//if (LowestPrice-5*Point>Bid-Spread*Point) {

// cmd=OP_SELL ;

// Price=Bid ;

//} else {

cmd=OP_SELLSTOP ;

Price=LowestPrice-5*Point ;

//}

ticket=OrderSendExtended(Symbol(),OP_SELLSTOP,Lots,Price,Slippage,0,0,setup,MagicNumber+2,Validity,Green) ;

err = GetLastError() ;

if (err>1) { Print("Erreur lors de la modification de l'ordre de vente [" + setup + "] : (" + err + ") " + ErrorDescription(err)) ; }

}

if (TimeHour(Time[0])==EndSession2 && TimeMinute(Time[0])==0) {

LowestPrice=Low[Lowest(NULL, PERIOD_M5, MODE_LOW, 80, 0)] ;

HighestPrice=High ;

//si (HighestPrice+5*Point<Ask+Spread*Point) {

// cmd=OP_BUY ;

// Price=Ask ;

//} else {

cmd=OP_BUYSTOP ;

Price=HighestPrice+5*Point ;

//}

ticket=OrderSendExtended(Symbol(),cmd,Lots,Price,Slippage,0,0,setup,MagicNumber+3,Validity,Green) ;

err = GetLastError() ;

if (err>1) { Print("Error modifying Sell order [" + setup + "] : (" + err + ") " + ErrorDescription(err)) ; }

//if (LowestPrice-5*Point>Bid-Spread*Point) {

// cmd=OP_SELL ;

// Price=Bid ;

//} else {

cmd=OP_SELLSTOP ;

Price=LowestPrice-5*Point ;

//}

ticket=OrderSendExtended(Symbol(),cmd,Lots,Price,Slippage,0,0,setup,MagicNumber+4,Validity,Green) ;

err = GetLastError() ;

if (err>1) { Print("Error modifying Sell order [" + setup + "] : (" + err + ") " + ErrorDescription(err)) ; }

}

}

/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

///////////////// DIVERSES SOUS-ROUTINES /////////////////////////////////////////////////////////////////////////////

/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

int func_Symbol2Val(string symbol) {

if(symbol=="AUDUSD") { return(01) ;

} else if(symbol=="CHFJPY") { return(10) ;

} else if(symbol=="EURAUD") { return(10) ;

} else if(symbol=="EURCAD") { return(11) ;

} else if(symbol=="EURCHF") { return(12) ;

} else if(symbol=="EURGBP") { return(13) ;

} else if(symbol=="EURJPY") { return(14) ;

} else if(symbol=="EURUSDm") { return(15) ;

} else if(symbol=="GBPCHF") { return(20) ;

} else if(symbol=="GBPJPY") { return(21) ;

} else if(symbol=="GBPUSD") { return(22) ;

} else if(symbol=="USDCAD") { return(40) ;

} else if(symbol=="USDCHF") { return(41) ;

} else if(symbol=="USDJPY") { return(42) ;

} else if(symbol=="GOLD") { return(90) ;

} else { Comment("Symbole inattendu") ; return(0) ;

}

}

int OrderSendExtended(string symbol, int cmd, double volume, double price, int slippage, double stoploss, double takeprofit, string comment, int magic, datetime expiration=0, color arrow_color=CLR_NONE) {

datetime OldCurTime ;

int timeout=30 ;

int ticket ;

OldCurTime=CurTime() ;

while (GlobalVariableCheck("InTrade") && !IsTradeAllowed()) {

if(OldCurTime+timeout<=CurTime()) {

Print("Erreur dans OrderSendExtended() : Timeout encountered") ;

return(0) ;

}

Sleep(1000) ;

}

GlobalVariableSet("InTrade", CurTime()) ; // définit l'indicateur de verrouillage

ticket = OrderSend(symbol, cmd, volume, price, slippage, stoploss, takeprofit, comment, magic, expiration, arrow_color) ;

GlobalVariableDel("InTrade") ; // suppression de l'indicateur de verrouillage

retour(ticket) ;

}

Essayez de multiplier l'InitialStopLoss par 10 sur un compte réel. Cet EA est écrit pour les courtiers à 4 chiffres

______________________

PS : vous devriez également multiplier le TakeProfit par 10 pour être cohérent et l'avoir en pips, mais si vous l'avez testé avec ces chiffres, vous n'obtiendrez pas les mêmes résultats que lors du back-test (simplement parce que le back-test vous a permis d'utiliser des valeurs pour ces deux-là que ni le compte démo ni le compte réel ne vous permettront).

 
mladen:
zigflip Les deux derniers psar comme dans "dernière paire supérieure/inférieure de psar" ou "les 2 dernières barres" ?

Désolé pour la réponse tardive mladen, je pensais que j'avais un abonnement email mais...

Je veux dire la dernière paire de psars !

Je veux principalement surveiller le dernier psar mais quand le changement supérieur/inférieur se produit, j'aurais besoin des deux derniers niveaux, hmm peut-être devrait-il y avoir x barres en arrière... agh je vois ce que vous dites maintenant, en y réfléchissant à deux fois, peut-être le dernier ensemble de plus hauts/plus bas, qui s'ajuste au dernier changement à l'arrivée du premier psar de nouvelle direction !

Merci pour votre aide,

Raison: