Richiesta non valida - ho appena iniziato e non riesco a capire... - pagina 8

 
papaklass:

L'ho implementato allo stesso modo, solo attraverso funzioni.


Capisco. Il tuo codice è simile a quello di MK - tra OrderCheck e OrderSend c'è un livello di gestione degli errori da parte dell'utente.

 
papaklass:

L'ho implementato in questo modo, solo attraverso le funzioni.

OrderCheck è implicito e necessariamente controllato all'interno di OrderSend.

Quindi, se l'ordine non è compilato correttamente, la risposta sarà restituita immediatamente senza rimandarla al server.

 
papaklass:

Vedi cosa dice il manuale a questo proposito:

Prima selezione: vediamo che la funzione è per le transazioni commerciali e nessun accenno ai controlli.

Beh, se dico che ci sono controlli, allora è vero.

Nessun ordine lascia il terminale senza controlli rigorosi.

Seconda evidenziazione: vediamo che i controlli vengono eseguiti sul server e gli sviluppatori raccomandano di usare OrderCheck() per controllare la richiesta prima di inviarla al server. Di nuovo, non si dice che OrderSend() esegue alcuna convalida.

Raccomandiamo specificamente che i trader abbiano l'opportunità di scoprire in anticipo se l'ordine viene riempito correttamente, e di intraprendere le azioni appropriate.

Chi vuole - può precontrollare. Chi non vuole, controlleremo e restituiremo comunque risposte simili per loro.

L'unico posto dove è menzionato che il controllo prima di inviare la richiesta è "In caso di successo del controllo di base delle strutture (controllo del puntatore) ....". Ma il controllo dei puntatori e il controllo dei valori dei campi della struttura di richiesta per gli errori non è la stessa cosa. E la raccomandazione degli sviluppatori di usare la funzione OrderCheck() è una prova indiretta che OrderSend() non esegue un vero controllo degli errori prima di inviare una richiesta al server. Altrimenti perché dovremmo fare "oliato": OrderSend() controlla prima, e poi lo stesso controllo deve essere eseguito di nuovo da OrderCheck()?

Quindi dal riferimento segue inequivocabilmente che il controllo viene eseguito solo sul server!

Nessuno perderà un flusso errato o eccessivo di richieste al server.

La logica di base è sufficiente per capire questo. E amplieremo la documentazione.

 
sergeev:

Non ce l'hai, tutti gli errori sono gestiti dalla logica di business.

Ne ho uno. La logica di business gestisce gli eventi relativi alla logica di business (ad esempio, il fallimento dell'ordine), ma tutto il resto (ad esempio, il ritardo della risposta del server) - un modello universale, basato su cui assolutamente qualsiasi esperto può essere implementato.

Ma MT5 è molto più complicato in termini di gestione dei codici di ritorno + asincronia.

È di questo che stiamo parlando, come ho similmente scritto prima, e non c'è nessuna informazione su questo argomento. E da anni gli MK stanno cercando in tutti i modi di dissociarsi dalla sua fornitura. Questo è quello che ho scritto - i concessionari beneficiano di un prodotto in cui ci sono punti che portano alla perdita, cioè per MQ è un fattore di aumento delle vendite. Ahimè, siamo in un mercato dove i concorrenti (noi e MQ), non i compagni.

Stai chiedendo l'impossibile a un involucro. La libreria standard non è la logica di business. È un wrapper "sopra" le funzioni del terminale. Un involucro sopra il ripieno della caramella.

Allora ha poco senso una tale strutturazione.

Ma l'involucro non può garantire nulla, perché sei tu che fai da garante. La vostra logica di business. :)

Proprio come la funzione di stampa non può garantire lo spazio libero sul disco e gli errori di registrazione. Dovete usare altre funzioni per la gestione degli errori e sono specifiche del caso.

Nemmeno il giusto wrapper può garantire tutto, ma può molte cose relative a funzioni correlate.

-Alexey-, parliamo di difetti specifici e tu dai voce a difetti specifici che vorresti correggere.

È già stato scritto più di una volta sullo specifico. Se MQ non è in grado di fornire una soluzione pronta, che almeno facciano un manuale sulla gestione degli errori e sui codici di ritorno. Sbloccato in ogni modo possibile. Nella documentazione per 4 questo era in parte presente (ad esempio aspettare 30 secondi in un caso simile), in parte gli utenti hanno individuato per esperienza la gestione di situazioni non documentate. Per 5 non c'è proprio nulla. E siccome c'è, nessuno lo userà.

Beh, se MQ risponde così perché l'infrastruttura di trading appena creata non lo permette in linea di principio, allora che dire - questo è un completo fallimento dell'intero progetto MT5, dato che ci sono anche una massa incredibile di altre secche.

Se volete, potete passare attraverso ogni codice di ritorno e guardare le principali situazioni possibili.

Lo farei volentieri con un esperto MQL5 Expert Advisor come te. Aspetteremo il tempo e la necessità. Grazie a Dio ho ancora il 4 che è molto più comodo in molti aspetti.

 

-Alexey-:

una soluzione pronta, almeno una guida alla gestione degli errori e ai codici di ritorno


quale codice causa problemi di elaborazione?


Codice

Identificatore

Descrizione

10004

CODICE COMMERCIALE_REQUOTE

Richiedere

10006

CODICE COMMERCIALE RIFIUTATO

Richiesta respinta

10007

TRADE_RETCODE_CANCEL

Richiesta cancellata dal commerciante

10008

CODICE COMMERCIALE PIAZZATO

Ordine effettuato

10009

COMMERCIO_RETCODICE_FATTO

Ordine eseguito

10010

TRADE_RETCODE_DONE_PARTIAL

Richiesta parzialmente eseguita

10011

ERRORE DI CODICE COMMERCIALE

Errore di elaborazione della richiesta

10012

TRADE_RETCODE_TIMEOUT

Richiesta cancellata per scadenza del tempo

10013

TRADE_RETCODE_INVALID

Richiesta errata

10014

TRADE_RETCODE_INVALID_VOLUME

Volume errato nella richiesta

10015

TRADE_RETCODE_INVALID_PRICE

Prezzo errato nella richiesta

10016

TRADE_RETCODE_INVALID_STOPS

Fermate errate nella richiesta

10017

TRADE_RETCODE_TRADE_DISABLED

Commercio proibito

10018

TRADE_RETCODE_MARKET_CLOSED

Il mercato è chiuso

10019

TRADE_RETCODE_NO_MONEY

Fondi insufficienti per l'esecuzione della richiesta

10020

PREZZO_COMMERCIALE_RETCODICE_CAMBIATO

I prezzi sono cambiati

10021

SCONTO_DI_RETROCODICE_COMMERCIALE

Nessun preventivo per elaborare la richiesta

10022

TRADE_RETCODE_INVALID_EXPIRATION

Data di scadenza non valida nella richiesta

10023

ORDINE_COMMERCIALE_RETCODE_CAMBIATO

Stato dell'ordine cambiato

10024

TRADE_RETCODE_TOO_MANY_REQUESTS

Richieste troppo frequenti

10025

TRADE_RETCODE_NO_CHANGES

Nessun cambiamento nella richiesta

10026

TRADE_RETCODE_SERVER_DISABLES_AT

Auto-trading negato dal server

10027

TRADE_RETCODE_CLIENT_DISABLES_AT

Autotrading vietato dal terminale del cliente

10028

TRADE_RETCODE_LOCKED

Richiesta bloccata per l'elaborazione

10029

TRADE_RETCODE_FROZEN

Ordine o posizione congelati

10030

TRADE_RETCODE_INVALID_FILL

Viene indicato un tipo di ordine di saldo non supportato

10031

CONNESSIONE_TRADE_RETCODE

Nessuna connessione al server commerciale

10032

TRADE_RETCODE_ONLY_REAL

L'operazione è consentita solo per i conti reali

10033

ORDINI CON LIMITE AL CODICE COMMERCIALE

Limite sul numero di ordini pendenti raggiunto

10034

TRADE_RETCODE_LIMIT_VOLUME RAGGIUNTO

Raggiunto il limite sul volume di ordini e posizioni per questo simbolo


Aggiornato: 2012.11.14
Документация по MQL5: Стандартные константы, перечисления и структуры / Состояние окружения / Информация об инструменте
Документация по MQL5: Стандартные константы, перечисления и структуры / Состояние окружения / Информация об инструменте
  • www.mql5.com
Стандартные константы, перечисления и структуры / Состояние окружения / Информация об инструменте - Документация по MQL5
 

Per esempio 10004. Dove sta scritto cosa fare? E c'era almeno qualcosa nella documentazione quadrupla:

Можно без задержки обновить данные при помощи функции RefreshRates и повторить попытку. Если ошибка не исчезает, необходимо прекратить все попытки торговых операций и изменить логику программы.

 
sergeev:

quale codice solleva problemi di elaborazione?

10006 (quale motivo viene rifiutato, quali altri motivi potrebbero esserci che non sono elencati negli altri codici?)

10011, 10013, 10028

 
A100:

10006 (quale motivo viene rifiutato, quali altri motivi potrebbero esserci che non sono indicati negli altri codici?)

10011, 10013, 10028

Io sono d'accordo con la domanda. MQ, una forte richiesta a te. Si prega di commentare questi 4 codici nel modo più dettagliato possibile.
 

Colleghi, già stanchi di cercare la verità. L'argomento è simile a quello di cui ho bisogno, quindi sto scrivendo qui, per favore aiutatemi!

Piazzo l'ordine con esecuzione immediata, mentre è appeso controllo il prezzo ogni tick e se è possibile lo seguo, ma per qualche motivo ottengo sempre l'errore 10013. Ho cercato in tutti i forum possibili e ho aggiunto quasi tutte le linee dell'ordine iniziale (anche se la descrizione dice che solo il simbolo, azione e sl e tp sono sufficienti per questo tipo di azione. Non funziona niente! Ecco il codice.

// проверяем условие на открытую сделку
if (f_IsDealOpened()>0)
{  
   // здесь надо написать условия для коррекции ордеров
 MqlTradeRequest chrequest={0};
    if (1)//(is_Str2)
   {
    PositionSelect(NULL);
    if(PositionGetInteger(POSITION_TYPE)==0)
    {
        chrequest.symbol=PositionGetSymbol(0);
        chrequest.order=PositionGetInteger(POSITION_IDENTIFIER);
        chrequest.volume=PositionGetDouble(POSITION_VOLUME);
        chrequest.action=TRADE_ACTION_SLTP;
        chrequest.sl = latest_price.bid - TrailingStop;
        chrequest.tp = PositionGetDouble(POSITION_TP);

     }
     else
     {
        chrequest.symbol=PositionGetSymbol(0);
        chrequest.order=PositionGetInteger(POSITION_IDENTIFIER);
        chrequest.volume=PositionGetDouble(POSITION_VOLUME);
        chrequest.action=TRADE_ACTION_SLTP;
        chrequest.sl = latest_price.ask + TrailingStop;
        chrequest.tp = PositionGetDouble(POSITION_TP);
        Alert(PositionSelect(NULL));
     
     }    
    }
     MqlTradeResult chresult;
     if (OrderSend(chrequest,chresult)==0) 
         {
             Alert("Ошибка расчета функции OrderSend!");
             return;
         }    
         // анализируем код возврата торгового сервера
         if(mresult.retcode==10009 || mresult.retcode==10008) //запрос выполнен или ордер успешно помещен
           {
            Alert("Ордер по изменению SL успешно помещен, тикет ордера #: ",mresult.order,"!!");
            open_order_ticket = mresult.order;
            open_order_price = mresult.price;
            return;
           }
         else
           {
            Alert("Запрос на измнение ордера не выполнен - код ошибки: ",GetLastError());
            return;
           }
   
   
   return;
}
Motivazione: