Toute question des nouveaux arrivants sur MQL4 et MQL5, aide et discussion sur les algorithmes et les codes. - page 1076

 
danil77783:

Bonjour. Pourriez-vous m'aider, si vous avez le temps La question est la suivante, j'ai besoin que l'EA ouvre un ordre sur chaque signal de deux indicateurs, (ils donnent un signal quand ils sont dans une certaine combinaison) en un mot, il devrait y avoir plusieurs ordres d'achat ou de vente sur le marché, respectivement, selon les signaux des indicateurs. Mais je n'ai qu'un seul ordre sur le marché et tant qu'il ne se ferme pas, le suivant ne s'ouvre pas...... S'agit-il d'une question de comptage des ordres ? S'il vous plaît, donnez-moi un indice. Si vous en avez besoin, je peux vous envoyer le code.

Merci d'avance !

supprimer la condition "if (OrdersTotal()==0)....". - Ils disent simplement : rechercher les entrées et ouvrir de nouveaux ordres uniquement lorsqu'il n'y a pas d'ordre du tout.

Si vous ne voulez pas ouvrir un gros paquet de nouvelles commandes sans cette condition, vous devez créer une condition supplémentaire. Et cela dépend de votre stratégie : ne pas en ouvrir un nouveau dans le temps T du précédent, ou contrôler les barres ou garder des distances en pips entre les ordres....

 

Bonjour. Je commencerai par vous remercier d'avoir aidé les débutants. Je ne serais pas capable de répondre moi-même à des questions élémentaires, jour après jour, à un débutant puis à un autre.

Et la question est la suivante :

Je pensais auparavant, lorsque mql4 était un peu différent, que tout traitement d'ordre, comme l'ouverture/la fermeture/la modification après une éventuelle erreur devait être interrompu par la fonction return(0). A cause de cela, si je devais fermer plusieurs ordres ouverts au prix actuel, le testeur les fermerait un par un sur chaque nouvelle barre et cela fausserait probablement l'image réelle (de manière assez spectaculaire, parfois) dans le testeur (pour chaque tick d'une trame). Le nouvel EA doit fermer plusieurs ordres exactement par le signal et partiellement.

Question : Est-il possible de les traiter tous (les fermer partiellement) dans une boucle, sans interrompre la boucle à chaque fois ? Le testeur sera-t-il capable de le gérer ? En d'autres termes, sera-t-il capable de les fermer partiellement sur une seule barre ?

 
XpeHHukoB:

Bonjour. Je commencerai par vous remercier d'avoir aidé les débutants. Je ne serais pas capable de répondre moi-même à des questions élémentaires, jour après jour, à un débutant puis à un autre.

Et la question est la suivante :

Je pensais auparavant, lorsque mql4 était un peu différent, que tout traitement d'ordre, comme l'ouverture/la fermeture/la modification après une éventuelle erreur devait être interrompu par la fonction return(0). A cause de cela, si je devais fermer plusieurs ordres ouverts au prix actuel, le testeur les fermerait un par un sur chaque nouvelle barre et cela fausserait probablement l'image réelle (assez dramatiquement, parfois) dans le testeur (pour chaque tick d'une trame). Le nouvel EA doit fermer plusieurs ordres exactement par le signal et partiellement.

Question : Est-il possible de les traiter tous (les fermer partiellement) dans une boucle, sans interrompre la boucle à chaque fois ? Le testeur sera-t-il capable de le gérer ? En d'autres termes, sera-t-il capable de les fermer partiellement sur une seule barre ?

Il peut le faire sans problème à une petite condition. Le code doit être écrit correctement.

 
Seric29:
S'il y a 2 fonctions (éventuellement surchargées), par exemple, int Funkz(int a) int Funkz(int a, int b, int w), et qu'ensuite le programme est compilé, quelle fonction fonctionnera plus rapidement, la première considérant qu'elle a un argument ou cela n'a pas d'importance, car le programme est déjà construit et ce qui est décrit dans le corps, ou tout de même il y a un petit effet, car les arguments de la fonction représentent une pile pour laquelle la mémoire est réservée ?

Si vous avez deux fonctions du même nom avec un nombre d'arguments différent, la question n'est pas de savoir laquelle sera appelée plus rapidement. Lorsque vous appelez une fonction, vous n'écrivez pas Funkz(), vous spécifiez le nombre d'arguments.

La question est de savoir si le compilateur va mâcher les fonctions portant le même nom.

Si je comprends bien, nous ne parlons pas du code, mais du fichier compilé ?

 
Hum... Merci pour votre réponse, Alexei. Beaucoup de choses ont été éclaircies.
 
Aide s'il vous plaît, nous avons SL égale à une valeur en pips (ce niveau de perte - paramètre réglable par l'utilisateur), et nous avons un prix de symbole pour le bas ou le haut du jour - c'est comme un deuxième stop loss et à différents moments dans le temps, ils seront différents, j'ai besoin de la fonction de comparaison automatique - de sorte qu'après que le robot définit un stop loss pour le plus petit paramètre (SL ou Ilow - pour l'achat ou SL -iHign pour la vente) ci-dessous est le code qui ne donne pas le résultat souhaité, je ne peux pas comprendre ce que c'est...
   пользовательский параметр - extern int    SL               = 1000;
//---------------------------------------------------------------
bool CheckForStopLossSell()
  {
   double Hign=iHigh(Symbol(),PERIOD_D1,1);
   double StopLoss=NormalizeDouble(SL*Point,Digits);
   double uroven = StopLoss;
   double OOPS=iLow(Symbol(),PERIOD_D1,1)-StepOpenOrder*Point;
   double StopLossS=NormalizeDouble(OOPS+StopLoss,Digits);
   //----------------------------------------
   if(Hign>StopLoss) Alert("StopLoss");
   return bool(StopLossS);
   
   //else
   if(Hign<StopLoss) Alert("Hign");
   return bool(Hign); 
   
   //else
   Alert("uroven");
   return bool(uroven); 
   
  }
