Любые вопросы новичков по MQL4 и MQL5, помощь и обсуждение по алгоритмам и кодам - страница 26

 
trader781:

Вот после того, как причешете свой код, он и для вас станет более читабелен, не говоря уже о других, которым нужно ещё и логику вашу понять. Там и видны будут все косяки.

ок, так лучше?
А теперь удалите лишние парные фигурные скобки, а остальные расставьте нормально блоками, и увидите где у вас косяки в логике.
 
Artyom Trishkin:
А теперь удалите лишние парные фигурные скобки, а остальные расставьте нормально блоками, и увидите где у вас косяки в логике.
какие именно лишние?
 
trader781:
какие именно лишние?
У вас их там много лишних в коде - обработайте код стилизатором, и сразу увидите лишние пустые парные фигурные скобки.
 
Artyom Trishkin:
У вас их там много лишних в коде - обработайте код стилизатором, и сразу увидите лишние пустые парные фигурные скобки.
Сделано
Файлы:
 
trader781:
Сделано
Позже гляну - дела на часа четыре, не меньше...
 
trader781:
Сделано
1.  count++;  //  считаем тики от запуска программы

Лучше так: if(count<=20)    count++; - зачем считать дальше, если нужно только до 21?

2. 
   if(count>20) //  если количество тиков больше начинаем работу ... и дальше код эксперта
     {
      if(Bars<801 || (IsTradeAllowed()==false)) //--- Проверим достаточна ли в истории баров для анализа и разрешение торговли
         Print("Нет достаточного количества баров или торговля на текущем инструменте запрещена");
      return;
     }

А вот вигвам. Тут только проверка будет на кол-во баров и принт при count>20, остальной код будет работать и при count<=20.

3.  

if(OrderSymbol()==Symbol() && OrderType()<2)
            continue;

Если нужно учитывать только рыночные (а исходя из дальнейшего кода это так), то  continue тут совсем не нужен.

4.

         if(y==true && (OrderType()==0)) //+-----покупка
           {
            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()  даст неверный результат если распихана масса ордеров по всем инструментам

 
trader781:

2   непорядок, надо что следующие блоки не работали при count<20

Тогда надо добавить после блока else return;

4  да, минута,  но надо чтоб запускался только если по текущему инструменту больше не осталось рыночных ордеров. Я пытался реализовать через отрицательный результат выбора ордеров, поэтому где - то надо поставить возврат, а ретурн в void OnTick() как то не смотрится. Опять же OrdersTotal()  даст неверный результат если распихана масса ордеров по всем инструментам

А зачем три раза звук-то?

А так, можно всё сделать в два этапа: в первом цикле закрываете ордера, в следующем - пересчитываете все рыночные, чтобы проверить, не осталось ли не закрытых и если их нет, играют фанфары.

Только я всё равно не пойму, в чём прикол музычки после закрытия ордеров. Ну можно принт в журнал сделать, на почту сообщение отправить или уведомление на смарт, но превращать советника в музыкальную шкатулку?
 
Vitalie Postolache:

Тогда надо добавить после блока else return;

А зачем три раза звук-то?

А так, можно всё сделать в два этапа: в первом цикле закрываете ордера, в следующем - пересчитываете все рыночные, чтобы проверить, не осталось ли не закрытых и если их нет, играют фанфары.

Только я всё равно не пойму, в чём прикол музычки после закрытия ордеров. Ну можно принт в журнал сделать, на почту сообщение отправить или уведомление на смарт, но превращать советника в музыкальную шкатулку?

Как отделить циклы?

Как привязать звук именно к последнему закрытому? потому что если ордеров нет то и советник не сработает

Ну и последнее. вариант с музыкой меня пока что устраивает

 
trader781:

Как отделить циклы?

Как привязать звук именно к последнему закрытому? потому что если ордеров нет то и советник не сработает

Ну и последнее. вариант с музыкой меня пока что устраивает

Ну что значит как отделить? Ничего не надо отделять, надо два цикла написать, в общем-то одинаковых, только в одном - OrderClose(), а в другом - счётчик ордеров. Признаки выбора ордеров те же. Если счётчик=0 - то все ордера закрыты и можно играть музыку.

Да ещё вот что заметил, условие 

         if(Uslovie1==true) //Bid+ma6
           {
            if((Bid>=ma1-X*Point && Bid<ma1) || (Bid<=ma1+X*Point && Bid>ma1))
              {
                 {y=true;}
              }
           }

вроде как не относится к какому-то конкретному ордеру, зачем оно в цикле?  

Я бы его перед циклом закрытия проверял.