Question pour les connaisseurs - page 13

 

Oui, - je suppose que oui ! Merci, TheXpert !

Je vais essayer !

 
Chers experts, veuillez m'aider à comprendre la fonction OrderCloseBy(). Je suis totalement confus. J'ai un Conseiller Expert, qui ouvre et ferme des positions par des conditions inversées. C'est-à-dire que les conditions OPEN BUY et CLOSE SELL sont les mêmes, ainsi que OPEN SELL et CLOSE BUY, ce qui signifie que juste après avoir quitté une position au même prix, une position s'ouvre dans la direction opposée avec la même taille. J'ai donc décidé d'essayer de remplacer OrderClose() en ouvrant une position dans la direction opposée avec un volume double, puis en fermant les ordres opposés avec OrderCloseBy(). Autrement dit, le même algorithme aurait dû être appliqué, mais il aurait permis d'économiser un spread par transaction, mais le testeur a montré un tout autre résultat. Je ne peux pas décider si j'ai mal écrit le code ou si j'ai mal compris l'idée... Je vous serai très reconnaissant pour les explications...
 
Tout d'abord, vérifiez auprès du support technique de votre société de courtage si cette fonction est prise en charge par le terminal. Toutes les maisons de courtage n'autorisent pas la fonction OrderCloseBy().
 
Dans la démo, la fonction OrderCloseBy() est prise en charge.
 

Je ne suis pas un expert. J'ai cette note sur cette fonction dans mon dossier "aide", en plus de tout ce qui est "normal" (je l'ai copiée ici aussi - je ne me souviens plus de quelle branche) : -.

Et la fonction OrderCloseBy est utilisée UNIQUEMENT pour fermer 2 ordres simultanément, à ce moment-là un spread est sauvegardé.
Nous devrions parcourir le terminal de façon programmatique, mémoriser tous les numéros d'ordres ouverts et leurs caractéristiques, sélectionner le numéro de l'ordre principal, le faire correspondre avec le contre-ordre souhaité (parmi ceux disponibles) et coller ce numéro.


// C'est-à-dire que, si je comprends bien, avec cette fonction vous ne pouvez fermer que deux positions de compteur, présélectionnées.

C'est tout ce qu'il y a à faire.

 

Ouais, eh bien...

C'est pour ça que ça s'appelle comme ça.

 

Permettez-moi de reformuler la question pour savoir s'il existe une différence économique entre les deux possibilités suivantes d'inversion de position :

1) Fermer SELL avec 1 lot de volume en utilisant la fonction OrderClose et ensuite ouvrir BUY avec 1 lot de volume.

2) Alors que la position VENTE est ouverte dans un lot, ouvrez d'abord la position ACHAT dans deux lots, puis fermez la position VENTE avec la fonction OrderCloseBy, ce qui laissera également une position ACHAT ouverte dans un lot.

Selon l'exemple du cahier d'exercices, il restera un écart dans la variante 2).

 
En bref, l'écart 1+1 sera compensé et le 1 restant sera l'écart de négociation normal.
 
https://book.mql4.com/ru/trading/orderclose - voici une description de la fonction OrderCloseBy(). J'ai essayé de faire la même chose sur la démo - cela réduit vraiment beaucoup l'écart. Mais il ne fonctionne toujours pas sur Expert Advisor... Je suis tellement confus...
 
Dmirtiy писал(а) >>
https://book.mql4.com/ru/trading/orderclose - vous pouvez voir ici comment fonctionne la fonction OrderCloseBy(). J'ai essayé de faire la même chose sur la démo - l'écart est vraiment plus faible. Mais il ne fonctionne toujours pas sur Expert Advisor... Je suis vraiment confus...

Vous avez été dans deux fils de discussion avec cette question. Vous êtes curieux.

Il n'y a pas de solutions simples. Avec la sortie de MQL5, ce problème va complètement disparaître.

Je peux vous suggérer quelques procédures que j'utilise dans mes EA.

//Détecter l'état actuel des commandes en cours :

void CheckOrders()
{
int i ;
BuyOrder = false ;
SellOrder = false ;
BuyLots = 0.0 ;
SellLots = 0,0 ;

for ( i=0 ; i < OrdersTotal() ; i++)
{
OrderSelect(i, SELECT_BY_POS) ;
si ( OrderSymbol() == Symbol())
{
si ( OrderType() == OP_BUY )
{
BuyOrder = true ;
LastBuyLots = OrderLots() ;
BuyLots += LastBuyLots ; // somme des positions d'achat ouvertes
BuyTicket = OrderTicket() ;
}
si ( OrderType() == OP_SELL)
{
SellOrder = true ;
LastSellLots = OrderLots() ;
SellLots += LastSellLots ; // somme des positions de vente ouvertes
SellTicket = OrderTicket() ;
}
}
}
}

//Ouvrir (fermer) les ordres :

void TradeVariant( int variant )
{
switch( variante )
{
// si (Pattern < 0 && !BuyOrder && !SellOrder && !FridayLastHour) variant = 1 ;
// signal de vente, aucun ordre n'est ouvert et ce n'est pas la dernière heure du vendredi.
// ouvrir un ordre de vente
cas 1 :
OpenSellOrder(Lots) ;
pause ;

// si (Pattern < 0 && BuyOrder && !SellOrder && !FridayLastHour) variant = 2 ;
// signal de vente, il y a un ordre d'achat ouvert, pas d'ordre de vente.
// ce n'est pas la dernière heure du vendredi - nous nous retournons
cas 2 :
OpenSellOrder(Lots + BuyLots) ;
pause ;

// si (Pattern < 0 && BuyOrder && !SellOrder && FridayLastHour) variant = 3 ;
// signal de vente, il y a un ordre d'achat ouvert, pas d'ordre de vente.
// c'est la dernière heure du vendredi - fermez l'ordre d'achat.
cas 3 :
CloseBuyOrders() ;
pause ;

// si (Pattern > 0 && !SellOrder && !BuyOrder && !FridayLastHour) variant = 4 ;
// signal d'achat, aucun ordre n'est ouvert et ce n'est pas la dernière heure du vendredi.
// ouvrir un ordre d'achat
cas 4 :
OpenBuyOrder(Lots) ;
pause ;

// si (Pattern > 0 && SellOrder && !BuyOrder && !FridayLastHour) variant = 5 ;
// signal d'achat, il y a un ordre de vente ouvert, pas d'ordre d'achat.
// ce n'est pas la dernière heure du vendredi - nous nous retournons
cas 5 :
OpenBuyOrder(Lots + SellLots) ;
pause ;

// si (Pattern > 0 && SellOrder && !BuyOrder && FridayLastHour) variant = 6 ;
// signal d'achat, il y a un ordre de vente ouvert, pas d'ordre d'achat.
// c'est la dernière heure du vendredi - fermez l'ordre de vente.
cas 6 :
CloseSellOrders() ;
pause ;

cas 7 :
// if (SellOrder && BuyOrder) variant = 7 ;
// ont un ordre croisé ouvert
if (WaitBeforeTransaction(WaitSeconds) == 1) // pause entre les demandes
{
if (LastBuyLots <= LastSellLots)
OrderCloseBy( BuyTicket, SellTicket) ;
else
OrderCloseBy( SellTicket, BuyTicket) ;
}
break

// dans les autres variantes, ne rien faire
par défaut :
pause ;
}
}

J'espère que vous vous débrouillerez avec les variables.

>> Bonne chance !