[АРХИВ!] Любой вопрос новичка, чтоб не захламлять форум. Профи, не проходите мимо. Без вас никуда - 4. - страница 545

 
То-есть советник последней версии оставил после себя тупо две строки.. 
 

Помогите, пожалуйста, правильно разобраться в проблеме поиска дивергенции на осциляторах. В данном случае пусть будет MACD. Набросал такой алгоритм:

1) Отсчитываем бары от начала и ищем пики на осциляторе:

   for(int i=limit; i=>0; i--)
    {
      MACD[i]=iMACD(Symb,TimeFrame,FastEMA,SlowEMA,5,PRICE_CLOSE,0,0) 
      
      if(MACD[i]>0)
       {
         if(MACD[i]>MACD[i-1] && MACD[i]>MACD[i-2] &&
            MACD[i]>MACD[i+1] && MACD[i]>MACD[i+2])
           {
            //--- здесь вносим в массив данные о баре, чтобы его можно было снова найти (1)
           }
       }
      if(MACD[i]<0)
       {
         if(MACD[i]<MACD[i-1] && MACD[i]<MACD[i-2] &&
            MACD[i]<MACD[i+1] && MACD[i]<MACD[i+2])
           {
            //--- здесь вносим в массив данные о баре, чтобы его можно было снова найти (2)
           }
       }

 2) Создаем массивы, содержащие время пиков:

datetime Date_up[], Date_dn[];

 и вносим в них значение MACD[i] при выполненном условии. При том, последний новый пик должен имеет индекс [n], а предпоследний [n+1];

3)  Рассмотрим дальнейшее решения в рамках ситуации (1):

if(Date_up[n]<Date_up[n+1]
 { // находим индекс бара
  int i1=iBarShift(Symb,TF,Date_up[n],false);
  int i2=iBarShift(Symb,TF,Date_up[n+1],false);
  // находим пик на графике баров в пределах пяти баров
  double High1=iHighest(Symb,TF,MODE_HIGH,5,i1);
  double High2=iHighest(Symb,TF,MODE_HIGH,5,i2);
  
  if(High1>High2)
   {
    // ЕСТЬ ДИВЕРГЕНЦИЯ!!!
   }
 }

 

Собственно проблема с пунктом 2: как правильно организовать такой массив, как в таймсерии, что бы при каждом новом пике значения сдвигались?  

 
merkulov.artem:

Дайте совет. На форуме, в библиотеке кодов и в интернете ответа не нашел, обращаюсь за помощью. Заранее спасибо.

 

1) "Файловые операции". Выдержка из учебника: Группа функций для работы с файлами.

Существует три каталога (с подкаталогами), в которых могут располагаться рабочие файлы:

/HISTORY/<текущий брокер> - специально для функции FileOpenHistory;

/EXPERTS/FILES - общий случай;

/TESTER/FILES - специально для тестирования.

Работа с файлами из других каталогов пресекается.

Вопрос: Существуют ли библиотеки, или команды, или иные способы заставить советник обращаться к каталогу, который укажет пользователь т.е. обращался к той папке, которую я укажу???

 

2) Вопрос: Существуют ли команды в MQL4 или библиотеки, с помощью которых можно выключить терминал по команде пользователя т.е. указать определенные условия, при выпадении которых терминал будет выключаться. Не просто вырубался советник, а именно полностью закрывался сам терминал???

1. https://www.mql5.com/ru/code/10873

Эта библиотека для работы с каталогами вне песочницы. Файл создаёте в песочнице, работаете с ним, переносите потом куда надо, Можно переносить копированием, перемещением (переименовывание), с помощью символьной ссылки на нужный Вам каталог, что тоже самое, что файл или каталог. Т.е. создаёте символьную ссылку в песочницу, работаете с ней, как с каталогом Вашего файла, потом удаляете её или не удаляете, если нужна.

2. https://www.mql5.com/ru/code/8577 

Это старая библиотека функций WinAPI с оболочкой MQL4. Все операции с файлами и каталогами. Не рекомендую. Надёжнее первой.

3. https://www.mql5.com/ru/code/9951

 // 2.2.1. Функция закрывает окно терминала МТ4. Функция возвращает TRUE, если сообщение поставлено в очередь, иначе - FALSE.
 bool ServiceMetaTraderClose();

 ==================

Артём, Вы в курсе, что запрещены здесть ники с точкой? Ваш профиль не виден из-за точки. 

 
......

Артём, Вы в курсе, что запрещены здесть ники с точкой? Ваш профиль не виден из-за точки. 

 


Спасибо огромное за совет. Работает только на Vista или на 7 тоже? или никто не проверял?

 Профиль создавал давно, про точку не знал. Пытался его редактировать давно и усердно, выдает ошибку "Ссылка не работает". Писал в супорт, тишина. Так что смирился, главную функцию он выполняет :)

 
merkulov.artem:


Спасибо огромное за совет. Работает только на Vista или на 7 тоже? или никто не проверял?

 Профиль создавал давно, про точку не знал. Пытался его редактировать давно и усердно, выдает ошибку "Ссылка не работает". Писал в супорт, тишина. Так что смирился, главную функцию он выполняет :)

Написано же ОТ Висты.
 
Dimka-novitsek:

Ещё раз здравствуйте!   

 

1. Представляете, чёрте- куда исчез последний эксперт.. Вот что осталось.

2. Можно ли его вернуть обратно! 

 


Доброго утра!

1. ТАКИМ баблецом рулишь! Давно пора брать себе отдельный камп с линией и-нета! ИМХО! (Когда не один за компом работаешь - подобное удаление не удивительно, скорее всего кто-то запарился, но это уже не важно - код снесён...) Опять же как такое (без подкидывания падлы) может быть, что код почти вытерт и кнопка "Сохранить" нажата (дискета вверху слева)? Даже если по запарке кто-то что-то и вытер, то зачем было сохранять? Опять же мотай на ус, что при написании проги необходимо выполнять промежуточные сохранения и в подобном случае продолжать с них (загружая крайний вариант промежуточного (окончательного - это если прога закончена) сейва).

2. Нельзя.

 

Всем привет!

Я доработал свой первый эксперт. Первоначальная задача  заключалась в правильном изложении своей идеи в виде кода.

Я прошу Вас посмотреть мой советник и высказать свое мнение.

Большое спасибо за помощь в написании советника!

Логика советника заключается в следующем:

-Цена пробивает уровень уровень RSI(1 условие),  

-потом с помощью флага отрабатывает второе условие(пробитие максимума или минимума за n количество баров)

-также ввел функцию чтоб не открывался второй ордер пока открыт первый.

Еще раз повторюсь, цель была в грамотном написании советника. Укажите пожалуйста на мои ошибки и недочеты. 

Заранее Вам благодарен. 

Файлы:
proboitrsi.mq4  12 kb
 
Спасибо!
 
Pacman:

Всем привет!

Я доработал свой первый эксперт. Первоначальная задача  заключалась в правильном изложении своей идеи в виде кода.

...

Решил вот немного пошариться в вашем коде.

1) Не хватает init() и deinit(),

2) Вот это:
for(int i=1; i<=OrdersTotal(); i++)
      {
       if(OrderSelect(i-1,SELECT_BY_POS)==true)
         {
          if(OrderSymbol() == Symb)
            {
             if(OrderMagicNumber()==777)
                return;
            }    
         }   
      }

можно сделать так:

if (OrdersTotal()>0)
{  for (int i=OrdersTotal()-1; i>=0; i--)
   {  if (OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
      {   if(OrderSymbol() != Symb) continue;
          if(OrderMagicNumber() != 777) continue;
          return;
      }
   }
}

3) Вот это

Symb=  Symbol();
...
Min_Lot= MarketInfo(Symbol(),MODE_MINLOT);
...
Steep=   MarketInfo(Symbol(),MODE_LOTSTEP);

запишите в init(), достаточно один раз при инициализации определить их, а не каждом тике, т.к. "вызов функции требует больше времени, чем обращение к переменной".

4) Логика этой записи мне не понятна

while(true)
...

когда while может быть false?

Это лишь немного что прямо бросилось в глаза.

 
paladin80:

Решил вот немного пошариться в вашем коде.


3) Вот это

запишите в init(), достаточно один раз при инициализации определить их, а не каждом тике, т.к. "вызов функции требует больше времени, чем обращение к переменной".


Только не забывайте что в init() не всегда доступно рыночное окружение
Причина обращения: