Problèmes de vérification des échanges ouverts

 

Bonjour, j'ai ajouté ceci à mon code pour vérifier s'il y a déjà une transaction ouverte. Le problème est que le code exécute une transaction et c'est tout. Quelqu'un peut-il voir un problème avec ce code ? Je ne suis pas un super expert en programmation


// Vérifier les transactions ouvertes

for(int cnt=OrdersTotal()-1;cnt>=0;cnt--)
{
if(OrderSelect(cnt,SELECT_BY_POS))
{

if(OrderSymbol()==Symbol())
{
tradeopen=true ;
}
else
{
tradeopen=false ;
}

}

}

 
Votre code récupère les transactions en attente et les transactions ouvertes, mais à part cela, il me semble correct.
 

Merci Raptor pour votre réponse rapide.


Si cela ne vous dérange pas, je vais joindre le code entier, peut-être qu'il y a quelque chose que j'ai manqué ailleurs. Je me suis heurté à un mur pour le moment.

Dossiers :
daz.mq4  3 kb
 
dazamate:
Quelqu'un peut-il voir un problème avec ce code ?

  1. Pas de nombre magique signifie qu'il est incompatible avec tous les autres EA et le trading manuel et lui-même sur la même paire/différentes échéances.
  2. Si le premier ordre ouvert n'est pas celui de l'EA, alors le drapeau est faux, même s'il a des transactions ouvertes.
    int TotalOrderCount(){
        int count=0;
        for(pos = OrdersTotal()-1; pos >= 0 ; pos--) if (
            OrderSelect(pos, SELECT_BY_POS)                 // Only my orders w/
        &&  OrderMagicNumber()  == magic.number             // my magic number
        &&  OrderSymbol()       == Symbol() ){              // and my pair.
            count++;
        }
        return(count);
    }

 
dazamate:

Merci Raptor pour votre réponse rapide.


Si cela ne vous dérange pas, je vais joindre le code entier, peut-être qu'il y a quelque chose que j'ai manqué ailleurs. Je me suis heurté à un mur pour le moment.

Quelques commentaires...

Vous déclarez i. .

int i;

. . . mais tu ne le mets nulle part, qu'est-ce que i?

Vous mettez . . .

static bool tradeopen = false;

... puis vous le vérifiez pour voir si vous pouvez placer une transaction... il sera toujours faux à ce stade... puis vous avez du code plus tard qui peut le mettre à vrai

if(OrderSymbol()==Symbol())
    {
    tradeopen=true;
    }  

barcount est fixé à 0

static int barcount = 0;

donc ce sera toujours vrai si vous avez au moins une barre sur votre graphique...

if(Bars != barcount)

Vous devez parcourir votre code ligne par ligne... Tout ce que vous ne comprenez pas, recherchez-le et lisez-le... C'est la seule façon d'apprendre.

 

Raptor, merci de l'avoir fait. Comme je l'ai dit, je ne suis pas un super expert. J'ai lu la façon dont les autres codent les choses et j'ai essayé de l'implémenter dans le mien. J'ai fait beaucoup de lecture sur les fonctions. C'est juste frustrant quand ça ne marche pas et qu'on ne sait pas comment diagnostiquer son propre désastre.

En réponse à vos commentaires

int i;

C'est parti, je l'utilisais pour autre chose et je l'ai accidentellement laissé là.


Je vais expliquer ce qui se passe dans ma tête en ce qui concerne le compteur de bar. Je ne sais toujours pas pourquoi cette partie du code n'est pas bonne.

static int barcount = 0;  // <- First time program is run bar counter is set to 0

     if(Bars != barcount) // <-  This will be true so the if statement is allowed to run
    
       {      
         if(iBarHour == iOpenHour)
                {
                //If statement
    
                }
         barcount=Bars ; // <- At the end of the if statement, the bar counter is set to Bars so that this if statement will not be true
                         //    again until another bar opens
       }

Pour ce qui est de la vérification pour voir s'il y a des transactions ouvertes sur la paire...

static bool tradeopen = false;                // First time program is run tradeopen is set to false. I use the static in front 
// because if I don't the programming will keep setting this to false because an ea or   // a program is just a giant loop is it not. However I should set this to true because // the ea should assume there is a trade open until it does it checks that would // probably be the more smarter approach.       for(int cnt=OrdersTotal()-1;cnt>=0;cnt--)         {           if(OrderSelect(cnt,SELECT_BY_POS)) // <- So it scans each open and pending trade             {                           if(OrderSymbol()==Symbol()) // <- Checks to see if any of them trades are the same as the pair the ea is using                {                 tradeopen=true; // If so then set tradeopen to true                }                        else                {                 tradeopen=false; // If not set trade open to false                }                          }                         }

Donc à la fin de l'ea, il fait cette vérification pour voir s'il y a un trade ouvert sur la paire actuelle ou non. Il met tradeopen à true ou false. Est-ce un problème que ce bout de code soit utilisé à la fin de l'EA ?

Il y a aussi un autre problème que je ne parviens pas à résoudre...

int iBarHour;
iBarHour = TimeHour(TimeCurrent());
Print(iBarHour);
Pourquoi iBarHour renvoie-t-il toujours 1 ? Je veux qu'il renvoie l'heure actuelle :(


WHRoeder


Est-il important que l'EA utilise un nombre magique ou non ? Ne peut-il pas simplement vérifier toutes les transactions ouvertes et en attente et si l'une d'entre elles correspond à la paire actuelle ?


Une fois de plus les gars, je sais que je suis un débutant, mais toutes vos contributions sont appréciées. Je sais que je vais probablement me faire attaquer à nouveau à propos de mon codage douteux :P


Merci

 
dazamate:

Je vais expliquer ce qui se passe dans ma tête en ce qui concerne le compteur de barres. Je ne sais toujours pas pourquoi cette partie du code n'est pas bonne.

Désolé, je montre probablement mon ignorance de l'utilisation des variables statiques . . . J'utilise plutôt des variables globales et tout ce que je veux définir à l'initialisation du code, je le mets dans la fonction init. https://docs.mql4.com/basis/functions/special

Si vous exécutez cette partie du code pendant le week-end, elle ne changera pas, car elle utilise l'heure du serveur, qui est mise à jour à chaque tic-tac.

int iBarHour;
iBarHour = TimeHour(TimeCurrent());
Print(iBarHour);

En supposant que ce code fonctionne, dDayOpenPrice ne sera défini que lorsque iBarHour = 6, lorsque iBarHour = 7 dDayOpenPrice ne sera plus défini à la valeur correcte. Si vous faites de dDayOpenPrice un global, sa valeur sera sauvegardée pendant l'exécution du code (le rendre statique fonctionnera probablement aussi). Si le code est redémarré, rien ne se passera avant le jour suivant... pas avant la barre de 6 heures du matin.

WHRoeder

Est-il important que l'EA utilise un nombre magique ou non ? Ne peut-il pas simplement vérifier toutes les transactions ouvertes et en attente et si l'une d'entre elles correspond à la paire actuelle ?

Si vous n'avez qu'un seul EA sur un seul graphique, sans trading manuel, alors vous pouvez probablement vous en sortir sans utiliser de numéro magique, mais c'est une bonne pratique de l'utiliser, faites d'abord fonctionner votre code puis implémentez un numéro magique, cela vous aidera à apprendre.

 

RaptorUK merci encore une fois.


J'ai backtesté l'ea pour voir si le code fonctionne et j'ai imprimé() les variables pour voir ce qui se passe dans celles-ci afin d'aider à déboguer le code. Le code ibarhour semble fonctionner correctement, il ne s'affichait pas correctement dans le backtest parce que je l'ai configuré pour imprimer constamment la valeur de ibarhour et qu'il ne peut pas l'afficher assez vite comme le code le crache, donc le backtester est bloqué. Y a-t-il un moyen de retarder l'impression du code ?



Aussi, oui, je veux qu'il stocke la valeur de l'ouverture de la barre 06:00 :)