//--------------------------------------------------------------
bool CheckForStopLossBuy()
  {
   double LOW=iLow(Symbol(),PERIOD_D1,1);
   double StopLoss=SL*Point;
   double uroven = StopLoss;
   double SPREAD = MarketInfo(Symbol(),MODE_SPREAD)*Point;
   double OOPB = (iHigh(Symbol(),PERIOD_D1,1)+SPREAD)+StepOpenOrder*Point;
   double StopLossB=OOPB-StopLoss;
   //-------------------------------------------
   if(LOW<StopLoss) Alert("StopLoss"); 
   return bool(StopLossB);  
   
   //else
   if(LOW>StopLoss) Alert("LOW"); 
   return bool(LOW);  
   
   //else
   Alert("uroven");
   return bool(uroven);  
   
  }
//---------------------------------------------------------------
 
XpeHHukoB:

Si vous avez deux fonctions du même nom avec un nombre d'arguments différent, la question n'est pas de savoir laquelle sera appelée plus rapidement. Lorsque vous appelez une fonction, vous n'écrivez pas Funkz(), vous spécifiez le nombre d'arguments.

La question est de savoir si le compilateur va mâcher les fonctions portant le même nom.

Vous voulez dire le fichier compilé, pas le code ?

Et si les fonctions sont différentes, laquelle fonctionnera plus rapidement avec moins ou plus d'arguments ? Je pense que le fait de surcharger avec différents numéros entraîne également une charge ou est-ce juste par commodité ?

 

Veuillez me dire comment écrire #define ?

Je l'écris comme ceci

#define  my_POS    cst_Position.my_Position

Si je change cette construction en def - tout fonctionne.

my_POS.SelectByTicket(pos_DATA(DATA_TICKET))

Mais quand j'écris simplement my_POS. la liste des fonctions ne s'affiche pas après un point.

Idem pour

#define  pos_DATA  cst_Position.getPositionData

il n'y a pas d'indices après le pos_DATA(.

Qu'est-ce que je fais de mal ?

 
bool operation=0;for(int pos=0;pos<OrdersTotal();pos++)
     {if ( OrderSelect (pos, SELECT_BY_POS) == false )  continue;
      if ( OrderSymbol()==Symbol()) break;}


//=========================================================================================================
if(Hour()>=2&&Hour()<=18&&operation==0){
if(OPB1==1)
   {operation=1;if(operation==0 &&OrderSymbol()!=Symbol()||OrdersTotal()==0)
        {OrderSend(Symbol(),OP_BUY,lots,Ask,0,Bid-ss*Point,Ask+T*Point,"My order#",mn,0,Green);}}
        if (OrderType()==OP_BUY &&OrdersTotal()==1&&OrderMagicNumber()==8)
        {OrderSend(Symbol(),OP_SELLSTOP,5*lots,OrderOpenPrice()-(ss-ss/4)*Point,0,0,SstopClose,"My order#",80,0,Red);}
       

if(OPS1==1)
   {operation=1;if(operation==0 &&OrderSymbol()!=Symbol()||OrdersTotal()==0)        
         {OrderSend(Symbol(),OP_SELL,lots,Bid,0,Ask+ss*Point,Bid-T*Point,"My order#",mn,0,Red);}}
         if (OrderType()==OP_SELL &&OrdersTotal()==1&&OrderMagicNumber()==8)
         {OrderSend(Symbol(),OP_BUYSTOP,5*lots,OrderOpenPrice()+(ss-ss/4)*Point,0,0,BstopClose,"My order#",80,0,Green);}}



if(OrderMagicNumber()==80){operation=0;
 {for( int  ii=OrdersTotal()-1;ii>=0;ii--)
       {OrderSelect(ii, SELECT_BY_POS);
        int  type   = OrderType();bool result = false;
        switch(type)
         {case OP_BUYSTOP   : result = OrderClose( OrderTicket(), OrderLots(), MarketInfo(OrderSymbol(), MODE_BID), 5, Red );//break;
          case OP_SELLSTOP  : result = OrderClose( OrderTicket(), OrderLots(), MarketInfo(OrderSymbol(), MODE_ASK), 5, Red ); //break;
         
          result = OrderDelete( OrderTicket() );//break;
          }}}}

Bonjour, chers experts !

Veuillez m'aider à résoudre ce problème.

Lorsque je teste une paire, tout fonctionne correctement, mais lorsque je travaille avec d'autres devises, les ordres en attente ne sont pas placés (je dois exposer l'ordre en attente) et ne sont pas fermés après le déclenchement du take profit.

Veuillez indiquer comment modifier le code, si possible :



Merci beaucoup à l'avance

Документация по MQL5: Константы, перечисления и структуры / Торговые константы / Свойства ордеров
Документация по MQL5: Константы, перечисления и структуры / Торговые константы / Свойства ордеров
  • www.mql5.com
Приказы на проведение торговых операций оформляются ордерами. Каждый ордер имеет множество свойств для чтения, информацию по ним можно получать с помощью функций Идентификатор позиции, который ставится на ордере при его исполнении. Каждый исполненный ордер порождает сделку, которая открывает новую или изменяет уже существующую позицию...
Dossiers :
c5k8icfo.png  55 kb
 
Motzaart:

Bonjour, chers experts !

Veuillez m'aider à résoudre ce problème.

...

Veuillez insérer le code correctement :


Raison: