Toute question de débutant, afin de ne pas encombrer le forum. Professionnels, ne passez pas à côté. Nulle part sans toi - 6. - page 887
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
faites void start() et il n'y aura pas d'erreur
Merci ! L'erreur a disparu, mais la position ne se ferme toujours pas.
Pas assez de code pour dire exactement ce qu'est la raison
Extrait :
void CritCloseBuy()
{
if (((Yellow_0-Red_0)<(Yellow_1-Red_1) && ((MA_0<MA_1)&&(MA_1>MA_2)) || ((Yellow_0-Red_0)>(Yellow_1-Red_1)&& ((MB_0<MB_1)&&(MB_1>MB_2))))
while(true)
{
ord_close=OrderClose(OrderTicket(),0.1,MarketInfo(OrderSymbol(),MODE_BID),0,Red) ;
if (ord_close = false)
{
Comment("BAY position closing failed with error #",GetLastError()) ;//Message de l'erreur
break ;
}
else
{
Ord=0 ;
break ;
}
}
Ça pourrait être la raison de l'ouverture :
void CritOpen()
{
if (///condition d'ouverture//)
while(true)
{
ticket=OrderSend(Symbol(),OP_BUY,0.1,Ask,0,0,NULL,10011,0,clrNONE) ; //ouverture de la commande BAY, MAGIC 10011
if(ticket<=0)
{
Comment("L'ouverture de la position BAY-10011 a échoué avec l'erreur #",GetLastError()) ;
break ;
}
else
{
Comment("BAY-10011 position ouverte avec le lot 0.1,price", Ask) ;
Ord=(Ord+1) ;
break ;
}
}
Extrait :
avant ord_close=OrderClose(OrderTicket(),0.1,MarketInfo(OrderSymbol(),MODE_BID),0,Red) ;
il serait bien de pouvoir sélectionner la commande à l'aide de la fonction OrderSelect(). Je ne vois pas l'utilité d'une telle boucle autour de la fonction close...
avant ord_close=OrderClose(OrderTicket(),0.1,MarketInfo(OrderSymbol(),MODE_BID),0,Red) ;
il serait bien de pouvoir sélectionner la commande à l'aide de la fonction OrderSelect().
J'ai le seul. Eh bien, en fait, c'était le cas au début. J'ai commencé à chercher la cause en utilisant la méthode du tâtonnement. Je ne comprends pas le sens de la boucle.
Je triche juste par analogie : si j'ai ouvert avec la boucle, alors je devrais fermer aussi...
Igor Kim a notre exemple :
void start() {
ManagePositions() ;
}
//+----------------------------------------------------------------------------+
//| Fermer les positions au prix du marché|
//| Paramètres :|
//| sym - nom de l'instrument ("" - symbole actuel)|
//| op - opération(-1 - toute position)|
//| mn - MagicNumber(-1 - tout magik) |
//+----------------------------------------------------------------------------+
void ClosePositions(string sym="", int op=-1, int mn=-1) {
int i, k=OrdersTotal() ;
if (sym=="") sym=Symbol() ;
for (i=0 ; i<k ; i++) {
if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {
if (OrderSymbol()==sym && (op<0 || OrderType()==op)) {
if (mn<0 || OrderMagicNumber()==mn) {
if (OrderType()==OP_BUY) {
OrderClose(OrderTicket(), OrderLots(), Bid, Slippage, clCloseBuy) ;
}
if (OrderType()==OP_SELL) {
OrderClose(OrderTicket(), OrderLots(), Ask, Slippage, clCloseSell) ;
}
}
}
}
}
}
Mais le compilateur exige de vérifier la valeur de retour de OrderClose
Igor Kim a notre exemple :
Mais le compilateur exige que la valeur de retour de l'OrderClose soit vérifiée
Faites comme dans l'exemple - sélectionnez d'abord et fermez ensuite. Peu importe qu'il s'agisse de la seule commande ou d'un million de commandes, car chaque commande doit d'abord être sélectionnée.
La vérification est très simple if(!OrderClose(OrderTicket(), OrderLots(), Ask, Slippage, clCloseSell)) Print("Erreur de fermeture #", GetLastError()) ;
Igor Kim a le nôtre comme exemple :
...
Mais le compilateur exige que la valeur de retour de l'OrderClose soit vérifiée
Faites donc comme dans l'exemple - sélectionnez d'abord et fermez ensuite. Peu importe qu'il y ait une seule commande ou un million de commandes, chacune d'entre elles doit être sélectionnée en premier.
La vérification est très simple if(!OrderClose(OrderTicket(), OrderLots(), Ask, Slippage, clCloseSell)) Print("Erreur de fermeture #", GetLastError()) ;
J'ai fait ce qui suit : if ( !OrderClose(OrderTicket(), OrderLots(), Bid, 0, Red))
{
Comment("La fermeture de la position BAY a échoué avec l'erreur #",GetLastError()) ;
break ;
}
sinon
{
Ord=0 ;
break ;
}
On continue à demander "la valeur de retour devrait être vérifiée".
Je l'ai fait comme ça :
ord_close=OrderClose(OrderTicket(), OrderLots(), Bid, 0, Red) ;
if (ord_close = false)
{
Comment("BAY position closing failed with error #",GetLastError()) ; //Message de l'erreur
pause ;
}
else
{
Ord=0 ;
break ;
}
Silencieux. Mais dans les deux cas, la position n'est pas fermée.
ZS : Je pense qu'il y a une erreur dans la définition des conditions de fermeture et d'ouverture.
Le message ci-dessus montre un exemple de condition de fermeture. Qu'est-ce qui peut bien se passer ?
Il est silencieux. Mais dans les deux cas, la position n'est pas fermée.
ZS : Je pense qu'il y a une erreur dans la définition des conditions de fermeture et d'ouverture des positions.
Le post ci-dessus donne un exemple d'une condition proche. Qu'est-ce qui peut bien se passer ?
Si la fermeture ne se fait pas en silence, sans erreur, c'est que la condition de fermeture n'est pas bonne. Nous devons repenser et réécrire cette condition même.
Les parenthèses sont en quelque sorte mal disposées :
if (((Yellow_0-Red_0)<(Yellow_1-Red_1) && ((MA_0<MA_1)&&(MA_1>MA_2))) || ((Yellow_0-Red_0)>(Yellow_1-Red_1) && ((MB_0<MB_1)&&(MB_1>MB_2))))
Que pensez-vous de ça ?
if (((Yellow_0-Red_0<Yellow_1-Red_1) && (MA_0<MA_1 && MA_1>MA_2)) || ((Yellow_0-Red_0>Yellow_1-Red_1) && (MB_0<MB_1 && MB_1>MB_2)))