Code d'erreur "0" ?

 

J'ai du mal à comprendre pourquoi les positions longues fonctionnent et les transactions courtes pas du tout ?

J'ai le sentiment que cela a quelque chose à voir avec ma fonction init pour déterminer le nombre de décimales avec le courtier donné à portée de main. (car cela semble être le coupable de la raison pour laquelle les ordres fantômes sont jetés dès le début de l'initiation du testeur...)

Quelqu'un a-t-il une idée de la raison pour laquelle le côté court me signale cette erreur ?


Merci d'avance (le code est un peu désordonné pour le moment, j'ai l'intention de le nettoyer bien sûr !)

//+------------------------------------------------------------------+
//| expert initialization function                                   |
//+------------------------------------------------------------------+
int init()
  {

   double ticksize = MarketInfo(Symbol(), MODE_TICKSIZE);
   if (ticksize == 0.00001 || ticksize == 0.001) // if you set this to 0 it WONT throw an order out straight away.
   pips = ticksize*10;
   else pips = ticksize;  
   

   return(0);
  }
//+----

//+------------------------------------------------------------------+
//| Order Enter Function                                             |
//+------------------------------------------------------------------+

void OrderEntry (int direction)
{    
   
  int PositionIndex;    //  <-- this variable is the index used for the loop
  int TotalNumberOfOrders;   //  <-- this variable will hold the number of orders currently in the Trade pool
  TotalNumberOfOrders = OrdersTotal();    // <-- we store the number of Orders in the variable
   
   
   double s12 = iMA(NULL,60,60,0,1,0,1); 
   double i121 = iMA(NULL,60,60,0,1,0,1);
   
   double LotSize=0;
   double Equity=AccountEquity();
   double RiskedAmount=Equity*RiskPercent*0.01;

   int iTBT= iBarShift(NULL,60, triggerBarTime, true),
        iHH= iHighest(NULL,60, MODE_HIGH, iTBT + 1, 0); 
            double buyPrice = High[iHH]+PadAmount*pips;
   
   
    int iTBT_1= iBarShift(NULL,60, triggerBarTime1, true),
        iLL= iLowest(NULL,60, MODE_LOW, iTBT_1 + 1, 0); 
            double sellPrice = Low[iLL]-PadAmount*pips;
            
   
   double buy_stop_price = iMA(NULL,60,60,0,1,0,1)-PadAmount*pips; 
   double pips_to_bsl = buyPrice-buy_stop_price;         
   double buy_takeprofit_price = (pips_to_bsl*RewardRatio)+buyPrice;   
   double sell_stop_price = iMA(NULL,60,60,0,1,0,1)+PadAmount*pips; 
   double pips_to_ssl = sell_stop_price-sellPrice;     
   double sell_takeprofit_price = sellPrice-(pips_to_ssl*RewardRatio);
   
//+----------------------------------------------------------------------------------------------------------------------------------------+  
//+----------------------------------------------------------------------------------------------------------------------------------------+   
   
  
if (direction==0) //--Buy--//
   {
      
      {
      double bsl=buy_stop_price;
      double btp=buy_takeprofit_price;
      LotSize = (RiskedAmount/(pips_to_bsl/pips))/10;
      if(OpenOrdersThisPair(Symbol())==0) 
      int BuyTicketOrder = OrderSend(Symbol(),OP_BUYSTOP,LotSize,buyPrice,3,bsl,btp,NULL,MagicNumber,0,Green); 
      
      if(BuyTicketOrder > 0)
         {
         Print("Order Placed #", BuyTicketOrder);
         }
      else
         {
         Print("Order Send Failed, error # ", GetLastError());   
         }
  
      }
   }

            
if (direction==1)//--Sell--//
   {
      {
      double ssl=sell_stop_price;
      double stp=sell_takeprofit_price;
      LotSize = (RiskedAmount/(pips_to_ssl/pips))/10;    
      if(OpenOrdersThisPair(Symbol())==0)  
      int SellTicketOrder = OrderSend(Symbol(),OP_SELLSTOP,LotSize,sellPrice,3,ssl,stp,NULL,MagicNumber,0,Red); 
  
      if(SellTicketOrder > 0)
         {
         Print("Order Placed #", SellTicketOrder);
         }
      else
         {
         Print("Order Send Failed, error # ", GetLastError());   
         }
 
      }
   }
} 
 

Le logiciel entre-t-il dans les transactions lorsque vous commentez ?

//if(OpenOrdersThisPair(Symbol())==0
est-ce qu'il entre quand
LotSize = 0.1;
etc. Remontez jusqu'à ce qu'il commence à entrer des transactions, une fois là vous saurez probablement quel est le problème. hth
 
Oui, il entre sur le côté long même avec la taille de lot "0"...

Changer l'OpenOrderThisPair ne fonctionne pas non plus.... Hmmm. C'est très étrange...
 
DomGilberto:
Oui, il entre sur le côté long même avec une taille de lot "0"...

