In generale, abbiamo bisogno di un qualche tipo di RefreshPositions() sincrono da parte degli sviluppatori che restituisca in modo affidabile dal server lo stato delle posizioni + gli ordini
Poi quello che ne ha bisogno invia ordini in modo asincrono, e quello che non ne ha bisogno aspetta la risposta del server nel corpo del programma.
Questo è il punto, l'ha fatto. Quando lo script finisce di funzionare, una o due posizioni rimangono sospese (a seconda di quante stampe vengono inserite nel codice).
Многие трейдеры на Московской бирже хотели бы автоматизировать свои торговые алгоритмы, но не знают с чего начать. Язык MQL5 предлагает не только огромный набор торговых функций, но и готовые классы, которые максимально облегчают первые шаги в алготрейдинге.
imho, anche OnTradeTransaction() non garantisce nulla, la sequenza degli eventi non è garantita, così come la consegna delle informazioni al terminale stesso - intendo il caso con i provider internet non più affidabili
non c'è un meccanismo che controlla OnTradeTransaction(), o ho o non ho ricevuto tutti gli eventi in stretta sequenza
PZY: Vorrei che qualche programmatore MQ non troppo occupato potesse trovare 2 ore per scrivere una funzione che restituisca una descrizione testuale del codice di errore. Sarebbe fantastico, e ci sarebbe meno scrittura in MQL5 e nessun bisogno in MT4 - lasciateglielo fare manualmente
//+------------------------------------------------------------------+//| Возврат стрингового результата торговой операции по его коду |//+------------------------------------------------------------------+string ResultRetcodeDescription(int retcode)
{
string str;
//----switch(retcode)
{
caseTRADE_RETCODE_REQUOTE:
str="TRADE_RETCODE_REQUOTE(Реквота)";
break;
caseTRADE_RETCODE_REJECT:
str="TRADE_RETCODE_REJECT(Запрос отвергнут)";
break;
caseTRADE_RETCODE_CANCEL:
str="TRADE_RETCODE_CANCEL(Запрос отменен трейдером)";
break;
caseTRADE_RETCODE_PLACED:
str="TRADE_RETCODE_PLACED(Ордер размещен)";
break;
caseTRADE_RETCODE_DONE:
str="TRADE_RETCODE_DONE(Заявка выполнена)";
break;
caseTRADE_RETCODE_DONE_PARTIAL:
str="TRADE_RETCODE_DONE_PARTIAL(Заявка выполнена частично)";
break;
caseTRADE_RETCODE_ERROR:
str="TRADE_RETCODE_ERROR(Ошибка обработки запроса)";
break;
caseTRADE_RETCODE_TIMEOUT:
str="TRADE_RETCODE_TIMEOUT(Запрос отменен по истечению времени)";
break;
caseTRADE_RETCODE_INVALID:
str="TRADE_RETCODE_INVALID(Неправильный запрос)";
break;
caseTRADE_RETCODE_INVALID_VOLUME:
str="Неправильный объем в запросе";
break;
caseTRADE_RETCODE_INVALID_PRICE:
str="TRADE_RETCODE_INVALID_VOLUME(Неправильная цена в запросе)";
break;
caseTRADE_RETCODE_INVALID_STOPS:
str="TRADE_RETCODE_INVALID_STOPS(Неправильные стопы в запросе)";
break;
caseTRADE_RETCODE_TRADE_DISABLED:
str="TRADE_RETCODE_TRADE_DISABLED(Торговля запрещена)";
break;
caseTRADE_RETCODE_MARKET_CLOSED:
str="TRADE_RETCODE_MARKET_CLOSED(Рынок закрыт)";
break;
caseTRADE_RETCODE_NO_MONEY:
str="TRADE_RETCODE_NO_MONEY(Нет достаточных денежных средств для выполнения запроса)";
break;
caseTRADE_RETCODE_PRICE_CHANGED:
str="TRADE_RETCODE_PRICE_CHANGED(Цены изменились)";
break;
caseTRADE_RETCODE_PRICE_OFF:
str="TRADE_RETCODE_PRICE_OFF(Отсутствуют котировки для обработки запроса)";
break;
caseTRADE_RETCODE_INVALID_EXPIRATION:
str="TRADE_RETCODE_INVALID_EXPIRATION(Неверная дата истечения ордера в запросе)";
break;
caseTRADE_RETCODE_ORDER_CHANGED:
str="TRADE_RETCODE_ORDER_CHANGED(Состояние ордера изменилось)";
break;
caseTRADE_RETCODE_TOO_MANY_REQUESTS:
str="TRADE_RETCODE_TOO_MANY_REQUESTS(Слишком частые запросы)";
break;
caseTRADE_RETCODE_NO_CHANGES:
str="TRADE_RETCODE_NO_CHANGES(В запросе нет изменений)";
break;
caseTRADE_RETCODE_SERVER_DISABLES_AT:
str="TRADE_RETCODE_SERVER_DISABLES_AT(Автотрейдинг запрещен сервером)";
break;
caseTRADE_RETCODE_CLIENT_DISABLES_AT:
str="TRADE_RETCODE_CLIENT_DISABLES_AT(Автотрейдинг запрещен клиентским терминалом)";
break;
caseTRADE_RETCODE_LOCKED:
str="TRADE_RETCODE_LOCKED(Запрос заблокирован для обработки)";
break;
caseTRADE_RETCODE_FROZEN:
str="TRADE_RETCODE_FROZEN(Ордер или позиция заморожены)";
break;
caseTRADE_RETCODE_INVALID_FILL:
str="TRADE_RETCODE_INVALID_FILL(Указан неподдерживаемый тип исполнения ордера по остатку)";
break;
caseTRADE_RETCODE_CONNECTION:
str="TRADE_RETCODE_CONNECTION(Нет соединения с торговым сервером)";
break;
caseTRADE_RETCODE_ONLY_REAL:
str="TRADE_RETCODE_ONLY_REAL(Операция разрешена только для реальных счетов)";
break;
caseTRADE_RETCODE_LIMIT_ORDERS:
str="TRADE_RETCODE_LIMIT_ORDERS(Достигнут лимит на количество отложенных ордеров)";
break;
caseTRADE_RETCODE_LIMIT_VOLUME:
str="TRADE_RETCODE_LIMIT_VOLUME(Достигнут лимит на объем ордеров и позиций для данного символа)";
break;
caseTRADE_RETCODE_INVALID_ORDER:
str="TRADE_RETCODE_INVALID_ORDER:Неверный или запрещённый тип ордера)";
break;
caseTRADE_RETCODE_POSITION_CLOSED:
str="TRADE_RETCODE_POSITION_CLOSED:Позиция с указанным POSITION_IDENTIFIER уже закрыта)";
break;
caseTRADE_RETCODE_INVALID_CLOSE_VOLUME:
str="TRADE_RETCODE_INVALID_CLOSE_VOLUME(Закрываемый объем превышает текущий объем позиции)";
break;
caseTRADE_RETCODE_CLOSE_ORDER_EXIST:
str="TRADE_RETCODE_CLOSE_ORDER_EXIST(Для указанной позиции уже есть ордер на закрытие)";
break;
caseTRADE_RETCODE_LIMIT_POSITIONS:
str="TRADE_RETCODE_LIMIT_POSITIONS(Количество открытых позиций, которое можно одновременно иметь на счете, может быть ограничено настройками сервера)";
break;
caseTRADE_RETCODE_REJECT_CANCEL:
str="TRADE_RETCODE_REJECT_CANCEL(Запрос на активацию отложенного ордера отклонен, а сам ордер отменен)";
break;
caseTRADE_RETCODE_LONG_ONLY:
str="TRADE_RETCODE_LONG_ONLY(Запрос отклонен, так как на символе установлено правило \"Разрешены только длинные позиции\")";
break;
caseTRADE_RETCODE_SHORT_ONLY:
str="TRADE_RETCODE_SHORT_ONLY(Запрос отклонен, так как на символе установлено правило \"Разрешены только короткие позиции\")";
break;
caseTRADE_RETCODE_CLOSE_ONLY:
str="TRADE_RETCODE_CLOSE_ONLY(Запрос отклонен, так как на символе установлено правило \"Разрешено только закрывать существующие позиции\")";
break;
caseTRADE_RETCODE_FIFO_CLOSE:
str="TRADE_RETCODE_FIFO_CLOSE(Запрос отклонен, так как для торгового счета установлено правило \"Разрешено закрывать существующие позиции только по правилу FIFO\")";
break;
case TRADE_RETCODE_HEDGE_PROHIBITED:
str="TRADE_RETCODE_HEDGE_PROHIBITED(Запрос отклонен, так как для торгового счета установлено правило \"Запрещено открывать встречные позиции по одному символу\")";
break;
//case : str=""; break;//case : str=""; break;//case : str=""; break;//case : str=""; break;default:
str="Неизвестный результат";
}
//----return(str);
}
Così la gente ha chiesto l'accesso alla scatola nera - l'ha ottenuto. Ora devi fare la sincronizzazione da solo. Chiesto? L'hanno fatto. L'hanno fatto? L'hanno fatto. È buono? Hanno detto che sarebbe stato bello. Una volta che è stato dato, è diventato cattivo.
1. Non l'ho chiesto io.
2. nessuno ha detto che il prezzo sarebbe stato l'integrità dei dati, che è molto più importante.
invece della nuda demagogia come "colpa nostra", potete offrire una soluzione senza stampelle?
Ho fatto lo stesso codice in mezz'ora dall'aiuto di ME - ho aperto i codici di errore, evidenziato il mouse, Ctrl+C , creato una pagina Excel vuota, Ctrl+V e aggiunto colonne con case: e virgolette
poi Ctrl+C+Ctrl+V in ME
Ok, a quanto pare "sopportare le avversità" non è solo un articolo del manuale militare, è più la nostra mentalità
Ho fatto lo stesso codice in mezz'ora dalla guida di ME - ho aperto i codici di errore, evidenziato il mouse, Ctrl+C , creato una pagina Excel vuota, Ctrl+V e aggiunto colonne con case: e virgolette
poi Ctrl+C+Ctrl+V in ME
Ok, a quanto pare "sopportare le avversità" non è solo un articolo del manuale militare, è più la nostra mentalità
sembra funzionare così:
ma è molto lento e non è una soluzione molto buona.
sembra funzionare così:
ma è molto lento e non è una soluzione molto buona.
Avete fatto quasi questa opzione.
Forum sul trading, sistemi di trading automatico e test di strategie di trading
Il grande e orribile MT4 Forever (o come strategizzare la migrazione)
fxsaber, 2021.05.09 00:36
Puoi usare questa condizione:
In generale, abbiamo bisogno di un qualche tipo di RefreshPositions() sincrono da parte degli sviluppatori che restituisca in modo affidabile dal server lo stato delle posizioni + gli ordini
Poi quello che ne ha bisogno invia ordini in modo asincrono, e quello che non ne ha bisogno aspetta la risposta del server nel corpo del programma.
Questo è il punto, l'ha fatto. Quando lo script finisce di funzionare, una o due posizioni rimangono sospese (a seconda di quante stampe vengono inserite nel codice).
Codice:
Risultato:
Per completare il quadro, aggiungete l'ascoltatore di eventi commerciali dall'articolo https://www.mql5.com/ru/articles/2513 al grafico adiacente
Per vedere l'ordine degli eventi
+ addrequest_id - ID della richiesta da impostare dal terminale quando viene inviato l'ordine
Quanti ordini vengono realmente inviati lì
imho, anche OnTradeTransaction() non garantisce nulla, la sequenza degli eventi non è garantita, così come la consegna delle informazioni al terminale stesso - intendo il caso con i provider internet non più affidabili
non c'è un meccanismo che controlla OnTradeTransaction(), o ho o non ho ricevuto tutti gli eventi in stretta sequenza
PZY: Vorrei che qualche programmatore MQ non troppo occupato potesse trovare 2 ore per scrivere una funzione che restituisca una descrizione testuale del codice di errore. Sarebbe fantastico, e ci sarebbe meno scrittura in MQL5 e nessun bisogno in MT4 - lasciateglielo fare manualmente
;)
Trovato in codobase e gli ultimi codici aggiunti
Così la gente ha chiesto l'accesso alla scatola nera - l'ha ottenuto.
Ora devi fare la sincronizzazione da solo. Chiesto? L'hanno fatto. L'hanno fatto? L'hanno fatto. È buono? Hanno detto che sarebbe stato bello. Una volta che è stato dato, è diventato cattivo.
1. Non l'ho chiesto io.
2. nessuno ha detto che il prezzo sarebbe stato l'integrità dei dati, che è molto più importante.
invece della nuda demagogia come "colpa nostra", potete offrire una soluzione senza stampelle?
Trovato in kodobase e aggiunto gli ultimi codici
Ho fatto lo stesso codice in mezz'ora dall'aiuto di ME - ho aperto i codici di errore, evidenziato il mouse, Ctrl+C , creato una pagina Excel vuota, Ctrl+V e aggiunto colonne con case: e virgolette
poi Ctrl+C+Ctrl+V in ME
Ok, a quanto pare "sopportare le avversità" non è solo un articolo del manuale militare, è più la nostra mentalità
1. Non l'ho chiesto io.
2. nessuno ha detto che il prezzo sarebbe stato l'integrità dei dati, che è molto più importante.
Invece della demagogia della "colpa", può suggerire una soluzione senza stampelle?
Ho fatto lo stesso codice in mezz'ora dalla guida di ME - ho aperto i codici di errore, evidenziato il mouse, Ctrl+C , creato una pagina Excel vuota, Ctrl+V e aggiunto colonne con case: e virgolette
poi Ctrl+C+Ctrl+V in ME
Ok, a quanto pare "sopportare le avversità" non è solo un articolo del manuale militare, è più la nostra mentalità