papaklass: Какие задачи Вы пытаетесь решить через работу с файлами?
Надо записывать в файл состояние позиций и тем же МТ4 считывать эти данные. Нужна корреляция позиций одного символа с другим(-и) символом(-ами). Например, если есть уже какое-то граничное количество позиций по EURUSD, то по GBPUSD уже больше не открывать. Умею это делать без файловых операций, просто я хочу научиться работать с файловыми операциями, так для расширения кругозора.
Плиз приведите пример кода, как вызвать из эксперта прилинкованный ресурс-индикатор, который в свою очередь использует в себе другой прилинкованный ресурс-индикатор. Например, есть индикатор A, из него вызывается B. Также есть эксперт C, который использует A. Что нужно прописать в #resource и при вызове iCustom во всех случаях?
Справка написана непонятно на сей счет. Обычная конструкция в индикаторе A: #resource "\\Indicators\B.ex4", а потом iCustom(::Indicators\B.ex4) - нормально работает при запуске индикатора A самого по себе. Однако если A вставляется в эксперт #resource "\\Indicators\A.ex4", возникает ошибка cannot load resource для вложенного индикатора, с указанием какого-то абсолютно кривого синтезированного пути, в котором почему-то упоминается каталог Libraries, а индикатор B ищется внутри самого себя (MQL4\Libraries\::Indicators\B.ex4::Indicators\B.ex4).
По поводу ArraySize я буквально на днях поднимал похожую проблемку на MQL4: https://www.mql5.com/ru/forum/152471. Как я понимаю, на MQL5 должно быть всё идентично этом плане.
А когда появился этот 969 билд? Возможно там как-раз и учли моё обращение :) По поводу этой проблемы в сервис-деске ответили, что причина была в некорректной работе оптимизатора, и что они поменяют тип на uint в новых билдах. Точнее по факту он и сейчас uint, просто недокументированно :) И кстати для ArrayResize тоже будут менять на uint. Я правда посоветовал им менять сразу на ulong, иначе в ближайшем будущем придётся вернуться к этой проблеме из-за нехватки 32-битного значения при хранения больших объёмов.
А что касается значения -1 при ошибке, то с этим проблем быть не должно, ибо: (int)-1 = (uint)-1 = 0xFFFFFFFF = UINT_MAX, т.е. битовое представление одно и то же. Правда операция сравнения уже даст другой результат. Т.е. если в коде было так:
то станет некорректно.
Ещё раз спасибо за заявку, возвращаемый тип функций ArraySize и ArrayRange менять не будем, оставим тип int, внесли исправления в оптимизатор кода, теперь ошибки описанной Вами не будет.
Общее количество элементов в MQL массиве не может превышать INT_MAX и меняться это не будет. Если в MQL программе потребуются массивы бОльших размеров, Вам придётся создавать отдельный класс (например CBigArray).
Пытаюсь освоить iCustom в mql5. В mql4 умел виртуозно :)
Задача такая - отрисовать нечто подобное MACD, только вместо быстрой скользящей средней должен использоваться индикатор VIDYA, который лежит в папке Examples.
Взял стандартный код MACD и вставил туда вместо быстрой скользящей параметры для VIDYA. Проблема - все компилируется, но ничего не рисуется.
Я ниже в коде выделил 2 места, в которых изменил стандартный код MACD. В остальном все то же самое. Пожалуйста, подскажите, что ещё я упустил. Я так предполагаю, что это ниже где-то по коду...
inputint InpSlowEMA=84; // Slow EMA periodinputint InpSignalSMA=9; // Signal SMA periodinputENUM_APPLIED_PRICE InpAppliedPrice=PRICE_CLOSE; // Applied price//--- indicator buffersdouble ExtMacdBuffer[];
double ExtSignalBuffer[];
double ExtFastMaBuffer[];
double ExtSlowMaBuffer[];
//--- MA handlesint ExtFastMaHandle;
int ExtSlowMaHandle;
//+------------------------------------------------------------------+//| Custom indicator initialization function |//+------------------------------------------------------------------+voidOnInit()
{
//--- indicator buffers mappingSetIndexBuffer(0,ExtMacdBuffer,INDICATOR_DATA);
SetIndexBuffer(1,ExtSignalBuffer,INDICATOR_DATA);
SetIndexBuffer(2,ExtFastMaBuffer,INDICATOR_CALCULATIONS);
SetIndexBuffer(3,ExtSlowMaBuffer,INDICATOR_CALCULATIONS);
//--- sets first bar from what index will be drawnPlotIndexSetInteger(1,PLOT_DRAW_BEGIN,InpSignalSMA-1);
//--- name for Dindicator subwindow labelIndicatorSetString(INDICATOR_SHORTNAME,"MACD("+string(InpSlowEMA)+","+string(InpSignalSMA)+")");
//--- get MA handles
ExtSlowMaHandle=iMA(NULL,0,InpSlowEMA,0,MODE_SMA,InpAppliedPrice);
//--- initialization done
}
//+------------------------------------------------------------------+//| Moving Averages Convergence/Divergence |//+------------------------------------------------------------------+intOnCalculate(constint rates_total,constint prev_calculated,
constdatetime &Time[],
constdouble &Open[],
constdouble &High[],
constdouble &Low[],
constdouble &Close[],
constlong &TickVolume[],
constlong &Volume[],
constint &Spread[])
{
//--- check for dataif(rates_total<InpSignalSMA)
return(0);
//--- not all data may be calculatedint calculated=BarsCalculated(ExtFastMaHandle);
if(calculated<rates_total)
{
Print("Not all data of ExtFastMaHandle is calculated (",calculated,"bars ). Error",GetLastError());
return(0);
}
calculated=BarsCalculated(ExtSlowMaHandle);
if(calculated<rates_total)
{
Print("Not all data of ExtSlowMaHandle is calculated (",calculated,"bars ). Error",GetLastError());
return(0);
}
//--- we can copy not all dataint to_copy;
if(prev_calculated>rates_total || prev_calculated<0) to_copy=rates_total;
else
{
to_copy=rates_total-prev_calculated;
if(prev_calculated>0) to_copy++;
}
//--- get Fast EMA bufferif(IsStopped()) return(0); //Checking for stop flagif(CopyBuffer(ExtFastMaHandle,0,0,to_copy,ExtFastMaBuffer)<=0)
{
Print("Getting fast EMA is failed! Error",GetLastError());
return(0);
}
//--- get SlowSMA bufferif(IsStopped()) return(0); //Checking for stop flagif(CopyBuffer(ExtSlowMaHandle,0,0,to_copy,ExtSlowMaBuffer)<=0)
{
Print("Getting slow SMA is failed! Error",GetLastError());
return(0);
}
//---int limit;
if(prev_calculated==0)
limit=0;
else limit=prev_calculated-1;
//--- calculate MACDfor(int i=limit;i<rates_total && !IsStopped();i++)
ExtMacdBuffer[i]=ExtFastMaBuffer[i]-ExtSlowMaBuffer[i];
//--- calculate Signal
SimpleMAOnBuffer(rates_total,prev_calculated,0,InpSignalSMA,ExtMacdBuffer,ExtSignalBuffer);
//--- OnCalculate done. Return new prev_calculated.return(rates_total);
}
//+------------------------------------------------------------------+
Не знаю, может уже было, но вопрос такой, новый бар, значения PLOT_EMPTY_VALUE для буфера задано 0.0, но по факту там иногда совершенно другие значения
Не знаю, может уже было, но вопрос такой, новый бар, значения PLOT_EMPTY_VALUE для буфера задано 0.0, но по факту там иногда совершенно другие значения
Насколько я помню, EMPTY_VALUE всего лишь задает, какое значение будет считаться пустым и не отображаться. С инициализацией буфера оно не имеет ничего общего. Вы сами должны заполнять буфер нулевым значением, чтобы там не было мусора.
Осваиваю файловые операции. Кто-нибудь в курсе, MQL4/5 быстрее работается с файлом csv или txt?
Какие задачи Вы пытаетесь решить через работу с файлами?
Плиз приведите пример кода, как вызвать из эксперта прилинкованный ресурс-индикатор, который в свою очередь использует в себе другой прилинкованный ресурс-индикатор. Например, есть индикатор A, из него вызывается B. Также есть эксперт C, который использует A. Что нужно прописать в #resource и при вызове iCustom во всех случаях?
Справка написана непонятно на сей счет. Обычная конструкция в индикаторе A: #resource "\\Indicators\B.ex4", а потом iCustom(::Indicators\B.ex4) - нормально работает при запуске индикатора A самого по себе. Однако если A вставляется в эксперт #resource "\\Indicators\A.ex4", возникает ошибка cannot load resource для вложенного индикатора, с указанием какого-то абсолютно кривого синтезированного пути, в котором почему-то упоминается каталог Libraries, а индикатор B ищется внутри самого себя (MQL4\Libraries\::Indicators\B.ex4::Indicators\B.ex4).
По поводу ArraySize я буквально на днях поднимал похожую проблемку на MQL4: https://www.mql5.com/ru/forum/152471. Как я понимаю, на MQL5 должно быть всё идентично этом плане.
А когда появился этот 969 билд? Возможно там как-раз и учли моё обращение :) По поводу этой проблемы в сервис-деске ответили, что причина была в некорректной работе оптимизатора, и что они поменяют тип на uint в новых билдах. Точнее по факту он и сейчас uint, просто недокументированно :) И кстати для ArrayResize тоже будут менять на uint. Я правда посоветовал им менять сразу на ulong, иначе в ближайшем будущем придётся вернуться к этой проблеме из-за нехватки 32-битного значения при хранения больших объёмов.
А что касается значения -1 при ошибке, то с этим проблем быть не должно, ибо: (int)-1 = (uint)-1 = 0xFFFFFFFF = UINT_MAX, т.е. битовое представление одно и то же. Правда операция сравнения уже даст другой результат. Т.е. если в коде было так:
то станет некорректно.
Общее количество элементов в MQL массиве не может превышать INT_MAX и меняться это не будет.
Если в MQL программе потребуются массивы бОльших размеров, Вам придётся создавать отдельный класс (например CBigArray).
Пытаюсь освоить iCustom в mql5. В mql4 умел виртуозно :)
Задача такая - отрисовать нечто подобное MACD, только вместо быстрой скользящей средней должен использоваться индикатор VIDYA, который лежит в папке Examples.
Взял стандартный код MACD и вставил туда вместо быстрой скользящей параметры для VIDYA. Проблема - все компилируется, но ничего не рисуется.
Я ниже в коде выделил 2 места, в которых изменил стандартный код MACD. В остальном все то же самое. Пожалуйста, подскажите, что ещё я упустил. Я так предполагаю, что это ниже где-то по коду...
Первый вставленный кусок:input int Per=7; // Per input int Per1=21; // Per1 input int Shift=0; // ShiftКонецВторой вставленный кусокКонецПытаюсь освоить iCustom в mql5. В mql4 умел виртуозно :)
Не знаю, может уже было, но вопрос такой, новый бар, значения PLOT_EMPTY_VALUE для буфера задано 0.0, но по факту там иногда совершенно другие значения
Не знаю, может уже было, но вопрос такой, новый бар, значения PLOT_EMPTY_VALUE для буфера задано 0.0, но по факту там иногда совершенно другие значения
Подскажите, если ранее счет пользовался сигналом, то в дальнейшем этот счет сам сигнал распространять не может?
upd: имеется ввиду не вторичное копирование сигнала, а новая система! пользование сигналом прекращено более полугода назад.