Errore #1 quando si modificano gli ordini

 

Come faccio a sbarazzarmi di questo cazzo di errore? Non ne posso più. Sto controllando ogni parametro di ingresso della funzione. Per me, al momento, è così:

if (OrderOpenPrice() != ND (fd_MurreyLevelsValue[11]))
   New_OOP = ND (fd_MurreyLevelsValue[11]);
else New_OOP = OrderOpenPrice();
if (OrderStopLoss() != ND (fd_MurreyLevelsValue[12]))
   New_SL = ND (fd_MurreyLevelsValue[12]);
else New_SL = OrderStopLoss();
if (OrderTakeProfit() != ND (fd_MurreyLevelsValue[2]))
   New_TP = ND (fd_MurreyLevelsValue[2]);
else New_TP = OrderTakeProfit();

Cioè, se il parametro non è stato cambiato, non c'è bisogno di cambiarlo. Non l'ho mai fatto prima, ma ho deciso di...

Poi i parametri vengono passati al metodo di modifica dell'ordine come segue:

 if (!fOrderModify (Ticket,  New_OOP, New_SL, New_TP))
{
   if (_LastError != 0)
     WriteLog (StringConcatenate (__FUNCTION__, ". В строке ", __LINE__, " ", CErrs.ErrorToString (_LastError)),
                     CLogs.GetNeedLogs(), CLogs.GetPrintUP(), CLogs.GetCommentUP());
}

Nw output nel log:

modify #2  sell limit 0.10 EURUSD at 1.34048 sl: 1.34125 tp: 1.33362 ok
OrderModify error 1

Quindi, il giornale ci notifica, come modifica: OK, ma poi un errore. Nessuno dei parametri è cambiato.

L'ordine è in sospeso. Quindi possiamo cambiare open, stop e take price. E questo, a quanto ho capito, non contraddiceva la documentazione.

Chi ha incontrato qualcosa del genere? Come risolverlo?

 
hoz:

Come faccio a sbarazzarmi di questo cazzo di errore? Non ne posso più. Sto controllando ogni parametro di ingresso della funzione. Per me, al momento, è così:

Cioè, se il parametro non è stato cambiato, non c'è bisogno di cambiarlo. Non l'ho mai fatto prima, ma ho deciso di...

Poi i parametri vengono passati al metodo di modifica dell'ordine come segue:

Nw output nel log:

Quindi, il giornale ci avvisa, come modifica: OK, ma poi... un errore. Nessuno dei parametri è cambiato.

L'ordine è in sospeso. Quindi possiamo cambiare open, stop e take price. E questo, a quanto ho capito, non contraddiceva la documentazione.

Chi ha incontrato qualcosa del genere? Come risolverlo?

State gestendo male il codice di errore, dimenticando che il codice di errore è già sovrascritto dopo le vostre numerose funzioni.

Quindi, quando si verifica un errore, è necessario salvare il codice di errore in una variabile locale e stamparlo da lì, dopo la massa delle chiamate successive.

 
Renat:

State gestendo male il codice di errore, dimenticando che il codice di errore è già sovrascritto dopo le vostre numerose funzioni.

Pertanto, quando si verifica un errore, il suo codice deve essere salvato in una variabile locale, e solo allora, dopo la massa delle vostre chiamate successive, stamparlo.

Perché non create anche un array di errori? È scritto nero su bianco nella documentazione che la variabile _LastError memorizza il numero dell'ultimo errore. E viene resettato dalla funzione ResetLastError(). Se non ci sono più errori tra le chiamate di _LastError, _LastError memorizza il valore dell'ultimo errore. Non c'erano più errori nel mio codice. Beh, non è questo il problema.

Inoltre, non è molto logico creare variabili per gli errori in ogni metodo e poi stampare queste variabili in Expert Advisors.

Dopo tutto, se c'è una variabile per raccogliere gli errori, perché crearne di nuovi?

 

evillive, cosa vuol dire che non ci sono controlli? Ho scritto sopra:

if (OrderOpenPrice() != ND (fd_MurreyLevelsValue[11]))    \\ Если текущая цена не равна новой.. из массива, то..
   New_OOP = ND (fd_MurreyLevelsValue[11]);               \\.. новая цена равна этому новому значению цены из массива( расчитанного ).
else New_OOP = OrderOpenPrice();                          \\ Иначе новая цена равно текущей цене выбранного ордера. Т.е. не изменяется.
if (OrderStopLoss() != ND (fd_MurreyLevelsValue[12]))
   New_SL = ND (fd_MurreyLevelsValue[12]);
else New_SL = OrderStopLoss();
if (OrderTakeProfit() != ND (fd_MurreyLevelsValue[2]))
   New_TP = ND (fd_MurreyLevelsValue[2]);
else New_TP = OrderTakeProfit();

Ho anche dato un commento per il primo. Anche se lì tutto è elementare.

Come altro si può controllare qui?

 
Faccio un doppio controllo che non sia uguale e diretto dove ci si aspetta!
 
evillive:
Mi sono reso conto, è per questo che ho pulito)))
Sei un maleducato! ;)
 
borilunad:
Faccio un doppio controllo che non sia uguale e diretto dove ci si aspetta!

Boris, cosa vuoi dire con questo? Perché ho scritto chiaramente che se il prezzo non è così... altrimenti... corrente... Qual è il punto? Si può controllare 20 volte... :) Non ha senso. È il secondo giorno che lotto con questo codice. Non ho mai incontrato un bug del genere prima d'ora. Ora l'ho affrontato. Ho già scritto e testato tutti questi metodi molte volte. Ho affrontato un problema qui.

Il fatto è che io sono più un fan delle tattiche leggermente diverse. Ma scrivendo l'ultimo Owls, mi sono imbattuto in questo inconveniente. Questo è me stesso non so dove scavare, perché pristrintovav tutto il codice in senso longitudinale e altrimenti non ho più pensieri. Ecco perché la funzione OrderModify() è integrata. E non conosco la sua attuazione.

 
hoz:

evillive, cosa vuol dire che non ci sono controlli? Ho scritto sopra:

Ho anche dato un commento per il primo. Anche se lì tutto è elementare.

Come altro si può controllare qui?

Victor, dopo aver controllato, il nuovo valore è assegnato o no... Dovete controllare.

if (OrderOpenPrice() != ND (fd_MurreyLevelsValue[11])  // Если текущая цена не равна новой.. из массива
 || OrderStopLoss() != ND (fd_MurreyLevelsValue[12])   // или 
 || OrderTakeProfit() != ND (fd_MurreyLevelsValue[2])) // или
  // если одно из условий выполнено пойдём в модифай... 
 
AlexeyVik:

Victor, dopo aver controllato che il nuovo valore sia assegnato o meno... Dovete controllare

Alexey, e dove hai un controllo per assicurarti che il valore delle funzioni passate sia invariato? Ho già tenuto conto di questo sopra. E la necessità di modifica in generale è fatta all'inizio. Ci sono dei livelli, se l'indicatore segnala che il livello è cambiato, andiamo avanti...

 
hoz:

Boris, cosa vuoi dire con questo? Perché ho scritto chiaramente che se il prezzo non è così... altrimenti... corrente... Qual è il punto? Si può controllare 20 volte... :) Non ha senso. È il secondo giorno che lotto con questo codice. Non ho mai incontrato un bug del genere prima d'ora. Ora l'ho affrontato. Ho già scritto e testato tutti questi metodi molte volte. Ho affrontato un problema qui.

Il fatto è che io sono più un fan delle tattiche leggermente diverse. Ma scrivendo l'ultimo Owls, mi sono imbattuto in questo inconveniente. Questo è me stesso non so dove scavare, perché stampanti tutto il codice in senso longitudinale e a testa in giù, non ho più alcun pensiero. Ecco perché la funzione OrderModify() è integrata. E non conosco la sua attuazione...

Victor, tu Renat, in generale, hai notato correttamente, Alexey ha mostrato il necessario ultimo controllo, e prima, controllare tutti i controlli necessari per ogni parametro con tutte le sfumature, per evitare ambiguità di significato e senza perdere alcuna condizione!
 
hoz:

evillive, cosa vuol dire che non ci sono controlli? Ho scritto sopra:

if (OrderOpenPrice() != ND (fd_MurreyLevelsValue[11]))    \\ Если текущая цена не равна новой.. из массива, то..
   New_OOP = ND (fd_MurreyLevelsValue[11]);               \\.. новая цена равна этому новому значению цены из массива( расчитанного ).
else New_OOP = OrderOpenPrice();                          \\ Иначе новая цена равно текущей цене выбранного ордера. Т.е. не изменяется.
if (OrderStopLoss() != ND (fd_MurreyLevelsValue[12]))
   New_SL = ND (fd_MurreyLevelsValue[12]);
else New_SL = OrderStopLoss();
if (OrderTakeProfit() != ND (fd_MurreyLevelsValue[2]))
   New_TP = ND (fd_MurreyLevelsValue[2]);
else New_TP = OrderTakeProfit();

Ho anche dato un commento per il primo. Anche se lì tutto è elementare.

Come altro si può controllare qui?

Dobbiamo anche controllare che se nessuno dei 3 parametri non è cambiato, allora OrderModify non dovrebbe essere toccato. O meglio, se almeno uno di questi parametri è cambiato, solo allora vai su OrderModify.