Code d'erreur "0" ? - page 2

 
DomGilberto:
Oh désolé - je ne reçois plus aucune erreur. 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 !

Je ne peux pas parler pour les autres, je ne m'énerve pas....

Si vous n'obtenez aucune erreur et qu'aucun ordre de vente n'est placé, alors OpenOrdersThisPair(Symbol()) n'est pas égal à 0, de quel type est cette fonction ? est-ce un int ou un double ? ou peut-être un bool ?

 
//+----------------------------------------------------------------------------------------------------------------------------------------+  
//| Check to see if any order open on this currency pair                                                                                   |
//+----------------------------------------------------------------------------------------------------------------------------------------+   

int OpenOrdersThisPair(string pair)
{
   int total=0;
      for(int i=OrdersTotal()-1; i >= 0; i--)
         {
         OrderSelect(i,SELECT_BY_POS,MODE_TRADES);
         if(OrderSymbol()==pair) total++;
         }
         return (total);
} 
//+------------------------------------------------------------------+
//| 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);
  }
Je n'arrive pas à comprendre quel est le problème. J'ai écrit les déclarations MA if autant de fois que mes connaissances limitées me le permettent (clairement limitées car cela ne fonctionne pas sur le côté court...)

Je pense que c'est parce que les ordres ne sont pas simplement placés là où le croisement des moyennes mobiles a lieu, mais à un point différent.
 
//+----------------------------------------------------------------------------------------------------------------------------------------+   
//| Function that checks for an MA Cross                                                                                                   |
//+----------------------------------------------------------------------------------------------------------------------------------------+   
  

void CheckForMaTradeLong()
{
   
   TriggerBarTime = Time[1];
   
   for (int i=0; i < Bars; i++)
   {
   double i1  = iMA(NULL,60,3,0,1,0,i); 
   double i2  = iMA(NULL,60,5,0,1,0,i);
   double i3  = iMA(NULL,60,8,0,1,0,i);
   double i4  = iMA(NULL,60,10,0,1,0,i);  
   double i5  = iMA(NULL,60,12,0,1,0,i);
   double i6  = iMA(NULL,60,15,0,1,0,i);  
   double i7  = iMA(NULL,60,30,0,1,0,i);
   double i8  = iMA(NULL,60,35,0,1,0,i);
   double i9  = iMA(NULL,60,40,0,1,0,i);
   double i10 = iMA(NULL,60,45,0,1,0,i);
   double i11 = iMA(NULL,60,50,0,1,0,i);
   double i12 = iMA(NULL,60,60,0,1,0,i); 
   double ema21 = iMA(NULL,60,21,0,1,0,i);   

   double TriggerBarTime = (i1>i2 && i2>i3 && i3>i4 && i4>i5 && i5>i6 && i6>i7 && i7>i8 && i8>i9 && i9>i10 && i10>i11 && i11>i12); // this needs to just tell me where all the MA's fan up and nothing more...
   if(i1 > i12)
   if (TriggerBarTime == true)
       if(Low[1]<ema21 && i12<Close[1]) OrderEntry(0);
         if(Close[1]<i12) DeleteOrder(0);   
   
   break;
   }
   return(i-1);
   }

Je sais que c'est le problème ! Je sais que j'ai déjà demandé à ce sujet sur un autre sujet, mais j'apprécierais vraiment la réponse à cette question (et oui, je sais que le code est bâclé, j'ai juste passé beaucoup de temps à hacher, compiler et exécuter la stratégie pour voir de première main comment ils communiquent les uns avec les autres. Sans parler de la façon inutile dont je l'ai écrit aussi... mais passons outre...)

Q.1) En ce qui concerne la ligne "double triggerbartime" et la section > than.... Tout ce que je veux comprendre, c'est comment dire à cette fonction de trouver quand toutes les moyennes mobiles sont plus grandes que la moyenne mobile comparée précédente, et ensuite oublier de s'assurer qu'elles restent dans le bon ordre... Au lieu de cela, tout ce dont j'ai besoin de m'assurer, c'est que le PRICE CLOSE reste au-dessus de "i12" (60 EMA) - si c'est le cas, alors il peut suivre les autres instructions IF et lancer un ordre long via "OrderEntry(0)" - Si ce n'est pas le cas, alors il doit regarder la ligne longue (i1>i2 && i2>i3...) et attendre qu'elle soit à nouveau vraie avant de considérer les lignes suivantes...

Je sais que la réponse est sous mes yeux, mais je deviens un peu frustré et j'apprécierais vraiment ce petit morceau de pépite..... Merci !

 
  1. Votre message
    double TriggerBarTime = (i1>i2  && i2>i3   && i3>i4 && i4>i5 && 
                             i5>i6  && i6>i7   && i7>i8 && i8>i9 && 
                             i9>i10 && i10>i11 && i11>i12);
       if (TriggerBarTime == true)
    Quel type de données doit être TrgggerBarTime ?
    double  TriggerBarTime = boolean;
       if (double == true)

  2. Pourquoi prenez-vous en compte les anciennes barres pour TriggerBarTime ET la dernière barre pour orderEntry ?
  3. Corrigez votre indentation
    Votre message
       if(i1 > i12)
       if (TriggerBarTime == true)
           if(Low[1]<ema21 && i12<Close[1]) OrderEntry(0);
             if(Close[1]<i12) DeleteOrder(0);   
    Correctement indenté. Est-ce vraiment ce que vous vouliez dire ?
    if(i1 > i12 && TriggerBarTime && Low[1]<ema21 && i12<Close[1]){
        OrderEntry(0);
    }
    if(Close[1]<i12){
        DeleteOrder(0);
    }
    
 
//TriggerBarTime works in conjunction with:

   int iTBT= iBarShift(NULL,60, TriggerBarTime, true),
        iHH= iHighest(NULL,60, MODE_HIGH, iTBT + 1, 0); 
            double buyPrice = High[iHH]+PadAmount*pips;

//I then use this "buyPrice" in conjunction with OrderSend for where the price of the entry order is...

Je veux savoir où toutes les MA sont réparties, mais elles n'ont pas besoin d'être vraies TOUT le temps... Je veux juste que ce soit vrai avant toute autre chose... En partant du principe que c'est vrai, tout ce qui doit se passer à partir de ce prix est qu'AUCUNE barre ne clôture en dessous de l'EMA 60 (pour une position longue) afin de rester valide pour qu'une position longue soit sortie...

J'utilise TriggerBarTime pour trouver le point le plus haut à partir duquel toutes les moyennes mobiles se sont empilées dans le bon ordre et la barre qui procède alors à toucher l'EMA 21...

Donc, bien que vous ayez redressé l'indentation pour moi, cela fait à peu près ce que j'avais écrit auparavant (à moins que je ne manque quelque chose ?) C'est ma faute si je ne l'ai pas expliqué correctement.

(ah oui - je sais que ça devrait être bool c'était une erreur - je m'amusais simplement et j'ai oublié de les remettre en place).

 
double TriggerBarTime = (i1>i2 .. 
c'est vrai ou faux 0 ou 1 rien d'autre
 int iTBT= iBarShift(NULL,60, TriggerBarTime, true),
Le troisième argument de iBarShift doit être un datetime. iBarShift(0) ou (1) sera TOUJOURS Bars-1.
 
datetime          TriggerBarTime;
J'ai ceci dans la section globale...

Je ne comprends pas votre message précédent ? ^

Est-il possible de suggérer comment j'écris la ligne If par rapport à mon post au-dessus du vôtre ?
 
DomGilberto: J'ai ceci dans la section globale...
ET vous l'avez caché avec la déclaration locale.
 
Désolé, mais encore une fois, ça n'a aucun sens pour moi...
 
DomGilberto: Désolé, mais encore une fois, ça n'a aucun sens pour moi...
int myVariable = 0;
int start(){
  double myVariable = 1;
  Print(myVariable); // Outputs 1.0
  myVariable++;
  myFunction(myVariable);
}
void myFunction(double v){
  Print(myVariable," ",v); // Outputs 0 2.0
}