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.
È 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.
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.
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.
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 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.
E in generale, questo stile di scrittura non ha senso.
Ho appena iniziato, sono benvenuti i commenti.
inserire il codice tramite "SRC" in modo da poter guardare
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);}
È 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 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?
ma la linea di fondo dei due è per caso ridondante?
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.
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?
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.