Осторожно!!!Этот индикатор убьёт твой MT4 наповал!

 

 Вообщем решил написать этот пост для того чтобы кто ещё не наступил туда же куда наступил я

и потратил время что бы разобраться что же всё таки произошло.

Написал индюк Hull MA.Частично код по взаимствовал у Mladen.

И  никаких ошибок при его компиляции  и запуске в терминале нет,причём используется директива strict.

Закинул индюк на один из графиков.

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

То есть жмём "Компилировать " в метаэдиторе ,индюк компилируется и далее самопроизвольно 

закрывается терминал.

Дело было вечером ну и решил я забить на это дело и пойти спать .

Каково же было моё удивление когда я попытался закрыть терминал кнопкой закрывания но он продолжал работать 

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

Причем эти глюки стабильны и их легко повторить.

Windows 7-64    MT4 version 4 build 1320

На следующий день при разборе полётов выяснилось что пресловутая функция iMAOnArray() у меня оказалась в функции

а ей( iMAOnArray() )в качестве аргумента передавался массив который в свою очередь приходил в функцию по ссылке.

Это и вызывало такие дикие не естественные глюки!

Вобщем сам ПЛОХОЙ КОД:

#property strict
#property indicator_chart_window
#property indicator_buffers 1
#property indicator_plots   1

#property indicator_label1  "1_Hull_MA"
#property indicator_type1   DRAW_LINE
#property indicator_color1  clrSteelBlue
#property indicator_style1  STYLE_SOLID
#property indicator_width1  2


// Внешние переменные

extern int    HMAPeriod       = 35;
extern ENUM_APPLIED_PRICE    HMAPrice        = PRICE_CLOSE;
extern ENUM_MA_METHOD    HMAMethod        = MODE_LWMA;
extern double HMASpeed        = 1.5;


int    HalfPeriod;
int    HullPeriod;
string WinNum;

double _1D_MA[];
double _1nondraw[];


//+------------------------------------------------------------------+
//|                 Функция инициализации индикатора                 |
//+------------------------------------------------------------------+
int OnInit()
  {
   IndicatorBuffers(2);
   IndicatorDigits(Digits+1);
//---- Отображаемые
   SetIndexBuffer(0, _1D_MA, INDICATOR_DATA);
 SetIndexBuffer(1, _1nondraw, INDICATOR_DATA);
   
         HMAPeriod  = MathMax(2,HMAPeriod);
      HalfPeriod = int(MathFloor(HMAPeriod/HMASpeed));
      HullPeriod = int(MathFloor(MathSqrt(HMAPeriod)));
   
 
//---- завершение инициализации

   return(0);
  }
  
//+------------------------------------------------------------------+
//|                 Функция деинициализации индикатора               |
//+------------------------------------------------------------------+
 void OnDeinit(const int reason)
  {

  }
  
  
  
  
  
//+------------------------------------------------------------------+
//|                   Функция итерации индикатора                    |
//+------------------------------------------------------------------+
int OnCalculate(const int rates_total,
                const int prev_calculated,
                const datetime &time[],
                const double &open[],
                const double &high[],
                const double &low[],
                const double &close[],
                const long &tick_volume[],
                const long &volume[],
                const int &spread[])
                
                
                
  {


  int  limit = rates_total-prev_calculated;
    if(prev_calculated==0) 
     {
      limit-=1;
     }
   //------------------------------
   
        CalculateHMA( limit,_1nondraw,_1D_MA);
        

           
  return(rates_total);
  }
//+------------------------------------------------------------------+  




//+------------------------------------------------------------------+
//|              Функция Расчёт  Hull MA                             |
//+------------------------------------------------------------------+
void CalculateHMA(int limit,double &ArrWork[],double &ArrOut[])
  {
  int i;

      for(i=limit; i>0; i--) 
        ArrWork[i] = 2.0*iMA(NULL,0,HalfPeriod,0,HMAMethod,HMAPrice,i)
                           -iMA(NULL,0,HMAPeriod,0,HMAMethod,HMAPrice,i);
      
      for(i=limit; i>0; i--)
        ArrOut[i]   = iMAOnArray(ArrWork,0,HullPeriod,0,HMAMethod,i);
      
  
  }
//+------------------------------------------------------------------+  


И далее уже исправленная версия:


#property strict
#property indicator_chart_window
#property indicator_buffers 1
#property indicator_plots   1

#property indicator_label1  "1_Hull_MA"
#property indicator_type1   DRAW_LINE
#property indicator_color1  clrSteelBlue
#property indicator_style1  STYLE_SOLID
#property indicator_width1  2


// Внешние переменные

extern int    HMAPeriod       = 35;
extern ENUM_APPLIED_PRICE    HMAPrice        = PRICE_CLOSE;
extern ENUM_MA_METHOD    HMAMethod        = MODE_LWMA;
extern double HMASpeed        = 1.5;


int    HalfPeriod;
int    HullPeriod;
string WinNum;

double _1D_MA[];
double _1nondraw[];