J'ai réorganisé le code, et je suis fier de moi, j'ai réussi à le rendre capable de vérifier si l'ea a ouvert des transactions sur la paire actuelle. J'ai utilisé l'exempledeWHRoeder et l'ai transformé en une fonction séparée :) et j'ai obtenu que la fonction renvoie true ou false. Super.



Puisque vous êtes manifestement une élite dans le domaine du codage d'EA. Combien d'histoires de réussite avez-vous entendu de la part de personnes qui ont créé leur propre EA ? Je n'ai entendu ou vu que de mauvaises histoires.











 
dazamate:

Puisque vous êtes manifestement une élite dans le domaine du codage d'EA. Combien d'histoires de réussite avez-vous entendu de la part de personnes créant leurs propres EA ? Je n'ai entendu ou vu que de mauvaises histoires.











LOL . ... votre commentaire devrait être adressé à WHRoeder et non à moi, il est un codeur beaucoup, beaucoup plus compétent que moi, jetez un coup d'œil à certains de ses messages récents sur le code qu'il a partagé, vous pouvez apprendre beaucoup en comprenant son code, je sais que j' ai appris, merci WHRoeder :-).

Je traîne ici parce que j'aime essayer d'aider les gens à s'aider eux-mêmes... et j'apprends des choses par la même occasion.

Pour avoir un EA efficace, il faut d'abord une méthode efficace... combien y en a-t-il ? Beaucoup de choses fonctionnent pendant une courte période, quelques-unes fonctionnent pendant un mois ou deux, mais très peu fonctionnent de manière constante. Même si quelqu'un dispose d'une bonne méthode (je ne sais pas comment il pourrait le savoir sans effectuer les tests appropriés), il n'a généralement pas les connaissances ou la capacité de la transformer en un EA viable. Ceux qui ont un EA viable sont peu enclins à en faire la publicité, car ils l'utilisent et gagnent de l'argent...

Heureux d'entendre que vous faites des progrès... En ce qui concerne votre problème d'impression, vous pourriez utiliser Comment(iBarHour) ; au lieu de cela, il est affiché à l'écran dans le coin supérieur gauche.

 
  1. Vous êtes le bienvenu. "Pour apprendre quelque chose, pratiquez. Pour le maîtriser, enseignez."
  2. Bars n'est pas fiable (une fois que vous avez atteint le nombre maximum de barres sur le graphique, il ne change pas et le code se casse.) Volume[0]==1 n'est pas fiable, si vous manquez un tick le code se casse. Utilisez toujours le temps.
    int start(){
       static datetime Time0;
       if (Time0 == Time[0]) return; Time0 = Time[0];
       // A new bar has started.

  3. montrant probablement mon ignorance de l'utilisation des variables statiques . . . J'utilise plutôt des variables globales et tout ce que je veux définir à l'initialisation du codeSi
    la variable doit être initialisée, alors elle doit être globale. Si la variable est partagée entre deux ou plusieurs fonctions, elle doit être globale. Sinon, définissez-la localement à la fonction, statiquement si nécessaire.
  4. Est-il important que l'EA utilise un nombre magique ou non ?
    Vous aurez probablement tout fait fonctionner, puis vous ouvrirez un autre graphique pour le tester et soudain tout échouera. Faites-le bien dès le début. Dans mon code, je vérifie à la fois le nombre magique et la paire, juste au cas où je le mettrais sur un autre graphique, mais je ne change pas le nombre magique.
 

Vous avez raison Raptor... Désolé WHRoeder, c'était impoli de ne pas vous remercier. C'est le début d'un énorme projet pour moi, alors j'espère vraiment que vous ne m'en voudrez pas de vous embêter.


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 ça ne marche pas mais je ne comprends pas comment ça marche structuré comme ça.


Deux autres questions.

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 == le nombre de 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 ?

Question suivante.

Cette fois-ci, je n'ai aucune idée de la façon de procéder.

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, enregistre l'ouverture, remonte encore 24 barres jusqu'à la bougie précédente de 06:00 gmt, enregistre cette ouverture et enregistre la plage 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 ?


Merci encore pour vos connaissances et vos patients

Raison: