borilunad: Victor, tu, Renat, in generale giustamente sottolineato, Alexey ha mostrato l'ultimo controllo necessario, e prima controllare tutti i controlli necessari per ogni parametro con tutte le sfumature per evitare ambiguità di significato e senza perdere alcuna condizione!
A cosa servirebbe? Perché sto resettando il valore _LastError in ogni funzione. Non è che sia costantemente appeso nella memoria...
hoz: A cosa serve? Perché ho resettato _LastError in ogni funzione. Non è che sia costantemente appeso nella memoria...
Mi dispiace, sei vittima delle tue funzioni e dei tuoi controlli! Emettere le informazioni sul grafico per interesse, e stampare i controlli degli errori solo dopo le funzioni di trading!
Possiamo vedere chiaramente che il valore di errore viene azzerato.
Poi riceve le informazioni sul mercato. Se la modifica è nel tester... allora... Faccio il test proposto da Alexei, e... se la modifica non ha successo, allora... scrive un registro e stampa nel registro...
In generale, possiamo vedere che non ci sono errori tra ResetLastError()... Non c'è niente di sbagliato lì.
Diario:
020:24:082013.08.2600:00 Kevin Martens_Moi_Myrei EURUSD,M15: PositionsManipulations::fOrderModify: Вошли в функцию
020:24:082013.08.2600:00 Kevin Martens_Moi_Myrei EURUSD,M15: PositionsManipulations::fOrderModify: До проверки на FREEZELEVEL и STOPLEVEL тикета № 2020:24:082013.08.2600:00 Kevin Martens_Moi_Myrei EURUSD,M15: PositionsManipulations::fOrderModify: Тикет № 2; OOP = 1.34048; SL = 1.34125; TP = 1.33362020:24:082013.08.2600:00 Kevin Martens_Moi_Myrei EURUSD,M15: PositionsManipulations::CheckLevelsBLOCK: Вошли в функцию
020:24:082013.08.2600:00 Kevin Martens_Moi_Myrei EURUSD,M15: PositionsManipulations::CheckLevelsBLOCK: Тикет № 2; fd_NewOpenPrice = 1.34048; fd_NewSL = 1.34125; fd_NewTP = 1.33362020:24:082013.08.2600:00 Kevin Martens_Moi_Myrei EURUSD,M15: PositionsManipulations::CheckLevelsBLOCK: fi_Type > 2 = true020:24:082013.08.2600:00 Kevin Martens_Moi_Myrei EURUSD,M15: PositionsManipulations::CheckLevelsBLOCK: Тикет № 2; fd_NewOpenPrice = 1.34048; fd_NewSL = 1.34125; fd_NewTP = 1.33362020:24:082013.08.2600:00 Kevin Martens_Moi_Myrei EURUSD,M15: PositionsManipulations::CheckLevelsBLOCK: Вышли из функции
020:24:082013.08.2600:00 Kevin Martens_Moi_Myrei EURUSD,M15: PositionsManipulations::fOrderModify: После проверки на FREEZELEVEL и STOPLEVEL тикета № 2020:24:082013.08.2600:00 Kevin Martens_Moi_Myrei EURUSD,M15: PositionsManipulations::fOrderModify: Тикет № 2; OOP = 1.34048; SL = 1.34125; TP = 1.33362220:24:082013.08.2600:00 Kevin Martens_Moi_Myrei EURUSD,M15: modify #2 sell limit 0.10 EURUSD at 1.34048 sl: 1.34125 tp: 1.33362 ok
320:24:082013.08.2600:00 Kevin Martens_Moi_Myrei EURUSD,M15: OrderModify error 1
Ho capito. Non ha aiutato. Ecco un pezzo di codice del mio metodo di modifica:
Potete vedere chiaramente che il valore dell'errore viene resettato lì.
Poi riceve le informazioni sul mercato. Se la modifica è nel tester... allora... Faccio il test proposto da Alexei, e... se la modifica non ha successo, allora... scrive un registro e stampa nel registro...
In generale, possiamo vedere che non ci sono errori tra ResetLastError()... Non c'è niente di sbagliato lì.
Diario:
È necessario registrare i valori precedenti di OOP, SL e TP prima del cambiamento per vedere se sono gli stessi di quelli nuovi, allora anche la causa dell'errore #1 sarà più chiara.
Lasciatemi spiegare. La modifica avviene nel metodo fOrderModify(). All'ingresso di questo metodo fOrderModify(), i valori attuali dei parametri dell'ordine e i nuovi valori previsti sono stampati all'inizio del corpo. Si può vedere:
Il Bid è sempre inferiore al SellLimit, quindi la linea if(New_OOP < Bid) non sarà mai vera... ...rispettivamente, la modifica viene implementata senza impedimenti.
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 è questa la domanda.
Si sbaglia di grosso. L'ultimo errore è ben resettato in molte funzioni importanti. Funziona così anche in WinAPI.
Questo è il motivo per cui dovreste salvare il codice di errore in una variabile locale subito dopo che si è verificato e non cercare di usarlo dopo aver cancellato questa variabile di sistema dieci volte in molte delle vostre funzioni intermedie.
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 in questo modo:
Nw output nel log:
Allora, 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?
E non si cerca di modificare gli ordini pendenti se nessuno dei parametri è stato modificato.
Victor, tu, Renat, in generale giustamente sottolineato, Alexey ha mostrato l'ultimo controllo necessario, e prima controllare tutti i controlli necessari per ogni parametro con tutte le sfumature per evitare ambiguità di significato e senza perdere alcuna condizione!
A cosa serve? Perché ho resettato _LastError in ogni funzione. Non è che sia costantemente appeso nella memoria...
ancora bisogno di controllare che se nessuno dei 3 parametri è cambiato, allora anche OrderModify non ha bisogno di essere toccato.
Ho capito. Non ha aiutato. Ecco un pezzo di codice del mio metodo di modifica:
Possiamo vedere chiaramente che il valore di errore viene azzerato.Poi riceve le informazioni sul mercato. Se la modifica è nel tester... allora... Faccio il test proposto da Alexei, e... se la modifica non ha successo, allora... scrive un registro e stampa nel registro...
In generale, possiamo vedere che non ci sono errori tra ResetLastError()... Non c'è niente di sbagliato lì.
Diario:
Ho capito. Non ha aiutato. Ecco un pezzo di codice del mio metodo di modifica:
Potete vedere chiaramente che il valore dell'errore viene resettato lì.Poi riceve le informazioni sul mercato. Se la modifica è nel tester... allora... Faccio il test proposto da Alexei, e... se la modifica non ha successo, allora... scrive un registro e stampa nel registro...
In generale, possiamo vedere che non ci sono errori tra ResetLastError()... Non c'è niente di sbagliato lì.
Diario:
È così...
Nell'Expert Advisor, chiamo il metodo della classe in questo modo:
Ecco il pezzo di classe che ci interessa:
Ecco il pezzo di registro che vogliamo:
Lasciatemi spiegare. La modifica avviene nel metodo fOrderModify(). All'ingresso di questo metodo fOrderModify(), i valori attuali dei parametri dell'ordine e i nuovi valori previsti sono stampati all'inizio del corpo. Si può vedere:
Questo pezzo è nel registro:
Potete vedere che i parametri sono tutti diversi. Non dovrebbero esserci problemi.È così...
Nell'Expert Advisor, chiamo il metodo della classe in questo modo:
Ecco il pezzo di classe che ci interessa:
Ecco il pezzo di registro che vogliamo:
Non capisco cosa c'entra il Bid, se l'ordine è in sospeso?
Il Bid è sempre inferiore al SellLimit, quindi la linea if(New_OOP < Bid) non sarà mai vera... ...rispettivamente, la modifica viene implementata senza impedimenti.
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 è questa la domanda.
Si sbaglia di grosso. L'ultimo errore è ben resettato in molte funzioni importanti. Funziona così anche in WinAPI.
Questo è il motivo per cui dovreste salvare il codice di errore in una variabile locale subito dopo che si è verificato e non cercare di usarlo dopo aver cancellato questa variabile di sistema dieci volte in molte delle vostre funzioni intermedie.
Spiacente, SellLimit richiede un dist:
non se (New_OOP < Bid) continua; mase (New_OOP-dist*Point < Bid) continua;
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 in questo modo:
Nw output nel log:
Allora, 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?