Questions des débutants MQL4 MT4 MetaTrader 4 - page 71

 
Vitalie Postolache:

Depuis quand un point est un type double?

C'est ce que je dis, string+int est une erreur.

Mais si vous le faites comme je l'ai écrit ci-dessus, il n'y aura pas d'erreur.

 
Renat Akhtyamov:

C'est ce que je dis : string+int est une erreur.

Mais si vous le faites comme je l'ai écrit ci-dessus, il n'y aura pas d'erreur.


IntegerToString? Non, je n'ai pas entendu ;)
 
Vitalie Postolache:

IntegerToString ? Non, je n'ai pas entendu ;)
L'un ou l'autre fonctionne bien, je ne vois pas de problème.
 

Bonjour à tous

Je suis novice en programmation, mais j'essaie d'apprendre)

J'ai un petit problème pour clôturer l'ordre selon les relevés de l'indicateur.

Je sais tout de suite quelles sont les conditions d'ouverture et de fermeture d'une position grâce aux lectures de l'indicateur et je ferme l'ordre dans la direction opposée sans aucun stop ni profit.

si(r > 50 && p > m) //conditions d'ouverture d'un ordre d'achat

{

ticketB = OrderSend(Symbol(),OP_BUY,0.1,Ask,5,0,0,",111,0,Green) ; //ouvre un ordre d'achat

}

Est-ce que j'écris correctement la condition de clôture de l'ordre ?

if(r < 50 && p < m) --- c'est une condition de vente et une condition de fermeture.

{

OrdreClose(ticketB,0.1,Bid,5,Red) ;

}

et les impressions de l'utilisation possible de la variable non initialisée 'ticketB' et de la valeur de retour de 'OrderClose' doivent être vérifiées.

Pouvez-vous me dire où j'ai mal écrit ?



 
funnyrain8:

Bonjour à tous

Je suis novice en programmation, mais j'essaie d'apprendre)

J'ai un petit problème pour clôturer l'ordre selon les relevés de l'indicateur.

Je sais tout de suite quelles sont les conditions d'ouverture et de fermeture d'une position grâce aux lectures de l'indicateur et je ferme l'ordre dans la direction opposée sans aucun stop ni profit.

si(r > 50 && p > m) //conditions d'ouverture d'un ordre d'achat

{

ticketB = OrderSend(Symbol(),OP_BUY,0.1,Ask,5,0,0,",111,0,Green) ; //ouverture d'un ordre d'achat

}

Est-ce que j'écris correctement la condition de clôture de l'ordre ?

if(r < 50 && p < m) --- c'est une condition de vente et une condition de fermeture.

{

OrdreClose(ticketB,0.1,Bid,5,Red) ;

}

et les impressions de l'utilisation possible de la variable non initialisée 'ticketB' et de la valeur de retour de 'OrderClose' doivent être vérifiées.

Pouvez-vous me dire où j'ai mal écrit ?



La variable ticketB n'est pas initialisée, c'est-à-dire que son type n'est pas connu. Dans ce cas, il s'agit de Int

La deuxième erreur est que nous devons vérifier que le résultat de la clôture de l'ordre ne contient pas d'erreurs. Recherchez "fonction de traitement des erreurs" dans le forum

 
Renat Akhtyamov:

la variable ticketB n'est pas initialisée, c'est-à-dire que son type n'est pas connu. Dans ce cas, il s'agit de Int.

La deuxième erreur concerne la vérification du résultat de la clôture de l'ordre pour détecter les erreurs. Recherchez "fonction de traitement des erreurs" dans le forum

Je n'arrive pas à comprendre la logique ou je suis abasourdi), mais comment faire ? Au début, j'ai essayé de le faire en utilisant OrderSelect mais c'était faux)

J'ai besoin d'informations à ce sujet.

 
funnyrain8:

est-ce GetLastError? je ne comprends pas la logique ou je suis un peu bête) mais comment le définir ? au début j'ai essayé de tout faire avec OrderSelect, mais ce n'est pas pareil)

J'ai besoin d'informations à ce sujet.

Oui.

Regardez la base de code - de nombreux exemples de mise en œuvre.

 
Bonjour, je suis vendeur de signaux, je voudrais savoir comment promouvoir vos signaux pour que les gens s'y abonnent ?
 
