[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 - 2. - page 81

 

extern bool BUY = true ;
extern int Magic = 0 ;
extern double Lot = 0.1 ;
extern int takeprofit = 0 ;
extern int stoploss = 0 ;
extern int slippage = 3 ;
double SL,TP ;
int init(){
return(0) ;
}
int start()
{
if (BUY)
{
if (takeprofit!=0) TP = NormalizeDouble(Ask + takeprofit*Point,Digits) ; else TP=0 ;
if (stoploss!=0) SL = NormalizeDouble(Ask - stoploss*Point,Digits) ; else SL=0 ;

BUY=false ;
}

return(0) ;
}
void OPENORDER(string ord)
{
int error ;
while (true)
{ error=true ;
if (ord=="Buy") error=OrderSend(Symbol(),OP_BUY, Lot,NormalizeDouble(Ask,Digits),slippage,SL,TP,",Magic,0){BUY = false;}
}
return ;
}

 
nemo811:

Veuillez me donner un exemple. Je suis en train d'apprendre, et je n'ai pas encore été confronté à la tâche de mettre en place un drapeau. )
Changez simplement la variable en false et c'est tout, au prochain tick l'EA n'entrera pas dans ce bloc et il n'ouvrira rien d'autre jusqu'à ce que vous redémarriez.
 
nemo811:

Veuillez m'indiquer comment permettre une exécution unique d'une condition dans un EA (par exemple l'ouverture d'un ordre), plutôt que de la répéter à chaque tick. Dans ce cas, lors de la fermeture d'une position, l'EA ne doit pas en ouvrir une nouvelle. J'ai essayé de le visualiser, mais ça ne fonctionne pas comme prévu.

Merci d'avance.



pourquoi avez-vous nommé la variable où le ticket de commande sera enregistré ?

si (ord=="Buy") error=OrderSend(Symbol(),OP_BUY, Lot,NormalizeDouble(Ask,Digits),slippage,SL,TP,"",Magic,0){BUY = false;}

Lisez sur OrderSend(), je pense que les questions vont disparaître d'elles-mêmes, j'écrirais quelque chose comme ceci :

void OPENORDER(string ord)
{
int ticket = -1;
 while (ticket<0)
 {ticket=OrderSend(Symbol(),OP_BUY, Lot,NormalizeDouble(Ask,Digits),slippage,SL,TP,"",Magic,0);
  sleep(500);
}
return;
}
 
IgorM:



Peut-être avez-vous lu plus haut que j'ai exprimé mon problème. Ils semblent avoir trouvé une solution, mais je ne trouve pas dans le livre comment travailler avec une chaîne de caractères dans mql(

comment retirer les chiffres de la ligne par ligne ?

 
NameLess:


Peut-être avez-vous lu plus haut que j'ai exprimé mon problème. Ils semblent avoir trouvé une solution, mais je ne trouve pas dans le livre comment travailler avec une chaîne de caractères dans mql(

comment retirer les chiffres de la ligne par ligne ?


Créez un script pour expérimenter les fonctions de chaîne de caractères MQL4 - voir ici https://docs.mql4.com/ru/strings.
 

ZERO

selon quelles règles, par exemple ?

 
drknn:

Créez un script qui expérimente les fonctions de chaîne MQL4 - voir ici https://docs.mql4.com/ru/strings/StringSubstr.

Merci !
 
NameLess:


Peut-être avez-vous lu un peu plus haut que j'ai exprimé mon problème. Cela semble être une solution, mais je ne trouve pas de moyen de travailler avec des chaînes de caractères dans mql dans le livre (

comment extraire un chiffre d'une chaîne de chiffres ?

pour convertir un nombre en une chaîne de caractères https://docs.mql4.com/ru/convert/DoubleToStr

couper une partie de la chaîne https://docs.mql4.com/ru/strings/StringSubstr depuis le début https://docs.mql4.com/ru/strings/StringLen

et le reconvertir au type réel https://docs.mql4.com/ru/convert/StrToDouble

c'est tout ce que vous avez besoin de faire avec les chaînes de caractères, peut-être que StrToDouble() sera suffisant pour vous.

Une autre solution : multiplier un nombre réel à la puissance x par 10, et donner le résultat au type int - si je ne me trompe pas, il n'y aura pas d'arrondi, puis diviser int par 10 à la puissance x.

 
IgorM:

traduire un nombre en chaîne de caractères https://docs.mql4.com/ru/convert/DoubleToStr

couper une partie de la chaîne https://docs.mql4.com/ru/strings/StringSubstr à partir du début de https://docs.mql4.com/ru/strings/StringLen

et reconvertissons tout en un type réel https://docs.mql4.com/ru/convert/StrToDouble

c'est tout ce que vous avez besoin de faire avec des chaînes de caractères, peut-être que StrToDouble() est suffisant pour vous.

Une autre solution : multipliez un nombre réel par 10 à la puissance x, et donnez le résultat au type int - si je ne me trompe pas, il n'y aura pas d'arrondi, puis divisez int par 10 à la puissance x.


au moins *découper*, car le nombre ne peut être sorti de l'indicateur que vers une chaîne... merci pour le conseil, je vais expérimenter)
 

IgorM:

Sans nom :

Merci pour votre aide. Je comprends la logique de l'activation du drapeau et la fonction de retour du nombre de commandes. Mais je m'intéresse aussi au moment où l'ordre est fermé. Il semble que la condition de drapeau essaie de placer un ordre à nouveau mais la fonction renvoyant le numéro d'ordre dit qu'il y a un ordre de moins et initialise l'ouverture d'une position également. Corrigez-moi si j'ai manqué quelque chose.
Raison: