Comment coder ? - page 100

 

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().

panteraschoice:
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.

 
IN10TION:
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 ?

panteraschoice:
#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

panteraschoice:
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.

panteraschoice:
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 |

//+------------------------------------------------------------------+
Dossiers :
 

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.

 
IN10TION:
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 ;