Vitalie Postolache:


Où est la logique ? Vous fixez le lot maximal autorisé pour la première commande, puis vous l'augmentez pour chaque commande suivante. Ne pensez-vous pas que c'est, pour le moins, peu judicieux ?

En outre, vous diminuez le lot du premier ordre dans la boucle en utilisant une méthode totalement incompréhensible, tandis que les lots des autres ordres, qui ont été "calculés" auparavant, restent inchangés, et ces valeurs ne dépassent en aucun cas les limites de cette fonction. Alors, que font-ils ?

Sans compter que la boucle d'incrémentation ne peut pas être un nombre réel, elle doit être un compteur, un entier. Mais vous définissez la valeur du lot comme un compteur et vous en soustrayez un à chaque itération. C'est une erreur majeure, une erreur très grave.

Clarifiez d'abord la logique dans votre esprit, puis essayez de la mettre en œuvre dans votre code.

Les valeurs qui ne sont pas retirées afin de déterminer le lot final après multiplication, il devrait être le lot maximum possible à ouvrir, en fait, les ordres avec ces lots pourraient ne pas s'ouvrir parce que l'EA ouvre les ordres dans un petit intervalle, mais il y a une possibilité, donc je veux calculer le lot initial maximum possible. J'ai écouté vos conseils et voilà ce que j'ai obtenu. Que pensez-vous de cette fonction ? Je pense que j'ai manqué quelque chose ou que je l'ai mal prescrit ; le testeur se bloque un peu et obtient un petit lot de sortie.
//Функция расчета торгового лота
double GetLots()
{
 double lots = 0.0;
 double L9 = MarketInfo(Symbol(),MODE_MAXLOT);
 double L8 = L9 / Multipler;
 double L7 = L8 / Multipler;
 double L6 = L7 / Multipler;
 double L5 = L6 / Multipler;
 double L4 = L5 / Multipler;
 double L3 = L4 / Multipler;
 double L2 = L3 / Multipler;
 double cl = L2 / Multipler;
 double balance = AccountFreeMarginCheck(Symbol(),OP_BUY,L9);
 
 if(balance <= AccountFreeMargin())
 {
  for(int risk = 100;balance > 0 && risk > 0;risk--)
  {
   if(!IsStopped())
   {
    if(risk >= 1)
    {
     lots = (cl/100)*risk;
    }
    if(risk < 1)
    {
     for(int risk2 = 100;balance > 0 && risk2 >= 1;risk2--)
     {
      lots = (cl/100)*(risk2*0.01);
     }
    }
   }
  }
 }
 double clots = NormalizeDouble(MathMax(lots,MarketInfo(Symbol(),MODE_MINLOT)),2);
 return(clots);
}
 
Arseniy Barudkin:

Qu'en pensez-vous ?


Je dirai la même chose. Vous n'êtes pas bon en logique. Quel est le problème pour calculer immédiatement le lot initial, sur la base des fonds disponibles et de la valeur du risque (je crois qu'il était écrit environ 3%) ? Pourquoi devez-vous tout faire au même endroit ?

Prenez la valeur de la marge libre, multipliez-la par le risque, divisez-la par 100 et obtenez la valeur de la marge pour 1 lot. Voici la formule la plus simple pour calculer le lot avec un pourcentage déterminé de la marge libre. Vous devez également tenir compte de l'étape de changement de lot et éviter de dépasser la taille de lot min/max autorisée par les sociétés de courtage :

input double risk = 3; //процент свободной маржи для расчёта лота
double GetLots()
{
  double margin = MarketInfo(Symbol(),MODE_MARGINREQUIRED);
  double lotstep = MarketInfo(Symbol(),MODE_LOTSTEP);
  double rsk = MathMin(100.0,risk);
  double lotmax = MarketInfo(Symbol(), MODE_MAXLOT);
  double lotmin = MarketInfo(Symbol(), MODE_MINLOT);

  double clots = NormalizeDouble(lotstep*MathRound(AccountFreeMargin()*rsk/100/margin/lotstep),2);
  if(clots < lotmin) clots = lotmin;
  if(clots > lotmax) clots = lotmax;

return(clots);
}
Raison: