Jump to content
Sign in to follow this  
elisseev2000

создание массива из множества значений

Recommended Posts

AntFX

Похоже ему как и всем прочим нужно чтобы им рассказали как сделать что-то, и при этом он не хочет рассказывать, что именно нужно сделать. И рыбку съесть и в воду не залезть. Очень типичная ситуация для данного раздела.


1

Share this post


Link to post
Share on other sites
Circle
"И тут я массив использую в личных целях))) например для решения СЛАУ

Подскажите пожалуйста как это сделать в mql4"

Это я написал просто что потом буду с массивом делать.

Вопрос КАК создать в цикле массив, что бы он был в памяти после завершения цикла

 

Если вы разбираетесь в программировании, то наверняка можете составить формальный алгоритм заполнения двухмерного массива.

Вам остается только потратить некоторое количество времени на ознакомление с синтаксисом языка mql, который практически ни чем не отличается от синтаксиса популярных языков программирования, такие как например С,С++,С#,PHP и т.д.


Что такое форекс? Это там где деньги лежат.  :)

Share this post


Link to post
Share on other sites
elisseev2000
Да, согласен, фортран - значительно отличается от MQL4 и др. C-подобных языков. Однако, уверен, что даже этот опыт программирования Вам пригодится в освоении MQL4.

 

Всегда рад помочь :beer_drink:

Обращайтесь, если появятся еще вопросы.

 

Кирилл

 

Здравствуйте, Кирилл.

Есть вопрос. Если размерность массива зависит от переменной, то как его объявить? Например.

for(m=1;m<=10;m++)

double A[m][m]

Так нельзя. А как можно?

Спасибо

Олег

Share this post


Link to post
Share on other sites
Circle

Если заранее размер массива неизвестен то объявите динамический (без указания размера) массив.

Например double A[];

Для изменения размера массива используйте функцию ArrayResize().


Что такое форекс? Это там где деньги лежат.  :)

Share this post


Link to post
Share on other sites
Programmer

Подробней про ArrayResize() читайте здесь: http://docs.mql4.com/ru/array/ArrayResize

Обратите внимание на важное замечание "Массив' date=' объявленный на локальном уровне в какой-либо функции, у которого был изменен размер, останется неизменным после завершения работы функции. При повторном вызове функции такой массив будет иметь размер, отличный от объявленного."[/i']

Из-за этого свойства локальных массивов (связанных со структурой MQL4) можно легко набрать трудно-отслеживаемых ошибок в программе!

 

Кирилл

Share this post


Link to post
Share on other sites
Programmer

И тут я массив использую в личных целях))) например для решения СЛАУ

Подскажите пожалуйста как это сделать в mql4

 

Приветствую,

Я согласен общественным мнением - Вам необходимо конкретизировать вопрос.

Share this post


Link to post
Share on other sites
Programmer
Здравствуйте.

Вопрос следующий.

Если надо вычислить сумму, зависящую от 2 переменных, то правильно будет оформить вычисление через двойной цикл

 

Здравствуйте Олег,

Да, верно - в подобных случаях нужно применять вложенные циклы. Однако, помните, что в связи со своебразием языка MQL4 в некоторых случаях циклы необходимо организовывать от конца к началу. Это связано с тем, что в MQL4 Вы можете закрывать/удалять рыночные/отложенные ордера внутри цикла, что будет влиять на количество перебираемых элементов и их порядковые номера в цикле.

 

Подробней читайте в Курсе MQL4: https://forum.alpari.com/showpost.php?p=2570917&postcount=76

 

Урок называется "Способы перебора массивов". Информация больше относится к работе с ордерами, в меньшей степени - к расчетам. Но все же, ознакомиться стоит.

 

Кирилл

Share this post


Link to post
Share on other sites
New Guest

Подскажите , что ознaчает ошибка "индекс находился вне границ массива" fr.OnExecute() - Error

Share this post


Link to post
Share on other sites
Programmer
Подскажите , что ознaчает ошибка "индекс находился вне границ массива" fr.OnExecute() - Error

 

Скорее всего, это означает, что Вы пытаетесь обратиться к несуществующему элементу массива.

Например, у Вас массив объявлен как:

int myArray[7];

 

Элементов всего 7, а в коде Вы обращаетесь к 11-му элементу:

myArray[10]

 

Наиболее часто подобная ошибка возникает из-за того, чтоб программист забывает, что массивы нумеруются с нуля, а не с единицы. Например, к массиву из 7-ми элементов доступны следующие обращения:

 

myArray[0] - 1й элемент

myArray[1] - 2й элемент

myArray[2] - 3й элемент

myArray[3] - 4й элемент

myArray[4] - 5й элемент

myArray[5] - 6й элемент

myArray[6] - 7й элемент

 

Надеюсь, данное объяснение понятно. Пишите, если остались вопросы - разберемся вместе.

 

Кирилл

Share this post


Link to post
Share on other sites
New Guest
Скорее всего, это означает, что Вы пытаетесь обратиться к несуществующему элементу массива.

Например, у Вас массив объявлен как:

int myArray[7];

 

Элементов всего 7, а в коде Вы обращаетесь к 11-му элементу:

myArray[10]

 

Наиболее часто подобная ошибка возникает из-за того, чтоб программист забывает, что массивы нумеруются с нуля, а не с единицы. Например, к массиву из 7-ми элементов доступны следующие обращения:

 

myArray[0] - 1й элемент

myArray[1] - 2й элемент

myArray[2] - 3й элемент

myArray[3] - 4й элемент

myArray[4] - 5й элемент

myArray[5] - 6й элемент

myArray[6] - 7й элемент

 

Надеюсь, данное объяснение понятно. Пишите, если остались вопросы - разберемся вместе.

 

Кирилл

 

Т.е если я программирую в коде что боллинджер должен пересечь зигзаг это означает что боллинджер никогда зигзаг не пересекет.Нужно делать чтоб зигзаг пересекал боллинджера.Так что ли?

Share this post


Link to post
Share on other sites
Pavel Kononenko
Т.е если я программирую в коде что боллинджер должен пересечь зигзаг это означает что Боллинджер никогда зигзаг не пересекет.Нужно делать чтоб зигзаг пересекал боллинджера.Так что ли?

 

Что?:insane:

Как это связано с размерностью массива? Во первых Зигзаг(в стандартной поставке) перерисовывающийся и с дичайшими глюками при построении в реалтайме. Здесь нужен более сложный алгоритм. Сначала нужно перейти от секций к линиям.

И вообще, Болинджер - это СКО. Оно характеризует разброс случайной величины. Читайте правило трех сигм. Вот это Боллинджер.