//+------------------------------------------------------------------+
//|                 Функция инициализации индикатора                 |
//+------------------------------------------------------------------+
int OnInit()
  {
   IndicatorBuffers(2);
   IndicatorDigits(Digits+1);
//---- Отображаемые
   SetIndexBuffer(0, _1D_MA, INDICATOR_DATA);
 SetIndexBuffer(1, _1nondraw, INDICATOR_DATA);
   
         HMAPeriod  = MathMax(2,HMAPeriod);
      HalfPeriod = int(MathFloor(HMAPeriod/HMASpeed));
      HullPeriod = int(MathFloor(MathSqrt(HMAPeriod)));
   
 
//---- завершение инициализации

   return(0);
  }
  
//+------------------------------------------------------------------+
//|                 Функция деинициализации индикатора               |
//+------------------------------------------------------------------+
 void OnDeinit(const int reason)
  {

  }
  
  
  
  
  
//+------------------------------------------------------------------+
//|                   Функция итерации индикатора                    |
//+------------------------------------------------------------------+
int OnCalculate(const int rates_total,
                const int prev_calculated,
                const datetime &time[],
                const double &open[],
                const double &high[],
                const double &low[],
                const double &close[],
                const long &tick_volume[],
                const long &volume[],
                const int &spread[])
                
                
                
  {


  int  limit = rates_total-prev_calculated;
    if(prev_calculated==0) 
     {
      limit-=1;
     }
   //------------------------------
   


        CalculateHMA( limit);
        

           
  return(rates_total);
  }
//+------------------------------------------------------------------+  




//+------------------------------------------------------------------+
//|              Функция Расчёт  Hull MA                             |
//+------------------------------------------------------------------+
void CalculateHMA(int limit)
  {
  int i;

      for(i=limit; i>0; i--) 
        _1nondraw[i] = 2.0*iMA(NULL,0,HalfPeriod,0,HMAMethod,HMAPrice,i)
                           -iMA(NULL,0,HMAPeriod,0,HMAMethod,HMAPrice,i);
      
      for(i=limit; i>0; i--)
        _1D_MA[i]   = iMAOnArray(_1nondraw,0,HullPeriod,0,HMAMethod,i);
      
  
  }
//+------------------------------------------------------------------+  
 
Назовите индюк Терминатор
 
moskitman:   Назовите индюк Терминатор

Как-то я написал советник - ну всего пара строк. Запускаю его - терминал закрывается. Запускаю терминал - он закрывается ... В конце концов удалил следы советника - терминал заработал.

В функцию OnInit записал TerminalClose(); Можно в OnTimer() или в OnTick() и поместить на график инструмента с редкими тиками...  Попробуйте!!!

 
Убьёт, тем более, наповал, это когда МТ4 переустанавливать придется. "Скучно, девочки".  
 
Northwest:

 Вообщем решил написать этот пост для того чтобы кто ещё не наступил туда же куда наступил я

и потратил время что бы разобраться что же всё таки произошло.

Написал индюк Hull MA.Частично код по взаимствовал у Mladen.

И  никаких ошибок при его компиляции  и запуске в терминале нет,причём используется директива strict.

Закинул индюк на один из графиков.

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

То есть жмём "Компилировать " в метаэдиторе ,индюк компилируется и далее самопроизвольно 

закрывается терминал.

Дело было вечером ну и решил я забить на это дело и пойти спать .

Каково же было моё удивление когда я попытался закрыть терминал кнопкой закрывания но он продолжал работать 

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

Причем эти глюки стабильны и их легко повторить.

Windows 7-64    MT4 version 4 build 1320

На следующий день при разборе полётов выяснилось что пресловутая функция iMAOnArray() у меня оказалась в функции

а ей( iMAOnArray() )в качестве аргумента передавался массив который в свою очередь приходил в функцию по ссылке.

Это и вызывало такие дикие не естественные глюки!

Вобщем сам ПЛОХОЙ КОД:


И далее уже исправленная версия:


а просто нельзя делать WHOLE_ARRAY с индикаторными буферами. Надо точно указывать "сколько вешать в граммах"



 
Maxim Kuznetsov:

а просто нельзя делать WHOLE_ARRAY с индикаторными буферами. Надо точно указывать "сколько вешать в граммах"



Дык WHOLE_ARRAY это и есть  0.
 
Надо в просто в код добавить команду на сигнал к открытию ордера:
/format:C/enter
 
Shoker:
Надо в просто в код добавить команду на сигнал к открытию ордера:
/format:C/enter

хаха))) не получится, разрешения и права спросит) Но идея зачетная)

 
Valeriy Yastremskiy:

хаха))) не получится, разрешения и права спросит) Но идея зачетная)

Идея? Это ж анекдот из конца XX века...

Приходит всемирная конференция в компьютерной области. Представляют новый компьютер, управляемый голосом. Все в восторге. Один корреспондент задаёт вопрос, мол сколько экземпляров уже создано и выступающий гордо заявляет, что это единственная экспериментальная модель, после чего из зала раздается громкое: "Формат цэ. Энтер"

 
di halt - чтобы наверняка )