tuner: 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 ; } }
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...
//+----------------------------------------------------------------------------+ //| 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
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()) ;
Mais le compilateur exige que la valeur de retour de l'OrderClose soit vérifiée
C'est parce qu'à l'époque où Igor écrivait ses fonctions, le compilateur n'exigeait pas de vérifier la valeur de retour, alors que le compilateur d'aujourd'hui jure s'il ne le fait pas.
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))))
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)))