Sie verpassen Handelsmöglichkeiten:
- Freie Handelsapplikationen
- Über 8.000 Signale zum Kopieren
- Wirtschaftsnachrichten für die Lage an den Finanzmärkte
Registrierung
Einloggen
Sie stimmen der Website-Richtlinie und den Nutzungsbedingungen zu.
Wenn Sie kein Benutzerkonto haben, registrieren Sie sich
Grüße. Ich habe mich umgehört, aber noch keine Antwort gefunden. Können Sie mir bitte sagen, warum der folgende Eintrag
if (x!=maxpr1){x=maxpr1; OrderDelete(ticketD);}
if (z!=minpr1){z=minpr1; OrderDelete(ticketUP);}
Das System erzeugt ständig Fehler
: ungültiges Ticket für OrderDeletefunction
OrderDelete-Fehler 4051
Dem Nachschlagewerk zufolge ist es
Ungültiger Wert des Funktionsparameters
Die Parameter scheinen jedoch dieselben zu sein.
Wenn Sie jedoch die Bedingung entfernen und nur noch
OrderDelete(ticketD);
OrderDelete(ticketUP);
es wird erfolgreich gelöscht (aber ich brauche es nach Bedingung). Was mache ich falsch? Hier ist die ganze Sache:
Da es über OrderSelect ausgewählt werden muss, geht IhrticketD-Wert verloren, und höchstwahrscheinlich gibt es statt des Tickets irgendeinen Blödsinn, versuchen Sie, es auszudrucken und zu vergleichen.
Liegt es daran, dass die Löschfunktion durch die Bedingung ausgelöst wird, dass der Wert verloren gegangen ist? Ich habe versucht, es so zu schreiben:
if (x!=maxpr1){x=maxpr1; OrderDelete(ticketD);}
OrderDelete(ticketUP);
auf die kommende Bedingung für "ticketD" schreibt die gleichen Fehler, und der Auftrag"ticketUP" wird bei jedem Tick erfolgreich gelöscht.
Und im Allgemeinen ist diese Art zu schreiben Unsinn.
Ich fange gerade erst an, ich würde mich über Kommentare freuen.
Code über "SRC" einfügen, damit Sie sich die
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);}
Liegt es daran, dass die Löschfunktion durch die Bedingung ausgelöst wird, dass der Wert verloren gegangen ist? Ich habe versucht, es so zu schreiben:
if (x!=maxpr1){x=maxpr1; OrderDelete(ticketD);}
OrderDelete(ticketUP);
Wenn die Bedingung für "ticketD" eintritt, werden die gleichen Fehler geschrieben, und der Auftrag"ticketUP" wird bei jedem Tick erfolgreich gelöscht.
Wir sollten prüfen, ob der Auftrag existiert, und wenn es einen mit einem solchen Häkchen gibt, werden wir ihn löschen, wenn nicht, werden wir nichts tun. Der Auftrag wurde bereits gelöscht, und Sie löschen ihn immer wieder.
In dieser Eingabewird die Order mitticketUP zunächst geöffnet und dann bei jedem Tick gelöscht, während die Order tikcetD bei Eintreten der entsprechenden Bedingung einen Löschungsfehler erzeugt. So steht es in der Zeitschrift.
Oder habe ich vielleicht etwas verwechselt?
aber ist die unterste Zeile der beiden zufällig überflüssig?
OrderDelete(ticketUP);//лишняя?
Wenn es nicht überflüssig ist, wo liegt dann die Löschungsbedingung?
Dies ist meiner Meinung nach eine Variante des Codes, der versucht, einen schwebenden Auftrag bei jedem Tick zu löschen.
Und die Nummer des Tickets ist unklar.
Das ist es, was die Fehlermeldung auslöst.
In dieser Eingabewird die Order mitticketUP zunächst geöffnet und dann bei jedem Tick gelöscht, während die Order tikcetD bei Eintreten der entsprechenden Bedingung einen Löschungsfehler erzeugt. So steht es in der Zeitschrift.
Oder bin ich vielleicht verwirrt?
nun ja, richtig.
Was ist dann die Frage?
Nun, das ist richtig.
Wie lautet also die Frage?
Dies gilt für verschiedene Aufträge. Die Funktion des Entfernens des einen mit einer Bedingung, das Entfernen des anderen ohne Bedingung.
Die Frage ist, warum in meinem Fall die Löschfunktion ohne eine Bedingung erfolgreich funktioniert, und wenn ich sie in eine Bedingung einfüge, gibt es einen Fehler, wenn die Bedingung eintritt.