[ARCHIVE]Toute question de débutant, afin de ne pas encombrer le forum. Professionnels, ne passez pas à côté. Je ne peux aller nulle part sans toi - 5. - page 271

 
IIya:

Mes amis ! J'ai besoin d'aide pour peaufiner une EA.

Il y a un code qui ouvre une commande sous certaines conditions . L'exécution de la condition peut avoir lieu à chaque tick car elle est placée dans le corps de int start().

Nous avons besoin :

1. Après l'exécution de la condition (et l'ouverture d'un ordre), pause pour l'ouverture de nouveaux ordres, pause pour n barres. Par exemple, si l'EA est sur l'échelle de temps M30 et que je dois faire une pause de 3 heures, la pause doit être de 6 barres.

2. Ce programme devrait fonctionner dans le testeur de stratégie.

Quel code est nécessaire ? Et quel serait le bon endroit pour le mettre.

La fonction iBarShift() vous aidera. Tout d'abord, vous devez trouver l'heure de la dernière ouverture de commande et la transmettre à cette fonction, puis contrôler la valeur renvoyée par cette fonction en la comparant à un certain nombre (dans votre cas 6).
 
TarasBY:
La fonction iBarShift() vous aidera. Tout d'abord, vous devez trouver l'heure de la dernière ouverture de commande et la transmettre à cette fonction, puis contrôler la valeur renvoyée par cette fonction en la comparant à un certain nombre (dans votre cas, 6).

Nous allons régler cela ensemble.)

Nous passons l'heure de la dernière ouverture de commande à cette fonction et obtenons le nombre retourné. C'est approximativement :

OrderSelect(OrdersTotal()-1,SELECT_BY_POS,MODE_TRADES);
int my_bar = iBarShift(NULL,PERIOD_M30,OrderOpenTime()); 

Ok, on a le numéro du bar. Maintenant, comment faire une pause pour ouvrir des ordres pour 6 barres ?

 
IIya:

Nous allons régler cela ensemble.)

Nous passons l'heure de la dernière ouverture de commande à la fonction, et obtenons le nombre retourné est approximatif :

Ok, on a le numéro du bar. Maintenant, comment faire une pause pour ouvrir des ordres pour 6 barres ?

C'est une approche analphabète :

OrderSelect(OrdersTotal()-1,SELECT_BY_POS,MODE_TRADES);

Mais comme ce n'est pas directement lié à cette affaire, nous ne nous y intéressons pas. Le schéma se présente comme suit :

    if (my_bar >= 6)
    {
        OrderSend();
    }
 
TarasBY:
Il n'y a pas d'erreurs évidentes dans la logique. Imprimez le code étape par étape. La procédure d'échange est liée à la valeur de la variable ticket. Tout d'abord, retracez ses changements. Faites également attention à la valeur de la variable globale "TRADECONTEXT" - sa valeur doit être 0.

Merci ! Je ne comprends rien(((, je suis comme un chaton aveugle dans ces codes(((....
 
al7bar:

Merci ! Mais je n'y comprends rien(((, je suis comme un chaton aveugle dans ces codes(((....
Il s'avère que vous n'êtes pas l'auteur de ce code. Il est alors plus facile de contacter l'auteur.
 
TarasBY:

Chaque fonction de bibliothèque individuelle fait partie de l'ensemble, et chaque bibliothèque individuelle fait partie de l'ensemble de mes bibliothèques - sans cette prise de conscience, il est impossible de comprendre le code.

J'essaie de le comprendre, et je me heurte à toutes sortes de nuances. C'est pourquoi je vous le demande, car vous êtes le mieux placé pour le savoir. Vous êtes l'auteur...

TarasBY:

Et c'est là que vous avez tort. Avez-vous déjà réfléchi à la structure d'un conseiller expert "moyen" ? Ce qui fait l'individualité d'un EA, ce sont ses conditions stratégiques (c'est-à-dire les conditions d'entrée et de sortie), et tout le reste est du code standard. La façon dont je crée les Expert Advisors, y compris ceux basés sur les ordres : je prends un modèle (par exemple, SAR, si un EA réseau est nécessaire) et j'y connecte une bibliothèque supplémentaire dans laquelle les conditions d'une nouvelle stratégie sont écrites (je la recrée).

Je comprends cela. Je ne veux pas copier toute la bibliothèque. Vous comprenez qu'il est plus commode de créer une fondation, avec laquelle il sera commode de travailler personnellement.

TarasBY:

Pour comprendre la mise en œuvre, vous devez comprendre les données initiales. Les bibliothèques ont été créées avec la possibilité de travailler avec n'importe quel outil (Forex) et en mode mono et multidevise, d'où l'introduction de la variable globale bs_Symbol, qui contient la valeur du symbole actuel.

Et où cette variable est définie explicitement, s'il ne s'agit pas d'un secret ? :) Je vois dans la bibliothèqueb-PSI@Base.mqh qu'il est seulement déclaré :

 bs_Symbol,                            // текущий инструмент

Mais il n'y a rien de plus dans les faits. De toute façon, la valeur de l'outil courant est retournée par défaut par Symbol(). Alors pourquoi avons-nous besoin d'une variable ici ?

 
TarasBY:

C'est une approche analphabète :

Mais, comme ce n'est pas directement pertinent pour cette affaire, nous ne nous y attardons pas. Et le modèle ressemble à ça :

Maintenant notre code fonctionne. Dans ma version, cela fonctionne comme suit :
int start()
  {
   if (OrdersTotal()<1)                                                //условие
      {
         OrderSend(Symbol(),OP_BUY,1,Ask,0,0,0,"Order BUY",0,0);     //открытие ордера
      }
   OrderSelect(OrdersTotal()-1,SELECT_BY_POS,MODE_TRADES);
   int my_bar = iBarShift(NULL,PERIOD_M30,OrderOpenTime()); 
   if (my_bar > 6)                                                     //если прошло 6 баров с момента открытия последнего ордера
      {
         OrderSend(Symbol(),OP_BUY,1,Ask,0,0,0,"Order BUY",0,0);      //открываем новый ордер
      }
   return(0);
  }

:) Mais s'il est introduit dans le conseiller expert comme c'est le cas actuellement, tout commence à fonctionner de manière incorrecte.

D'après ce que j'ai compris, elle est due à cette entrée :

OrderSelect(OrdersTotal()-1,SELECT_BY_POS,MODE_TRADES);

Qu'est-ce qu'il y a ?

 
Bonjour à tous. s'il vous plaît répondre à tous ceux qui peuvent créer un script qui augmente les lots à l'ouverture de la transaction. détails écrire dans un personnel. garantie de rémunération dans la satisfaction de la tâche
 
IIya:
Notre code fonctionne maintenant. Dans ma version, cela fonctionne comme suit :

:) Sauf que si elle est mise en œuvre dans l'EA comme elle l'est actuellement, tout commence à fonctionner de manière incorrecte.

Je comprends grâce à cette entrée :

Qu'est-ce qu'il y a ?

Je n'ai fait qu'esquisser un schéma, tandis que votre tâche consistait à réfléchir à la suite de la logique :

int start()
{
   if (OrdersTotal()<1)                                                //условие
      {
         OrderSend(Symbol(),OP_BUY,1,Ask,0,0,0,"Order BUY",0,0);     //открытие ордера
      }
   else
   {
       OrderSelect (OrdersTotal()-1,SELECT_BY_POS,MODE_TRADES);
       int my_bar = iBarShift (NULL,PERIOD_M30,OrderOpenTime()); 
       if (my_bar >= 6)                                                     //если прошло 6 баров с момента открытия ордера
       {OrderSend (Symbol(),OP_BUY,1,Ask,0,0,0,"Order BUY",0,0);}      //открываем новый ордер
   }
   return(0);
}
 
hoz:

Et où cette variable est-elle fixée explicitement, si ce n'est pas un secret ? :) Je vois dans la bibliothèqueb-PSI@Base.mqh qu'il est seulement déclaré :

Mais il n'y a essentiellement rien de plus. En fait, la valeur de l'instrument actuel est renvoyée par défaut par Symbol(). Alors pourquoi avons-nous besoin d'une variable ici ?

J'ai déjà répondu à cette question dans la section sur la multidevise - current symbol = Symbol() - ce n'est qu'un cas particulier.

P.S. Votre approche est intéressante : vous prenez le code de quelqu'un d'autre et vous essayez de l'adapter à votre logique - vous avez tous les droits, mais ne me demandez pas : "Pourquoi votre logique est différente de la mienne !