Codice di errore "0"? - pagina 2

 
DomGilberto:
Oh, scusate - non ricevo più alcun errore. Ricevo solo ordini di acquisto che passano e nessun ordine di vendita...

E' in relazione al mio precedente thread riguardante i cross over delle MA - non l'ho ancora capito! Ma non voglio far arrabbiare nessuno e battere un cavallo morto mentre la gente mi sta dando la risposta (anche se non capisco la risposta lol)! Grazie RaptorUK per il tuo aiuto!

Non posso parlare per gli altri, non mi sto agitando...

Se non si ottengono errori e nessun ordine di vendita piazzato, allora OpenOrdersThisPair(Symbol()) non è uguale a 0, che tipo è quella funzione? È un int o un double? o forse 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);
  }
In realtà non riesco a capire quale sia il problema. Ho scritto le dichiarazioni MA if in tanti modi che la mia limitata conoscenza mi dice (chiaramente limitata in quanto non funziona sul lato corto...)

Penso che sia perché gli ordini non vengono semplicemente piazzati dove avviene l'incrocio delle medie mobili, ma in un punto diverso.
 
//+----------------------------------------------------------------------------------------------------------------------------------------+   
//| 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);
   }

So che questo è il problema! So che l'ho già chiesto in precedenza su un altro argomento, ma apprezzerei molto la risposta a questa domanda (e sì, so che il codice è sciatto, ho solo passato molto tempo a tagliare, compilare ed eseguire strategie per vedere in prima persona come comunicano tra loro. Per non parlare del modo inutile in cui l'ho anche scritto... ma ignorando questo...)

D.1) Per quanto riguarda la linea "doppio triggerbartime" e il > di sezione.... Quello che voglio capire è come faccio a dire a questa funzione di trovare quando tutte le medie mobili sono maggiori della precedente media mobile confrontata, e poi dimenticarmi di fare in modo che rimangano nel giusto ordine... Invece da quel punto tutto ciò di cui ho bisogno per assicurarmi è che PRICE CLOSE rimanga sopra la "i12" (60 EMA) - se lo fa, allora può proseguire con le altre istruzioni IF e lanciare un ordine lungo tramite "OrderEntry(0)" - se non lo fa, allora deve guardare la linea lunga (i1>i2 && i2>i3...) e aspettare che questa sia di nuovo vera prima di considerare le linee successive...

So che la risposta è proprio davanti a me, ma sta diventando un po' frustrante e apprezzerei molto questa piccola pepita.... Grazie!

 
  1. Il tuo post
    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)
    Che tipo di dati dovrebbe essere TrgggerBarTime?
    double  TriggerBarTime = boolean;
       if (double == true)

  2. Perché stai guardando le vecchie barre per TriggerBarTime E l'ultima barra per orderEntry?
  3. Correggi il tuo indentamento
    Il tuo post
       if(i1 > i12)
       if (TriggerBarTime == true)
           if(Low[1]<ema21 && i12<Close[1]) OrderEntry(0);
             if(Close[1]<i12) DeleteOrder(0);   
    Correttamente indentato. È davvero questo che intendevi?
    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...

Voglio sapere dove sono disposte tutte le MA, ma NON è necessario che siano vere TUTTE le volte... Voglio solo che questo sia vero prima di ogni altra cosa... Partendo dal presupposto che questo è vero, tutto ciò che deve accadere da questo prezzo è che NESSUNA barra si chiuda sotto la 60 EMA (per un long) per rimanere valida e che qualsiasi posizione long venga spinta fuori...

Sto usando TriggerBarTime per trovare il punto più alto da dove tutte le medie mobili si sono impilate nel giusto ordine e la barra che poi procede nel toccare la 21 EMA...

Quindi, anche se mi hai chiarito il rientro, questo fa più o meno quello che avevo scritto prima (a meno che non mi manchi qualcosa?).

(ah sì - so che dovrebbe essere bool, è stato un errore - stavo semplicemente giocando e ho dimenticato di scambiarli di nuovo).

 
double TriggerBarTime = (i1>i2 .. 
è vero o falso 0 o 1 nient'altro
 int iTBT= iBarShift(NULL,60, TriggerBarTime, true),
Il terzo argomento di iBarShift deve essere un datetime. iBarShift(0) o (1) sarà SEMPRE Bars-1.
 
datetime          TriggerBarTime;
Ho questo nella sezione globale...

Non capisco il tuo post precedente? ^

È possibile suggerire come scrivo la linea If relativa al mio post sopra il tuo?
 
DomGilberto: Ho questo nella sezione globale...
E l'hai nascosto con la dichiarazione locale.
 
Scusa, ma ancora una volta, questo non ha senso per me...
 
DomGilberto: Scusa, ma ancora una volta, questo non ha senso per me...
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
}