Problemi di controllo degli scambi aperti - pagina 2

 
dazamate:


int start(){
   static datetime Time0;
   if (Time0 == Time[0]) return; Time0 = Time[0];
   // A new bar has started.

WHRoeder, Questo codice sembra così semplice ma non riesco a capire nella mia testa come funziona, l'istruzione if non sarà sempre vera se rende time0 uguale a time[0] ogni volta che time0 è uguale a time[0]? Non dico che non funzioni, ma non capisco come funziona strutturato in questo modo.

1° tick: Time0 non è uguale a Time[0 ] quindi il ritorno non viene eseguito,Time0 è impostato su Time[0 ] (tempo di inizio della barra corrente) il resto della funzione diinizio viene eseguito.

2° tick e successivi: se Time0 è ancora uguale al tempo di inizio della barra corrente allora siamo ancora sulla stessa barra, viene eseguito il ritorno e si esce dalla funzione di avvio. Se Time0 non è uguale al tempo di inizio della barra corrente allora siamo su una nuova barra, il ritorno non viene eseguito, Time0 è impostato su Time[0] (tempo di inizio della nuova barra corrente) il resto della funzione di avvio viene eseguito.

 
dazamate:

Come posso fare per creare un contatore dove se un ordine in sospeso viene piazzato e non viene attivato entro un certo numero di barre, allora deve essere cancellato? Tutto quello che posso fare è mettere un contatore per contare ogni volta che si forma una nuova barra e se la quantità di barre contate == le barre consentite specificate prima che gli ordini in sospeso vengano cancellati. Il contatore di barre viene azzerato ogni volta che viene aperto un nuovo ordine pendente? Come vi sembra?

Creerei una funzione che controlla gli ordini in sospeso, cerca di vedere quando ogni ordine è stato aperto, controlla quanto tempo è passato e se più lungo del limite di tempo chiude l'ordine.

 
dazamate:

Voglio fare una funzione che analizza eurusd, usdchf, gbpusd, usdjpy su 1hr tf. Va indietro all'ultima candela delle 06:00 gmt e registra l'apertura, va indietro di altre 24 barre alla candela precedente delle 06:00 gmt e registra il range 6gmt - 6gmt per ogni coppia. Poi confronta il range 6gmt - 6gmt di tutte le coppie e restituisce quello che è il più alto. E' possibile per un ea fare questo dall'essere collegato ad un grafico a tempo?

Con tutti i problemi come questo, prima di pensare al codice devi prima capire la tua soluzione...IMO. Crea un diagramma di flusso o scrivi qualche pseudo codice . . ottenere una soluzione che abbia senso prima . . poi guardare il codice.

Per rispondere alla tua ultima domanda, sì, è possibile farlo, ad esempio, per ottenere il valore di apertura di una particolare candela da una coppia diversa da quella su cui l'EA è in uso.

iOpen( string symbol, int timeframe, int shift)

una volta che hai i tuoi valori per la rabbia delle 4 coppie puoi facilmente determinare il più grande usando qualcosa come questo:

  MathMax( double value4, (MathMax( double value3, (MathMax( double value1, double value2))))) ;

. . . o potresti mettere i valori in un array e usare ArraySort . . . di solito c'è più di un modo per fare qualsiasi cosa, prima devi avere un piano di come hai intenzione di risolvere il tuo problema.

EDIT: tieni presente che alcune di queste cose non funzioneranno correttamente con lo Strategy tester.

 
extern int     iOpenHour                = 6;

int start()
  {
  
int b, scannedhour;
datetime bartime;
double dibsclose, dibsopen, prevdayrange;

for(b=0; b<=24; b++)                                   // scans the last 24 bars 
   {
      bartime = iTime("EURUSD", 60, b);                // checks the open time of each bar
      scannedhour = TimeHour(bartime);                 // extracts the hour of that bar
    
      if ( scannedhour == iOpenHour )                  // Check to see if scanned hour = Dibs hour
         {
            dibsclose    = iOpen("EURUSD", 60, b);     // Get the open value of that bar (Close of 6gmt day) 
            dibsopen     = iOpen("EURUSD", 60, b-24);  // Get the value of the bar 24 bars before the Dibs bar (Open of 6gmt day)
            prevdayrange = (dibsclose-dibsopen);       // Calculate the range of the Dibs day
         }                                             // End of if statement
    }                                                  // End of for statement


Comment("Prev Dibs day range is...",prevdayrange, "dibsclose  =  ", dibsclose, "dibsopen  =  ",dibsopen, "Scannedhour=",scannedhour);      


   return(0);
  }

Bene, questo è il mio tentativo di scrivere del codice che scannerizzi il grafico eurusd 1hr fino a trovare l'ultima barra delle 06:00, ne registri l'apertura, torni indietro di altre 24 barre per registrare l'apertura di quella barra (inizio del giorno 06:00) e ottenga l'intervallo apertura-apertura da queste due barre selezionate.

Sorpresa, sorpresa, non funziona. Lol ------> http://myfacewhen.com/307/

Dimmi il che cosa ho f*'d up. O ho solo preso la cosa nel modo sbagliato? Ho provato hehe

 

Individuato un problema . . . 24 ore prima di b è b+24 . . le barre contano dalla barra corrente ( 0 ) a sinistra

dibsopen     = iOpen("EURUSD", 60, b-24);  // Get the value of the bar 24 bars before the Dibs bar (Open of 6gmt day)

change to:

dibsopen     = iOpen("EURUSD", 60, b+24);  // Get the value of the bar 24 bars before the Dibs bar (Open of 6gmt day)

Ben fatto per l'aggiunta dei commenti, molto buona pratica per ottenere in . . . :-)

 
RaptorUK:

Individuato un problema . . . 24 ore prima di b è b+24 . . le barre contano dalla barra corrente ( 0 ) a sinistra

Ben fatto per l'aggiunta dei commenti, molto buona pratica per ottenere in . . . :-)


Wow, ben individuato, mi ci sarebbe voluto un po' per capirlo lol. Non posso credere di aver capito tutto - quello stupido errore. Sento che sto arrivando da qualche parte ora. Sì, ho aggiunto i commenti per aiutarmi a tenere traccia di ciò che sto facendo e per rendere super facile per voi ragazzi vedere cosa sto cercando di fare. Ora ho intenzione di ottenere per confrontare le 4 coppie e sputare fuori quello con il più alto valore Ill farvi sapere come vado con esso. Grazie RaptorUK
 
Ottimo materiale, ben fatto. Sei il benvenuto :-)
 
extern int     iOpenHour                = 6;

int start()
  {
                                                            //  Array Categorys ( 1  EURUSD, 2 GBPUSD, 3 USDCHF, 4 USDJPY )
int b[4], scannedhour[4];
datetime bartime[4];
double dibsclose[4], dibsopen[4], prevdayrange[4];

//----------------------------------------------------------------------------------------------
//        EURUSD PREV DAY RANGE CALC

for(b[1]=0; b[1]<=24; b[1]++)                               // scans the last 24 bars on eurusd
   {
      bartime[1] = iTime("EURUSD", 60, b[1]);               // checks the open time of each bar
      scannedhour[1] = TimeHour(bartime[1]);                // extracts the hour of that bar
    
      if ( scannedhour[1] == iOpenHour )                    // Check to see if scanned hour = Dibs hour
         {
            dibsclose[1]    = iOpen("EURUSD", 60, b[1]);    // Get the open value of that bar (Close of 6gmt day) 
            dibsopen[1]     = iOpen("EURUSD", 60, b[1]+24); // Get the value of the bar 24 bars before the Dibs bar (Open of 6gmt day)
            prevdayrange[1] = (dibsclose[1]-dibsopen[1]);   // Calculate the range of the Dibs day
         }                                                  // End of if statement
    }                                                       // End of for statement
    

//----------------------------------------------------------------------------------------------
//        GBPUSD PREV DAY RANGE CALC

for(b[2]=0; b[2]<=24; b[2]++)                               // scans the last 24 bars on eurusd
   {
      bartime[2] = iTime("GBPUSD", 60, b[2]);               // checks the open time of each bar
      scannedhour[2] = TimeHour(bartime[2]);                // extracts the hour of that bar
    
      if ( scannedhour[2] == iOpenHour )                    // Check to see if scanned hour = Dibs hour
         {
            dibsclose[2]    = iOpen("GBPUSD", 60, b[2]);    // Get the open value of that bar (Close of 6gmt day) 
            dibsopen[2]     = iOpen("GBPUSD", 60, b[2]+24); // Get the value of the bar 24 bars before the Dibs bar (Open of 6gmt day)
            prevdayrange[2] = (dibsclose[2]-dibsopen[2]);   // Calculate the range of the Dibs day
         }                                                  // End of if statement
    }                                                       // End of for statement



//----------------------------------------------------------------------------------------------
//        USDCHF PREV DAY RANGE CALC

for(b[3]=0; b[3]<=24; b[3]++)                               // scans the last 24 bars on eurusd
   {
      bartime[3] = iTime("EURUSD", 60, b[3]);               // checks the open time of each bar
      scannedhour[3] = TimeHour(bartime[3]);                // extracts the hour of that bar
    
      if ( scannedhour[3] == iOpenHour )                    // Check to see if scanned hour = Dibs hour
         {
            dibsclose[3]    = iOpen("USDCHF", 60, b[3]);    // Get the open value of that bar (Close of 6gmt day) 
            dibsopen[3]     = iOpen("USDCHF", 60, b[3]+24); // Get the value of the bar 24 bars before the Dibs bar (Open of 6gmt day)
            prevdayrange[3] = (dibsclose[3]-dibsopen[3]);   // Calculate the range of the Dibs day
         }                                                  // End of if statement
    }                                                       // End of for statement


//----------------------------------------------------------------------------------------------
//        USDJPY PREV DAY RANGE CALC

for(b[4]=0; b[4]<=24; b[4]++)                               // scans the last 24 bars on eurusd
   {
      bartime[4] = iTime("USDJPY", 60, b[4]);               // checks the open time of each bar
      scannedhour[4] = TimeHour(bartime[4]);                // extracts the hour of that bar
    
      if ( scannedhour[4] == iOpenHour )                    // Check to see if scanned hour = Dibs hour
         {
            dibsclose[4]    = iOpen("USDJPY", 60, b[4]);    // Get the open value of that bar (Close of 6gmt day) 
            dibsopen[4]     = iOpen("USDJPY", 60, b[4]+24); // Get the value of the bar 24 bars before the Dibs bar (Open of 6gmt day)
            prevdayrange[4] = (dibsclose[4]-dibsopen[4]);   // Calculate the range of the Dibs day
         }                                                  // End of if statement
    }                                                       // End of for statement




//----------------------------------------------------------------------------------------------



Comment("DIBS RANGE EURUSD:...", prevdayrange[1],        //Display Ranges of each pair
        "DIBS RANGE GBPUSD:...", prevdayrange[2],
        "DIBS RANGE USDCHF:...", prevdayrange[3],
        "DIBS RANGE USDJPY:...", prevdayrange[4]);      


   return(0);
  }
Va bene, ho trasformato tutte le variabili in array ed eseguito i controlli per ciascuna di esse. Ora ha smesso di funzionare. Non è possibile avere più cicli for come questo?
 
dazamate:
Va bene, ho trasformato tutte le variabili in array ed eseguito i controlli per ciascuna di esse. Ora ha smesso di funzionare. Non è possibile avere più cicli for come questo?
Sì, è possibile, nessun problema, ma non usate un array nell'indice del ciclo for, potete usare b ogni volta se volete. Viene reimpostato a 0 per ogni ciclo for, quindi riutilizzarlo non è un problema. Per cosa hai effettivamente bisogno di usare un array? Non è solo per i valori dell'intervallo?
 
RaptorUK:
Sì, puoi, nessun problema, ma non usare un array nell'indice del ciclo for, puoi usare b ogni volta se vuoi. Viene resettato a 0 per ogni ciclo for, quindi riutilizzarlo non è un problema. Per cosa hai effettivamente bisogno di usare un array? Non è solo per i valori dell'intervallo?
Ahhh sì, vedo cosa stai dicendo, lo aggiusto e vedo come vado. Risposte veloci amico ti ripagherò alcuni $$$ se questo ea mi rende ricco lol
Motivazione: