Есть прекрасная статья в которой автор создает функцию для проверки торгового потока https://www.mql5.com/ru/articles/1412
Вот пример проверки со статьи
У меня советник открывает две позиции в одном направлении с разными стопами. Вопрос: нужно ставить две проверки торгового потока, так как две сделки, или можно открывать после первой проверки ???
Перед совершением любой торговой операции нужно убедиться в том что:
- Автоторговля разрешена (нажата кнопка автоторговля). IsExpertsEnabled()
- Торговый поток свободен. IsTradeAllowed()
- Программа оперирует актуальным рыночным окружением. RefreshRates() и получение других рыночных параметров.
- Торговая операция передает корректные параметры. Проверка стопов, профитов, цен открытия времени истечения ордеров.
Эта проверка уже несколько лет не актуальна. Статья тоже.
Эта проверка уже несколько лет не актуальна. Статья тоже.
Есть прекрасная статья в которой автор создает функцию для проверки торгового потока https://www.mql5.com/ru/articles/1412
Вот пример проверки со статьи
У меня советник открывает две позиции в одном направлении с разными стопами. Вопрос: нужно ставить две проверки торгового потока, так как две сделки, или можно открывать после первой проверки ???
Разве OrderSend() возвращает integer?
По моему должно быть bool
Разве OrderSend() возвращает integer?
По моему должно быть bool
Никак. Просто не парьтесь торговым потоком, если у вас не 20 советников на открытии бара входят вместе.
Сейчас достаточно проверки IsTradeContextBusy() и маленького слипа. Городить семафоры смысла нет.
Гляньте пожалуйста функцию на открытие двух ордеров в одном направлении. Может что-то упустил ?
{
double price = 0;
if(IsTradeContextBusy())
{
Print("Торговый поток занят! Ждём, пока он освободиться...");
while(true)
{
// если эксперт был остановлен пользователем, прекращаем работу
if(IsStopped())
{
Print("Эксперт был остановлен пользователем!");
return;
}
// если торговый поток освободился, выходим из цикла и переходим к торговле
if(!IsTradeContextBusy())
{
break;
}
// если ни одно из условий остановки цикла не сработало, "ждём" 0,1 секунды
// и начинаем проверку сначала
Sleep(100);
}
}
Print("Торговый поток свободен! Пытаемся открыть позицию 1...");
// пытаемся открыть позицию
RefreshRates();
if(cmd == OP_BUY) price = Ask;
if(cmd == OP_SELL) price = Bid;
int ticket1 = OrderSend(Symbol(), cmd, lot, price, 3, stoploss, takeprofit1, comment + "_1", magicNumber, 0, Red);
if(ticket1<0)
Print("OrderSend1 завершилась с ошибкой #",GetLastError());
//--------------------------------------------------------------------------------------------------------------------
if(IsTradeContextBusy())
{
Print("Торговый поток занят! Ждём, пока он освободиться...");
while(true)
{
if(IsStopped())
{
Print("Эксперт был остановлен пользователем!");
return;
}
if(!IsTradeContextBusy())
{
break;
}
Sleep(100);
}
}
Print("Торговый поток свободен! Пытаемся открыть позицию 2...");
// пытаемся открыть позицию
RefreshRates();
if(cmd == OP_BUY) price = Ask;
if(cmd == OP_SELL) price = Bid;
int ticket2 = OrderSend(Symbol(), cmd, lot, price, 3, stoploss, takeprofit2, comment + "_2", magicNumber, 0, Green);
if(ticket2<0)
Print("OrderSend2 завершилась с ошибкой #",GetLastError());
return;
}
Сейчас достаточно проверки IsTradeContextBusy() и маленького слипа.
Гляньте пожалуйста функцию на открытие двух ордеров в одном направлении. Может что-то упустил ?
Ожидание освобождения торгового потока можно описать лаконичнее:
{
Print("Торговый поток занят! Ждём, пока он освободится...");
Sleep(100);
}
и оформить все это функцией.
Ну а далее по списку. Если, конечно, необходимо сделать все "правильно", с учетом всевозможных ситуаций.
- Проверить достаточность средств.
- Проверить правильность уровней SL и ТР.
- Проверить разрешение торговли в выбранном направлении. Пользователь может запретить эксперту торговать в одном из направлений.
- Проверить тот факт, что рынок не закрыт (или разрешена торговля по выбранному символу).
В работе одного советника не может возникнуть конфликта доступа к торговому потоку, все торговые операции синхронные (выполняются последовательно).
Вы рассчитываете на отправку 8-ми торговых приказов из одного терминала одновременно? Тогда все правильно.
Ахах.. ну 8 это уже многовато... ну по 2 с двух разных символов принципе может быть. Но суть я понял, спасибо.
Ожидание освобождения торгового потока можно описать лаконичнее:
{
Print("Торговый поток занят! Ждём, пока он освободится...");
Sleep(100);
}
Спасибо большое за разъяснение.
Еще у меня вопрос... как обработать ошибки открытия ордера. Когда ticket<0.
Цикл на несколько попыток открытия со слипом ? Да, и можно как-то сообщить пользователю когда пропадает интернет ?

- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Вы принимаете политику сайта и условия использования
Есть прекрасная статья в которой автор создает функцию для проверки торгового потока https://www.mql5.com/ru/articles/1412
Вот пример проверки со статьи
У меня советник открывает две позиции в одном направлении с разными стопами. Вопрос: нужно ставить две проверки торгового потока, так как две сделки, или можно открывать после первой проверки ???