Учите матчасть. Нет и не может быть никакого сигнала на пересечении каких-то там линий с Боллинджером [-X Это все-равно что яблоки умножать на огурцы. Есть случайная величина(цена) и есть ее разброс(границы Боллинджера). Другое учитывать в Боллинджере глупо.

Edited by Rails

Share this post


Link to post
Share on other sites
New Guest

Получается по правилу 3-х сигм невозможно уловить через программный код, пересечение Боллинджером трендовой линии и открыть позицию,можно только стрелочку на рисовать на графике и всё.Или и стрелочки не получиться нарисовать, потому что в компиляторе нет таких функций.:casha:

Share this post


Link to post
Share on other sites
Ugar68
Получается по правилу 3-х сигм невозможно уловить через программный код, пересечение Боллинджером трендовой линии и открыть позицию,можно только стрелочку на рисовать на графике и всё.Или и стрелочки не получиться нарисовать, потому что в компиляторе нет таких функций.:casha:

У зигзага ломаная линия рисуется по экстремумум. От зигзага можно их получить. Имея 2 точки, можно прочертить линию. А можно вычислить координаты всех промежуточных точек этой линии.

Конверт Боллинжера это МА и стандартные девиации от МА вверх и вниз. Если воспринимать конверт не как канал, а как 3 линии, можно получить все точки линий конверта. А значит можно и регистрировать пересечение линий зигзага и Боллинжера.


Пишу советники и индикаторы по вашим алгоритмам. Пишите в личку.
Чужие программы не переделываю.

Share this post


Link to post
Share on other sites
New Guest
Имея 2 точки, можно прочертить линию.

А можно создать код именно для построения произвольной линии в советнике? чтобы через график при построении трендовой по своим правилам регистрировалось пересечение именно Боллинджера с трендовой, а не наоборот и открывалась позиция.

Share this post


Link to post
Share on other sites
Ugar68
А можно создать код именно для построения произвольной линии в советнике?

чтобы через график при построении трендовой по своим правилам регистрировалось пересечение именно Боллинджера с трендовой, а не наоборот и открывалась позиция.

Координата это время и цена. Имея 2 координаты легко установить объект трендовую линию. Но этот советник будет работать в тестере только в визуальном режиме. В остальных режимах объекты не работают.

Что бы работало в тестере во всех режимах нужно вместо реальных линий вычислять её цены на каждом баре с помощью линейного уравнения.

чтобы через график при построении трендовой по своим правилам регистрировалось пересечение именно Боллинджера с трендовой, а не наоборот и открывалась позиция.

Чего? Вообще то если 1 линия пересекает 2, то и 2 пересекает 1 только в другую сторону.


Пишу советники и индикаторы по вашим алгоритмам. Пишите в личку.
Чужие программы не переделываю.

Share this post


Link to post
Share on other sites
New Guest

 

Чего? Вообще то если 1 линия пересекает 2, то и 2 пересекает 1 только в другую сторону.

Если вычислять цены на каждом баре у Боллинджера и Трендовой с помощью линейного уравнения, то можно только вычислить пересечение или их равенство,а больше/ меньше при таких обстоятельствах не получиться задать?

Share this post


Link to post
Share on other sites
Ugar68
Если вычислять цены на каждом баре у Боллинджера и Трендовой с помощью линейного уравнения, то можно только вычислить пересечение или их равенство,а больше/ меньше при таких обстоятельствах не получиться задать?

Почему не получится? А как без больше/меньше определить пересечение?

Если на i баре линия Боллинжера больше трендовой, а на i+1 линия Боллинжера меньше трендовой, это и есть пересечение.


Пишу советники и индикаторы по вашим алгоритмам. Пишите в личку.
Чужие программы не переделываю.

Share this post


Link to post
Share on other sites
elisseev2000

Здравствуйте. При написании индикатора наткнулся на такую проблему. Мне необходимо создать массив закрытия цен для недели ИМЕННО из массива данных цен закрытия дня. пишу следующее

for (j1=1;j1<=15125;j1=j1+125)

ExtMapBuffer1[j1]=iClose (NULL,PERIOD_H1,j1);

............................

Не работает. просто ничего не отображает. Помогите мне пожалуйста.

Заранее благодарен. Олег.

Share this post


Link to post
Share on other sites
AntFX
Здравствуйте. При написании индикатора наткнулся на такую проблему. Мне необходимо создать массив закрытия цен для недели ИМЕННО из массива данных цен закрытия дня.

А зачем вам создавать массив цен закрытия недели именно из цен закрытия дня? Почему нельзя взять цены закрытия именно недели?

Почему в вашем примере вы начинаете с бара с индексом 1? Разве алгоритм запускается только на нулевом часе каждого дня?

Почему вы считаете, что в каждой неделе должно быть 125 ценовых баров?

Во-первых 24*5=120, а не 125

Во-вторых у брокера рынок может открываться в понедельник в 1:00, а закрываться в пятницу в 22:00, к примеру.

В-третьих, могут выпадать периоды праздников, когда котировки отсутствуют внутри недели

Если все таки исходить из равного кол-ва часовых баров в каждой неделе (120), что на практике может быть неверно, то цикл должен выглядеть так:

for (j1=0;j1<121;j1++)
ExtMapBuffer1[j1]=iClose(NULL,PERIOD_H1,Hour()+1+j1*120);

Edited by AntFX

1

Share this post


Link to post
Share on other sites
elisseev2000

Дело в том что я пишу индикатор в котором мне надо одновреммено использовать массивы закрытия разных таймфреймов. Я хочу привести все какбы к общему знаменателю т.е к часам. Я беру из массива часов выборку для недели , дня и 4часа. Индикатор вобще ничего не отображает. Насчет рабочих дней итд все правильно. Я пока хочу просто отработать идею. Спасибо за ответ

Share this post


Link to post
Share on other sites
elisseev2000

спасибо ОГРОМНОЕ. Очень помогли. Хочется написать индикатор с 70% вероятности

Share this post


Link to post
Share on other sites
elisseev2000

а вы удалили второй более правильный вариант?? а то он не отображается

Share this post


Link to post
Share on other sites
elisseev2000

второй вариант ничего не отображает

Share this post


Link to post
Share on other sites
AntFX
второй вариант ничего не отображает

 

Додебажил )))

На всякий случай вот правильный вариант в составе индикатора.

#property indicator_separate_window
#property indicator_buffers 1
#property indicator_color1 clrYellow

double ExtMapBuffer1[];

void init()
 {
  SetIndexStyle(0,DRAW_LINE);
  SetIndexBuffer(0,ExtMapBuffer1);
  IndicatorDigits(Digits);
 }

void start()
 {
datetime lastweek_endhour_start=iTime(NULL, PERIOD_H1, iBarShift(NULL, PERIOD_H1, TimeCurrent()-TimeCurrent()%86400-(DayOfWeek()-1)*86400)+1);
for (int j1=0;j1<121;j1++)
{
int shift=iBarShift(NULL, PERIOD_H1, lastweek_endhour_start-604800*j1, true);
if(shift<0)
{
shift=iBarShift(NULL, PERIOD_H1, lastweek_endhour_start-604800*j1);
if(iTime(NULL, PERIOD_H1, shift)>lastweek_endhour_start-604800*j1 && shift<iBars(NULL, PERIOD_H1)-1) shift++;
}
ExtMapBuffer1[j1+1]=iClose(NULL,PERIOD_H1,shift);
}  
}

 

%2$s


1

Share this post


Link to post
Share on other sites
elisseev2000

Спасибо

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
Sign in to follow this  

  • Recently Browsing   0 members

    No registered users viewing this page.

×