Помогите Структуры и MQH библиотека - страница 2

 
Alexey Viktorov:

Не удивительно. Если через строку вставлять по 3 пустые то советник разрастётся до 9 тыс. строк.

Суть файла .mqh в том, чтобы некоторые функции и/или структуры можно было хранить вне основного кода. Но при компиляции эти функции вносятся в код программы как родные. Тоесть, если у тебя в .mqh есть структура, то к ней из советника надо обращаться так-же как если она в основном коде, но при этом в начале кода надо компилятору объяснить что если здесь чего-то не находишь, то посмотри в инклюднике.

#include <ArrMQH.mqh>

Я ему про то и говорил. Инклуд просто заменяет всё что в инглудном файле.
 

Массив до 4х мерного ничем не отличается от структуры. Но структура удобней тем, что если нужно хранить данные и double и int в одном массиве, то массив должен int как тип double и при чтении надо приводить их к нужному типу. В структуре-же хранятся и double и int и string и все остальные, да ещё и не ограничен размер.

А обращение к структуре мало чем отличается

double d = arr[0];

// равно

double d = str.имя_элемента_структуры;

 
Alexey Viktorov:

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

DATA_ARREY_MQH globArrayMQH[1];

или лучше

DATA_ARREY_MQH globArrayMQH;

Зачем массив с одним элементом? Хотя если предполагаешь потом увеличивать, то пусть будет так.

НО в инклюднике её объявлять не надо.

В твоём-же коде присутствуют две структуры и создаёшь две переменные.

И ещё вопрос: для чего в структуре конструктор?

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

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

Я не очень силен в программировании, я привел пример упрощенно, как у меня сейчас все организованно в советнике. 

Может просто покажете где и что надо у меня в коде поправить чтоб все заработало.

RE:  "И ещё вопрос: для чего в структуре конструктор?"  Как было в примере так и сделал. И все работает, ошибок нет. код компилируется без ошибок и восклицаний.

Весь советник построен подобным образом на подобном массиве.  

RE: Зачем массив с одним элементом? Хотя если предполагаешь потом увеличивать, то пусть будет так. В твоём-же коде присутствуют две структуры и создаёшь две переменные.  "

 на самом деле их в 10 раз больше.( В коде я все очень упростил.) А количество элементов я могу и увеличить.

 
Vasyl Nosal:
Поддерживаю!!!!!!!!!!!!
Alexey Viktorov:

Не удивительно. Если через строку вставлять по 3 пустые то советник разрастётся до 9 тыс. строк.

Суть файла .mqh в том, чтобы некоторые функции и/или структуры можно было хранить вне основного кода. Но при компиляции эти функции вносятся в код программы как родные. Тоесть, если у тебя в .mqh есть структура, то к ней из советника надо обращаться так-же как если она в основном коде, но при этом в начале кода надо компилятору объяснить что если здесь чего-то не находишь, то посмотри в инклюднике.

#include <ArrMQH.mqh>

По поводу пустых строк вопрос надо задавать разрабу metaeditorа. Он их какого то х.. сам вставляет. В коде что выкладывал специально все пустые строки удалил откомпилировал для проверки и выложил... Результат... пустые строки.

 Суть .mqh  понятна. boll работает без проблем ;-). Почему тогда не работает мой пример. У меня в коде есть такая строчка #include <ArrMQH.mqh>.

Только вы сами попробуйте в каком нибудь из этих двух файлов не обьявить структуру.... :-) 

 
Alexey Viktorov:

Массив до 4х мерного ничем не отличается от структуры. Но структура удобней тем, что если нужно хранить данные и double и int в одном массиве, то массив должен int как тип double и при чтении надо приводить их к нужному типу. В структуре-же хранятся и double и int и string и все остальные, да ещё и не ограничен размер.

А обращение к структуре мало чем отличается

double d = arr[0];

// равно

double d = str.имя_элемента_структуры;

В моей структуре так и есть doble, int, datetime, ENUM_TIMEFRAMES, enum. И как с этим всем работать тоже есть понимание.(все работает). 

Просто хочу половину кода вынести в MQH. 

 

Вот текст .mqh

//+------------------------------------------------------------------+
//|                                                         test.mqh |
//|                                         Copyright 2016, Viktorov |
//|                                                v4forex@yandex.ru |
//+------------------------------------------------------------------+
#property copyright "Copyright 2016, Viktorov"
#property link      "v4forex@yandex.ru"
#property strict


struct sss
{
 datetime time;
 int      bar;
};

и вот код советника

/********************************************************************\
                                                  Херня какая-та.mq4 |
                                            Copyright 2014, Viktorov |
                                                      v4forex@qip.ru |
\********************************************************************/

#property copyright "Copyright 2014, Viktorov"
#property link      "v4forex@qip.ru"
#property version   "1.0"
#property strict
#include <test.mqh>

input int   Bar = 0;
sss arr[];
/******************Expert initialization function*******************/
int OnInit()
{
  ArrayResize(arr, Bar+1);
  return(INIT_SUCCEEDED);
}/*******************************************************************/

/************************Expert tick function***********************/
void OnTick()
{
  arr[Bar].time = Time[Bar];
  arr[Bar].bar  = iBarShift(_Symbol, PERIOD_CURRENT, arr[Bar].time);
   Comment("Бар ", arr[Bar].bar , "\n"
         , "Время ", arr[Bar].time, "\n"
         );
}/*******************************************************************/

void OnDeinit(const int reason)
{/*****************Expert deinitialization function******************/
   Comment("");
}/*******************************************************************/
 
Alexey Viktorov:

Вот текст .mqh

и вот код советника

Все равно не получается.

arr[Bar].time = Time[Bar];
arr[Bar].bar  = iBarShift(_Symbol, PERIOD_CURRENT, arr[Bar].time);

 Это нужно получить из mqh файла. А в сове прочитать.

 Но это уже что-то спасибо. Попробую разобраться.

 
ForTorg ZEVs:

Все равно не получается.

 Это нужно получить из mqh файла. А в сове прочитать.

 Но это уже что-то спасибо. Попробую разобраться.

Смотри, в этом примере очень важна последовательность. Сначала пишется в структуру время указанного бара, потом используя это время получаем номер бара функцией iBarShift()

Я умышленно переплёл всё. Чтобы показать и запись в структуру и чтение из неё.

 
Alexey Viktorov:

Смотри, в этом примере очень важна последовательность. Сначала пишется в структуру время указанного бара, потом используя это время получаем номер бара функцией iBarShift()

Я умышленно переплёл всё. Чтобы показать и запись в структуру и чтение из неё.

Огромнейшее Спасибо разобрался. Усе работает как надо. Тему можно закрывать. Не пойму тока как плюсовать, или на этом форуме нету такого... Еще раз Спасибо.

 
ForTorg ZEVs:

 Как я не пытался результат отрицательный; не объявлен или уже  объявлен. 

Мне нужно передать данные из MQH в MQL4 советник и дальше с ними работать в советнике. В файл MQH ничего не передается. Он получает котировки, обрабатывает и отправляет сигнал советнику.

Может эти структуры и называются иначе, но суть то не меняется. 

Внимательно прочитайте и сделайте. У меня почему-то результат положительный. Представляете, не от балды написал, а сначала попробовал.

В конце концов можно сделать просто - освободить mqh, добиться, чтобы советник компилировался, а потом переносить код в mqh. 

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