Problèmes de vérification des échanges ouverts - page 5

 
BrotherPyrus:
Hé Daz & Co,

hothand fonctionne sur MT4 à cinq chiffres, mais pas sur une plateforme à quatre chiffres.
Pouvez-vous être plus précis sur la façon dont il ne fonctionne pas ?
 
BrotherPyrus:
hothand fonctionne sur MT4 à cinq chiffres, mais pas sur une plateforme à quatre chiffres. Une idée de la cause de ce problème, et des indices sur la façon de le résoudre ?
Les EA doivent s'ajuster pour 4/5 chiffres, TP, SL, ET slippage. Sur les courtiers ECN, vous devez d'abord ouvrir et ensuite définir les stops.
//++++ These are adjusted for 5 digit brokers.
int     pips2points;    // slippage  3 pips    3=points    30=points
double  pips2dbl;       // Stoploss 15 pips    0.0015      0.00150
int     Digits.pips;    // DoubleToStr(dbl/pips2dbl, Digits.pips)
int     init(){
    if (Digits == 5 || Digits == 3){    // Adjust for five (5) digit brokers.
                pips2dbl    = Point*10; pips2points = 10;   Digits.pips = 1;
    } else {    pips2dbl    = Point;    pips2points =  1;   Digits.pips = 0; }
    // OrderSend(... Slippage.Pips * pips2points, Bid - StopLossPips * pips2dbl
 
   if(iBarHour >= iOpenHour && iBarHour <= iOpenHour + iBarsToTrade && Tradeopen()==false) // Check if time is ok to trade & no trade is open
                  {

                          
                              //  if(High[2]>High[1] && Low[2]<Low[1]) // see if we have an inside bar
                                if(iHigh(hothand(), 60, 2)>iHigh(hothand(), 60, 1) && iLow(hothand(), 60, 2) < iLow(hothand(), 60, 1)) // see if we have an inside bar
                                 {                                                                                                     // on the hothand pair
                                           
                                        // IB found 
                                        if(iHigh(hothand(), 60, 1) > dDayOpenPrice) // IB high on hothand pair is greater than day open price bullish signal
                                          {
                                             int    buyspread=MarketInfo(hothand(),MODE_SPREAD);
                              double buyentry =  iHigh(hothand(), 60, 1) + 10 + buyspread;  //Low of prev bar + 1 pip + spread
                              double buystop = iLow(hothand(), 60, 1) - 10;    //Low of prev bar - 1 pip
                              double buytpx1 = iHigh(hothand(), 60, 1)+(iHigh(hothand(), 60, 1)-iLow(hothand(), 60, 1)); //1:1 r:r
                              double buytpx3 = iHigh(hothand(), 60, 1)+(iHigh(hothand(), 60, 1)-iLow(hothand(), 60, 1))*3; // 1:3 r:r
                              
                              
                           OrderSend(Symbol(),OP_BUY,1 , Ask, 3, buystop, buytpx1, "DIBSBUY", Mnumber1);  //Open buy order
                           OrderSend(Symbol(),OP_BUY,1 , Ask, 3, buystop, buytpx3, "DIBSBUY", Mnumber3);
                            }
                            
                         if(iLow(hothand(), 60, 1) < dDayOpenPrice) // IB low on hothand pair is lower than day open price bearish signal
                            {
                              int    sellspread=MarketInfo(hothand(),MODE_SPREAD);
                              double sellentry = iLow(hothand(), 60, 1)-10; //Low of prev bar - 1 pip 
                              double sellstop = iHigh(hothand(), 60, 1)+ 10 + sellspread; // High of prev bar + 1 pip + Spread
                              double selltpx1 = iLow(hothand(), 60, 1)-(iHigh(hothand(), 60, 1)- iLow(hothand(), 60, 1)); //1:1 r:r
                              double selltpx3 = iLow(hothand(), 60, 1)-(iHigh(hothand(), 60, 1)- iLow(hothand(), 60, 1))*3; // 1:3 r:r
                              
                              
                           OrderSend(Symbol(),OP_SELL,1 , Ask, 3, sellstop, selltpx1,"DIBSSELL",Mnumber1);  //Open Sell Order
                           OrderSend(Symbol(),OP_SELL,1 , Ask, 3, sellstop, selltpx3,"DIBSSELL",Mnumber3);  //Open Sell Order
               
                                      } 
                        }
                               
                   }
     //  
  
    
      }

Bon, je suis de retour,


C'est la partie de mon code où les transactions sont exécutées, je vais juste travailler avec 5 chiffres pour le moment. L'idée ici est que j'ai utilisé ma fonction hothand pour choisir la meilleure paire à trader pour la journée. Ce code doit rechercher une barre intérieure sur le graphique en 1 heure. (La fonction hothand renvoie une chaîne de caractères de la paire) Lorsqu'il trouve une barre intérieure, je l'ai juste fait ouvrir une transaction d'achat ou de vente à plat à des fins de test. Je ne suis pas sûr que le backtester puisse gérer la négociation de plusieurs paires à partir d'un seul graphique. J'ai téléchargé l'historique 1min pour toutes les paires qu'il utilise. Mais il ne semble ouvrir des transactions que sur l'eurusd qui est le graphique auquel je l'ai attaché,

WHRoeder, merci d'être passé et de m'avoir aidé à nouveau. Je suis sûr que vous pouvez repérer un million de paires de paires de paires de paires de paires de paires de paires de paires de paires de paires de paires de paires de paires de paires de paires de paires. Je suis sûr que vous pouvez trouver un million de choses erronées dans ce code.

 
  1. OrderSend(Symbol(),OP_BUY,1 , Ask, 3, buystop, buytpx1, "DIBSBUY", Mnumber1);  //Open buy order
    

    Pas d'ajustement du slippage pour les 4/5 chiffres. Non compatible avec ECN

    Testez toujours les codes de retour pour savoir POURQUOI cela ne fonctionne pas.

    int ticket = OrderSend(Symbol(),OP_BUY,1 , Ask, 3, buystop, buytpx1, "DIBSBUY", Mnumber1);  //Open buy order
    if (ticket < 0) Alert("OrderSend [1] failed: ",GetLastError());

  2. buystop = iLow(hothand()...
    Vos stops sont basés sur la paire hothand(), mais vous ouvrez un ordre avec Symbol(). Si ce n'est pas la même chose, les stops sont complètement faux.
 
dazamate:

Bon, je suis de retour,


C'est la partie de mon code où les transactions sont exécutées, je vais juste travailler avec 5 chiffres pour le moment. L'idée ici est que j'ai utilisé ma fonction hothand pour choisir la meilleure paire à trader pour la journée. Ce code doit rechercher une barre intérieure sur le graphique en 1 heure. (La fonction hothand renvoie une chaîne de caractères de la paire) Lorsqu'il trouve une barre intérieure, je l'ai juste fait ouvrir une transaction d'achat ou de vente à plat à des fins de test. Je ne suis pas sûr que le backtester puisse gérer la négociation de plusieurs paires à partir d'un seul graphique. J'ai téléchargé l'historique 1min pour toutes les paires qu'il utilise. Mais il ne semble ouvrir des transactions que sur l'eurusd qui est le graphique auquel je l'ai attaché,


Quelques commentaires généraux :

vous achetez à l'Ask et vendez à l'Bid.

si votre courtier est un courtier de type ECN, vous ne pouvez pas définir le SL et le TP lorsque vous passez l'ordre (dans ce cas, mettez-les à 0), vous devez passer l'ordre, puis modifier l'ordre pour ajouter le SL et le TP.

vérifiez toujours le résultat de la passation d'un ordre et vérifiez si des erreurs sont retournées, vous devrez les traiter en agissant en conséquence.

si vous envisagez d'utiliser cet EA sur plusieurs graphiques, c'est-à-dire de passer des ordres à partir de plusieurs graphiques, vous aurez besoin d'une sorte de Mutex pour éviter le Busy Order Context (consultez les articles de WHRoeder, il a un excellent Mutex).

 
Damm WHRoeder, vous avez raison "nos stops sont basés sur la paire hothand(), mais vous ouvrez un ordre avec Symbol()" Je n'avais pas remarqué cela. Quelle stupidité. Ce truc est si fatiguant mentalement pendant que vous essayez de l'apprendre. Mais oui, stupide. Merci d'avoir passé en revue tout ce bazar. Je vais probablement faire une pause et revenir demain avec l'esprit libre. Je corrigerai les choses que vous avez signalées.
 
dazamate:

Mais il ne semble ouvrir des transactions que sur l'eurusd qui est le graphique auquel je l'ai attaché,

Oui... . .

OrderSend(Symbol(),OP_SELL,1 , Ask, 3, sellstop, selltpx1,"DIBSSELL",Mnumber1);  //Open Sell Order

Symbol () est la paire à laquelle l'EA/Indicateur est attaché, vouliez-vous faire cela à la place ?

OrderSend(hothand(),OP_SELL,1 , Ask, 3, sellstop, selltpx1,"DIBSSELL",Mnumber1);  //Open Sell Order
 

Oui, c'est ce que je voulais faire, mais maintenant j'ai cette erreur


http://clip2net.com/s/144hq


Comme s'il ne reconnaissait pas la sortie de la paire de la fonction hothand. La sortie de la fonction hothand est une chaîne de caractères, donc je ne vois pas pourquoi cela ne fonctionnerait pas.

 
dazamate:
Comme s'il ne reconnaissait pas la sortie de la paire de la fonction hothand. La sortie de la fonction hothand est une chaîne de caractères, donc je ne vois pas pourquoi elle ne fonctionnerait pas.
OrderSend(hothand(),OP_SELL,1 , Ask, 3, sellstop, selltpx1,"DIBSSELL",Mnumber1);  //Open Sell Order
  1. Ask/Bid est le prix actuel du Symbol() mais vous essayez d'ouvrir une autre paire. C'est un faux prix.
  2. Vous ne pouvez pas obtenir de valeurs de barre zéro à partir du testeur pour d'autres TF/paires.
  3. Vous ne pouvez pas ouvrir de transactions pour d'autres paires dans le testeur.
  4. Nom de symbole USDCHF inconnu pour la fonction OrderSend.
    D'où vient cette chaîne ? Est-ce que le graphique actuel a le même motif, ou USD,EUR, ou USD/EUR, ou USDEURm, ou USDEURfxf, etc.
  5. Je vous suggère de négocier UNIQUEMENT la paire actuelle. Si hothand() n'est pas la paire actuelle, pas de transactions. De cette façon, cela fonctionne dans le testeur, vous pouvez toujours mettre l'EA sur d'autres paires et ainsi contrôler les paires qu'il trade, et vous évitez tous les pièges.
 

Salut les gars, j'essaie de faire un code qui fait ce qui suit


extern string  sComment4                = "Max Hours allowed before pending orders are deleted";
extern int     pendinglimit        = 4;

// * EVERYTIME A TRADE GETS TRIGGERED 

bartraded = TimeHour(TimeCurrent());


// DELETE PENDING ORDERS THAT HAVE NOT BEEN TRIGGERED WITHIN 

   if(TimeHour(TimeCurrent()) > bartraded + pendinglimit && Tradeopen()==true) // Check to see if pending orders have expired
     {
        for(int tnumber = OrdersTotal()-1; tnumber >= 0 ; tnumber--)  //scan through open orders
        {
          if (OrderSelect(tnumber, SELECT_BY_POS) &&   
           OrderType()==(OP_BUYSTOP||OP_SELLSTOP) &&     // The order selected is either a pending buy on stop order or a buy on sell order
            OrderMagicNumber()==(Mnumber1||Mnumber3))    // The orders magic number is the same as the magic number used in this ea
          
               {
                OrderSelect(tnumber, SELECT_BY_POS);     // Select order
                OrderDelete(tnumber);                    // Delete it
               }
        }
     }

Si un ordre en attente a été ouvert depuis x barres, il est supprimé si le nombre de barres a dépassé x.


Il y a peut-être un problème avec ma logique ?

Raison: