Problèmes de vérification des échanges ouverts - page 2

 
dazamate:


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

WHRoeder, Ce code a l'air si simple mais je n'arrive pas à comprendre comment il fonctionne, l'instruction if ne sera-t-elle pas toujours vraie si elle rend time0 égal à time[0] chaque fois que time0 est égal à time[0] ? Je ne dis pas que cela ne fonctionne pas mais je ne comprends pas comment cela fonctionne structuré comme ça.

1er tick : Time0 n'est pas égal à Time[0 ] donc le retour n'est pas exécuté,Time0 est mis à Time[0 ] (heure de début de la barre actuelle) le reste de la fonction de démarrage est exécuté.

2ème ticks et suivants : si Time0 est toujours égal au temps de début de la barre actuelle, nous sommes toujours sur la même barre, return est exécuté et la fonction de démarrage est quittée. Si Time0 n'est pas égal au temps de début de la barre courante, alors nous sommes sur une nouvelle barre, return n'est pas exécuté, Time0 est mis à Time[0] (temps de début de la nouvelle barre courante) et le reste de la fonction de démarrage est exécuté.

 
dazamate:

Comment faire pour créer un compteur où si un ordre en attente est placé et qu'il n'est pas déclenché dans un nombre x de barres, il doit être annulé ? Tout ce que je peux faire est de mettre un compteur pour compter chaque fois qu'une nouvelle barre se forme et si le nombre de barres comptées == les barres autorisées spécifiées avant que les ordres en attente soient annulés. Le compteur de barres est remis à zéro chaque fois qu'un nouvel ordre en attente est ouvert ? Qu'en pensez-vous ?

Je créerais une fonction qui vérifie les ordres en attente, elle regarde quand chaque ordre a été ouvert, vérifie combien de temps cela fait et si cela dépasse la limite de temps, elle ferme l'ordre.

 
dazamate:

Je veux faire une fonction qui scanne eurusd, usdchf, gbpusd, usdjpy sur 1hr tf. Elle remonte jusqu'à la dernière bougie de 06:00 gmt et enregistre l'ouverture, remonte encore 24 barres jusqu'à la bougie précédente de 06:00 gmt et enregistre la fourchette 6gmt - 6gmt pour chaque paire. Ensuite, il compare la plage 6gmt - 6gmt de toutes les paires et renvoie celle qui est la plus élevée. Est-il possible pour une application de faire cela en étant attachée à un seul graphique temporel ?

Avec tous les problèmes comme celui-ci, avant de penser au code, vous devez d'abord trouver une solution... IMO. Créez un organigramme ou écrivez un pseudo-code . . obtenir une solution qui a du sens d'abord . . puis regarder le code.

Pour répondre à votre dernière question, oui, il est possible de le faire, par exemple, pour obtenir la valeur d'ouverture pour une bougie particulière d'une paire différente de celle de l'EA, j'utiliserais ....

iOpen( string symbol, int timeframe, int shift)

une fois que vous avez vos valeurs pour la rage des 4 paires vous pouvez facilement déterminer la plus grande en utilisant quelque chose comme ceci :

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

... ou vous pouvez mettre les valeurs dans un tableau et utiliser ArraySort ... il y a généralement plus d'une façon de faire quelque chose, d'abord vous devez avoir un plan de la façon dont vous allez résoudre votre problème.

EDIT : gardez à l'esprit que certains de ces éléments ne fonctionneront pas correctement avec le testeur de stratégie.

 
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);
  }

Bon, c'est ma propre tentative d'écrire un code qui va scanner le graphique eurusd 1hr jusqu'à ce qu'il trouve la dernière barre de 06:00, enregistre son ouverture, retourne 24 barres en arrière pour enregistrer l'ouverture de cette barre (début du jour 06:00) et obtient la plage d'ouverture-ouverture de ces 2 barres sélectionnées.

Surprise, surprise, cela ne fonctionne pas. Lol ------> http://myfacewhen.com/307/

Dites-moi ce que j'ai f*'d up. Ou est-ce que je m'y suis pris de la mauvaise façon ? J'ai essayé hehe

 

J'ai repéré un problème... 24 heures avant b est b+24 ... les barres comptent à partir de la barre actuelle ( 0 ) vers la gauche.

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)

Bravo pour l'ajout des commentaires, une très bonne pratique à adopter... :-)

 
RaptorUK:

J'ai repéré un problème... 24 heures avant b est b+24 ... les barres comptent à partir de la barre actuelle ( 0 ) vers la gauche.

Bravo pour l'ajout des commentaires, une très bonne pratique à adopter... :-)


Wow, bien vu, ça m'aurait pris un moment pour comprendre ça, lol. Je n'arrive pas à croire que j'ai réussi à faire tout ça - cette erreur stupide. J'ai l'impression d'arriver à quelque chose maintenant. Oui, j'ai ajouté les commentaires pour m'aider à garder une trace de ce que je fais et pour que ce soit super facile pour vous de voir ce que j'essaie de faire. Maintenant, je vais faire en sorte qu'il compare les 4 paires et qu'il sorte celle qui a la plus grande valeur. Merci RaptorUK
 
Bon travail, bien fait. Vous êtes les bienvenus :-)
 
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);
  }
Bon, j'ai transformé toutes les variables en tableaux et j'ai exécuté les vérifications pour chacune d'entre elles. Maintenant, cela ne fonctionne plus. N'est-il pas possible d'avoir plusieurs boucles for comme celle-ci ?
 
dazamate:
Bon, j'ai transformé toutes les variables en tableaux et j'ai effectué les vérifications pour chacune d'entre elles. Maintenant, cela ne fonctionne plus. N'est-il pas possible d'avoir plusieurs boucles for comme celle-ci ?
Oui, vous pouvez, sans problème, mais n'utilisez pas un tableau dans l'index de la boucle for, vous pouvez utiliser b à chaque fois si vous le souhaitez. Il est réinitialisé à 0 pour chacune des boucles for, donc sa réutilisation n'est pas un problème. Pourquoi avez-vous besoin d'utiliser un tableau ? N'est-ce pas seulement pour les valeurs de l'intervalle ?
 
RaptorUK:
Oui, vous pouvez, sans problème, mais n'utilisez pas un tableau dans l'index de la boucle for, vous pouvez utiliser b à chaque fois si vous le souhaitez. Il est remis à 0 pour chacune des boucles for, donc le réutiliser n'est pas un problème. Pourquoi avez-vous besoin d'utiliser un tableau ? N'est-ce pas seulement pour les valeurs de l'intervalle ?
Ahhh oui, je vois ce que tu veux dire, je vais arranger ça et voir comment ça se passe. Les réponses sont rapides, je vous rembourserai quelques $$$ si cette application me rend riche.