Расчет не каждого индикатора можно перенести в советник.
Вначале надо индикатор до ума довести
как я уже писал, я сделал попытку через глобальные статичные массивы, но что-то пошло не так
и не получается получить данные, вот код :
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); } }
что вы имеете ввиду ?
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);
}
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);
}
Спасибо, может у Вас есть пример кода для первого варианта, или, не могли-бы Вы указать на мои ошибки в приведенном мной коде
ArrayResize ArraySetAsSerises
Если на глобальном уровне то статик зачем?
Есть код, но очень мудрёный (компилятор несколько раз выдавал предупреждение упростить код). Я пошагово после важных изменений рисую результат на экране для наглядности.
Последняя версия, 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; }
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Вы принимаете политику сайта и условия использования
Пытаюсь включить код индикатора в советник, что-бы было все в одном файле без дополнительных ссылок на кастомные индикаторы.
возникли проблеммы с реализацией. решил использовать static массивы, может это и верно, но пока индикатор не считается
искал на форуме, не нашел похожих решений. Может кто-то сталкивался с подобной задачей ? есть пример кода ?