Besoin d'aide avec l'erreur #130 "invalid stoploss".

 
Cher Forum,

J'ai vu que beaucoup de personnes sur le forum sont aux prises avec cette erreur.
Comme je l'ai compris dans les autres fils de discussion, l'erreur peut être causée par
a : la définition d'une valeur stoploss trop proche du prix actuel
b : un mauvais nombre de chiffres après 0.

Concernant a :
Si j'ai bien compris. MarketInfo(Symbol(), MODE_STOPLEVEL)) devrait me donner la distance minimale que le stoploss doit avoir.
Voici donc un exemple de trade raté :

Marekt Info :
Date : 2011/9/15 16:31
Symbole : #ESU1
Niveau d'arrêt : 75.00000000
Point : 0.01000000
Taille du tick : 0.25000000
Valeur du tick : 12.50000000
Chiffres : 2.00000000

Ainsi, la distance minimale devrait être le niveau d'arrêt * point, n'est-ce pas ? donc 0,75.
Voici donc mon ordre qui a échoué :
2011.09.15 16:32:07 '393930' : ordre de vente 18.00 #ESU1 ouverture à 1201.00 sl : 1202.35 tp : 0.00 échoué [S/L ou T/P invalide].
L'erreur est : 130 / stops invalides

Le stoploss est à 1.35 de l'ouverture. Cela devrait donc être correct. Les chiffres (b) correspondent également.
Alors pourquoi est-ce que je reçois cette erreur ?

De plus, cette erreur est difficile à reproduire. Parfois, elle apparaît. Parfois, elle n'apparaît pas.
Parfois, elle apparaît plusieurs fois de suite.

Avez-vous une idée ?
Merci d'avance !

shinobi
 
Quel était le spread au moment exact où cette erreur s'est produite ?
 

vous pouvez faire un cas d'erreur dans votre code et utiliser RefreshRates()

Je ne sais pas comment le faire, mais vous pouvez peut-être faire quelque chose comme ceci.

if(Trade==fase)

{

int ErrorCode= GetLastError() ;

si (ErrorCode=130)

{

RefreshRates() ;

}

}

Encore une fois, ce code peut ne pas être correct, vous devriez donc chercher sur Google comment le faire.

De plus, si vous ne l'avez pas encore fait, utilisez la fonction NormalizeDouble pour arrondir les chiffres.

 
35806:

vous pouvez faire un cas d'erreur dans votre code et utiliser RefreshRates()

En quoi cela peut-il vous aider ?
 
RaptorUK:
Comment cela va-t-il aider ?

C'est peut-être un problème temporaire. Il a dit que c'était sensible à la casse, donc rafraîchir les taux pourrait le résoudre.
 
35806:

il pourrait s'agir d'un problème temporaire. il a dit que c'était sensible à la casse, donc rafraîchir les taux pourrait le résoudre.
Nous n'avons pas vu de code. ... s'il n'utilise pas de variables prédéfinies, le nombre de RefreshRates ne sera d'aucune utilité.
 

vrai.

 
Merci pour vos réflexions.

Raptor, je ne connais pas le spread pour la transaction ci-dessus. J'ai ajouté une sortie de journal dans le code, la prochaine fois que l'erreur se produit, je serai en mesure de vous dire le spread.
Mais pouvez-vous me dire pourquoi le spread est important? De quelle manière dois-je prendre en compte l'écart, lorsque je détermine le stoploss ?

J'envoie un ordre avec par exemple :
int ticket = OrderSend(Symbol(), OP_BUY, position_size, Ask, SLIPPAGE, initial_stop, TAKEPROFIT, NULL, EXPERT_ID, 0, Green) ;

ainsi la seule variable prédéfinie que j'utilise lors de l'envoi des ordres est : Ask
SLIPPAGE et TAKEPROFIT sont tous deux égaux à 0.
EXPERT_ID est un numéro magique unique
position_size est un nombre entier, par exemple 3
initial_stop est mon stoploss, qui est (dans le cas de l'exemple ci-dessus) Bid - risk.
Le risque est une valeur supérieure à (MODE_STOPLEVEL * Point), dans le cas du trade du premier post. Le risque était de : 1.35
 
shinobi:
Merci pour vos réflexions.

Raptor, je ne connais pas le spread de la transaction ci-dessus. J'ai ajouté une sortie de journal dans le code, la prochaine fois que l'erreur se produit, je serai en mesure de vous dire le spread.
Mais pouvez-vous me dire pourquoi le spread est important ? De quelle manière dois-je prendre en compte le spread, lorsque je détermine le stoploss ?


Bravo pour avoir ajouté l'impression au journal pour l'avenir:-)

Je dois toujours réfléchir longuement à la question de savoir si la diffusion doit être prise en compte ou non... Il semble que j'aie un blocage mental à ce sujet... mais je pense que j'ai raison.

Pour un achat, cela ne devrait pas avoir d'importance, acheter à l'Ask, SL se produira à l'Bid, donc le Spread est déjà pris en compte dans votre OpenPrice. Pour une vente, c'est une autre histoire... vous vendez à l'offre et votre SL sera pris par le prix de l'offre... où est le prix de l'offre ? cela dépend du spread à ce moment-là... Je pense que c'est correct, réfléchissez-y et voyez si cela a du sens... Je suis plus qu'heureux d'être corrigé si je me trompe... :-)

 
int ticket = OrderSend(Symbol(), OP_BUY, position_size, Ask, SLIPPAGE, initial_stop, TAKEPROFIT, NULL, EXPERT_ID, 0, Green);
Les EAs doivent s'ajuster pour les brokers à 4/5 chiffres, TP, SL, ET slippage. Sur les courtiers ECN, vous devez ouvrir et ensuite fixer des stops.
//++++ These are adjusted for 5 digit brokers.
int     pips2points;    // slippage  3 pips    3=points    30=points
double  pips2dbl;       // Stoploss 15 pips    0.0015      0.00150
int     Digits.pips;    // DoubleToStr(dbl/pips2dbl, Digits.pips)
int     init(){
     if (Digits % 2 == 1){      // DE30=1/JPY=3/EURUSD=5 forum.mql4.com/43064#515262
                pips2dbl    = Point*10; pips2points = 10;   Digits.pips = 1;
    } else {    pips2dbl    = Point;    pips2points =  1;   Digits.pips = 0; }
    // OrderSend(... Slippage.Pips * pips2points, Bid - StopLossPips * pips2dbl
//---- These are adjusted for 5 digit brokers.
    /* On ECN brokers you must open first and THEN set stops
    int ticket = OrderSend(...)
    if (ticket < 0)
       Alert("OrderSend failed: ", GetLastError());
    else if (!OrderSelect(ticket, SELECT_BY_POS))
       Alert("OrderSelect failed: ", GetLastError());
    else if (!OrderModify(OrderTicket()...)
       Alert("OrderModify failed: ", GetLastError());
     */
 
35806:

il pourrait s'agir d'un problème temporaire. il a dit que c'était sensible à la casse, donc rafraîchir les taux pourrait le résoudre.
Pour l'instant, RefreshRates() n'a rien à voir avec l'erreur 130.