Come trovare il tempo della barra in cui le medie mobili si sono incrociate? (codice all'interno)

 

Ciao a tutti!

Speravo in un po' di aiuto sul mio codice - attualmente bloccato su questa dannata parte!


Questo è il processo che sto cercando di scrivere nel codice qui sotto:

1) Se tutte le MA sono "a ventaglio" e incrociate in modo che il prezzo sia sopra tutte le medie mobili e queste indicano un potenziale lungo.

2) Voglio poi sapere la barra esatta (usando il Tempo) in cui le medie mobili sono "a ventaglio" all'incrocio delle medie mobili.

3) Se 1 e 2 sono vere, aspetto poi che una qualsiasi barra torni giù (nel caso di una posizione lunga) e tocchi la 21 EMA.

4) Dalla prima barra (dove le MA si sono incrociate e sono uscite a ventaglio) alla barra che ora ha toccato la 21 EMA - voglio un ordine pendente O a mercato piazzato SOPRA i massimi di questo range (1 & 3).

5) Se il prezzo in QUALSIASI punto CHIUDE sotto la 60 EMA, PRIMA di far scattare l'ordine - allora l'ordine deve essere cancellato.

Questo ovviamente non è tutto il codice, ma questa è la parte principale con cui mi sto strappando i capelli. Si prega di controllare il codice con il "<<<<<<<<<<<<<". Questi sono i punti su cui sono confuso.

Potrei VERAMENTE fare con l'aiuto di qualcuno - sarebbe davvero apprezzato!

Molte grazie in anticipo!

datetime          triggerBarTime;   <<<<< Global settings.
datetime          triggerBarTime1;  <<<<< Global settings.	



void CheckForMaTrade()
{

//+-----------------------------------------------------------------------------------------------------------------------+ 
    //Small and Big Fish on the H1 Time Frame.                                                                           |
//+-----------------------------------------------------------------------------------------------------------------------+              

   {
   double PreviousSmallFish1  =  iMA(NULL,60,3,0,1,0,2); 
   double CurrentSmallFish1   =  iMA(NULL,60,3,0,1,0,1);
   double PreviousSmallFish2  =  iMA(NULL,60,5,0,1,0,2);
   double CurrentSmallFish2   =  iMA(NULL,60,5,0,1,0,1);
   double PreviousSmallFish3  =  iMA(NULL,60,8,0,1,0,2);
   double CurrentSmallFish3   =  iMA(NULL,60,8,0,1,0,1);
   double PreviousSmallFish4  =  iMA(NULL,60,10,0,1,0,2);
   double CurrentSmallFish4   =  iMA(NULL,60,10,0,1,0,1);  
   double PreviousSmallFish5  =  iMA(NULL,60,12,0,1,0,2);
   double CurrentSmallFish5   =  iMA(NULL,60,12,0,1,0,1);
   double PreviousSmallFish6  =  iMA(NULL,60,15,0,1,0,2);
   double CurrentSmallFish6   =  iMA(NULL,60,15,0,1,0,1);  
   
      double PreviousBigFish1  =  iMA(NULL,60,30,0,1,0,2); 
      double CurrentBigFish1   =  iMA(NULL,60,30,0,1,0,1);
      double PreviousBigFish2  =  iMA(NULL,60,35,0,1,0,2);
      double CurrentBigFish2   =  iMA(NULL,60,35,0,1,0,1);
      double PreviousBigFish3  =  iMA(NULL,60,40,0,1,0,2);
      double CurrentBigFish3   =  iMA(NULL,60,40,0,1,0,1);
      double PreviousBigFish4  =  iMA(NULL,60,45,0,1,0,2);
      double CurrentBigFish4   =  iMA(NULL,60,45,0,1,0,1);
      double PreviousBigFish5  =  iMA(NULL,60,50,0,1,0,2);
      double CurrentBigFish5   =  iMA(NULL,60,50,0,1,0,1);
      double PreviousBigFish6  =  iMA(NULL,60,60,0,1,0,2);
      double CurrentBigFish6   =  iMA(NULL,60,60,0,1,0,1); 
      
            if(PreviousBigFish1<CurrentBigFish2 && CurrentBigFish1>PreviousBigFish2)
               if(PreviousBigFish2<CurrentBigFish3 && CurrentBigFish2>PreviousBigFish3)
                  if(PreviousBigFish3<CurrentBigFish4 && CurrentBigFish3>PreviousBigFish4)
                     if(PreviousBigFish4<CurrentBigFish5 && CurrentBigFish4>PreviousBigFish5)
                        if(PreviousBigFish5<CurrentBigFish6 && CurrentBigFish5>PreviousBigFish6)  
                           
                           if(PreviousSmallFish1<CurrentSmallFish2 && CurrentSmallFish1>PreviousSmallFish2)
                        if(PreviousSmallFish2<CurrentSmallFish3 && CurrentSmallFish2>PreviousSmallFish3)
                     if(PreviousSmallFish3<CurrentSmallFish4 && CurrentSmallFish3>PreviousSmallFish4)
                  if(PreviousSmallFish4<CurrentSmallFish5 && CurrentSmallFish4>PreviousSmallFish5)
                if(PreviousSmallFish5<CurrentSmallFish6 && CurrentSmallFish5>PreviousSmallFish6)triggerBarTime = Time[1];  <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
      
      
      double ema21 = iMA(NULL,60,21,0,1,0,1); 
       
        
         if (Low[1]<ema21)
         {
         
           OrderEntry(0); // BUY 
            }     
      
      
                
     if(PreviousBigFish1>CurrentBigFish2 && CurrentBigFish1<PreviousBigFish2)
      if(PreviousBigFish2>CurrentBigFish3 && CurrentBigFish2<PreviousBigFish3)
         if(PreviousBigFish3>CurrentBigFish4 && CurrentBigFish3<PreviousBigFish4)
            if(PreviousBigFish4>CurrentBigFish5 && CurrentBigFish4<PreviousBigFish5)
               if(PreviousBigFish5>CurrentBigFish6 && CurrentBigFish5<PreviousBigFish6)
               
               if(PreviousSmallFish1>CurrentSmallFish2 && CurrentSmallFish1<PreviousSmallFish2)
            if(PreviousSmallFish2>CurrentSmallFish3 && CurrentSmallFish2<PreviousSmallFish3)
         if(PreviousSmallFish3>CurrentSmallFish4 && CurrentSmallFish3<PreviousSmallFish4)
       if(PreviousSmallFish4>CurrentSmallFish5 && CurrentSmallFish4<PreviousSmallFish5)
     if(PreviousSmallFish5>CurrentSmallFish6 && CurrentSmallFish5<PreviousSmallFish6)triggerBarTime = Time[1]; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
   
    double ema21_2 = iMA(NULL,60,21,0,1,0,1); 
  
            if(High[1]>ema21_2)
            {
             
              OrderEntry(1); // SELL
             }  
   
       }

}


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

void OrderEntry (int direction)
{    
   double LotSize=0;
   double Equity=AccountEquity();
   double RiskedAmount=Equity*RiskPercent*0.01;
   int buyStopCandle = iLowest(NULL,0,1,CandlesBack,1); 
   int sellStopCandle = iHighest(NULL,0,2,CandlesBack,1);
   
   double buyPrice = iHighest(Symbol(), 0, MODE_HIGH, iBarShift(Symbol(), 0, triggerBarTime, true), 0);    <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< 
   double sellPrice = iLowest(Symbol(), 0, MODE_LOW, iBarShift(Symbol(), 0, triggerBarTime1, true), 0);   <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
   
   double buy_stop_price = iMA(NULL,60,60,0,1,0,1)-PadAmount*pips; 
   double pips_to_bsl = Ask-buy_stop_price;         //double pips_to_bsl = Ask-buy_stop_price;   --- Old code
   double buy_takeprofit_price = Ask+pips_to_bsl*RewardRatio;   
   double sell_stop_price = iMA(NULL,60,60,0,1,0,1)+PadAmount*pips; //- Greyed out, this is an old code line.
   double pips_to_ssl = sell_stop_price-Bid;     ////double pips_to_ssl = sell_stop_price-Bid;   --- Old code
   double sell_takeprofit_price = Bid-pips_to_ssl*RewardRatio;   
   
  
   if (direction==0)//<< "0" pushes out a Buy direction
   {
      //double buyPrice = iHighest(Symbol(), 60, MODE_HIGH, iBarShift(Symbol(), 0, triggerBarTime, true), 0);//-PadAmount*pips; // new line
      int Buy_Price = buyPrice;
      
      double bsl=buy_stop_price;
      double btp=buy_takeprofit_price;
      //LotSize = (100/(0.00500/0.00010))/10
      LotSize = (RiskedAmount/(pips_to_bsl/pips))/10;
      if(OpenOrdersThisPair(Symbol())==0) //--- This means that it will not open a new order if there is one already open!If greyed out, it will take everything.
      int buyticket = OrderSend(Symbol(),Buy_Price,LotSize,Ask,3,0,0,NULL,MagicNumber,0,Green); //ask
      if(buyticket>0)OrderModify(buyticket,OrderOpenPrice(),bsl,btp,0,CLR_NONE);
   }
            
   if (direction==1) //<< "1" pushes out a Sell direction
   {
      
      //double sellPrice = iLowest(Symbol(), 60, MODE_LOW, iBarShift(Symbol(), 0, triggerBarTime1, true), 0);//+PadAmount*pips;   // new line.
      int Sell_Price = sellPrice;
      
      double ssl=sell_stop_price;
      double stp=sell_takeprofit_price; 
      //LotSize = (100/(0.00500/0.00010))/10;
      LotSize = (RiskedAmount/(pips_to_ssl/pips))/10;    
      if(OpenOrdersThisPair(Symbol())==0)  //--- This means that it will not open a new order if there is one already open! If greyed out, it will take everything.
      int sellticket = OrderSend(Symbol(),Sell_Price,LotSize,Bid,3,ssl,stp,NULL,MagicNumber,0,Red); //bid
      if(sellticket>0)OrderModify(sellticket,OrderOpenPrice(),ssl,stp,0,CLR_NONE);
   }
   
}

return(0);

 
DomGilberto:

Ciao a tutti!

Questo ovviamente non è tutto il codice, ma questa è la parte principale con cui mi sto strappando i capelli. Si prega di controllare il codice con il "<<<<<<<<<<<<<". Questi sono i punti su cui sono confuso.

Per favore leggi la documentazione per le funzioni che stai usando . . .iHighest() non restituisce un prezzo . . . restituisce un int"Restituisce lo spostamento del valore massimo su un numero specifico di periodi a seconda del tipo".
 

Grazie RaptorUK - Nel modo più gentile possibile, questo non mi spiega nulla? In termini profani?

È questo un forum dove qualcuno può effettivamente aiutarmi oltre a ripetere le definizioni delle funzioni (in cui ho letto 100 volte dalla sezione "aiuto"...)

Dopotutto, non credo che quello che sto chiedendo (in confronto ad alcune delle discussioni qui!) sia abbastanza per giustificare che qualcuno si faccia pagare per il suo tempo...?

 

Tradurre in termini profani vi aiuterà... una volta, oggi, con questo particolare problema... e prendete un po' di tempo per lo spiegatore.

Se dici quali delle definizioni non capisci, forse la prossima volta potrai risolvere i tuoi problemi, e dopo un po', potrai essere uno di quelli che risolvono i problemi degli altri.

Se provate a studiare il problema da soli, imparerete anche molto di più. Per esempio, provate questo:

Alert(iHighest(Symbol(), 0, MODE_HIGH, iBarShift(Symbol(), 0, triggerBarTime, true), 0));

e vedrete quale valore viene restituito dalla funzione... (come dice Raptor, non è un prezzo)... e probabilmente capirete più facilmente la definizione della funzione.

Cose come questa vi aiuteranno di più che sperare che qualcuno sul forum abbia il tempo di testare il vostro codice e fare la stessa risoluzione dei problemi che dovreste imparare a fare da soli.

 

Eh? Sono così confuso - Sto chiedendo troppo per un aiuto?

Dopo tutto, ho costruito il mio intero EA da zero (che ho imparato da solo...) Voglio solo qualche consiglio da qualcuno che ha più conoscenza di me... :s

 

"Cose come questa vi aiuteranno di più che sperare che qualcuno del consiglio abbia il tempo di testare il vostro codice e fare la stessa risoluzione dei problemi che dovreste imparare a fare da soli".

Che diavolo... Non me lo aspettavo da nessuno!

Il tuo post ha fatto più luce sulla situazione - Lo apprezzo.

Questo forum è davvero divertente... Non avevo intenzione di scaricare gratis su nessuno! Volevo semplicemente qualche chiarimento su come identificare correttamente la barra che si incrocia con le EMA...

Jeez....

 

quando leggo la risposta di raptor ti dice il problema esatto che hai fatto.

i prezzi sono memorizzati come variabili doppie, ad esempio 1.12345

le funzioni iHighest restituiscono un intero (int) ad esempio 1 o 2 o -100 .... chiaramente non un prezzo.

Non so cosa stai cercando di ottenere ma la funzione iHighest probabilmente non è quella che vuoi usare.

Lo avresti scoperto da solo se in metaeditor, clicchi su iHighest nel tuo codice, poi premi F1... vedrai che restituisce un intero (cosa che ti ha detto anche Raptor)

Non conosco la fonte della tua confusione. Se non conosci la differenza tra le variabili int e double ti mancano alcune conoscenze di base vitali, il che significa che stai cercando di correre prima di poter camminare, e vuoi che qualcun altro ti porti :/

EDIT: Non ti aspettavi di dover fare la tua risoluzione dei problemi prima di chiedere a qualcun altro?!?

 

Le medie mobili multiple non si incrociano allo stesso tempo.

Perché stai postando due volte? La tua domanda ha già ricevuto una risposta.

Trova la prima barra in cui erano tutte nel giusto ordine.

int DIR = 0;
for(int iBar = 0; iBar < Bar; iBar++){
   double MA20 = ... iBar), 
           MA5 = ... iBar);
          :
   if(     MA20 > MA5 && MA5 > ...) DIR = -1;
   else if(MA20 < MA5 && MA5 < ...) DIR = +1; // All fanning up.
   else if (DIR != 0){ iBar--; break; }       // Last one was cross.
}
 

Capisco la differenza tra int e double...

dopo che le dichiarazioni If sono vere, voglio trovare la barra che ha attraversato nel punto in cui le MA sono distanziate. Ho pensato che se avessi usato

"triggerBarTime = Time[1];" - dopo le dichiarazioni "If" allora triggerBarTime potrebbe essere usato insieme a iBarShift per bloccare la prima barra dell'intervallo che mi interessa?

Poi, usando iHighest, mi permetterebbe di convertire questa informazione in un int e usarla nella mia funzione d'ordine (Buy_Price)?

 

Puoi capire la differenza tra int e double ma non capisci la differenza tra un numero di barra (int) e un prezzo (double).

iHighest ti permetterebbe di convertire il datetime in un numero di barra (int.) Ma OrderSend prende solo un prezzo (un doppio) non ha senso aprire un ordine a 9

 

Ah! Gotch-ya!

Grazie mille :) Lo apprezzo davvero!

Grazie per essere stato paziente con me - non intendevo presentarmi in modo da aspettarmi che qualcuno facesse qualcosa per me; solo darmi qualche chiarimento sull'aiuto (premere F1 su tutto non è sempre così chiaro per me.) è tutto ciò che volevo.