Questions des débutants MQL5 MT5 MetaTrader 5 - page 574
Vous manquez des opportunités de trading :
- Applications de trading gratuites
- Plus de 8 000 signaux à copier
- Actualités économiques pour explorer les marchés financiers
Inscription
Se connecter
Vous acceptez la politique du site Web et les conditions d'utilisation
Si vous n'avez pas de compte, veuillez vous inscrire
L'idée d'ouvrir des ordres sur un signal d'achat ou de prise à la baisse, comment faire pour qu'il n'y ait qu'un seul trade d'achat/vente et un trade d'ordre en attente, j'en ai un ouvert sur chaque tick du trade. Aidez à résoudre le problème.
Voici une autre façon de procéder : des correspondances sont écrites pour chaque bougie de la fourchette. Dans la version précédente, les correspondances étaient écrites uniquement pour une bougie - c'est-à-dire qu'aucune correspondance n'était écrite pour celle qui correspondait à celle-ci.
Artem, merci. Je me pencherai sur la question.
Les valeurs élevées peuvent être arrondies, par exemple, nous pouvons arrondir la valeur 1,23456 à 1,2346.
Je vois ce que je veux dire. J'ai également ajouté une variable dans les paramètres dans lesquels vous pouvez prescrire l'écart dans lequel les valeurs de haut être considéré comme égal. C'est nécessaire parce que pour les guillemets à 4 chiffres, il n'y a souvent pas de problème de ce genre, mais pour les guillemets à 5 chiffres, la recherche de correspondances exactes est infiniment possible.
Artem, merci. Je vais m'en occuper.
L'arrondi est clair. J'ai également mis une variable dans les paramètres, dans laquelle je pourrai prescrire la valeur de l'écart, dans laquelle les valeurs élevées sont considérées comme égales. C'est nécessaire, car pour les citations à 4 chiffres, il n'y a souvent pas de problème, mais pour les citations à 5 chiffres, la recherche de correspondances exactes est sans fin.
Vous êtes les bienvenus. J'ai fait une inexactitude dans la deuxième version. Puisque dans la première version nous recherchions les correspondances à partir de la bougie suivante de l'index de la boucle, le passage de la boucle principale se faisait par le nombre de bougies moins une pour comparer les deux bougies les plus extérieures. Maintenant, dans la seconde version, pour chacun des chandeliers, nous recherchons des correspondances sur toute la plage, donc dans la ligne
vous devez changer le nombre de barres en
Vérifiez le nombre d'ordres fixés et le nombre de positions ouvertes avant d'ouvrir une nouvelle position ou de placer un nouvel ordre en attente.
c'est-à-dire qu'il est nécessaire d'ajouter une condition pour vérifier le nombre d'ordres et de positions dans les conditions d'une transaction ?
if (o4>c4&&o3>c3&&l2>l1&&c2<c1&&o2>c2&&o1<c1&&c1>o2&&h1>h2||o2>c1&h2>h1&h1<o2&o1<c1&&l2>l1&&o3>c3&&o4>c4){ //first condition
if (OrdersTotal()==0) //deuxième condition
OrderSend(Symbol(), OP_BUY,Lot,o,10,l1,0) ; } ................................... et ainsi de suite pour chaque transaction ?
Et quelle fonction compte le nombre de postes ouverts ?
Je pense que j'ai résolu le problème :
if (Hour()>=0&Hour()<23){
if (o4>c4&&o3>c3&&l2>l1&&c2<c1&&o2>c2&&o1<c1&&c1>o2&&h1>h2||o2>c1&&h2>h1&&h1<o2&&o1<c1&&l2>l1&&o3>c3&&o4>c4){
si (PositionsTotal()<=1)
OrderSend(Symbol(), OP_BUY,Lot,o,10,l1,0) ; } //opens Buy
if (o4>c4&&o3>c3&&l2>l1&&c2<c1&&o2>c2&&o1<c1&&c1>o2&&h1>h2||o2>c1&&h2>h1&&h1<o2&&o1<c1&&l2>l1&&o3>c3&&o4>c4){
si (PositionsTotal()==1&OrderType()==0)
OrderSend(Symbol(), OP_SELLSTOP,Lot,l2,10,h2,0);} /Postension de l'ordre SellStop
if (o4<c4&&o3<c3&&h2<h1&&c2>c1&&o2<c2&&o1>c1&&c1<o2&&l1<l2||o2<c1&&l2<l1&&l1>o2&&o1>c1&&h2<h1&&o3<c3&&o4<c4){
si (PositionsTotal()<=1)
OrderSend(Symbol(),OP_SELL,Lot,o,10,h1,0) ; } //ouvre la vente
if (o4<c4&&o3<c3&&h2<h1&&c2>c1&&o2<c2&&o1>c1&&c1<o2&&l1<l2||o2<c1&&l2<l1&&l1>o2&&o1>c1&&h2<h1&&o3<c3&&o4<c4){
si (PositionsTotal()==1&OrderType()==1)
OrderSend(Symbol(), OP_BUYSTOP,Lot,h2,10,l2,0);} //Arrêt différé de l'ordre BuyStop
}
//+------------------------------------------------------------------+
//Fonction qui retourne le montant total des positions ouvertes |
// |
//+------------------------------------------------------------------+
int PositionsTotal() {
int pos = 0 ;
for (int i=0 ; i<OrdersTotal() ; i++) {
OrderSelect(i, SELECT_BY_POS, MODE_TRADES) ;
if (OrderType() == OP_BUY || OrderType() == OP_SELL)
pos++ ;
}
retour(pos) ;
}
//+------------------------------------------------------------------+
Voici une autre façon de procéder : des correspondances sont écrites pour chaque bougie de la fourchette. Dans la version précédente, les correspondances n'étaient écrites que pour une seule bougie - c'est-à-dire qu'aucune correspondance n'était écrite pour celle qui correspondait à celle-ci.
Bien. Mais comme je le vois, si le haut de la bougie 2 coïncide avec le bas de la bougie 7, alors deux correspondances seront trouvées : 2 <=> 7, 7 <=>2. Et qu'en est-il de la prise en compte des paires inverses, mais sans la boucle supplémentaire ?
Ne pouvez-vous pas résoudre le problème en une seule fois, sans utiliser de boucles for imbriquées :))) ?
Gud. Cependant, si je comprends bien, si le sommet de la bougie 2 coïncide avec le sommet de la bougie 7, alors deux correspondances seront trouvées : 2 <=> 7, 7 <=>2. Et qu'en est-il de la prise en compte des paires inverses, mais sans la boucle supplémentaire ?
Que diriez-vous de résoudre le problème en une seule fois, sans utiliser de boucles for imbriquées :))) ?
:) N'essayez pas de vous jouerde moi ;) Bien sûr, je pense que l'on peut résoudre le problème avec une seule boucle, mais j'étais trop paresseux pour réfléchir plus longtemps et j'ai fait ce que j'ai pensé d'un coup.
Naturellement, ici toutes les bougies appariées ou plus sont enregistrées dans les données de correspondance de chaque bougie. C'est pourquoi ils se recoupent. Je ne fais que suggérer des variantes, sans savoir à quoi elles servent.
Et plus loin, il est possible de résoudre la tâche d'optimisation des calculs, mais je n'en ai pas besoin.
Et si vous aviez besoin des données exactes pour chaque bougie et pour toutes les correspondances, et si, soudainement, soudainement ... il n'y a que ....
Je n'ai donc ni le temps ni l'envie. J'ai perdu mon temps au lieu d'écrire mes propres codes.
SZY, vous devriez peut-être aussi connecter les méthodes Kohonen en connaissant le paramètre d'entrée requis.
En général - pas de temps et pas d'envie. Et donc perdu du temps au lieu d'écrire mes propres codes.
C'est dommage, c'est dommage.
Vous êtes les bienvenus. J'ai fait une inexactitude dans la deuxième version. Comme la première version recherchait les correspondances à partir de la bougie suivante de l'index de la boucle, la boucle principale était passée par le nombre de bougies moins une pour comparer les deux bougies les plus extérieures. Maintenant, dans la seconde version, pour chacun des chandeliers, nous recherchons des correspondances sur toute la plage, donc dans la ligne
vous devez changer le nombre de barres en
Veuillez nous dire la signification de ces lignes :
input int Search_Period=10 ; // Nombre de chandeliers à copier
int searchPeriod=(Search_Period<1)?1:Search_Period ; // que signifient les symboles " ?", " :"?
input int Delta=2 ; // Nombre de points d'admission
int delta=(Delta<0)?0:Delta ; // que signifient les symboles " ?", " :"?
Veuillez me dire la signification de ces lignes :
input Search_Period=10 ; // Nombre de chandeliers à copier
int searchPeriod=(Search_Period<1)?1:Search_Period ; // que signifient les caractères " ?", " :"?
input int Delta=2 ; // Nombre de points d'admission
int delta=(Delta<0)?0:Delta ; // que signifient les symboles " ?", " :"?
De la référence :
Opérateur conditionnel ?
La forme générale d'un opérateur ternaire ressemble à ceci :
expression1? expression2: expression3
Comme premier opérande, "expression1" peut être n'importe quelle expression qui donne une valeur de type bool. Si le résultat est vrai, l'opérateur spécifié par le second opérande, "expression2", est exécuté .
Si le premier opérande estfaux, le troisième opérande, "expressionZ", est exécuté. Les deuxième et troisième opérandes, c'est-à-dire "expression2" et "expressionZ", doivent renvoyer des valeurs du même type et ne doivent pas être de type void. Le résultat de l'exécution de l'opérateur conditionnel est le résultat de "expression2" ou le résultat de "expression3", en fonction du résultat de "expression1".
//--- renormaliser la différence entre les prix d'ouverture et de fermeture par la fourchette quotidienne
double true_range = (High==Low) ?0:(Close-Open)/(High-Low) ;
Cette entrée est équivalente à ce qui suit
double_range ;
if(High==Low)true_range=0;// si High et Low sont égaux
else true_range=(Close-Open)/(High-Low) ;// si High est non nul