По поводу ArrayCopyRates Алексей правильно говорил. В справке написано:
Значит нужно писать:
Но это неэкономный код.
Да, смысла тащить все 6 показателей бара нет, если нужен только один. Лоу.
И нет смысла вглубь глубоко идти на одном масштабе (ТФ). После квартала можно перейти на недели, потом на месяцы, а 132 месяца, это 11 лет.
В общем мысль, что нет смысла считать на всем графике, количество исторических данных по сути случайно, может быть с 70 года, а может с 2000, на разном инструменте у разных поставщиков данных разное, а логика всегда лучше, когда она едина для всех случаев.
Остальное можно выкинуть из массива. Вот тогда это будет экономично.
Так было нарисовано. Идея пока ТопикСтартером не озвучена)
Надо найти значимые для ТС экстремумы и сравнить их. Одинаковых Лоу на расстоянии много. Достаточно часто Опен и Клоз на одной свече равны, а что говорить про минимальные цены дня на значительном расстоянии.
Да, смысла тащить все 6 показателей бара нет, если нужен только один. Лоу.
И нет смысла вглубь глубоко идти на одном масштабе (ТФ). После квартала можно перейти на недели, потом на месяцы, а 132 месяца, это 11 лет.
В общем мысль, что нет смысла считать на всем графике, количество исторических данных по сути случайно, может быть с 70 года, а может с 2000, на разном инструменте у разных поставщиков данных разное, а логика всегда лучше, когда она едина для всех случаев.
Попробую изъяснится точнее.
1. Это не идея а рабочий и уже отлаженный 5 летний опыт торговли который решено было автоматизировать (так как сидень у монитора постоянно это не очень, понимаешь с годами )
2. По этим линия формируется сигнал ложных пробоев и это работает (просто нужно знать как их применять) в дальнейшем их можно вообще не выводить .
3. В 2020 г 10 февраля впервые заметил эту не неточность которая как вы думаете не нужна из такой далекой истории
обратите внимание где где находится Min_D и может быть раз в год а то и в 10лет.(как пойдёт)
далее вы видим развитее событий 12000 пунктов шорт ( думаю не допустимо пропускать такие движение) В данном случаи выход за массив и не дал мне упустить эту возможность.
Вот так это и работает по сей день в общем не доставляло особых проблем
Ну а сей час пришло время двигается дальше и изучать MQL4
4. Что касается загрузки компа или еще чего там (то раз в сутки в 24.00 можно и пересчитать и 10 раз не торгую в пятницу после 20.00 , и в будни с 23.00 до 3.00) пусть себе считает.
5. Идея пока ТопикСтартером не озвучена .
Если читать с начала поста а не с середины все понятно.
1. Low_D1 и High_D1 (D1 Прошедший день ), Min_D и Max_D ( это ближайший из истории , именно та которая доступна по инструменту ) Min_D < Low_D1 и Max_D > High_D1
2. Low_W1 и High_W1 (далее все аналогично выше описанному только недели)
3. Low_MN1 и High_MN1 ( ну а тут соответственно месяц)
Пришёл за советам как это исправить , может чего-то не знаю (типа загрузить какое-нибудь файл с историей , или массив сам не поддерживает, а может 16 гигов аперитивы мало , вот и сам вопрос??? и т.д.)
на данный момент просто стоит Алерт когда линия не меняет значение .
//+------------------------------------------------------------------+//| Test_Level.mq4 |//| Copyright 2020, MetaQuotes Software Corp. |//| https://www.mql5.com |//+------------------------------------------------------------------+#property copyright"Copyright 2020, MetaQuotes Software Corp."#property link"https://www.mql5.com"#property version"1.00"#property strictdouble Bar_data_D1 [][6]; // Копирует в массив данные баров указанного графика и возвращает количество скопированных баров D1double Low_D1_Level; // Возвращает значение минимальной цены бара D1double Min_D_Level ; // ближайшей минимальный D уровеньdatetime Time_Day;
int A_C_R; // возвращает количество скопированных баров D1//+------------------------------------------------------------------+//| Expert initialization function |//+------------------------------------------------------------------+intOnInit()
{
Level();
return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+//| Expert deinitialization function |//+------------------------------------------------------------------+voidOnDeinit(constint reason)
{
}
//+------------------------------------------------------------------+//| Expert tick function |//+------------------------------------------------------------------+voidOnTick()
{
On_Timer();
}
//+------------------------------------------------------------------+//+------------------------------------------------------------------+//| Функция Level //+------------------------------------------------------------------+void Level()
{
A_C_R = ArrayCopyRates(Bar_data_D1,_Symbol,PERIOD_D1); // Копирует в массив данные баров указанного графика и возвращает количество скопированных баров
Low_D1_Level = iLow (_Symbol,PERIOD_D1,1); // Возвращает значение минимальной цены бара D1//--- Min_D_Leve //for(int i = 1; i<ArrayRange(Bar_data_D1,0) ;i++) // или так то ошибки нет и линия не перерисовывается for(int i = 1; ;i++) // а так выход за массив
{
Print(" i = ",i," Bar_data_D1 [i][2] = ",Bar_data_D1 [i][2]);
if(Bar_data_D1 [i][2]>=0)
{
if( Bar_data_D1 [i][2] < Low_D1_Level)
{
Min_D_Level = Bar_data_D1 [i][2];break;
}
}
}
//+-------------------------Low_D1_Level----------------------------+ if(ObjectFind("Low_D1")!=Low_D1_Level)
{
ObjectDelete("Low_D1");
if(ObjectFind("Low_D1")!=0)
{
ObjectCreate("Low_D1",OBJ_HLINE, 0, Time[0],Low_D1_Level);
ObjectSet("Low_D1", OBJPROP_COLOR, clrMaroon);
ObjectSet("Low_D1", OBJPROP_WIDTH, 1);
}
}
if(ObjectFind("Low_D1_label")!=Low_D1_Level)
{
ObjectDelete("Low_D1_label");
if(ObjectFind("Low_D1_label") != 0)
{
ObjectCreate("Low_D1_label", OBJ_TEXT, 0, Time[13], Low_D1_Level);
ObjectSetText("Low_D1_label", "Low_D1: " + DoubleToStr(Low_D1_Level,_Digits), 8,"Verdana", Brown);
}
}
//+-------------------------Min_D_Level----------------------------+ if(ObjectFind("Min_D")!= Min_D_Level)
{
ObjectDelete("Min_D");
if(ObjectFind("Min_D")!=0)
{
ObjectCreate("Min_D",OBJ_HLINE, 0, Time[0],Min_D_Level);
ObjectSet("Min_D", OBJPROP_COLOR, clrMaroon);
ObjectSet("Min_D", OBJPROP_WIDTH, 1);
}
}
if(ObjectFind("Min_D_label")!=Min_D_Level)
{
ObjectDelete("Min_D_label");
if(ObjectFind("Min_D_label") != 0)
{
ObjectCreate("Min_D_label", OBJ_TEXT, 0, Time[30], Min_D_Level);
ObjectSetText("Min_D_label", "Min_D: " + DoubleToStr(Min_D_Level,_Digits), 8,"Verdana", Brown);
}
}
}
//+------------------------------------------------------------------+//| функция удаление всех объектов созданных советником//+------------------------------------------------------------------+void DestroyObject()
{
int tot=ObjectsTotal();
for( int i=tot; i>=0; i--)
{
if(ObjectName(i)=="Low_MN1"){ObjectDelete(0,"Low_MN1");Print("<< Объект Low_MN удалён >>");}
if(ObjectName(i)=="Low_MN1_label"){ObjectDelete(0,"Low_MN1_label");Print("<< Объект Low_MN1_label удалён >>");}
if(ObjectName(i)=="Min_D"){ObjectDelete(0,"Min_D");Print("<< Объект Min_D удалён >>");}
if(ObjectName(i)=="Min_D_label"){ObjectDelete(0,"Min_D_label");Print("<< Объект Min_D_label удалён >>");}
}
}
//+-------------------------------------------------------------------------+ // функция Timer //+-------------------------------------------------------------------------+void On_Timer()
{
if(Day()!= Time_Day)
{
Level();
Time_Day = Day();
}
}
По поводу ArrayCopyRates Алексей правильно говорил. В справке написано:
Значит нужно писать:
Но это неэкономный код.
Да, смысла тащить все 6 показателей бара нет, если нужен только один. Лоу.
И нет смысла вглубь глубоко идти на одном масштабе (ТФ). После квартала можно перейти на недели, потом на месяцы, а 132 месяца, это 11 лет.
В общем мысль, что нет смысла считать на всем графике, количество исторических данных по сути случайно, может быть с 70 года, а может с 2000, на разном инструменте у разных поставщиков данных разное, а логика всегда лучше, когда она едина для всех случаев.
Валерий, точно говорите!
По идее нам нужны только эти бары истории:
Остальное можно выкинуть из массива. Вот тогда это будет экономично.
Валерий, точно говорите!
По идее нам нужны только эти бары истории:
Остальное можно выкинуть из массива. Вот тогда это будет экономично.
Так было нарисовано. Идея пока ТопикСтартером не озвучена)
Надо найти значимые для ТС экстремумы и сравнить их. Одинаковых Лоу на расстоянии много. Достаточно часто Опен и Клоз на одной свече равны, а что говорить про минимальные цены дня на значительном расстоянии.
Заметил ошибку в циклах. И изменил сравнение не с текущим днём, а вчерашним. Попробуйте
Приветствую Всех !!!
Отлучался по делам .
Процесс полным ходом .
Протестировал !
Результат такой.
Остановил тестер пошли по истории вручную. Значение Max_D должен браться от сюда.
Я не понял, что не так. Это линия минимумов.
На всякий пожарный, скопируйте код по-новой, я там менял периодически, возможно, у Вас старая версия
Да, смысла тащить все 6 показателей бара нет, если нужен только один. Лоу.
И нет смысла вглубь глубоко идти на одном масштабе (ТФ). После квартала можно перейти на недели, потом на месяцы, а 132 месяца, это 11 лет.
В общем мысль, что нет смысла считать на всем графике, количество исторических данных по сути случайно, может быть с 70 года, а может с 2000, на разном инструменте у разных поставщиков данных разное, а логика всегда лучше, когда она едина для всех случаев.
Попробую изъяснится точнее.
1. Это не идея а рабочий и уже отлаженный 5 летний опыт торговли который решено было автоматизировать (так как сидень у монитора постоянно это не очень, понимаешь с годами )
2. По этим линия формируется сигнал ложных пробоев и это работает (просто нужно знать как их применять) в дальнейшем их можно вообще не выводить .
3. В 2020 г 10 февраля впервые заметил эту не неточность которая как вы думаете не нужна из такой далекой истории
обратите внимание где где находится Min_D и может быть раз в год а то и в 10лет.(как пойдёт)
далее вы видим развитее событий 12000 пунктов шорт ( думаю не допустимо пропускать такие движение) В данном случаи выход за массив и не дал мне упустить эту возможность.
Вот так это и работает по сей день в общем не доставляло особых проблем
Ну а сей час пришло время двигается дальше и изучать MQL4
4. Что касается загрузки компа или еще чего там (то раз в сутки в 24.00 можно и пересчитать и 10 раз не торгую в пятницу после 20.00 , и в будни с 23.00 до 3.00) пусть себе считает.
5. Идея пока ТопикСтартером не озвучена .
Если читать с начала поста а не с середины все понятно.
1. Low_D1 и High_D1 (D1 Прошедший день ), Min_D и Max_D ( это ближайший из истории , именно та которая доступна по инструменту ) Min_D < Low_D1 и Max_D > High_D1
2. Low_W1 и High_W1 (далее все аналогично выше описанному только недели)
3. Low_MN1 и High_MN1 ( ну а тут соответственно месяц)
В коде цикл for // прочитайте описание
Пришёл за советам как это исправить , может чего-то не знаю (типа загрузить какое-нибудь файл с историей , или массив сам не поддерживает, а может 16 гигов аперитивы мало , вот и сам вопрос??? и т.д.)
на данный момент просто стоит Алерт когда линия не меняет значение .
Я не понял, что не так. Это линия минимумов.
На всякий пожарный, скопируйте код по-новой, я там менял периодически, возможно, у Вас старая версия
Ок Ща попробую еще раз