2015-03-15 2 views
0

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); 
} 
+1

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

Répondre

1

Dans votre utilisation du iBand() et iStochastic(), vous utilisez SHIFT 0 (le dernier param). Ce qui signifie que vous extrayez la valeur de la bougie CURRENT (marché). Cependant, comme la bougie actuelle n'est pas encore terminée, sa valeur continue de changer de base sur le nouveau prix entrant. C'est pourquoi vos métiers sont entrés à des prix apparemment aléatoires.

Ce que vous voudrez peut-être est de se référer à la bougie PRÉCÉDENT (terminé), ce qui signifie SHIFT doit être 1 au lieu de 0.

+0

Place sur, merci mon pote! –