Changer l'OpenOrderThisPair ne fonctionne pas non plus.... Hmmm. C'est très étrange...

Si ce test renvoie un résultat différent de zéro...

if(OpenOrdersThisPair(Symbol()) == 0)  

. . . l'OrderSend() n'est pas appelé, mais il faut quand même vérifier si SellTicketOrder est supérieur à 0 . . .

Faites-le...

if (direction==1)//--Sell--//
   {
      {
      double ssl=sell_stop_price;
      double stp=sell_takeprofit_price;
      LotSize = (RiskedAmount/(pips_to_ssl/pips))/10;    
      if(OpenOrdersThisPair(Symbol())==0)
         {
         int SellTicketOrder = OrderSend(Symbol(),OP_SELLSTOP,LotSize,sellPrice,3,ssl,stp,NULL,MagicNumber,0,Red); 
  
         if(SellTicketOrder > 0)
            {
            Print("Order Placed #", SellTicketOrder);
            }
         else
            {
            Print("Order Send Failed, error # ", GetLastError());   
            }
         }
      }
 
Non, il ne semble pas vouloir envoyer l'ordre de vente...

Il doit s'agir d'une erreur dans la façon dont j'ai écrit le code concernant les instructions "IF" dans la boucle for qui envoie la fonction OrderEntry pour déclencher un ordre...
 
DomGilberto:
Non, il ne semble pas vouloir envoyer l'ordre de vente...

Il doit s'agir d'une erreur dans la façon dont j'ai écrit le code concernant les instructions "IF" dans la boucle for qui envoie la fonction OrderEntry pour déclencher un ordre...

Quelle erreur obtenez-vous maintenant ? Si vous n'en obtenez pas et que vous n'obtenez pas "Order placed # 12345", alors la fonction OrderSend() n'est pas appelée et vous avez un problème avec votre fonction OpenOrdersThisPair()... postez votre code.
 
Lorsque cela fonctionne, cela fonctionne bien pour le côté long (je viens de jouer avec cela pendant les deux dernières heures maintenant). Le truc, c'est que je vais très probablement vous énerver, vous et quelqu'un d'autre, car je sais où je me trompe (là où j'appelle la fonction"CheckForMaTrade") en ce qui concerne les instructions IF relatives aux paramètres de la moyenne mobile, et comment, si elles sont "vraies", cela enverra OrderEntry à OrderSend... Le problème est que je suis encore en train d'apprendre comment écrire cette partie correctement...
//+------------------------------------------------------------------+
//| expert start function                                            |
//+------------------------------------------------------------------+

int start()
  {
//----
   
   if(OpenOrdersThisPair(Symbol())>=1)
      {
      if(UseMoveToBreakEven)MoveToBreakEven();
      if(UseTrailingStop)AdjustTrail();
      if(Use_MA_Trail)MA_Trail();
      }
      if(IsNewCandle())CheckForMaTradeLong();
      if(IsNewCandle())CheckForMaTradeShort();
//----
   return(0);
  }
 
DomGilberto:
Lorsque cela fonctionne, cela fonctionne bien pour le côté long (je viens de jouer avec cela pendant les deux dernières heures maintenant). Le truc, c'est que je vais très probablement vous énerver, vous et quelqu'un d'autre, car je sais où je me trompe (là où j'appelle la fonction "CheckForMaTrade") en ce qui concerne les instructions IF relatives aux paramètres de la moyenne mobile, et comment, si elles sont "vraies", cela enverra OrderEntry à OrderSend... Le problème est que je suis encore en train d'apprendre comment écrire cette partie correctement...

RaptorUK:
Si tu n'en obtiens pas et que tu n'obtiens pas "Ordre placé # 12345", alors la fonction OrderSend() n'est pas appelée et tu as un problème avec ta fonction OpenOrdersThisPair()... affiche ton code.


Alors... . quelle erreur obtenez-vous, etc....
 
Oh, désolé - je ne reçois plus aucune erreur, quelle qu'elle soit. Je n'ai que des ordres d'achat qui passent et aucun ordre de vente...

C'est en rapport avec mon fil de discussion précédent concernant les croisements de MA - je ne comprends toujours pas ! Mais je ne veux pas énerver qui que ce soit et battre un cheval mort alors que les gens me donnent la réponse (même si je ne comprends pas la réponse lol) ! Cheers RaptorUK pour votre aide !
 
     if(IsNewCandle())CheckForMaTradeLong();
     if(IsNewCandle())CheckForMaTradeShort();
Bien que je sois favorable à l'intégration des opérations dans les fonctions, je ne le fais pas pour la plupart des variations de New Candle/New Bar car cette fonction ne peut être appelée qu'UNE SEULE FOIS [par start()].
int start(){
   static datetime time0; bool isNewCandle = time0 != Time[0]; time0 = Time[0]; // Once per start only.
   :
      if(isNewCandle)CheckForMaTradeLong();
      if(isNewCandle)CheckForMaTradeShort();
 
Merci WHRoeder - bon conseil !