Questions des débutants MQL5 MT5 MetaTrader 5 - page 574

 
Anton Balakirew:
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.
Vérifiez le nombre d'ordres placés et le nombre de positions ouvertes avant d'ouvrir une nouvelle position ou de placer un nouvel ordre en attente.
 
Artyom Trishkin:

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.

pako:

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.

 
Andrey Koldorkin:

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

for(int i=0; i<copy_bars-1; i++) {                             // цикл по скопированным данным от начала до "на один меньше размера массива"

vous devez changer le nombre de barres en

for(int i=0; i<copy_bars; i++) {                             // цикл по скопированным данным от начала до конца диапазона
 
Artyom Trishkin:
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) ;

}

//+------------------------------------------------------------------+

 
Artyom Trishkin:

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 :))) ?

 
Vasiliy Sokolov:

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.

 
Artyom Trishkin:

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, vraiment dommage.
 
Vasiliy Sokolov:
C'est dommage, c'est dommage.
Eh bien, oui, c'est une tâche intéressante, mais hélas, je n'ai pas le temps.
 
Artyom Trishkin:

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 " ?", " :"?

 
Andrey Koldorkin:

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 " ?", " :"?

// строку int searchPeriod=(Search_Period<1)?1:Search_Period;
// можно расписать так:

input int Search_Period=10; // Количество копируемых свечей ... эту строку вы видите в настройках
int searchPeriod;           // Сюда будем записывать входной параметр
if(Search_Period<1) searchPeriod=1; // Если во входном параметре ввели ноль или меньше нуля, то параметр будет равен единице
else searchPeriod=Search_Period;    // иначе примем входной параметр

// соответственно и строку int delta=(Delta<0)?0:Delta;
// можно расписать точно так же

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