Советники: SerialMA_EA

 

SerialMA_EA:

В основе сигналов советника лежит индикатор SerialMA;

Индикатор постоянно увеличивает свой период расчета, начиная от пересечения ценой его линии и до следующего пересечения. На каждом пересечении индикатор начинает расчет своего периода заново, с минимального значения.

Советник использует это его свойство:

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

В советнике можно выбрать два режима открытия позиций:

  • На каждом сигнале открывается одна соответствующая позиция. Противоположная позиция закрывается;
  • Позицию можно открыть только одну в одну сторону на первом сигнале. При этом противоположная позиция закрывается, все остальные сигналы пропускаются до появления противоположного сигнала, на котором позиция разворачивается (свинг).
Советник предназначен для работы на счетах с хэджингом. При запуске на неттинговом счете советник выдаст об этом предупреждение и выгрузится.

Для работы советника требуется, чтобы скомпилированный файл SerialMA.ex5 был установлен в стандартный каталог индикаторов терминала (Папка_вашего_терминала\MQL5\Indicators).

Советник позволяет включить/отключить разрешение на открытие длинных или коротких позиций, а также реверсировать сигналы индикатора - открывать вместо покупок продажи, и наоборот. Так же можно задать стоп лосс и тейк профит в пунктах. При ошибочно заданных размерах стоп лосс или тейк профит советник их автоматически корректирует под минимальный размер StopLevel, установленный для символа.

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

Стоит понимать, что этот советник предназначен для учебных целей.

Автор: Scriptor

 

Ура!

//+------------------------------------------------------------------+
//| Возвращает "неопределённое" состояние торгового окружения        |
//+------------------------------------------------------------------+
bool IsUncertainStateEnv(const string symbol_name,const ulong magic_number)
  {
   if(MQLInfoInteger(MQL_TESTER)) return false;
   int total=OrdersTotal();
   for(int i=total-1; i>WRONG_VALUE; i--)
     {
      if(OrderGetTicket(i)==0) continue;
      if(OrderGetInteger(ORDER_TYPE)>ORDER_TYPE_SELL) continue;
      if(OrderGetInteger(ORDER_MAGIC)!=magic_number) continue;
      if(!OrderGetInteger(ORDER_POSITION_ID) && OrderGetString(ORDER_SYMBOL)==symbol_name)
         return true;
     }
   return false;
  }

//+------------------------------------------------------------------+
//| Заполняет массивы тикетов позиций                                |
//+------------------------------------------------------------------+
bool FillingListTickets(const uint number_of_attempts)
  {
//--- Проверка состояния окружения
   int n=0,attempts=int(number_of_attempts<1 ? 1 : number_of_attempts);
   while(IsUncertainStateEnv(symb,InpMagic) && n<attempts && !IsStopped())
     {
      n++;
      Sleep(sleep);
     }
   if(n>=attempts && IsUncertainStateEnv(symb,InpMagic))
     {
      Print(__FUNCTION__,": Uncertain state of the environment. Please try again.");
      return false;
     }
//---

//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
//--- Проверка нулевых цен
   if(!RefreshRates() || Point()==0) return;
//--- Заполнение списков тикетов позиций
   int positions_total=PositionsTotal();
   if(prev_total!=positions_total)
     {
      if(FillingListTickets(num_attempts))
         prev_total=positions_total;
      else return;
     }
 

Эксперт не будет работать если не добавить эту строчку 

#include <Trade\SymbolInfo.mqh>

SerialMA_EA