Vous manquez des opportunités de trading :
- Applications de trading gratuites
- Plus de 8 000 signaux à copier
- Actualités économiques pour explorer les marchés financiers
Inscription
Se connecter
Vous acceptez la politique du site Web et les conditions d'utilisation
Si vous n'avez pas de compte, veuillez vous inscrire
seulement acheter, pas vendre
Je crée une ea rentable, mais elle pourrait être deux fois plus performante (peut-être) car pour l'instant seuls les achats sont placés, jamais les ordres de vente.
Quelqu'un sait-il pourquoi ?
//+------------------------------------------------------------------+
//| Signal Begin |
//+------------------------------------------------------------------+
double sig_buy = iCustom(NULL, 0, "Slope Direction Line",40, 2, 0, 0, 0, 0) ;
double sig_sell = iCustom(NULL, 0, "Slope Direction Line",40, 2, 0, 1, 0) ;
double Sg=iCustom(NULL,0, "RSIFilter_v1",5,5,0,1) ;
si (sig_buy>0 && Sg>0) Ordre = SIGNAL_BUY ;
si (sig_sell>0 && Sg<0 ) Ordre = SIGNAL_SELL ;
//+------------------------------------------------------------------+
//| Fin du signal |
//+------------------------------------------------------------------+
publier le code total, il y a une autre chose qui ne va pas...
la deuxième étape est peut-être vos fonctions iCustom().
je crée une ea rentable, mais elle pourrait être deux fois plus performante (peut-être) car pour l'instant seuls les achats sont placés, jamais les ordres de vente.
Quelqu'un sait pourquoi ?
//+------------------------------------------------------------------+
//| Signal Begin |
//+------------------------------------------------------------------+
double sig_buy = iCustom(NULL, 0, "Slope Direction Line",40, 2, 0, 0, 0) ;
double sig_sell = iCustom(NULL, 0, "Slope Direction Line",40, 2, 0, 1, 0) ;
double Sg=iCustom(NULL,0, "RSIFilter_v1",5,5,0,1) ;
si (sig_buy>0 && Sg>0) Ordre = SIGNAL_BUY ;
si (sig_sell>0 && Sg<0 ) Ordre = SIGNAL_SELL ;
//+------------------------------------------------------------------+
//| Signal End |
//+------------------------------------------------------------------+Placer et visualiser des objets sur des dates futures ?
Bonjour, quelqu'un sait-il si MQL4 supporte le placement d'un objet indicateur dans le futur et la visualisation de l'objet futur ? J'ai essayé ObjectMove à une date future (pas de retour d'erreur), mais l'affichage s'arrête à la date du dernier tick. Merci
Les MA's ont une fonction de décalage... si c'est ce que vous voulez dire. +2 la fera glisser vers l'avant de 2 barres TF. -2 la fera reculer de 2 TF.
publier le code total, il y a une autre chose qui ne va pas... la deuxième étape est peut-être vos fonctions iCustom().
#lien de propriété "https://www.forex-tsd.com"
extern int MagicNumber = 1001 ;
extern bool EachTickMode = False ;
extern double Lots = 0.01 ;
extern int Slippage = 4 ;
extern bool StopLossMode = True ;
extern int StopLoss = 70 ;
extern bool TakeProfitMode = True ;
extern int TakeProfit = 300 ;
extern bool TrailingStopMode = True ;
extern int TrailingStop = 25 ;
extern double MaximumRisk =0;//0.15
extern double DecreaseFactor =3 ;
extern int MaxOrders = 3000 ;
extern bool UseHourTrade = False ;
extern int FromHourTrade = 8 ;
extern int ToHourTrade = 18 ;
#define SIGNAL_NONE 0
#define SIGNAL_BUY 1
#define SIGNAL_SELL 2
#define SIGNAL_CLOSEBUY 3
#define SIGNAL_CLOSESELL 4
int BarCount ;
int Current ;
bool TickCheck = False ;
//+------------------------------------------------------------------+
//| fonction d'initialisation de l'expert
//+------------------------------------------------------------------+
int init() {
BarCount = Bars ;
if (EachTickMode) Current = 0 ; sinon Current = 1 ;
return(0) ;
}
//+------------------------------------------------------------------+
//| fonction de désinitialisation experte |
//+------------------------------------------------------------------+
int deinit() {
return(0) ;
}
//+------------------------------------------------------------------+
//| fonction de démarrage de l'expert |
//+------------------------------------------------------------------+
int start() {
if (UseHourTrade){
if ( !(Hour()>=FromHourTrade && Hour()<=ToHourTrade)) {
Comment("L'heure de la transaction n'est pas encore arrivée !") ;
return(0) ;
}
}
int Ordre = SIGNAL_NONE ;
int Total, Ticket ;
double StopLossLevel, TakeProfitLevel ;
int digit = MarketInfo(Symbol(),MODE_DIGITS) ;
if (EachTickMode && Bars != BarCount) EachTickMode = False ;
Total = OrdersTotal() ;
Ordre = SIGNAL_NONE ;
//+------------------------------------------------------------------+
//| Signal Begin |
//+------------------------------------------------------------------+
double sig_buy = iCustom(NULL, 0, "Slope Direction Line",40, 2, 0, 0, 0) ;
double sig_sell = iCustom(NULL, 0, "Slope Direction Line",40, 2, 0, 1, 0) ;
double Sg=iCustom(NULL,0, "RSIFilter_v1",5,5,0,1) ;
si (sig_buy>0 && Sg>0) Ordre = SIGNAL_BUY ;
si (sig_sell>0 && Sg<0 ) Ordre = SIGNAL_SELL ;
//+------------------------------------------------------------------+
//| Fin du signal |
//+------------------------------------------------------------------+
//Acheter
if (Order == SIGNAL_BUY && ((EachTickMode && !TickCheck) || (!EachTickMode && (Bars != BarCount)))) {
if(ScanTrades() < MaxOrders) {
//Contrôle de la marge libre
if (AccountFreeMargin() < (1000 * Lots)) {
Print("Nous n'avons pas d'argent. Marge libre = ", AccountFreeMargin()) ;
return(0) ;
}
StopLossLevel = Ask - StopLoss * Point ;
TakeProfitLevel = Ask + TakeProfit * Point ;
Ticket = OrderSend(Symbol(), OP_BUY, LotsOptimized(),
NormalizeDouble(Ask,digit),
Slippage,
NormalizeDouble(StopLossLevel,digit),
NormalizeDouble(TakeProfitLevel,digit),
"Buy(#" + MagicNumber + ")", MagicNumber, 0, DodgerBlue) ;
if(Ticket > 0) {
if (OrderSelect(Ticket, SELECT_BY_TICKET, MODE_TRADES)) Print("Ordre BUY ouvert : ", OrderOpenPrice()) ; else Print("Erreur lors de l'ouverture d'un ordre BUY : ", GetLastError()) ;
}
if (EachTickMode) TickCheck = True ;
if (!EachTickMode) BarCount = Bars ;
return(0) ;
}
}
//Vente
if (Order == SIGNAL_SELL && ((EachTickMode && !TickCheck) | (!EachTickMode && (Bars != BarCount)))) {
if(ScanTrades() < MaxOrders) {
//Contrôle de la marge libre
if (AccountFreeMargin() < (1000 * Lots)) {
Print("Nous n'avons pas d'argent. Marge libre = ", AccountFreeMargin()) ;
return(0) ;
}
StopLossLevel = Bid + StopLoss * Point ;
TakeProfitLevel = Bid - TakeProfit * Point ;
Ticket = OrderSend(Symbol(), OP_SELL, LotsOptimized(),
NormalizeDouble(Bid,digit),
Slippage,
NormalizeDouble(StopLossLevel,digit),
NormalizeDouble(TakeProfitLevel,digit),
"Sell(#" + MagicNumber + ")", MagicNumber, 0, DeepPink) ;
if(Ticket > 0) {
if (OrderSelect(Ticket, SELECT_BY_TICKET, MODE_TRADES)) Print("Ordre VENTE ouvert : ", OrderOpenPrice()) ; sinon Print("Erreur lors de l'ouverture d'un ordre VENTE : ", GetLastError()) ;
}
if (EachTickMode) TickCheck = True ;
if (!EachTickMode) BarCount = Bars ;
return(0) ;
}
}
//Check position
for (int i = 0 ; i < Total ; i ++) {
OrderSelect(i, SELECT_BY_POS, MODE_TRADES) ;
si(OrderType() <= OP_SELL && OrderSymbol() == Symbol()) {
if(OrderType() == OP_BUY && OrderMagicNumber()==MagicNumber ) {
//Fermeture
si (Order == SIGNAL_CLOSEBUY && ((EachTickMode && !TickCheck) || (!EachTickMode && (Bars != BarCount)))) {
OrderClose(OrderTicket(), OrderLots(), Bid, Slippage, MediumSeaGreen) ;
if (EachTickMode) TickCheck = True ;
if (!EachTickMode) BarCount = Bars ;
return(0) ;
}
/Trailing stop
if(TrailingStopMode && 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 ;
return(0) ;
}
}
}
} else {
if(OrderType()==OP_SELL && OrderMagicNumber()==MagicNumber)
{
//Fermeture
if (Order == SIGNAL_CLOSESELL && ((EachTickMode && !TickCheck) || (!EachTickMode && (Bars != BarCount))))
{
OrderClose(OrderTicket(), OrderLots(), Ask, Slippage, DarkOrange) ;
if (EachTickMode) TickCheck = True ;
if (!EachTickMode) BarCount = Bars ;
return(0) ;
}
//Trailing stop
if (TrailingStopMode && TrailingStop > 0)
{
if((OrderOpenPrice() - Ask) > (Point * TrailingStop)) {
si((OrderStopLoss() > (Ask + Point * TrailingStop)) || (OrderStopLoss() == 0)) {
OrderModify(OrderTicket(), OrderOpenPrice(), Ask + Point * TrailingStop, OrderTakeProfit(), 0, DarkOrange) ;
if (!EachTickMode) BarCount = Bars ;
return(0) ;
}
}
}
}}
}
}
if (!EachTickMode) BarCount = Bars ;
retour(0) ;
}
int ScanTrades()
{
int total = OrdersTotal() ;
int numords = 0 ;
for(int cnt=0 ; cnt<total ; cnt++)
{
OrderSelect(cnt, SELECT_BY_POS) ;
if(OrderSymbol() == Symbol() && OrderType()<=OP_SELLSTOP && OrderMagicNumber() == MagicNumber)
nombres++ ;
}
return(numords) ;
}
//bool ExistPositions() {
// for (int i=0 ; i<OrdersTotal() ; i++) {
// if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {
// si (OrderSymbol()==Symbol() && OrderMagicNumber()==MagicNumber) {
// return(True) ;
// }
// }
// }
// return(false) ;
//}
double LotsOptimized()
{
double lot=Lots ;
int orders=HistoryTotal() ; // total des ordres historiques
int losses=0 ; // nombre d'ordres de pertes sans pause
//---- sélectionner la taille du lot
if(MaximumRisk>0)lot=NormalizeDouble(Lots*AccountFreeMargin()*MaximumRisk/1000.0,1) ;
//---- calcule le nombre d'ordres de pertes sans pause
if(Facteur de diminution>0)
{
for(int i=ordres-1;i>=0;i--)
{
if(OrderSelect(i,SELECT_BY_POS,MODE_HISTORY)==false) { Print("Erreur dans l'historique !") ; break ; }
if(OrderSymbol()!=Symbol() || OrderType()>OP_SELL) continue ;
//----
si(OrderProfit()>0) break ;
si(OrderProfit()<0) pertes++ ;
}
if(losses>1) lot=NormalizeDouble(lot-lot*losses/DecreaseFactor,1) ;
}
//---- retourner la taille du lot
si(lot<0.1) lot=0.1 ;
return(lot) ;
}
//+------------------------------------------------------------------+
Obtenez-vous un code d'erreur ou autre chose (en backtesting) qui vous donne un indice de ce qui ne va pas ?
#lien de propriété "https://www.forex-tsd.com"
extern int MagicNumber = 1001 ;
extern bool EachTickMode = False ;
extern double Lots = 0.01 ;
extern int Slippage = 4 ;
extern bool StopLossMode = True ;
extern int StopLoss = 70 ;
extern bool TakeProfitMode = True ;
extern int TakeProfit = 300 ;
extern bool TrailingStopMode = True ;
extern int TrailingStop = 25 ;
extern double MaximumRisk =0;//0.15
extern double DecreaseFactor =3 ;
extern int MaxOrders = 3000 ;
extern bool UseHourTrade = False ;
extern int FromHourTrade = 8 ;
extern int ToHourTrade = 18 ;
#define SIGNAL_NONE 0
#define SIGNAL_BUY 1
#define SIGNAL_SELL 2
#define SIGNAL_CLOSEBUY 3
#define SIGNAL_CLOSESELL 4
int BarCount ;
int Current ;
bool TickCheck = False ;
//+------------------------------------------------------------------+
//| fonction d'initialisation de l'expert
//+------------------------------------------------------------------+
int init() {
BarCount = Bars ;
if (EachTickMode) Current = 0 ; sinon Current = 1 ;
return(0) ;
}
//+------------------------------------------------------------------+
//| fonction de désinitialisation experte |
//+------------------------------------------------------------------+
int deinit() {
return(0) ;
}
//+------------------------------------------------------------------+
//| fonction de démarrage de l'expert |
//+------------------------------------------------------------------+
int start() {
if (UseHourTrade){
if ( !(Hour()>=FromHourTrade && Hour()<=ToHourTrade)) {
Comment("L'heure de la transaction n'est pas encore arrivée !") ;
return(0) ;
}
}
int Ordre = SIGNAL_NONE ;
int Total, Ticket ;
double StopLossLevel, TakeProfitLevel ;
int digit = MarketInfo(Symbol(),MODE_DIGITS) ;
if (EachTickMode && Bars != BarCount) EachTickMode = False ;
Total = OrdersTotal() ;
Ordre = SIGNAL_NONE ;
//+------------------------------------------------------------------+
//| Signal Begin |
//+------------------------------------------------------------------+
double sig_buy = iCustom(NULL, 0, "Slope Direction Line",40, 2, 0, 0, 0) ;
double sig_sell = iCustom(NULL, 0, "Slope Direction Line",40, 2, 0, 1, 0) ;
double Sg=iCustom(NULL,0, "RSIFilter_v1",5,5,0,1) ;
si (sig_buy>0 && Sg>0) Ordre = SIGNAL_BUY ;
si (sig_sell>0 && Sg<0 ) Ordre = SIGNAL_SELL ;
//+------------------------------------------------------------------+
//| Fin du signal |
//+------------------------------------------------------------------+
//Acheter
if (Order == SIGNAL_BUY && ((EachTickMode && !TickCheck) || (!EachTickMode && (Bars != BarCount)))) {
if(ScanTrades() < MaxOrders) {
//Contrôle de la marge libre
if (AccountFreeMargin() < (1000 * Lots)) {
Print("Nous n'avons pas d'argent. Marge libre = ", AccountFreeMargin()) ;
return(0) ;
}
StopLossLevel = Ask - StopLoss * Point ;
TakeProfitLevel = Ask + TakeProfit * Point ;
Ticket = OrderSend(Symbol(), OP_BUY, LotsOptimized(),
NormalizeDouble(Ask,digit),
Slippage,
NormalizeDouble(StopLossLevel,digit),
NormalizeDouble(TakeProfitLevel,digit),
"Buy(#" + MagicNumber + ")", MagicNumber, 0, DodgerBlue) ;
if(Ticket > 0) {
if (OrderSelect(Ticket, SELECT_BY_TICKET, MODE_TRADES)) Print("Ordre BUY ouvert : ", OrderOpenPrice()) ; else Print("Erreur lors de l'ouverture d'un ordre BUY : ", GetLastError()) ;
}
if (EachTickMode) TickCheck = True ;
if (!EachTickMode) BarCount = Bars ;
return(0) ;
}
}
//Vente
if (Order == SIGNAL_SELL && ((EachTickMode && !TickCheck) | (!EachTickMode && (Bars != BarCount)))) {
if(ScanTrades() < MaxOrders) {
//Contrôle de la marge libre
if (AccountFreeMargin() < (1000 * Lots)) {
Print("Nous n'avons pas d'argent. Marge libre = ", AccountFreeMargin()) ;
return(0) ;
}
StopLossLevel = Bid + StopLoss * Point ;
TakeProfitLevel = Bid - TakeProfit * Point ;
Ticket = OrderSend(Symbol(), OP_SELL, LotsOptimized(),
NormalizeDouble(Bid,digit),
Slippage,
NormalizeDouble(StopLossLevel,digit),
NormalizeDouble(TakeProfitLevel,digit),
"Sell(#" + MagicNumber + ")", MagicNumber, 0, DeepPink) ;
if(Ticket > 0) {
if (OrderSelect(Ticket, SELECT_BY_TICKET, MODE_TRADES)) Print("Ordre VENTE ouvert : ", OrderOpenPrice()) ; sinon Print("Erreur lors de l'ouverture d'un ordre VENTE : ", GetLastError()) ;
}
if (EachTickMode) TickCheck = True ;
if (!EachTickMode) BarCount = Bars ;
return(0) ;
}
}
//Check position
for (int i = 0 ; i < Total ; i ++) {
OrderSelect(i, SELECT_BY_POS, MODE_TRADES) ;
si(OrderType() <= OP_SELL && OrderSymbol() == Symbol()) {
if(OrderType() == OP_BUY && OrderMagicNumber()==MagicNumber ) {
//Fermeture
si (Order == SIGNAL_CLOSEBUY && ((EachTickMode && !TickCheck) || (!EachTickMode && (Bars != BarCount)))) {
OrderClose(OrderTicket(), OrderLots(), Bid, Slippage, MediumSeaGreen) ;
if (EachTickMode) TickCheck = True ;
if (!EachTickMode) BarCount = Bars ;
return(0) ;
}
/Trailing stop
if(TrailingStopMode && 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 ;
return(0) ;
}
}
}
} else {
if(OrderType()==OP_SELL && OrderMagicNumber()==MagicNumber)
{
//Fermeture
if (Order == SIGNAL_CLOSESELL && ((EachTickMode && !TickCheck) || (!EachTickMode && (Bars != BarCount))))
{
OrderClose(OrderTicket(), OrderLots(), Ask, Slippage, DarkOrange) ;
if (EachTickMode) TickCheck = True ;
if (!EachTickMode) BarCount = Bars ;
return(0) ;
}
//Trailing stop
if (TrailingStopMode && TrailingStop > 0)
{
if((OrderOpenPrice() - Ask) > (Point * TrailingStop)) {
si((OrderStopLoss() > (Ask + Point * TrailingStop)) || (OrderStopLoss() == 0)) {
OrderModify(OrderTicket(), OrderOpenPrice(), Ask + Point * TrailingStop, OrderTakeProfit(), 0, DarkOrange) ;
if (!EachTickMode) BarCount = Bars ;
return(0) ;
}
}
}
}}
}
}
if (!EachTickMode) BarCount = Bars ;
retour(0) ;
}
int ScanTrades()
{
int total = OrdersTotal() ;
int numords = 0 ;
for(int cnt=0 ; cnt<total ; cnt++)
{
OrderSelect(cnt, SELECT_BY_POS) ;
if(OrderSymbol() == Symbol() && OrderType()<=OP_SELLSTOP && OrderMagicNumber() == MagicNumber)
nombres++ ;
}
return(numords) ;
}
//bool ExistPositions() {
// for (int i=0 ; i<OrdersTotal() ; i++) {
// if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {
// si (OrderSymbol()==Symbol() && OrderMagicNumber()==MagicNumber) {
// return(True) ;
// }
// }
// }
// return(false) ;
//}
double LotsOptimized()
{
double lot=Lots ;
int orders=HistoryTotal() ; // total des ordres historiques
int losses=0 ; // nombre d'ordres de pertes sans pause
//---- sélectionner la taille du lot
if(MaximumRisk>0)lot=NormalizeDouble(Lots*AccountFreeMargin()*MaximumRisk/1000.0,1) ;
//---- calcule le nombre d'ordres de pertes sans pause
if(Facteur de diminution>0)
{
for(int i=ordres-1;i>=0;i--)
{
if(OrderSelect(i,SELECT_BY_POS,MODE_HISTORY)==false) { Print("Erreur dans l'historique !") ; break ; }
if(OrderSymbol()!=Symbol() || OrderType()>OP_SELL) continue ;
//----
si(OrderProfit()>0) break ;
si(OrderProfit()<0) pertes++ ;
}
if(losses>1) lot=NormalizeDouble(lot-lot*losses/DecreaseFactor,1) ;
}
//---- retourner la taille du lot
si(lot<0.1) lot=0.1 ;
return(lot) ;
}
//+------------------------------------------------------------------+Je fais un backtest maintenant seulement avec le RSIFilter, j'utilise le RSIMixFilter il y a quelques messages dans ce fil de discussion, j'ai publié cet indicateur, et j'obtiens des BUYS et des SELLS, donc la logique pour faire les ordres BUY et SELL sont ok, le problème est avec vos signaux iCustom...
RSIMixFilter, n'est pas dans ce fil, désolé, c'est ici ASK
je crée une ea rentable, mais elle pourrait être deux fois plus performante (peut-être) car pour l'instant seuls les achats sont placés, jamais les ordres de vente.
Quelqu'un sait pourquoi ?
//+------------------------------------------------------------------+
//| Signal Begin |
//+------------------------------------------------------------------+
double sig_buy = iCustom(NULL, 0, "Slope Direction Line",40, 2, 0, 0, 0) ;
double sig_sell = iCustom(NULL, 0, "Slope Direction Line",40, 2, 0, 1, 0) ;
double Sg=iCustom(NULL,0, "RSIFilter_v1",5,5,0,1) ;
si (sig_buy>0 && Sg>0) Ordre = SIGNAL_BUY ;
si (sig_sell>0 && Sg<0 ) Ordre = SIGNAL_SELL ;
//+------------------------------------------------------------------+
//| Signal End |
//+------------------------------------------------------------------+J'ai fait quelques backtesting, EURUSD H1 d'avril 2007 à aujourd'hui, avec ce RSIMixFilter uniquement...
La qualité de la modélisation doit être de 90%, je ne sais pas pourquoi elle n'apparaît pas.
je crée une ea rentable, mais elle pourrait être deux fois plus performante (peut-être) car pour l'instant seuls les achats sont placés, jamais les ordres de vente.
Quelqu'un sait pourquoi ?
//+------------------------------------------------------------------+
//| Signal Begin |
//+------------------------------------------------------------------+
double sig_buy = iCustom(NULL, 0, "Slope Direction Line",40, 2, 0, 0, 0) ;
double sig_sell = iCustom(NULL, 0, "Slope Direction Line",40, 2, 0, 1, 0) ;
double Sg=iCustom(NULL,0, "RSIFilter_v1",5,5,0,1) ;
si (sig_buy>0 && Sg>0) Ordre = SIGNAL_BUY ;
si (sig_sell>0 && Sg<0 ) Ordre = SIGNAL_SELL ;
//+------------------------------------------------------------------+
//| Signal End |
//+------------------------------------------------------------------+Ce backtesting, a-t-il donné des achats et des ventes ou seulement l'un d'entre eux ? Avec moi j'ai eu seulement des achats (ou seulement des ventes quand j'ai changé le code).
Je n'ai vraiment rien vu qui montre une erreur.
Je fais un backtest maintenant seulement avec le RSIFilter, j'utilise le RSIMixFilter il y a quelques messages dans ce fil, j'ai publié cet indicateur, et j'obtiens des BUYS et des SELLS, donc la logique pour faire les ordres BUY et SELL sont ok, le problème est avec vos signaux iCustom...
Alors c'est bon ?
double Sg=iCustom(NULL,0, "RSIFilter_v1",5,5,0,1) ;
si ( Sg>0 ) Ordre = SIGNAL_BUY ;
si (Sg<0 ) Ordre = SIGNAL_SELL ;