← К каталогу
Исходный код · ID 3429

mss ea.mq5

Вы автор или правообладатель?

Сообщите нам, если считаете, что материал размещён без разрешения.

Краткий обзор

О программе

Это торговый советник для MetaTrader 5, работающий на событии OnTick. Он анализирует график цен текущего инструмента и таймфрейма, определяя точки разворота цены — swing highs и swing lows — и отслеживает пробой этих уровней. Советник хранит историю найденных разворотов и сравнивает их для определения смены рыночной структуры (Market Structure Shift). При обнаружении пробоя он выводит соответствующие сообщения в журнал и рисует графические объекты на графике: стрелки в точках разворотов и линии пробоя с подписями. Советник не выполняет никаких торговых операций и не взаимодействует с торговым терминалом для размещения или управления ордерами; он является исключительно аналитическим и визуализирующим инструментом.

Получить полный код

Поиск по коду файла

#property version   "1.00"

double swingHighs_Array[];
double swingLows_Array[];

int OnInit()
  {
      // код доступен только после оплаты
   }

void OnDeinit(const int reason)
  {

  }

void OnTick(){
      // код доступен только после оплаты
   }

   static bool isNewBar = false;
   int currBars = iBars(_Symbol,_Period);
   static int prevBars = currBars;
   if (prevBars == currBars){isNewBar = false;}
   else if (prevBars != currBars){isNewBar = true; prevBars = currBars;}

   const int length = 10; // >2
   int right_index, left_index;
   int curr_bar = length;
   bool isSwingHigh = true, isSwingLow = true;
   static double swing_H = -1.0, swing_L = -1.0;

   if (isNewBar){
      for (int a=1; a<=length; a++){
         right_index = curr_bar - a;
         left_index = curr_bar + a;

         if ( (high(curr_bar) <= high(right_index)) || (high(curr_bar) < high(left_index)) ){
            isSwingHigh = false;
         }
         if ( (low(curr_bar) >= low(right_index)) || (low(curr_bar) > low(left_index)) ){
            isSwingLow = false;
         }
      }

      if (isSwingHigh){
         swing_H = high(curr_bar);
         Print("WE DO HAVE A SWING HIGH @ BAR INDEX ",curr_bar," H: ",high(curr_bar));
         drawSwingPoint(TimeToString(time(curr_bar)),time(curr_bar),high(curr_bar),77,clrBlue,-1);

         if (ArraySize(swingHighs_Array) < 2){
            ArrayResize(swingHighs_Array,ArraySize(swingHighs_Array)+1);
            swingHighs_Array[ArraySize(swingHighs_Array)-1] = swing_H;
         }
         else if (ArraySize(swingHighs_Array) == 2){
            ArrayRemove(swingHighs_Array,0,1);
            ArrayResize(swingHighs_Array,ArraySize(swingHighs_Array)+1);
            swingHighs_Array[ArraySize(swingHighs_Array)-1] = swing_H;
            Print("POPULATED! New swing high prices data is as below:");
            ArrayPrint(swingHighs_Array,_Digits," , ");
         }

      }
      if (isSwingLow){
         swing_L = low(curr_bar);
         Print("WE DO HAVE A SWING LOW @ BAR INDEX ",curr_bar," L: ",low(curr_bar));
         drawSwingPoint(TimeToString(time(curr_bar)),time(curr_bar),low(curr_bar),77,clrRed,+1);

         if (ArraySize(swingLows_Array) < 2){
            ArrayResize(swingLows_Array,ArraySize(swingLows_Array)+1);
            swingLows_Array[ArraySize(swingLows_Array)-1] = swing_L;
         }
         else if (ArraySize(swingLows_Array) == 2){
            ArrayRemove(swingLows_Array,0,1);
            ArrayResize(swingLows_Array,ArraySize(swingLows_Array)+1);
            swingLows_Array[ArraySize(swingLows_Array)-1] = swing_L;
            Print("POPULATED! New swing low prices data is as below:");
            ArrayPrint(swingLows_Array,_Digits," , ");
         }

      }
   }

   double Ask = NormalizeDouble(SymbolInfoDouble(_Symbol,SYMBOL_ASK),_Digits);
   double Bid = NormalizeDouble(SymbolInfoDouble(_Symbol,SYMBOL_BID),_Digits);

   if (swing_H > 0 && Ask > swing_H){
      Print("$$$$$$$$$ BUY SIGNAL NOW. BREAK OF SWING HIGH");
      int swing_H_index = 0;
      for (int i=0; i<=length*2+1000; i++){
         double high_sel = high(i);
         if (high_sel == swing_H){
            swing_H_index = i;
            Print("BREAK HIGH FOUND @ BAR INDEX ",swing_H_index);
            break;
         }
      }

      bool isMSS_High = false;
      if (ArraySize(swingHighs_Array) >= 2 && ArraySize(swingLows_Array) >= 2){
         isMSS_High = swingHighs_Array[0] > swingHighs_Array[1]
                        && swingLows_Array[0] > swingLows_Array[1];
      }
      if (isMSS_High){
         Print("Alert! This is a Market Structure Shift (MSS) UPTREND");
         drawBreakLevel_MSS(TimeToString(time(0)),time(swing_H_index),high(swing_H_index),
         time(0),high(swing_H_index),clrDarkGreen,-1);
      }
      else if (!isMSS_High){
         drawBreakLevel(TimeToString(time(0)),time(swing_H_index),high(swing_H_index),
         time(0),high(swing_H_index),clrBlue,-1);
      }

      swing_H = -1.0;
      return;
   }
   if (swing_L > 0 && Bid < swing_L){
      Print("$$$$$$$$$ SELL SIGNAL NOW. BREAK OF SWING LOW");
      int swing_L_index = 0;
      for (int i=0; i<=length*2+1000; i++){
         double low_sel = low(i);
         if (low_sel == swing_L){
            swing_L_index = i;
            Print("BREAK LOW FOUND @ BAR INDEX ",swing_L_index);
            break;
         }
      }

      bool isMSS_Low = false;
      if (ArraySize(swingHighs_Array) >= 2 && Arra

Показано первые 50% кода (символов: 6821)

Открыть по тарифу

Купите тариф с пакетом открытий или войдите, если тариф уже есть. Открытый файл останется в вашем кабинете навсегда.

Разовая покупка файла

На этой странице откроется полный исходный код файла вместо ознакомительного фрагмента.

Чтобы оформить заказ, введите email и перейдите к оплате.

Стоимость полного кода
682,10₽ ≈ $8.34