Если используете что-то отличное от стандартного, начинайте проверку на стандартном:
//+------------------------------------------------------------------+ //| SampleEA.mq5 | //| Copyright 2013, MetaQuotes Software Corp. | //| https://www.mql5.com | //+------------------------------------------------------------------+ #resource "\\Indicators\\Examples\\Accelerator.ex5" int handle_ind; //+------------------------------------------------------------------+ //| Expert initialization function | //+------------------------------------------------------------------+ int OnInit() { //--- handle_ind=iCustom(_Symbol,_Period,"::Indicators\\Examples\\Accelerator.ex5"); if(handle_ind==INVALID_HANDLE) { Print("Expert: iCustom call: Error code=",GetLastError()); return(INIT_FAILED); } //--- return(INIT_SUCCEEDED); }
так Вы постепенно увидите свою ошибку.
Билд 3116
MetaTrader 5 x64 build 3116 started for MetaQuotes Software Corp. Windows 11 build 22000, 12 x Intel Core i7-9750H @ 2.60GHz, 13 / 31 Gb memory, 717 / 947 Gb disk, UAC, GMT+2 C:\Users\barab\AppData\Roaming\MetaQuotes\Terminal\D0E8209F77C8CF37AD8BF550E51FF075
даже подсказку даёт и сам компилирует индикатор, если индикатор не был скомпилирован ранее:
'Expert 1.mq5' Expert 1.mq5 1 1
resource file '\Indicators\Examples\Accelerator.ex5' not found, trying to compile its source... Expert 1.mq5 6 11
'\Indicators\Examples\Accelerator.mq5' compiled successfully Expert 1.mq5 6 11
code generated 1 1
0 errors, 0 warnings, 319 msec elapsed 1 1
Если используете что-то отличное от стандартного, начинайте проверку на стандартном:
так Вы постепенно увидите свою ошибку.
Билд 3116
даже подсказку даёт и сам компилирует индикатор, если индикатор не был скомпилирован ранее:
Так в том то и дело, что со стандартными такой проблемы нет.
И с этим индикатором если не обращаться к нему как к ресурсу через "::" тоже проблем нет.
Но мне он нужен встроенный (как ресурс) а вот тут и проблема.
Попробую разъяснить разницу.
вот так не работает.
#resource "\\Indicators\\Supertrend.ex5" int Handle; //+------------------------------------------------------------------+ //| Expert initialization function | //+------------------------------------------------------------------+ int OnInit() { //--- string path= "::Indicators\\Supertrend.ex5"; Handle = iCustom(_Symbol,PERIOD_CURRENT,path); if(Handle<0) { printf("ERROR HANDle [%d]",GetLastError()); return INIT_FAILED; }
а вот так работает, но как с внешним:
#resource "\\Indicators\\Supertrend.ex5" int Handle; //+------------------------------------------------------------------+ //| Expert initialization function | //+------------------------------------------------------------------+ int OnInit() { //--- string path= "\\Indicators\\Supertrend.ex5"; Handle = iCustom(_Symbol,PERIOD_CURRENT,path); if(Handle<0) { printf("ERROR HANDle [%d]",GetLastError()); return INIT_FAILED; }
Речь не о стандартном индикаторе.
Когда Вы используете стандартный индикатор, то Вас не заботит будет он встроенный или нет, потому что стандартный индикатор всегда есть в поставке терминала.
А нестандартный лучше всегда иметь при себе в советнике, чтобы не потерять.
Речь не о стандартном индикаторе.
Когда Вы используете стандартный индикатор, то Вас не заботит будет он встроенный или нет, потому что стандартный индикатор всегда есть в поставке терминала.
А нестандартный лучше всегда иметь при себе в советнике, чтобы не потерять.
У Вас индикатор НЕ СОЗАДЁТСЯ. Пример на основе папки "\\Indicators\\Examples\\" Вам был дан для изучения.
В Вашем случае действует один закон: нет полного кода индикатора и советника, нет доказательств что индикатор размещен в нужной папке - никто Вам не сможет помочь, так как все телепаты уехали на корпаратив.
У Вас индикатор НЕ СОЗАДЁТСЯ. Пример на основе папки "\\Indicators\\Examples\\" Вам был дан для изучения.
В Вашем случае действует один закон: нет полного кода индикатора и советника, нет доказательств что индикатор размещен в нужной папке - никто Вам не сможет помочь, так как все телепаты уехали на корпаратив.
Что значит не создаётся?
Вы хотите сказать не встраивается? ех5 индикатора прекрасно создаётся и я его могу использовать как ВНЕШНИЙ. но мне нужен ВНУТРЕННИЙ
папка индикатора
сам индикатор
//+------------------------------------------------------------------+ //| SuperTrend.mq5 | //| Copyright 2018, MetaQuotes Software Corp. | //| https://mql5.com | //+------------------------------------------------------------------+ #property copyright "Copyright 2018, MetaQuotes Software Corp." #property link "https://mql5.com" #property version "1.00" #property description "Olivier Seban's SuperTrend indicator" #property indicator_chart_window #property indicator_buffers 4 #property indicator_plots 1 //--- plot ST #property indicator_label1 "SuperTrend" #property indicator_type1 DRAW_COLOR_LINE #property indicator_color1 clrGreen,clrRed,clrDarkGray #property indicator_style1 STYLE_SOLID #property indicator_width1 2 //--- enums enum ENUM_INPUT_YES_NO { INPUT_YES = 1, // Yes INPUT_NO = 0 // No }; //--- input parameters input uint InpPeriod = 14; // Period input uint InpShift = 20; // Shift input ENUM_INPUT_YES_NO InpUseFilter = INPUT_YES; // Use filter //--- indicator buffers double BufferST[]; double BufferColors[]; double BufferFlag[]; double BufferCCI[]; //--- global variables double shift; int period_cci; int handle_cci; //+------------------------------------------------------------------+ //| Custom indicator initialization function | //+------------------------------------------------------------------+ int OnInit() { //--- set global variables period_cci=int(InpPeriod<2 ? 2 : InpPeriod); shift=InpShift*Point(); //--- indicator buffers mapping SetIndexBuffer(0,BufferST,INDICATOR_DATA); SetIndexBuffer(1,BufferColors,INDICATOR_COLOR_INDEX); SetIndexBuffer(2,BufferFlag,INDICATOR_CALCULATIONS); SetIndexBuffer(3,BufferCCI,INDICATOR_CALCULATIONS); //--- setting indicator parameters IndicatorSetString(INDICATOR_SHORTNAME,"SuperTrend ("+(string)period_cci+","+(string)InpShift+")"); IndicatorSetInteger(INDICATOR_DIGITS,Digits()); //--- setting buffer arrays as timeseries ArraySetAsSeries(BufferST,true); ArraySetAsSeries(BufferColors,true); ArraySetAsSeries(BufferFlag,true); ArraySetAsSeries(BufferCCI,true); //--- create cci handle ResetLastError(); handle_cci=iCCI(NULL,PERIOD_CURRENT,period_cci,PRICE_TYPICAL); if(handle_cci==INVALID_HANDLE) { Print("The iCCI(",(string)period_cci,") object was not created: Error ",GetLastError()); return INIT_FAILED; } //--- return(INIT_SUCCEEDED); } //+------------------------------------------------------------------+ //| Custom indicator iteration function | //+------------------------------------------------------------------+ 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[]) { //--- Установка массивов буферов как таймсерий ArraySetAsSeries(open,true); ArraySetAsSeries(high,true); ArraySetAsSeries(low,true); ArraySetAsSeries(close,true); //--- Проверка и расчёт количества просчитываемых баров if(rates_total<4) return 0; //--- Проверка и расчёт количества просчитываемых баров int limit=rates_total-prev_calculated; if(limit>1) { limit=rates_total-2; ArrayInitialize(BufferST,EMPTY_VALUE); ArrayInitialize(BufferColors,2); ArrayInitialize(BufferFlag,0); ArrayInitialize(BufferCCI,0); } //--- Подготовка данных int count=(limit>1 ? rates_total : 1); ResetLastError(); int copied=CopyBuffer(handle_cci,0,0,count,BufferCCI); if(copied!=count) return 0; //--- Расчёт индикатора for(int i=limit; i>=0 && !IsStopped(); i--) { double CCI=BufferCCI[i]; BufferST[i]=BufferST[i+1]; BufferFlag[i]=BufferFlag[i+1]; BufferColors[i]=2; if(CCI>0 && BufferFlag[i]<=0) { BufferFlag[i]=1; BufferST[i]=low[i]-shift; } if(CCI<0 && BufferFlag[i]>=0) { BufferFlag[i]=-1; BufferST[i]=high[i]+shift; } BufferST[i]= ( BufferFlag[i]>0 && low[i]-shift>BufferST[i+1] ? low[i]-shift : BufferFlag[i]<0 && high[i]+shift<BufferST[i+1] ? high[i]+shift : BufferST[i] ); if(InpUseFilter) { if(BufferFlag[i]>0 && BufferST[i]>BufferST[i+1]) { if(close[i]<open[i]) BufferST[i]=BufferST[i+1]; if(high[i]<high[i+1]) BufferST[i]=BufferST[i+1]; } if(BufferFlag[i]<0 && BufferST[i]<BufferST[i+1]) { if(close[i]>open[i]) BufferST[i]=BufferST[i+1]; if(low[i]>low[i+1]) BufferST[i]=BufferST[i+1]; } } if(close[i]>BufferST[i]) BufferColors[i]=0; else BufferColors[i]=1; } //--- return value of prev_calculated for next call return(rates_total); } //+------------------------------------------------------------------+
сам советник (точнее это просто тест для проверки встраивания)
//+------------------------------------------------------------------+ //| TestIndicator.mq5 | //| Copyright 2021, MetaQuotes Ltd. | //| https://www.mql5.com | //+------------------------------------------------------------------+ #resource "\\Indicators\\Supertrend.ex5" int Handle; //+------------------------------------------------------------------+ //| Expert initialization function | //+------------------------------------------------------------------+ int OnInit() { //--- string path= "::Indicators\\Supertrend.ex5"; Handle = iCustom(_Symbol,PERIOD_CURRENT,path,14,20,1); if(Handle<0) { printf("ERROR HANDle [%d]",GetLastError()); return INIT_FAILED; } printf("TODAY: %s",TimeToString(iTime(_Symbol,PERIOD_D1,0),TIME_DATE|TIME_SECONDS)); //--- return(INIT_SUCCEEDED); }
Что во всём этом не так?
вот выдержка из справочника
Работа с пользовательскими индикаторами, подключенными в качестве ресурсов Для работы mql5-программ может потребоваться один или несколько пользовательских индикаторов, все они могут быть включены в код исполняемой mql5-программы. Включение индикаторов в качестве ресурсов позволяет упростить распространение программ. Пример подключения и использования пользовательского индикатора SampleIndicator.ex5, расположенного в папке: каталог_данных_терминала\MQL5\Indicators\: //+------------------------------------------------------------------+ //| SampleEA.mq5 | //| Copyright 2013, MetaQuotes Software Corp. | //| https://www.mql5.com | //+------------------------------------------------------------------+ #resource "\\Indicators\\SampleIndicator.ex5" int handle_ind; //+------------------------------------------------------------------+ //| Expert initialization function | //+------------------------------------------------------------------+ int OnInit() { //--- handle_ind=iCustom(_Symbol,_Period,"::Indicators\\SampleIndicator.ex5"); if(handle_ind==INVALID_HANDLE) { Print("Expert: iCustom call: Error code=",GetLastError()); return(INIT_FAILED); } //---
Я уже голову сломал.
Может телепаты с кооператива всё же заглянут и посмотрят и объяснят в чём причина.
Предвидя ещё вопросы :
вот так работает
//+------------------------------------------------------------------+ //| Evgenii Matveev.mq5 | //| Copyright 2021, MetaQuotes Software Corp. | //| https://www.mql5.com | //+------------------------------------------------------------------+ #property copyright "Copyright 2021, MetaQuotes Software Corp." #property link "https://www.mql5.com" #property version "1.00" #resource "\\Indicators\\SuperTrend.ex5" //--- enums enum ENUM_INPUT_YES_NO { INPUT_YES = 1, // Yes INPUT_NO = 0 // No }; //--- input parameters input uint InpPeriod = 14; // Period input uint InpShift = 20; // Shift input ENUM_INPUT_YES_NO InpUseFilter = INPUT_YES; // Use filter int Handle; //+------------------------------------------------------------------+ //| Expert initialization function | //+------------------------------------------------------------------+ int OnInit() { //--- string path= "::Indicators\\SuperTrend.ex5"; Handle = iCustom(_Symbol,PERIOD_CURRENT,path,InpPeriod,InpShift,InpUseFilter); if(Handle<0) { printf("ERROR HANDle [%d]",GetLastError()); return INIT_FAILED; } //--- return(INIT_SUCCEEDED); } //+------------------------------------------------------------------+ //| Expert deinitialization function | //+------------------------------------------------------------------+ void OnDeinit(const int reason) { //--- } //+------------------------------------------------------------------+ //| Expert tick function | //+------------------------------------------------------------------+ void OnTick() { //--- } //+------------------------------------------------------------------+
Причину нашёл тестовым путём.
Советник лежит в подкаталоге \Experts\TestIndicator.
Если его перенести в основной каталог \Experts то всё начинает работать и встраиваться.
Подскажите как сделать, чтобы и в подкаталоге это работало?
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Вы принимаете политику сайта и условия использования
Пытаюсь встроить индикатора в советника. Всё делаю по инструкции. НО!
При таком коде
Получаю вот такое:
2021.12.01 23:38:50.751 TestIndicator (EURUSD,H1) cannot load custom indicator 'C:\Users\evgen\AppData\Roaming\MetaQuotes\Terminal\9EB2973C469D24060397BB5158EA73A5\MQL5\Experts\TestIndicator\TestIndicator.ex5::Indicators\Supertrend.ex5' [4802]
при замене двоеточек на "косые" всё работает, но индикатор не встраивается.
Помогите разобраться. Может это индикатор какой-то "неправильный"?