Любые вопросы новичков по MQL4 и MQL5, помощь и обсуждение по алгоритмам и кодам - страница 26
Вы упускаете торговые возможности:
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Регистрация
Вход
Вы принимаете политику сайта и условия использования
Если у вас нет учетной записи, зарегистрируйтесь
Вот после того, как причешете свой код, он и для вас станет более читабелен, не говоря уже о других, которым нужно ещё и логику вашу понять. Там и видны будут все косяки.
А теперь удалите лишние парные фигурные скобки, а остальные расставьте нормально блоками, и увидите где у вас косяки в логике.
какие именно лишние?
У вас их там много лишних в коде - обработайте код стилизатором, и сразу увидите лишние пустые парные фигурные скобки.
Сделано
Сделано
Лучше так: if(count<=20) count++; - зачем считать дальше, если нужно только до 21?
2.{
if(Bars<801 || (IsTradeAllowed()==false)) //--- Проверим достаточна ли в истории баров для анализа и разрешение торговли
Print("Нет достаточного количества баров или торговля на текущем инструменте запрещена");
return;
}
А вот вигвам. Тут только проверка будет на кол-во баров и принт при count>20, остальной код будет работать и при count<=20.
3.
if(OrderSymbol()==Symbol() && OrderType()<2)
continue;
Если нужно учитывать только рыночные (а исходя из дальнейшего кода это так), то continue тут совсем не нужен.
4.
{
dummy=(OrderClose(OrderTicket(),OrderLots(),Bid,0,White));
{
if((dummy==true) && ((OrderSelect(i,SELECT_BY_POS,MODE_TRADES))==false))
PlaySound("music");
Sleep(20000);
PlaySound("music");
Sleep(20000);
PlaySound("music");
Sleep(20000);
dummy=false;
ExpertRemove();
}
}
Закрывает один ордер и самоустраняется? А если их больше? Да и целую минуту спать...
Дальше не смотрел, негде тестить пока.
1 ок, поправлю
2 непорядок, надо что следующие блоки не работали при count<20
3 ок , поправлю
4 да, минута, но надо чтоб запускался только если по текущему инструменту больше не осталось рыночных ордеров. Я пытался реализовать через отрицательный результат выбора ордеров, поэтому где - то надо поставить возврат, а ретурн в void OnTick() как то не смотрится. Опять же OrdersTotal() даст неверный результат если распихана масса ордеров по всем инструментам
2 непорядок, надо что следующие блоки не работали при count<20
Тогда надо добавить после блока else return;
4 да, минута, но надо чтоб запускался только если по текущему инструменту больше не осталось рыночных ордеров. Я пытался реализовать через отрицательный результат выбора ордеров, поэтому где - то надо поставить возврат, а ретурн в void OnTick() как то не смотрится. Опять же OrdersTotal() даст неверный результат если распихана масса ордеров по всем инструментам
А зачем три раза звук-то?
А так, можно всё сделать в два этапа: в первом цикле закрываете ордера, в следующем - пересчитываете все рыночные, чтобы проверить, не осталось ли не закрытых и если их нет, играют фанфары.
Только я всё равно не пойму, в чём прикол музычки после закрытия ордеров. Ну можно принт в журнал сделать, на почту сообщение отправить или уведомление на смарт, но превращать советника в музыкальную шкатулку?Тогда надо добавить после блока else return;
А зачем три раза звук-то?
А так, можно всё сделать в два этапа: в первом цикле закрываете ордера, в следующем - пересчитываете все рыночные, чтобы проверить, не осталось ли не закрытых и если их нет, играют фанфары.
Только я всё равно не пойму, в чём прикол музычки после закрытия ордеров. Ну можно принт в журнал сделать, на почту сообщение отправить или уведомление на смарт, но превращать советника в музыкальную шкатулку?Как отделить циклы?
Как привязать звук именно к последнему закрытому? потому что если ордеров нет то и советник не сработает
Ну и последнее. вариант с музыкой меня пока что устраивает
Как отделить циклы?
Как привязать звук именно к последнему закрытому? потому что если ордеров нет то и советник не сработает
Ну и последнее. вариант с музыкой меня пока что устраивает
Ну что значит как отделить? Ничего не надо отделять, надо два цикла написать, в общем-то одинаковых, только в одном - OrderClose(), а в другом - счётчик ордеров. Признаки выбора ордеров те же. Если счётчик=0 - то все ордера закрыты и можно играть музыку.
Да ещё вот что заметил, условие
{
if((Bid>=ma1-X*Point && Bid<ma1) || (Bid<=ma1+X*Point && Bid>ma1))
{
{y=true;}
}
}
вроде как не относится к какому-то конкретному ордеру, зачем оно в цикле?
Я бы его перед циклом закрытия проверял.