Вы упускаете торговые возможности:
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Регистрация
Вход
Вы принимаете политику сайта и условия использования
Если у вас нет учетной записи, зарегистрируйтесь
Как это не то. Читайте справку по этой функции. TerminalInfoInteger(TERMINAL_TRADE_ALLOWED)
TERMINAL_TRADE_ALLOWED
Разрешение на торговлю
bool
Я видел... Моя слова: "перечисленные методы" в том числе и к нему относятся.
быстро и без запросов - это только если отслеживать поступающие события с рынка, то есть обрабатывать TradeEvent, BookEvent - если событий говорящих о том что рынок работает не поступает N-цать секунд то стоит наверное сделать запрос "жив ли рынок"
К сожалению, бывают моменты, когда перечисленные методы не исключают появления сообщения в терминале "...[Market closed]....". Тема неоднократно обжёвывалась на форуме, что-то вроди бы предпринималось...
Однако до сих пор приходится пользоваться костылями.
P.S. Если я ошибаюсь, не отследил, как проблему разрулили, ткните плиз носом "что, где когда".
Приведите пример, где не работает данный код.
Как я сказал раньше, "...бывают моменты, когда перечисленные методы не исключают появления сообщения в терминале "...[Market closed]...." . К сожалению я не могу формализовать совокупность стечений обстоятельств и привести конкретный пример, но с высокой степенью вероятности смогу такой момент отследить. Если есть сомнение в том, что я говорю правду, можем провести небольшой эксперимент. Для его чистоты Вы напишите и прокомпилите и пришлёте мне небольшой советничек, задача которого всего лишь подтвердить (или не подтвердить) пригодность Вашего кода для предотвращения ошибок в торговле с появлением сообщения "[Market closed]". Пусть алгоритм работы советничка будет следующим: По приходу нового бара нужно открыть сделку в любом направлении. Если возникнет ошибка, пусть советничек отправит Вам об этом пуш уведомление (это будет гарантией, что я запустил именно его, а не свою подделку). Если мне удастся отловить сбойный момент, я Вам пришлю лог с ошибками.
Как Вам идея? Надеюсь, не очень обременителное предложение?
Можете тему показать где это максимально подробно пережевано?
https://www.mql5.com/ru/search#!keyword=Market%20closed&module=mql5_module_forum&page=1
Там не всё в тему, но развлечься есть чем
Как я сказал раньше, "...бывают моменты, когда перечисленные методы не исключают появления сообщения в терминале "...[Market closed]...." . К сожалению я не могу формализовать совокупность стечений обстоятельств и привести конкретный пример, но с высокой степенью вероятности смогу такой момент отследить. Если есть сомнение в том, что я говорю правду, можем провести небольшой эксперимент. Для его чистоты Вы напишите и прокомпилите и пришлёте мне небольшой советничек, задача которого всего лишь подтвердить (или не подтвердить) пригодность Вашего кода для предотвращения ошибок в торговле с появлением сообщения "[Market closed]". Пусть алгоритм работы советничка будет следующим: По приходу нового бара нужно открыть сделку в любом направлении. Если возникнет ошибка, пусть советничек отправит Вам об этом пуш уведомление (это будет гарантией, что я запустил именно его, а не свою подделку). Если мне удастся отловить сбойный момент, я Вам пришлю лог с ошибками.
Как Вам идея? Надеюсь, не очень обременителное предложение?
Форум по трейдингу, автоматическим торговым системам и тестированию торговых стратегий
Библиотеки: MT4Orders
fxsaber, 2017.02.16 15:16
#define TOSTRING(A) #A + " = " + (string)(A) + "\n"
#define TOSTRING2(A) #A + " = " + EnumToString(A) + " (" + (string)(A) + ")\n"
string ToString( const MqlTradeRequest &Request )
{
return(TOSTRING2(Request.action) + TOSTRING(Request.magic) + TOSTRING(Request.order) +
TOSTRING(Request.symbol) + TOSTRING(Request.volume) + TOSTRING(Request.price) +
TOSTRING(Request.stoplimit) + TOSTRING(Request.sl) + TOSTRING(Request.tp) +
TOSTRING(Request.deviation) + TOSTRING2(Request.type) + TOSTRING2(Request.type_filling) +
TOSTRING2(Request.type_time) + TOSTRING(Request.expiration) + TOSTRING(Request.comment) +
TOSTRING(Request.position) + TOSTRING(Request.position_by));
}
string ToString( const MqlTradeResult &Result )
{
return(TOSTRING(Result.retcode) + TOSTRING(Result.deal) + TOSTRING(Result.order) +
TOSTRING(Result.volume) + TOSTRING(Result.price) + TOSTRING(Result.bid) +
TOSTRING(Result.ask) + TOSTRING(Result.comment) + TOSTRING(Result.request_id) +
TOSTRING(Result.retcode_external));
}
ENUM_DAY_OF_WEEK GetDayOfWeek( const datetime time )
{
MqlDateTime sTime = {0};
::TimeToStruct(time, sTime);
return((ENUM_DAY_OF_WEEK)sTime.day_of_week);
}
bool SessionTrade( const string Symb )
{
datetime TimeNow = ::TimeTradeServer();
const ENUM_DAY_OF_WEEK DayOfWeek = GetDayOfWeek(TimeNow);
TimeNow %= 24 * 60 * 60;
bool Res = false;
datetime From, To;
for (int i = 0; (!Res) && ::SymbolInfoSessionTrade(Symb, DayOfWeek, i, From, To); i++)
Res = ((From <= TimeNow) && (TimeNow < To));
return(Res);
}
bool SymbolTrade( const string Symb )
{
MqlTick Tick;
return(::SymbolInfoTick(Symb, Tick) ? ((Tick.bid != 0) && (Tick.ask != 0) && SessionTrade(Symb) &&
((ENUM_SYMBOL_TRADE_MODE)::SymbolInfoInteger(Symb, SYMBOL_TRADE_MODE) == SYMBOL_TRADE_MODE_FULL)) : false);
}
#define MT4ORDERS_BENCHMARK Alert(MT4ORDERS::LastTradeRequest.symbol + " " + \
(string)MT4ORDERS::LastTradeResult.order + " " + \
MT4ORDERS::LastTradeResult.comment); \
Print(ToString(MT4ORDERS::LastTradeRequest) + \
ToString(MT4ORDERS::LastTradeResult));
#include <MT4Orders.mqh> // https://www.mql5.com/ru/code/16006
#define Point (SymbolInfoDouble(Symb, SYMBOL_POINT))
#define Bid (SymbolInfoDouble(Symb, SYMBOL_BID))
#define Ask (SymbolInfoDouble(Symb, SYMBOL_ASK))
void Benchmark( string Symb = NULL, uint LimitOffset = 1000 )
{
if (Symb == NULL)
Symb = _Symbol;
if (SymbolTrade(Symb))
{
const bool DemoAccount = ((ENUM_ACCOUNT_TRADE_MODE)AccountInfoInteger(ACCOUNT_TRADE_MODE) == ACCOUNT_TRADE_MODE_DEMO);
const double MinLot = SymbolInfoDouble(Symb, SYMBOL_VOLUME_MIN);
const uint StopLevel = (uint)SymbolInfoInteger(Symb, SYMBOL_TRADE_STOPS_LEVEL);
if (StopLevel != 0)
LimitOffset = StopLevel;
if (DemoAccount && OrderSelect(OrderSend(Symb, OP_BUY, MinLot, Ask, 100, 0, 0, __FUNCTION__ + "_Position"), SELECT_BY_TICKET))
{
OrderModify(OrderTicket(), OrderOpenPrice(), 0, Bid + LimitOffset * Point, 0);
OrderClose(OrderTicket(), OrderLots(), Bid, 100);
}
double PriceMin = SymbolInfoDouble(Symb, SYMBOL_SESSION_PRICE_LIMIT_MIN);
if (PriceMin < Point)
PriceMin = MathMax(Ask - LimitOffset * Point, Point);
if ((PriceMin < Ask) &&
OrderSelect(OrderSend(Symb, OP_BUYLIMIT, MinLot, PriceMin, 100, 0, 0, __FUNCTION__ + "_Order"), SELECT_BY_TICKET) &&
(!OrderDelete(OrderTicket())) && (!DemoAccount))
{
Alert("OrderDelete ERROR, Check Now!");
ExpertRemove();
}
}
}
void OnStart()
{
if ((ENUM_ACCOUNT_TRADE_MODE)AccountInfoInteger(ACCOUNT_TRADE_MODE) == ACCOUNT_TRADE_MODE_DEMO) // Закомментировать, если хочется проверить реал
{
Alert(TOSTRING(AccountInfoString(ACCOUNT_SERVER)));
Alert(TOSTRING(TerminalInfoInteger(TERMINAL_PING_LAST)));
while (!IsStopped())
for (int i = SymbolsTotal(true) - 1; (i >= 0) && (!IsStopped()); i--)
Benchmark(SymbolName(i, true));
}
}
С помощью этого скрипта удалось найти проблемы с исполнением в MT5. Рекомендую проверять свою связку Терминал+Торговый Сервер и, в случае проблем, сообщать в Сервисдеск.
Бежит по всем символам в Обзоре рынка и совершает торговые операции на тех, что проходят сабж. Можете выкинуть Order-функции и впихнуть свои в Benchmark-функцию.
Забиваете перед запуском Обзор рынка всякими дрянь-символами под завязку и запускаете скрипт. Словит Market Closed почти сразу, если проверочный код ошибочный.
Виталий, функция
Я думал, что это аналог функции из mql4 IsTradeAllowed, которая помимо проверки разрешения на торговлю экспертами проверяет возможна ли торговля вообще. По крайней мере в своих экспертах я использую эту функцию и еще не разу не заметил что бы эксперт пытался торговать в выходные. Вы у разработчиков не пробовали спрашивать об этом, может просто они не посчитали нужным полностью задокументировать возможности этой функции. Или проверить экспериментальным путем.
Один из наиболее сильных тестов (наглая реклама, конечно)
Бежит по всем символам в Обзоре рынка и совершает торговые операции на тех, что проходят сабж. Можете выкинуть Order-функции и впихнуть свои в Benchmark-функцию.
Забиваете перед запуском Обзор рынка всякими дрянь-символами под завязку и запускаете скрипт. Словит Market Closed почти сразу, если проверочный код ошибочный.
Интересная идея, но не могу запустить и проверить. Можете сделать без MT4Orders.mqh ? не хочется ковыряться в дебрях MT4.