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
Salutations. Je me suis renseigné, mais je n'ai pas encore trouvé de réponse. Pouvez-vous me dire pourquoi avec l'entrée suivante
if (x!=maxpr1){x=maxpr1 ; OrderDelete(ticketD);}
if (z!=minpr1){z=minpr1 ; OrderDelete(ticketUP);}
Le système génère constamment des erreurs
: ticket invalide pour la fonction OrderDeletefunction
: Erreur de suppression de commande 4051
Selon le livre de référence, c'est
Valeur invalide du paramètre de fonction
Bien que les paramètres semblent être les mêmes.
Bien que si vous supprimez la condition et laissez seulement
CommandeSuppression(ticketD) ;
CommandeDelete(ticketUP) ;
il supprime avec succès (mais j'en ai besoin par condition). Qu'est-ce que je fais de mal ? Voici le tout :
Parce qu'il doit être sélectionné via OrderSelect, votre valeurticketD est perdue, et il est fort probable qu'il y ait une connerie à la place du ticket, essayez de l'imprimer et comparez.
Est-ce parce que la fonction de suppression est déclenchée par la condition de perte de la valeur ? J'ai essayé de l'écrire comme ça :
if (x!=maxpr1){x=maxpr1 ; OrderDelete(ticketD);}
CommandeDelete(ticketUP) ;
sur la condition à venir pour "ticketD" écrit les mêmes erreurs, et l'ordre"ticketUP" est supprimé avec succès à chaque tick.
Et en général, ce style d'écriture est absurde.
Je ne fais que commencer, les commentaires sont les bienvenus.
insérer le code via "SRC" pour pouvoir regarder
double slB, tpB, slS, tpS; double x=0, z=0;
void OnTick()
{
double maxpr1=-9999; double minpr1=9999;
for(int shift1=0; shift1<bars; shift1++)
{double i=iHigh(Symbol(), PERIOD_CURRENT, shift1);
if (i>maxpr1){maxpr1=i;}}
for(int shiftA1=0; shiftA1<bars; shiftA1++)
{double y=iLow(Symbol(), PERIOD_CURRENT, shiftA1);
if (y<minpr1) {minpr1=y;}}
if (BuyLimitCount()==0 && BuyCount()==0){
slB=NormalizeDouble(minpr1-pointsl*Point,5);
tpB=NormalizeDouble(minpr1+pointtp*Point,5);
int ticketUP=OrderSend(Symbol(), OP_BUYLIMIT, lotB, minpr1, 3, slB, tpB, "", MagicB, 0, Red);
if (ticketUP==-1) Print("ERROR OP_BUY"); else Print("OP_BUY OK");}
if (SellLimitCount()==0 && SellCount() ==0){
slS=NormalizeDouble(maxpr1+pointsl*Point,5);
tpS=NormalizeDouble(maxpr1-pointtp*Point,5);
int ticketD=OrderSend(Symbol(), OP_SELLLIMIT, lotS, maxpr1, 3, slS, tpS, "", MagicS, 0, Blue);
if (ticketD==-1) Print("ERROR OP_SELL"); else Print("OP_SELL OK");}
if (x!=maxpr1){x=maxpr1; OrderDelete(ticketD);}
OrderDelete(ticketUP);
double maxpr=-9999; double minpr=9999;
for(int shift=0; shift<bars; shift++)
{double e=iHigh(Symbol(), PERIOD_CURRENT, shift);
if (e>maxpr){maxpr=e;}}
for(int shiftA=0; shiftA<bars; shiftA++)
{double r=iLow(Symbol(), PERIOD_CURRENT, shiftA);
if (r<minpr) {minpr=r;}}
string a;
if(bars==1)a="bar: ";
else a= IntegerToString(bars,1) + " bar's: ";
Comment("Last ", a, "max ", DoubleToStr(maxpr, 5), ", min ", DoubleToStr(minpr, 5),".");
}
int BuyLimitCount(){
int count=0;
for(int i=OrdersTotal()-1; i>=0; i--){
if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES)==true){
if(OrderMagicNumber()==MagicB){
if(OrderType()==OP_BUYLIMIT)
count++;}}}return(count);}
int BuyCount(){
int count=0;
for(int i=OrdersTotal()-1; i>=0; i--){
if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES)==true){
if(OrderMagicNumber()==MagicB){
if(OrderType()==OP_BUY)
count++;}}}return(count);}
int SellLimitCount(){
int count=0;
for(int i=OrdersTotal()-1; i>=0; i--){
if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES)==true){
if(OrderMagicNumber()==MagicS){
if(OrderType()==OP_SELLLIMIT)
count++;}}}return(count);}
int SellCount(){
int count=0;
for(int i=OrdersTotal()-1; i>=0; i--){
if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES)==true){
if(OrderMagicNumber()==MagicS){
if(OrderType()==OP_SELL)
count++;}}}return(count);}
Est-ce parce que la fonction de suppression est déclenchée par la condition de perte de la valeur ? J'ai essayé de l'écrire comme ça :
if (x!=maxpr1){x=maxpr1 ; OrderDelete(ticketD);}
CommandeDelete(ticketUP) ;
Lorsque la condition pour "ticketD" arrive, elle écrit les mêmes erreurs, et l'ordre"ticketUP" est supprimé avec succès à chaque tick.
Nous devons vérifier l'existence de l'ordre et s'il y en a un avec une telle coche, nous le supprimerons, sinon, nous ne ferons rien. Ce qui se passe, c'est que la commande a déjà été supprimée et que vous continuez à la supprimer à nouveau.
Dans cette entrée, l'ordre avecticketUP est d'abord ouvert puis supprimé à chaque tick, tandis que l'ordre tikcetD, si la condition correspondante se produit, génère une erreur de suppression. C'est selon le journal.
Ou peut-être ai-je confondu quelque chose ?
mais la ligne de fond des deux est-elle par hasard redondante ?
OrderDelete(ticketUP);//лишняя?
Si elle n'est pas superflue, où se trouve la condition de suppression ?
Il s'agit d'une variante du code qui essaie de supprimer un ordre en attente à chaque tick, comme je le pense.
Et le numéro du billet n'est pas clair.
C'est ce qui va renvoyer l'erreur.
Dans cette entrée, l'ordre avecticketUP est d'abord ouvert puis supprimé à chaque tick, tandis que l'ordre tikcetD, si la condition correspondante se produit, génère une erreur de suppression. C'est selon le journal.
Ou peut-être suis-je confus ?
bien, correctement.
Quelle est la question alors ?
Eh bien, c'est vrai.
Quelle est la question alors ?
Ceci est pour des commandes différentes. La fonction de supprimer l'un avec une condition, de supprimer l'autre sans condition.
La question est de savoir pourquoi, dans mon cas, la fonction de suppression sans condition fonctionne avec succès, alors que si je l'intègre à une condition, elle donne lieu à une erreur lorsque la condition se produit.