Domande dai principianti MQL4 MT4 MetaTrader 4 - pagina 30

 
spoiltboy:

Saluti. Ho chiesto in giro, ma non ho ancora trovato una risposta. Potresti dirmi perché con la seguente voce

if (x!=maxpr1){x=maxpr1; OrderDelete(ticketD);}

if (z!=minpr1){z=minpr1; OrderDelete(ticketUP);}

Il sistema genera costantemente errori

ticket non valido per OrderDeletefunction

: errore OrderDelete 4051

Secondo il libro di riferimento è

Valore non valido del parametro della funzione

Anche se i parametri sembrano essere gli stessi.

Anche se se si rimuove la condizione e si lascia solo

OrderDelete(ticketD);

OrderDelete(ticketUP);

si cancella con successo (ma mi serve per condizione). Cosa faccio di sbagliato? Qui c'è tutta la storia:

Poiché deve essere selezionato attraverso OrderSelect, il tuo valoreticketD è perso, e molto probabilmente lì invece di ticket, qualche yukhnya, prova a stampare, e confronta. E in generale, questo stile di scrittura è senza senso
 
Vitaly Muzichenko:
Poiché deve essere selezionato tramite OrderSelect, il tuo valoreticketD è perso, e molto probabilmente c'è qualche stronzata al posto del biglietto, prova a stamparlo e confrontalo.

È perché la funzione di cancellazione è attivata dalla condizione che il valore è perso? Ho provato a scriverlo così:

if (x!=maxpr1){x=maxpr1; OrderDelete(ticketD);}

OrderDelete(ticketUP);

sulla condizione in arrivo per "ticketD" scrive gli stessi errori, e l'ordine"ticketUP" viene cancellato con successo ad ogni tick.

 
Vitaly Muzichenko:
E in generale, questo stile di scrittura non ha senso.
Ho appena iniziato, sono benvenuti i commenti.
 
spoiltboy:
Ho appena iniziato, sono benvenuti i commenti.
incollare il codice con "SRC" in modo da poterlo guardare
 
Renat Akhtyamov:
inserire il codice tramite "SRC" in modo da poter guardare
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:

È perché la funzione di cancellazione è attivata dalla condizione che il valore è perso? Ho provato a scriverlo così:

if (x!=maxpr1){x=maxpr1; OrderDelete(ticketD);}

OrderDelete(ticketUP);

Quando arriva la condizione per "ticketD", scrive gli stessi errori, e l'ordine"ticketUP" viene cancellato con successo ad ogni tick.

Dovremmo controllare l'esistenza dell'ordine, e se ce n'è uno con tale biglietto, lo cancelliamo; se non c'è, non facciamo nulla. Quello che succede è che l'ordine è già cancellato, e si continua a cancellarlo di nuovo
 
Vitaly Muzichenko:
Dovremmo controllare l'esistenza dell'ordine e se ce n'è uno con tale segno di spunta, lo cancelleremo, altrimenti non faremo nulla. Quello che succede è che l'ordine è già stato cancellato e tu continui a cancellarlo di nuovo

In questa voce, l'ordine conticketUP viene prima aperto e poi cancellato ad ogni tick, mentre l'ordine tikcetD, se si verifica la condizione corrispondente, genera un errore di cancellazione. È secondo il giornale.

O forse ho confuso qualcosa?

 
spoiltboy:

ma la linea di fondo dei due è per caso ridondante?

if (x!=maxpr1){x=maxpr1; OrderDelete(ticketD);}
OrderDelete(ticketUP);//лишняя?

Se non è superfluo, dov'è la condizione di cancellazione?

Questa è una variante del codice che cerca di cancellare un ordine pendente su ogni tick, come penso

E il numero del biglietto non è chiaro.

Questo è ciò che restituirà l'errore.

 
spoiltboy:

In questa voce, l'ordine conticketUP viene prima aperto e poi cancellato ad ogni tick, mentre l'ordine tikcetD, se si verifica la condizione corrispondente, genera un errore di cancellazione. È secondo il giornale.

O forse sono confuso su qualcosa?

beh, correttamente.

qual è la domanda allora?

 
Renat Akhtyamov:

Bene, è così.

Qual è la domanda allora?

Questo è per ordini diversi. La funzione di rimuovere uno con una condizione, rimuovendo l'altro senza una condizione.

La domanda è perché nel mio caso la funzione di cancellazione senza condizione funziona con successo e se la metto in una condizione dà un errore quando la condizione si verifica.