Упрощенно так, CopyOpen я так понимаю лишнее для OnCalculate, но так он видит только историю из окна терминала?
Массив mas на каждом тике создается с нулевым размером и далее нигде не меняет свой размер. Поэтому любое обращение к нему вызовет выход за пределы массива.
Чтобы решить проблему, нужно либо изменить размер на такой, который вместит показания всех баров истории, либо связать его с буфером индикатора (соответственно, объявлен должен быть как глобальная переменная программы). Ведь, если я правильно понимаю, именно эти значения нужно отображать при помощи индикатора.
Упрощенно так, CopyOpen я так понимаю лишнее для OnCalculate, но так он видит только историю из окна терминала?
Пример:
//+------------------------------------------------------------------+//| Test.mq5 |//| Copyright 2018, MetaQuotes Software Corp. |//| https://mql5.com/ru/users/artmedia70 |//+------------------------------------------------------------------+#property copyright"Copyright 2018, MetaQuotes Software Corp."#property link"https://mql5.com/ru/users/artmedia70"#property version"1.00"#property indicator_separate_window#property indicator_buffers1#property indicator_plots1//--- plot OC#property indicator_label1"Open/Close"#property indicator_type1DRAW_LINE#property indicator_color1clrRed#property indicator_style1STYLE_SOLID#property indicator_width11//--- indicator buffersdouble BufferOC[];
//+------------------------------------------------------------------+//| Custom indicator initialization function |//+------------------------------------------------------------------+intOnInit()
{
//--- Задаём массив BufferOC как буфер индикатораSetIndexBuffer(0,BufferOC,INDICATOR_DATA);
//--- Устанавливаем ему направление индексации как у таймсерииArraySetAsSeries(BufferOC,true);
//---return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+//| Custom indicator iteration function |//+------------------------------------------------------------------+intOnCalculate(constint rates_total,
constint prev_calculated,
constdatetime &time[],
constdouble &open[],
constdouble &high[],
constdouble &low[],
constdouble &close[],
constlong &tick_volume[],
constlong &volume[],
constint &spread[])
{
//--- Проверка на минимальное колиество баров для расчётаif(rates_total<1) return0;
//--- Установка массивов буферов как таймсерийArraySetAsSeries(open,true);
ArraySetAsSeries(close,true);
//--- Проверка и расчёт количества просчитываемых баровint limit=rates_total-prev_calculated;
if(limit>1) // если это первый запуск, или изменение истории, или открытие нового бара
{
limit=rates_total-1; // установим начало цикла на начало исторических данныхArrayInitialize(BufferOC,EMPTY_VALUE); // инициализируем массив
}
//--- Расчёт индикатораfor(int i=limit; i>=0 && !IsStopped(); i--)
{
if(close[i]==0) continue;
BufferOC[i]=open[i]/close[i];
}
//--- return value of prev_calculated for next callreturn(rates_total);
}
//+------------------------------------------------------------------+
Массив mas на каждом тике создается с нулевым размером и далее нигде не меняет свой размер. Поэтому любое обращение к нему вызовет выход за пределы массива.
Чтобы решить проблему, нужно либо изменить размер на такой, который вместит показания всех баров истории, либо связать его с буфером индикатора (соответственно, объявлен должен быть как глобальная переменная программы). Ведь, если я правильно понимаю, именно эти значения нужно отображать при помощи индикатора.
Моя неточность, mas[] это действительно глобальный массив должен быть, но и индикаторный буфер тоже не подходит, скорее это будет промежуточный многомерный массив. Как лучше определять оптимальный размер массива для М5, не через индикаторный буфер?
Моя неточность, mas[] это действительно глобальный массив должен быть, но и индикаторный буфер тоже не подходит, скорее это будет промежуточный многомерный массив. Как лучше определять оптимальный размер массива для М5, не через индикаторный буфер?
Про многомерный - не понял. Ведь речь идет об одномерном массиве. Кроме того, в MQL4 максимум измерений массива - 4.
Чтобы сделать массив такого же размера, как размер таймсерий, нужно изменить его размер в соответствии с количеством баров, имеющихся на графике нужного символа и периода:
double fArray[];
int nBarsCnt = iBars(<символ>, <таймфрейм>);
if (ArrayResize(fArray, nBarsCnt) != nBarsCnt)
{
// Не удалось изменить размер массиваreturn;
}
ArraySetAsSeries(fArray, true);
Моя неточность, mas[] это действительно глобальный массив должен быть, но и индикаторный буфер тоже не подходит, скорее это будет промежуточный многомерный массив. Как лучше определять оптимальный размер массива для М5, не через индикаторный буфер?
Почему не хотите использовать массивы как буферы индикатора? За ними следит подсистема, что облегчает вам работу.
А промежуточный массив-буфер индикатора делается легко:
Подскажите пожалуйста, что нужно дописать и куда, чтобы неоткрывшийся отложенный ордер был удален в том случае, если цена уже прошла стоп лосс(этого неоткрывшегося оредра).
Извините за глупый вопрос, заблудился в форумах пока искал ответ.
а как правильно это выполнять?
А как вы это делаете?
Упрощенно так, CopyOpen я так понимаю лишнее для OnCalculate, но так он видит только историю из окна терминала?
Упрощенно так, CopyOpen я так понимаю лишнее для OnCalculate, но так он видит только историю из окна терминала?
Массив mas на каждом тике создается с нулевым размером и далее нигде не меняет свой размер. Поэтому любое обращение к нему вызовет выход за пределы массива.
Чтобы решить проблему, нужно либо изменить размер на такой, который вместит показания всех баров истории, либо связать его с буфером индикатора (соответственно, объявлен должен быть как глобальная переменная программы). Ведь, если я правильно понимаю, именно эти значения нужно отображать при помощи индикатора.
Упрощенно так, CopyOpen я так понимаю лишнее для OnCalculate, но так он видит только историю из окна терминала?
Пример:
Массив mas на каждом тике создается с нулевым размером и далее нигде не меняет свой размер. Поэтому любое обращение к нему вызовет выход за пределы массива.
Чтобы решить проблему, нужно либо изменить размер на такой, который вместит показания всех баров истории, либо связать его с буфером индикатора (соответственно, объявлен должен быть как глобальная переменная программы). Ведь, если я правильно понимаю, именно эти значения нужно отображать при помощи индикатора.
Моя неточность, mas[] это действительно глобальный массив должен быть, но и индикаторный буфер тоже не подходит, скорее это будет промежуточный многомерный массив. Как лучше определять оптимальный размер массива для М5, не через индикаторный буфер?
Моя неточность, mas[] это действительно глобальный массив должен быть, но и индикаторный буфер тоже не подходит, скорее это будет промежуточный многомерный массив. Как лучше определять оптимальный размер массива для М5, не через индикаторный буфер?
Про многомерный - не понял. Ведь речь идет об одномерном массиве. Кроме того, в MQL4 максимум измерений массива - 4.
Чтобы сделать массив такого же размера, как размер таймсерий, нужно изменить его размер в соответствии с количеством баров, имеющихся на графике нужного символа и периода:
Моя неточность, mas[] это действительно глобальный массив должен быть, но и индикаторный буфер тоже не подходит, скорее это будет промежуточный многомерный массив. Как лучше определять оптимальный размер массива для М5, не через индикаторный буфер?
Почему не хотите использовать массивы как буферы индикатора? За ними следит подсистема, что облегчает вам работу.
А промежуточный массив-буфер индикатора делается легко:
Здравствуйте.
На платформе объемы тиковые,реальные объёмы будут?
Здравствуйте.
На платформе объемы тиковые,реальные объёмы будут?
Не будет. Используйте МТ5, там некоторые брокеры предоставляют реальные объемы.
Добрый день!
Прошу помочь со следующей проблемой:
1) После выполнения некоторых условий, открывается отложенный ордер:
{ price=High[1]+OrderPoint*Point; stoploss=Low[1]-Point; takeprofit=price+price-stoploss; OrderSend(Symbol(),OP_BUYSTOP,1,price,3,stoploss,takeprofit); }Подскажите пожалуйста, что нужно дописать и куда, чтобы неоткрывшийся отложенный ордер был удален в том случае, если цена уже прошла стоп лосс(этого неоткрывшегося оредра).
Извините за глупый вопрос, заблудился в форумах пока искал ответ.
Заранее благодарю!