Construire une stratégie de pratique basée sur les bandes de Bollinger et les stochastiques.Le prix d'ouverture de la bande de Bollinger est incorrect
Que faut-il que si le Close
d'une barre de 5 minutes est au-dessus de la bande supérieure et la stochastique est passé au-dessus de 80, un ordre sell
doit entrer, et la bande inverse inférieure 20.
Cependant, quand je exécutez-le pour tester dans MT4
, je remarque que les métiers sont sauvagement hors de la marque d'entrée (ouverture à l'intérieur des bandes de Bollinger et pas à l'extérieur, par exemple). Plutôt que d'ouvrir au Close
d'une barre, ils sont plusieurs pips trop haut ou trop bas.
Qu'est-ce que je fais mal?
Ceci est mon code:
extern int MagicNumber = 1;
extern double Lots = 1;
extern double StopLoss = 5;
extern double TakeProfit = 15;
extern int TrailingStop = 0;
int ThisBarTrade = 0;
int start() {
double MyPoint = Point;
if (Digits == 3 || Digits == 5) MyPoint = Point * 10;
double TheStopLoss = 0;
double TheTakeProfit = 0;
if (TotalOrdersCount() == 0) {
if (Bars != ThisBarTrade) {
ThisBarTrade = Bars;
int result = 0;
if ( Open[0] < iBands(NULL, 0, 20, 2, 0, PRICE_CLOSE, MODE_LOWER, 0)
&& 20 > iStochastic(NULL, 0, 12, 1, 3, MODE_SMA, 1, MODE_MAIN, 0)
&& 0 == OrdersTotal()
) // Here is your open [Buy] rule -------------------
{
result = OrderSend(Symbol(), OP_BUY, Lots, Ask, 0, 0, 0, "", MagicNumber, 0, Blue);
if (result > 0)
{
TheStopLoss = 0;
TheTakeProfit = 0;
if (TakeProfit > 0) TheTakeProfit = Ask + MyPoint * TakeProfit;
if (StopLoss > 0) TheStopLoss = Ask - MyPoint * StopLoss;
OrderSelect(result, SELECT_BY_TICKET);
OrderModify(OrderTicket(), OrderOpenPrice(), NormalizeDouble(TheStopLoss, Digits), NormalizeDouble(TheTakeProfit, Digits), 0, Green);
}
return(0); // JIT/RET --> --> --> --> --> --> --> --> -->
}
if ( Open[0] > iBands(NULL, 0, 20, 2, 0, PRICE_CLOSE, MODE_UPPER, 0)
&& 80 < iStochastic(NULL, 0, 12, 1, 3, MODE_SMA, 1, MODE_MAIN, 0)
&& 0 == OrdersTotal()
) // Here is your open [Sell] rule -----------------------
{
result = OrderSend(Symbol(), OP_SELL, Lots, Bid, 0, 0, 0, "", MagicNumber, 0, Red);
if (result > 0)
{
TheStopLoss = 0;
TheTakeProfit = 0;
if (TakeProfit > 0) TheTakeProfit = Bid - MyPoint * TakeProfit;
if (StopLoss > 0) TheStopLoss = Bid + MyPoint * StopLoss;
OrderSelect(result, SELECT_BY_TICKET);
OrderModify(OrderTicket(), OrderOpenPrice(), NormalizeDouble(TheStopLoss, Digits), NormalizeDouble(TheTakeProfit, Digits), 0, Green);
}
return(0); // JIT/RET --> --> --> --> --> --> --> --> -->
}
}
for (int cnt = 0; cnt < OrdersTotal(); cnt++) {
OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES);
if ( OrderType() <= OP_SELL // !PENDING ORDER
&& OrderSymbol() == Symbol() // !ANOTHER MARKET
&& OrderMagicNumber() == MagicNumber // !ANOTHER EA/MMI TRADE
)
{
if (OrderType() == OP_BUY)
{
if (TrailingStop > 0)
{
if (Bid - OrderOpenPrice() > MyPoint * TrailingStop)
{
if (OrderStopLoss() < Bid - MyPoint * TrailingStop)
{
OrderModify(OrderTicket(), OrderOpenPrice(), Bid - TrailingStop * MyPoint, OrderTakeProfit(), 0, Green);
return(0); // JIT/RET --> --> --> --> --> --> --> --> -->
}
}
}
}
else
{
if (TrailingStop > 0)
{
if (OrderOpenPrice() - Ask > MyPoint * TrailingStop)
{
if ( OrderStopLoss() > (Ask + MyPoint * TrailingStop)
|| OrderStopLoss() == 0
)
{
OrderModify(OrderTicket(), OrderOpenPrice(), Ask + MyPoint * TrailingStop, OrderTakeProfit(), 0, Red);
return(0); // JIT/RET --> --> --> --> --> --> --> --> -->
}
}
}
}
}
}
}
return(0);
}
int TotalOrdersCount()
{
int result = 0;
for (int i = 0; i < OrdersTotal(); i++)
{
OrderSelect(i, SELECT_BY_POS, MODE_TRADES);
if (OrderMagicNumber() == MagicNumber) result++;
}
return(result);
}
David, dans le cas où votre backtesting est en cours d'exécution pour une quantité remarquable de temps (entièrement scénarios d'optimisation -meshed et al), votre attention doit également être dirigée vers une efficacité d'exécution de code. Vos conditions passent un temps précieux sur la ré-exécution des opérations, cela doit être évité. Une meilleure exécution de code peut vous faire économiser des heures dans votre budget temps-backtesting. ** Un autre problème ** à réparer est une sensibilité côté serveur MT4 aux prix non normalisés dans l'exécution de OrderSend()/OrderModify() (que vous ne verrez pas dans le back-testing, mais ... ayant cela dans Live/Production ** tue ... **) – user3666197