Merci pour le conseil, Alexey ! Je vais d'abord attendre une réponse dans ce fil de discussion, mais si rien ne se passe, je me tournerai vers le fil de discussion Erreurs, bugs, questions.
Sincèrement, Vladimir.
Vous n'obtiendrez aucune réponse des développeurs dans ce fil de discussion. Si vous avez trouvé une erreur, si vous vous êtes assuré qu'il s'agissait bien d'une erreur, signalez-la à la branche représentée par Alexey. Il n'est pas nécessaire d'attendre des modérateurs qu'ils agissent sur ce point - nous sommes aussi des êtres humains, et nous n'avons parfois pas le temps.
Il est peu probable que vous obteniez des réponses des développeurs dans ce fil de discussion. Si vous trouvez une erreur, assurez-vous qu'il s'agit bien d'une erreur, signalez-la à la branche d'Alexey. Il n'est pas nécessaire d'attendre des actions de la part des modérateurs à cette occasion - nous sommes aussi des personnes, et nous n'avons pas le temps.
Voici deux fonctions pour le conseiller de la grille : la première fonction est le calcul du profit, en tenant compte de la clôture partielle des ordres perdants.
La deuxième fonction est la fermeture des ordres avec fermeture partielle des ordres non rentables.
//+----------------------------------------------------------------------------+//| Закрытие сетки ордеров при заданной команде с учетом части ордеров |//+----------------------------------------------------------------------------+void ClosseAll()
{
int i,j,tkt;
for(i = OrdersTotal()-1; i>=0; i--)
{
if(!OrderSelect(i, SELECT_BY_POS, MODE_TRADES) || OrderSymbol()!=Symbol() || OrderMagicNumber()!=Magic)
continue;
tkt=OrderTicket();
RefreshRates();
if(OrderProfit()>=0)
{
if(OrderType() == OP_BUY)
{
if(!OrderClose(OrderTicket(), OrderLots(), Bid, slip))
Print("Не удалось закрыть ордера на покупку!");
}
elseif(OrderType() == OP_SELL)
{
if(!OrderClose(OrderTicket(), OrderLots(), Ask, slip))
Print("Не удалось закрыть ордер на продажу!");
}
}
elsefor(j=0; j<nOrd; j++)
if(tkt==Ord_ticket[j])
{
if(OrderLots()<Ord_lot[j])
Ord_lot[j]=OrderLots();
Ord_lot[j]=NRL(Ord_lot[j]);
if(OrderType() == OP_BUY)
{
if(!OrderClose(OrderTicket(), Ord_lot[j], Bid, slip))
Print("Не удалось закрыть ордера на покупку!");
}
elseif(OrderType() == OP_SELL)
{
if(!OrderClose(OrderTicket(), Ord_lot[j], Ask, slip))
Print("Не удалось закрыть ордер на продажу!");
}
break;
}
}
}
La situation est la suivante : si je ferme une grille d'ordres en tenant compte de la fermeture partielle des ordres perdants, j'obtiens une perte en raison de l'arrondi au plus grand côté de certains lots qui doivent être fermés.
La question est de savoir si vous pouvez utiliser ces deux fonctions pour écrire une fonction de calcul des ordres perdants, ou plutôt une partie d'un ordre à clôturer.
l'astuce clé est de regarder l'index dans la boucle et de le modifier avec l'option ticket !!!
//--- при таком методе мы будет сюда попадать на каждом тике.for(int i=PositionsTotal()-1;i>=0;i--)
if(m_position.SelectByIndex(i))
if(m_position.Symbol()==Symbol() && m_position.Magic()==m_magic)
{
//--- TrailingStop -> подтягивание StopLoss у ПРИБЫЛЬНОЙ позицииif(m_position.PositionType()==POSITION_TYPE_BUY)
{
//--- когда у позиции ещё нет StopLossif(m_position.StopLoss()==0)
{
//--- пока StopLoss равен 0.0, TrailingStep не учитываемif(m_symbol.Bid()-ExtTrailingStop>m_position.PriceOpen())
{
//--- модификация позиции
m_trade.PositionModify(m_position.Ticket(),m_position.PriceOpen(),0.0);
}
}
La chaîne de touches est mise en évidence. Résultat :
2022.02.2613:56:48.489 test (NZDUSD,H4) 0000000891001213131313001302022.02.2613:56:48.489 test (NZDUSD,H4) 12345678910111213131313131313132022.02.2613:56:48.489 test (NZDUSD,H4) 123456711
Attendu :
2022.02.2613:56:48.489 test (NZDUSD,H4) 0000000891001213131313001302022.02.2613:56:48.489 test (NZDUSD,H4) 12345678910111213131313131313132022.02.2613:56:48.489 test (NZDUSD,H4) 123456711131313
ArrayJ est dynamique, il semble y avoir quelque chose qui cloche... Mais je n'ai pas besoin non plus d'une statique.
Ça m'a brisé l'esprit. QUOI DE NEUF ? Ou est-ce l'équivalent de la vieille chanson :
2. ArrayRemove ne rend pas un élément du tableau "vide", il "déplace" les éléments suivants à sa place. Par conséquent, la correspondance des éléments dans les index ultérieurs est rompue.
1. ArrayResize devrait être déplacé hors de la boucle
2. ArrayRemove ne rend pas un élément du tableau "vide", mais "déplace" les éléments suivants à sa place. Par conséquent, la correspondance des éléments dans les index ultérieurs est rompue.
Il n'y a aucun doute sur le point 2, j'ai juste mis les intervalles ici pour que ce soit plus clair. De plus, dans Help, il est dit à propos d'un tableau statique :"Si la fonction est utilisée pour un tableau de taille fixe, la taille du tableau lui-même ne change pas : la "queue" restante est physiquement copiée à la position de départ."L'exemple dans l'aide utilise également un tableau de taille fixe, alors que j'en ai un dynamique.
Re 1. Nous ne pouvons pas le mettre en dehors d'une boucle, car dans une tâche réelle, nous ne connaissons pas à l'avance la taille de ArrayJ ou ArrayI, et encore moins celle de CommonArray, puisqu'ils ne coïncident pas tous.
J'ai aussi un exemple où le fait de mélanger les éléments ne casse pas la moitié du chemin, comme dans cet exemple :
Mais vous avez besoin de cette variante pour fonctionner. Le problème se produit apparemment si des éléments ayant la même valeur (voir le message précédent) se trouvent dans la queue à droite - ce qui est similaire au problème auquel je faisais référence ci-dessus.
Il n'y a pas de questions sur le 2, je mets les intervalles pour plus de clarté. En outre, dans l'aide, il est dit à propos des tableaux statiques :"Si la fonction est utilisée pour un tableau de taille fixe, la taille du tableau lui-même ne change pas : elle copie physiquement la "queue" restante à la position de départ."L'exemple dans l'aide utilise également un tableau de taille fixe, alors que j'en ai un dynamique.
Re 1. Nous ne pouvons pas le mettre en dehors d'une boucle, car dans une tâche réelle, nous ne connaissons pas à l'avance la taille de ArrayJ ou ArrayI, et encore moins celle de CommonArray, puisqu'ils ne coïncident pas tous.
J'ai également un exemple où le fait de mélanger les éléments ne casse pas la moitié du chemin, comme dans cet exemple :
Le résultat est bon :
Mais j'ai besoin de cette variante pour fonctionner. Le problème se produit apparemment s'il y a des éléments avec la même valeur dans la queue à droite (voir le post précédent) - ce qui est similaire au problème que j'ai mentionné ci-dessus.
1. Vous pouvez et devez le retirer de la boucle, comme je l'ai montré. Sauf si la taille de l'ArrayI change au cours de la boucle.
2. Puis quelque chose comme ceci
int k=0; // объявляем до цикла - чтобы использовать послеfor(int i=0; i<ArraySize(ArrayI); i++) // после предыдущего кода (1) размеры ArrayI и ArrayJ равныif(ArrayI[i]!=ArrayJ[i])
{
ArrayJ[k++]=ArrayI[i];
}
ArrayResize(ArrayJ,k);
Si vous n'avez pas de compte, veuillez vous inscrire
Autorisez l'utilisation de cookies pour vous connecter au site Web MQL5.com.
Veuillez activer les paramètres nécessaires dans votre navigateur, sinon vous ne pourrez pas vous connecter.
Vous êtes connecté. L'authentification à deux facteurs a été désactivée. Configurez-la à nouveau et scannez un nouveau code QR, ou continuez avec l'authentification à deux facteurs désactivée.
Merci pour le conseil, Alexey ! Je vais d'abord attendre une réponse dans ce fil de discussion, mais si rien ne se passe, je me tournerai vers le fil de discussion Erreurs, bugs, questions.
Sincèrement, Vladimir.
Vous n'obtiendrez aucune réponse des développeurs dans ce fil de discussion. Si vous avez trouvé une erreur, si vous vous êtes assuré qu'il s'agissait bien d'une erreur, signalez-la à la branche représentée par Alexey. Il n'est pas nécessaire d'attendre des modérateurs qu'ils agissent sur ce point - nous sommes aussi des êtres humains, et nous n'avons parfois pas le temps.
Il est peu probable que vous obteniez des réponses des développeurs dans ce fil de discussion. Si vous trouvez une erreur, assurez-vous qu'il s'agit bien d'une erreur, signalez-la à la branche d'Alexey. Il n'est pas nécessaire d'attendre des actions de la part des modérateurs à cette occasion - nous sommes aussi des personnes, et nous n'avons pas le temps.
Salut Artem !
Tout est clair.
Sincèrement, Vladimir.
Bonjour !!!!
Voici deux fonctions pour le conseiller de la grille : la première fonction est le calcul du profit, en tenant compte de la clôture partielle des ordres perdants.
La deuxième fonction est la fermeture des ordres avec fermeture partielle des ordres non rentables.
La situation est la suivante : si je ferme une grille d'ordres en tenant compte de la fermeture partielle des ordres perdants, j'obtiens une perte en raison de l'arrondi au plus grand côté de certains lots qui doivent être fermés.
La question est de savoir si vous pouvez utiliser ces deux fonctions pour écrire une fonction de calcul des ordres perdants, ou plutôt une partie d'un ordre à clôturer.
Si oui, aidez-moi à l'écrire.
Merci.
Bonjour !!!!
Si oui, aidez-moi à l'écrire.
Ce n'est pas le bon moment.
Vous voulez dire l'écrire pour vous ?
Ce n'est pas une bonne époque.
Vous voulez dire écrire pour vous ?
Ne te déchire pas Alexandre
perdu dans les affaires élémentaires :
comment organiser une pose de chalut - co-directed, pour une raison quelconque, il trawl une pose, c'est-à-dire qu'il ne trawl pas... MT5
je peux utiliser une simple section de code comme une énumération de positions pour un chalutage avec des positions de marché HEDGE - merci.
le problème est résolu ! Félicitations encore une fois à Vladimir Karputov ! !!
avec son chalut !
https://www.mql5.com/ru/code/17263
l'astuce clé est de regarder l'index dans la boucle et de le modifier avec l'option ticket !!!
Une tâche simple : vous devez supprimer tous les éléments du tableau J qui ont le même indice et la même valeur que les éléments du tableau I:
La chaîne de touches est mise en évidence. Résultat :
Attendu :
ArrayJ est dynamique, il semble y avoir quelque chose qui cloche... Mais je n'ai pas besoin non plus d'une statique.
Ça m'a brisé l'esprit. QUOI DE NEUF ? Ou est-ce l'équivalent de la vieille chanson :
https://www.mql5.com/ru/forum/1111/page3141#comment_27152680
и
https://www.mql5.com/ru/forum/1111/page3142#comment_27371998
à propos des constantes nommées ?
La chaîne de touches est mise en évidence. Résultat :
Attendu :
ArrayJ est dynamique, il semble y avoir quelque chose qui cloche... Mais je n'ai pas besoin non plus d'une statique.
1. il serait préférable de déplacer ArrayResize hors de la boucle.
2. ArrayRemove ne rend pas un élément du tableau "vide", il "déplace" les éléments suivants à sa place. Par conséquent, la correspondance des éléments dans les index ultérieurs est rompue.
1. ArrayResize devrait être déplacé hors de la boucle
2. ArrayRemove ne rend pas un élément du tableau "vide", mais "déplace" les éléments suivants à sa place. Par conséquent, la correspondance des éléments dans les index ultérieurs est rompue.
Il n'y a aucun doute sur le point 2, j'ai juste mis les intervalles ici pour que ce soit plus clair. De plus, dans Help, il est dit à propos d'un tableau statique :"Si la fonction est utilisée pour un tableau de taille fixe, la taille du tableau lui-même ne change pas : la "queue" restante est physiquement copiée à la position de départ."L'exemple dans l'aide utilise également un tableau de taille fixe, alors que j'en ai un dynamique.
Re 1. Nous ne pouvons pas le mettre en dehors d'une boucle, car dans une tâche réelle, nous ne connaissons pas à l'avance la taille de ArrayJ ou ArrayI, et encore moins celle de CommonArray, puisqu'ils ne coïncident pas tous.
J'ai aussi un exemple où le fait de mélanger les éléments ne casse pas la moitié du chemin, comme dans cet exemple :
Le résultat est bon :
Mais vous avez besoin de cette variante pour fonctionner. Le problème se produit apparemment si des éléments ayant la même valeur (voir le message précédent) se trouvent dans la queue à droite - ce qui est similaire au problème auquel je faisais référence ci-dessus.
Il n'y a pas de questions sur le 2, je mets les intervalles pour plus de clarté. En outre, dans l'aide, il est dit à propos des tableaux statiques :"Si la fonction est utilisée pour un tableau de taille fixe, la taille du tableau lui-même ne change pas : elle copie physiquement la "queue" restante à la position de départ."L'exemple dans l'aide utilise également un tableau de taille fixe, alors que j'en ai un dynamique.
Re 1. Nous ne pouvons pas le mettre en dehors d'une boucle, car dans une tâche réelle, nous ne connaissons pas à l'avance la taille de ArrayJ ou ArrayI, et encore moins celle de CommonArray, puisqu'ils ne coïncident pas tous.
J'ai également un exemple où le fait de mélanger les éléments ne casse pas la moitié du chemin, comme dans cet exemple :
Le résultat est bon :
Mais j'ai besoin de cette variante pour fonctionner. Le problème se produit apparemment s'il y a des éléments avec la même valeur dans la queue à droite (voir le post précédent) - ce qui est similaire au problème que j'ai mentionné ci-dessus.
1. Vous pouvez et devez le retirer de la boucle, comme je l'ai montré. Sauf si la taille de l'ArrayI change au cours de la boucle.
2. Puis quelque chose comme ceci