Fragen von Anfängern MQL4 MT4 MetaTrader 4 - Seite 30

 
spoiltboy:

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 durch OrderSelect ausgewählt werden muss, ist IhrticketD Wert verloren, und höchstwahrscheinlich gibt es anstelle von Ticket, einige yukhnya, versuchen zu drucken, und zu vergleichen. Und im Allgemeinen ist diese Art zu schreiben Unsinn.
 
Vitaly Muzichenko:
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.

 
Vitaly Muzichenko:
Und im Allgemeinen ist diese Art zu schreiben Unsinn.
Ich habe gerade erst angefangen, ich würde mich über Kommentare freuen.
 
spoiltboy:
Ich fange gerade erst an, ich würde mich über Kommentare freuen.
fügen Sie den Code mit "SRC"ein, damit Sie ihn sehen können
 
Renat Akhtyamov:
Code über "SRC" einfügen, damit Sie sich die
extern int pointsl=100, pointtp=100, MagicB=1111, MagicS=2222, bars=10;  extern double lotB=0.1, lotS=0.1;
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);}
 
spoiltboy:

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 solchen Auftrag gibt, löschen wir ihn; wenn nicht, tun wir nichts. Das Problem ist, dass der Auftrag bereits gelöscht ist und Sie ihn immer wieder löschen.
 
Vitaly Muzichenko:
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?

 
spoiltboy:

aber ist die unterste Zeile der beiden zufällig überflüssig?

if (x!=maxpr1){x=maxpr1; OrderDelete(ticketD);}
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.

 
spoiltboy:

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?

 
Renat Akhtyamov:

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.