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

 
tuner:
faites void start() et il n'y aura pas d'erreur
Merci ! L'erreur a disparu, mais la position ne se ferme toujours pas.
 
rapid_minus:
Merci ! L'erreur a disparu, mais la position ne se ferme toujours pas.
Pas assez de code pour savoir exactement ce qui cause le problème.
 
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 ;
}
}

 
rapid_minus:


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...

 
evillive:

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

 
rapid_minus:

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()) ;

 
rapid_minus:

Igor Kim a le nôtre comme exemple :

...

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.
 
evillive:

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 ?

 
rapid_minus:

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