Скачать MetaTrader 5

Как включить код индикатора в советник ?

Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий
В Маркете более 400 индикаторов. Попробуй любой из них!
Andrey Egorov
3809
Andrey Egorov 2015.12.13 13:11 

Пытаюсь включить код индикатора в советник, что-бы было все в одном файле без дополнительных ссылок на кастомные индикаторы.

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

искал на форуме, не нашел похожих решений. Может кто-то сталкивался с подобной задачей ? есть пример кода ?

Victor Nikolaev
Модератор
14491
Victor Nikolaev 2015.12.13 13:40  

Расчет не каждого индикатора можно перенести в советник.

Вначале надо индикатор до ума довести 

Andrey Egorov
3809
Andrey Egorov 2015.12.13 13:43  
что вы имеете ввиду ?
Victor Nikolaev
Модератор
14491
Victor Nikolaev 2015.12.13 13:46  
Да я ничего не имею ввиду. Вы же индикаторы меняете как перчатки
Andrey Egorov
3809
Andrey Egorov 2015.12.13 13:46  

как я уже писал, я сделал попытку через глобальные статичные массивы, но что-то пошло не так

и не получается получить данные, вот код :

static double BB[];
static double MA_bb[], Ma_bb_plus[];

.......

void calc_ind(int TF)
{

 int    BandsPeriod=24;
 double BandsDeviations=2.0;
 int ma_per = 10;
 int ma_per2 = 5;
 int Bands_ma_mode=MODE_EMA;
 int bars  = 300;
 int to_calc = 0;

   int limit;
   int i;
//----

      if (BB[1] != 0 ) to_calc = 2; else to_calc = bars; 

      for(i= to_calc; i >= 0; i--) // for(i=limit - 1; i>=0; i --) 
     {
         double bb_top = iCustom(NULL,TF,"Bands",BandsPeriod,0, BandsDeviations, Bands_ma_mode, 1, i); 
         double bb_low = iCustom(NULL,TF,"Bands",BandsPeriod,0, BandsDeviations, Bands_ma_mode, 2, i); 
         if (bb_top != 0)
         BB[i] = -(bb_low/bb_top - 1); 

         MA_bb[i] =iMAOnArray(BB,0,ma_per,0,MODE_EMA,i); 
         Ma_bb_plus[i] =iMAOnArray(BB,0,ma_per2,0,MODE_EMA,i); 

     }       

  }
Vasyl Nosal
18538
Vasyl Nosal 2015.12.13 14:53  
Mr_Goods:
что вы имеете ввиду ?
Он здесь не для того чтобы помагать.
Vasyl Nosal
18538
Vasyl Nosal 2015.12.13 14:57  

2 варианта

 

1) Код индикатора записывать в советник.

При этом зоздавая буфера и делая им ArrayResize ArraySetAsSerises

2)  

 //+------------------------------------------------------------------+

//|                                                     SampleEA.mq4 |
//|                        Copyright 2013, MetaQuotes Software Corp. |
//|                                              https://www.mql5.com |
//+------------------------------------------------------------------+
#resource "\\Indicators\\SampleIndicator.ex4"
#property strict
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- получим значение пользовательского индикатора
   double value=iCustom(_Symbol,_Period,"::Indicators\\SampleIndicator.ex4",0,0);
   PrintFormat("Indicator: iCustom value=%f",value);
//--- ...
   return(INIT_SUCCEEDED);
  }
Andrey Egorov
3809
Andrey Egorov 2015.12.13 16:15  
eevviill:

2 варианта

 

1) Код индикатора записывать в советник.

При этом зоздавая буфера и делая им ArrayResize ArraySetAsSerises

2)  

 //+------------------------------------------------------------------+

//|                                                     SampleEA.mq4 |
//|                        Copyright 2013, MetaQuotes Software Corp. |
//|                                              https://www.mql5.com |
//+------------------------------------------------------------------+
#resource "\\Indicators\\SampleIndicator.ex4"
#property strict
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- получим значение пользовательского индикатора
   double value=iCustom(_Symbol,_Period,"::Indicators\\SampleIndicator.ex4",0,0);
   PrintFormat("Indicator: iCustom value=%f",value);
//--- ...
   return(INIT_SUCCEEDED);
  }
Спасибо, может у Вас есть пример кода для первого варианта, или, не могли-бы Вы указать на мои ошибки в приведенном мной коде
Vasyl Nosal
18538
Vasyl Nosal 2015.12.13 17:28  
Mr_Goods:
Спасибо, может у Вас есть пример кода для первого варианта, или, не могли-бы Вы указать на мои ошибки в приведенном мной коде

ArrayResize ArraySetAsSerises

Если на глобальном уровне то статик зачем? 

Алексей Тарабанов
7189
Алексей Тарабанов 2015.12.13 21:39  
... и если массивы, тоже непонятно - зачем; они ведь и так ... (:
Андрей
121
Андрей 2015.12.15 08:03  

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

Последняя версия, 2 года не пользовался, тонкости не помню. 

//+------------------------------------------------------------------+
//|                                          Stochastic.mq4 |
//|                        Copyright 2013, MetaQuotes Software Corp. |
//|                                              https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2013, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"
#property strict

//---- input parameters
 int D=1;
 int P=0; // 0 High  1 Close
 int M=0;
extern int Kmin=50;
extern int Kmax=400; // 

//---- buffers
double MainBuffer[];
double Mas[700];

//----





//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- create timer
  // EventSetTimer(60);
  
   n0=1-soot;
        
   i_dop_pr=barov_nazad; // количество проверяемых баров истории
   nuzno_prov_istor=1;
  
   name_shablon=Symbol()+Period()+"_GP"; // имя шаблона
   
   name_glob_per_K=Symbol()+Period()+"_1G_K"; // имена глобальных переменных с параметрами индикатора нашедшего последн-------
   name_glob_per_D=Symbol()+Period()+"_1G_D";
   name_glob_per_M=Symbol()+Period()+"_1G_M";
   name_glob_per_P=Symbol()+Period()+"_1G_P";  
   name__glob_per_K_p=Symbol()+Period()+"_1Gp_K"; // имена глобальных переменных с параметрами индикатора нашедшего последн------
   name__glob_per_D_p=Symbol()+Period()+"_1Gp_D";
   name__glob_per_M_p=Symbol()+Period()+"_1Gp_M";
   name__glob_per_P_p=Symbol()+Period()+"_1Gp_P";   
      
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//--- destroy timer
  // EventKillTimer();
      
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
//---
  if(t1!=Time[0]) // ели это первый тик или первый запуск или нужно проверить предыдушие бары
  {
   i0=1; t1=Time[0]; predo=2; // если первый тик, разрешить проверку
   
   strelka_proshloe="Niz_s_gp"+Time[2];  nalich_str= ObjectFind(0,strelka_proshloe); // имя срелки    наличие стрелки
   Name_prov="h_"+Time[2];              nalich_toch= ObjectFind(0,Name_prov); // имя точки   наличие точки
    
   if((nalich_str<0)&&(nalich_toch<0)) // если стрелки или точки нет на втором баре значит бар не проверяли (сделать полную проверку)
   {
    nuzno_prov_istor=1; // количество проверяемых баров истории
   }
  }
 
  if(nuzno_prov_istor==1) // ели нужно проверить предыдушие бары
  { 
   i_prov=barov_nazad; // количество проверяемых баров истории
   for(;i_prov>0;)
   {
    strelka_proshloe="Niz_s_gp"+Time[i_prov];  nalich_str= ObjectFind(0,strelka_proshloe); // имя срелки    наличие стрелки
    Name_prov="h_"+Time[i_prov];              nalich_toch= ObjectFind(0,Name_prov); // имя точки   наличие точки
    
    if((nalich_str<0)&&(nalich_toch<0)) // если стрелки или точки нет значит бар не проверяли
    {
     i0=i_prov; predo=2;  break;
    }
    else i_prov--;
   } 
   if(i_prov<2) nuzno_prov_istor=0;
  } 
  

if(predo==22)  // если можно икать   if(predo==2) if(2==2) if(predo<2) 
{ 
 predo=0;
 
 K_g=GlobalVariableGet(name_glob_per_K);
 if(K_g>0) // рисуем продолжение 
 {
    D_g=GlobalVariableGet(name_glob_per_D);
    M_g=GlobalVariableGet(name_glob_per_M);
    P_g=GlobalVariableGet(name_glob_per_P);
    prod1=iStochastic(NULL,0,K_g,D_g,1,M_g,P_g,1,i0);
    prod2=iStochastic(NULL,0,K_g,D_g,1,M_g,P_g,1,i1);
    txt="prod_g"+Time[i0];
    ObjectCreate(txt, OBJ_TREND,1,Time[i0],prod1,Time[i1],prod2); // линия продолжения -----
    ObjectSet(txt,OBJPROP_RAY,0); // сделать отрезком
    ObjectSet(txt,OBJPROP_COLOR,Yellow); // цвет 
 }

 K_g=GlobalVariableGet(name__glob_per_K_p);
 if(K_g>0) // рисуем продолжение 
 {
    D_g=GlobalVariableGet(name__glob_per_D_p);
    M_g=GlobalVariableGet(name__glob_per_M_p);
    P_g=GlobalVariableGet(name__glob_per_P_p);
    prod1=iStochastic(NULL,0,K_g,D_g,1,M_g,P_g,1,i0);
    prod2=iStochastic(NULL,0,K_g,D_g,1,M_g,P_g,1,i1);
    txt="prod_gp"+Time[i0];
    ObjectCreate(txt, OBJ_TREND,2,Time[i0],prod1,Time[i1],prod2); // линия продолжения ----
    ObjectSet(txt,OBJPROP_RAY,0); // сделать отрезком
    ObjectSet(txt,OBJPROP_COLOR,Yellow); // цвет 
 }




 string Pday=TerminalInfoString(TERMINAL_DATA_PATH)+"\\MQL4\\Files"; // где создать папку на день бара i0
 dlia_papki=Time[i0]; // время бара в секундах
 if(CreateFolder(Pday,TimeDay(dlia_papki),0))   {string Pnp=TimeDay(dlia_papki)+"\\np";   CreateFolder(Pday,Pnp,0); } // создать папку на день бара i0

 //if(i0<3)max_perv_vish_vxoda=400; else max_perv_vish_vxoda=400+i0; // если заполняем прошлое нужно сдвинуть границы ограничений

 
  
 for(P=0;P<2;P++)
 {
  for(M=0;M<4;M++)  
  {
   if(M==0)D=1; else D=2; // чтобы исключить повторный поиск с периодом 1 в разных МА
   for(;D<11;D++)
   {
    for(int K=Kmin; K<Kmax; K++)  // перебираем стохастики с К% от Kmin до Kmax
    {
     for(i=0; i<700; i++)  // заполняем массив
     {
      Mas[i]=iStochastic(NULL,0,K,D,1,M,P,1,i);  // элемент i массива равен элементу i стохастика
      
     }
           
  

Здесь копаемся в массиве Мас как в обычном буфере индикатора

         //--------------------------------------- Конец поиска в этом массиве ----------------------------------              }//for(int K=Kmin; K<Kmax; K++)    }//for(D=1;D<11;D++)   }//for(M=0;M<4;M++) }//for(P=0;P<2;P++)                                 // рисуем          ChartSaveTemplate(0,name_shablon);  // сохраняет изменения в шаблоне    }//if(predo==2)      } //+------------------------------------------------------------------+   Alert("1111   "); //| Timer function                                                   | //+------------------------------------------------------------------+ void OnTimer()   { //---      } //+------------------------------------------------------------------+ //| ChartEvent function                                              | //+------------------------------------------------------------------+ void OnChartEvent(const int id,                   const long &lparam,                   const double &dparam,                   const string &sparam)   { //---      } //+------------------------------------------------------------------+ //+------------------------------------------------------------------+ //| Пытается создать папку и выводит сообщения                       | //+------------------------------------------------------------------+ bool CreateFolder(string Pday,string folder_path,int file_flag)   {    if(FolderCreate(folder_path,file_flag))      {       PrintFormat("Cоздали папку %s",Pday+"\\"+folder_path);       ResetLastError();       return true;      }    else       PrintFormat("Не удалось создать папку %s. Код ошибки %d",Pday+folder_path,GetLastError());    return false;   }
123
Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий