Ваши вопросы по языку MQL4

ansol

Местный знаток
Проблема в том, что мой тупой советник очень сильно зависит от ДЦ и если я исправлю(или не исправлю) советник, то могу сильно угореть на бабло
 

ShadowCandle

Гуру форума
Врать нехорошо! оО
Ничего похожего нет и не было никогда! Если приложение называется "Уродыинста", то и папка будет называться в "документс энд сеттингз" как "уродыинста", не не как в вышеприведенном примере!
Вот это:
2E6A005861382433BE12963DE9029B61
Придумали идиоты метаквоты.
Попробуйте доказать обратное
А вам не кажется, что вы сами нарываетесь на такое отношение, я вам говорю как есть, а вы меня просите что-то вам доказывать? Я обязан это делать? Я вам пытаюсь помочь прояснить ситуацию, а вы меня начинаете проверять на правду? :facepalm:
С таким отношением флаг вам в руки... :nda:
 
Последнее редактирование модератором:

ansol

Местный знаток
Вообще, борьба с исходниками выглядит уныло. Когда-нибудь этот позор уйдет с лица Земли, возможно, вместе с человечеством.
Например, если я не хочу, чтобы мой бутерброд съели, то я его не буду выкладывать в коридоре. Таким образом, у меня его(бутерброд) можно только забрать с уголовно наказуемыми деяниями, например, морду набить.
 

hmpr

Прохожий
Здравствуйте. Помогите решить такую задачу: при написании индикатора необходимо, чтобы он прибавлял значение индикатора нулевого бара (например столбец MACD) к значению индикатора 1-го, 1-го к 2-го и т.д. Как это можно реализовать? Уже неделю бьюсь безрезультатно. Помогите пожалуйста.
 

Dom

Гуру форума
Подскажите пожалуйста, кто знает, как понять строку arrays passed by reference only(массивы передаются только по ссылке).Это после компиляции советника в новом билде.
 

Ugar

Гуру форума
Здравствуйте. Помогите решить такую задачу: при написании индикатора необходимо, чтобы он прибавлял значение индикатора нулевого бара (например столбец MACD) к значению индикатора 1-го, 1-го к 2-го и т.д. Как это можно реализовать? Уже неделю бьюсь безрезультатно. Помогите пожалуйста.
Так как 0 бар меняется, придётся пересчитывать все бары что бы они то же менялись.
Значит меняем limit=Bars-counted_bars; на limit=Bars;

В MACD быры перебираются от 0. Значит при расчёте всех остальных баров, значение 0 уже посчитано, нужно просто прибавить.
Вместо
Код:
Expand Collapse Copy
for(int i=0; i<limit; i++)
      MacdBuffer[i]=iMA(NULL,0,FastEMA,0,MODE_EMA,PRICE_CLOSE,i)-iMA(NULL,0,SlowEMA,0,MODE_EMA,PRICE_CLOSE,i);
делаем
Код:
Expand Collapse Copy
for(int i=0; i<limit; i++)
{     MacdBuffer[i]=iMA(NULL,0,FastEMA,0,MODE_EMA,PRICE_CLOSE,i)-iMA(NULL,0,SlowEMA,0,MODE_EMA,PRICE_CLOSE,i);
if(i>0)MacdBuffer[i]=MacdBuffer[i]+MacdBuffer[0];
}
Как то так.
 

Ugar

Гуру форума
Подскажите пожалуйста, кто знает, как понять строку arrays passed by reference only(массивы передаются только по ссылке).Это после компиляции советника в новом билде.
Должно работать и так. Если раздражает, можно поставить & перед именем массива в той строке.
 

AlexeyVik

Программист mql4 mql5
Здравствуйте. Помогите решить такую задачу: при написании индикатора необходимо, чтобы он прибавлял значение индикатора нулевого бара (например столбец MACD) к значению индикатора 1-го, 1-го к 2-го и т.д. Как это можно реализовать? Уже неделю бьюсь безрезультатно. Помогите пожалуйста.

Так как 0 бар меняется, придётся пересчитывать все бары что бы они то же менялись.
Значит меняем limit=Bars-counted_bars; на limit=Bars;

В MACD быры перебираются от 0. Значит при расчёте всех остальных баров, значение 0 уже посчитано, нужно просто прибавить.
Вместо
Код:
Expand Collapse Copy
for(int i=0; i<limit; i++)
      MacdBuffer[i]=iMA(NULL,0,FastEMA,0,MODE_EMA,PRICE_CLOSE,i)-iMA(NULL,0,SlowEMA,0,MODE_EMA,PRICE_CLOSE,i);
делаем
Код:
Expand Collapse Copy
for(int i=0; i<limit; i++)
{     MacdBuffer[i]=iMA(NULL,0,FastEMA,0,MODE_EMA,PRICE_CLOSE,i)-iMA(NULL,0,SlowEMA,0,MODE_EMA,PRICE_CLOSE,i);
if(i>0)MacdBuffer[i]=MacdBuffer[i]+MacdBuffer[0];
}
Как то так.
Андрей, ты наверное сегодня чуток перебрал, или я ничего не понял из твоего кода. Зачем такие нагрузки на комп? :)
Почему не использовать дополнительный буфер IndicatorBuffers(3); где #property indicator_buffers 2 (для MACD) и в него писать сумму показаний нулевого и первого баров. Дальше эти значения можно использовать для расчётов.
А дальше по необходимости, если надо эти показания рисовать, то можно добавить #property indicator_buffers 3 и эти значения будут отображаться.
 
  • Like
Реакции: Ugar

secotr

Прохожий
Помогите плиз! Перестала работать функция FileWriteArray... в файл записывает без данных ((( После обновления работа с файлами не корректная...
Код:
Expand Collapse Copy
void OnTimer()
  {
//---
      int total = OrdersTotal();
      ArrayResize(orders_arr, total);
      
      for(int i=0; i<total; i++)
      {
         if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
         {
            orders_arr[i].num_account = AccountNumber();
            orders_arr[i].num_order = OrderTicket();
            orders_arr[i].symbol = OrderSymbol();
            orders_arr[i].order_type = OrderType();
         }
         Print(orders_arr[i].num_account," ",orders_arr[i].num_order," ",orders_arr[i].symbol," ",orders_arr[i].order_type);
      }
      
      ResetLastError();
      int handle=FileOpen(FileName,FILE_WRITE|FILE_BIN);
      if(handle!=INVALID_HANDLE)
      {
         FileSeek(handle,0,SEEK_SET);
         FileWriteArray(handle,orders_arr,0,WHOLE_ARRAY);
         FileClose(handle);
      }
      else Print("Failed to open the file, error ",GetLastError());
      
   
  }
Может я конечно где-то туплю...
 
  • Like
Реакции: Ugar

Ugar

Гуру форума
Андрей, ты наверное сегодня чуток перебрал, или я ничего не понял из твоего кода. Зачем такие нагрузки на комп? :)
Почему не использовать дополнительный буфер IndicatorBuffers(3); где #property indicator_buffers 2 (для MACD) и в него писать сумму показаний нулевого и первого баров. Дальше эти значения можно использовать для расчётов.
А дальше по необходимости, если надо эти показания рисовать, то можно добавить #property indicator_buffers 3 и эти значения будут отображаться.
Мой вариант проще в реализации. Если человек задаёт вопросы, думаю ему это немаловажно.
Твой вариант конечно экономнее по ресурсам компа. Хотя и в этом варианте можно ограничить длину буфера, для ещё большей экономии.
 

AlexeyVik

Программист mql4 mql5
Помогите плиз! Перестала работать функция FileWriteArray... в файл записывает без данных ((( После обновления работа с файлами не корректная...
Код:
Expand Collapse Copy
void OnTimer()
  {
//---
      int total = OrdersTotal();
      ArrayResize(orders_arr, total);
      
      for(int i=0; i<total; i++)
      {
         if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
         {
            orders_arr[i].num_account = AccountNumber();
            orders_arr[i].num_order = OrderTicket();
            orders_arr[i].symbol = OrderSymbol();
            orders_arr[i].order_type = OrderType();
         }
         Print(orders_arr[i].num_account," ",orders_arr[i].num_order," ",orders_arr[i].symbol," ",orders_arr[i].order_type);
      }
      
      ResetLastError();
      int handle=FileOpen(FileName,FILE_WRITE|FILE_BIN);
      if(handle!=INVALID_HANDLE)
      {
         FileSeek(handle,0,SEEK_SET);
         FileWriteArray(handle,orders_arr,0,WHOLE_ARRAY);
         FileClose(handle);
      }
      else Print("Failed to open the file, error ",GetLastError());
      
   
  }
Может я конечно где-то туплю...
Обрати внимание на
раньше файлы всегда открывались в режиме FILE_SHARE_READ, FILE_SHARE_WRITE, теперь желательный режим открытия нужно указывать явно.
Это из справки. Может в этом проблема? Пока я не касался этого. Советник в котором есть запись в файл работает ещё на 509 билде. Сегодня тоже запустился без обновления. Теперь до следующих выходных будет жить в 509.
 

secotr

Прохожий
Обрати внимание на
Это из справки. Может в этом проблема? Пока я не касался этого. Советник в котором есть запись в файл работает ещё на 509 билде. Сегодня тоже запустился без обновления. Теперь до следующих выходных будет жить в 509.

Увы... Если с FILE_WRITE файл записывается, хотя и пустой, то с FILE_SHARE_WRITE вообще никакой реакции... причем handle нормальный! Так же проблема если вместо массива писать построчно с FILE_TXT, вообще не открывается и выдает 5004 ошибку... Пипец они накрутили...
 

AlexeyVik

Программист mql4 mql5
Увы... Если с FILE_WRITE файл записывается, хотя и пустой, то с FILE_SHARE_WRITE вообще никакой реакции... причем handle нормальный! Так же проблема если вместо массива писать построчно с FILE_TXT, вообще не открывается и выдает 5004 ошибку... Пипец они накрутили...
Нам обоим стоит быть повнимательней. Из справки
Записывает в файл типа BIN массивы любых типов, кроме строковых (может быть массив структур, не содержащих строки и динамические массивы).
В твоём массиве orders_arr.symbol = OrderSymbol();
А FILE_SHARE_WRITE мне кажется используется совместно с FILE_WRITE в комбинации флагов. Но учитывая наши потребности вряд-ли будет необходимость совместного использования файла.
 
Последнее редактирование:

eevviill

Заблокирован
Подскажите пожалуйста, кто знает, как понять строку arrays passed by reference only(массивы передаются только по ссылке).Это после компиляции советника в новом билде.
Сам начал разбиратся. Еле накопал информацию и казалось уже понял. Но тут наткнулся на пример с журнала fortrader. Хороший пример. Но правильный на 95 или 100%.
Передача параметров в функцию по ссылке (по адресу)
Эта вещь прекрасно известна программистам на любом из универсальных языков программирования,
например, на C, а ещё более на C++. Напишем самый простейший советник
(файл t2.mq4 — здесь и далее имена тестовых примеров в прилагаемом архиве), и поместим его на
график любой валютной пары:
PHP:
Expand Collapse Copy
int start() {
static int nTick = 0;
Inc( nTick );
Alert( «новый тик № » + nTick );
}
//—————————————
void Inc( int n ) { n++; }
Результатом выполнения будет непрерывное повторение одного и того же результата: «новый тик №0»… Переданное в функцию значение n изменяется там, но это не производит
никакого влияния на внешнее окружение функции (вызвавшую функцию
start()) — в функцию передаётся копия переменной nTick, так обычно работает вызов функций в MQL4.
PHP:
Expand Collapse Copy
Добавим один символ (&) в описание функции Inc() :
void Inc( int& n ) { n++; }
Выполнение советника радикально изменится:
новый тик № 1
новый тик № 2
новый тик № 3
…
Значок & указал, что в функцию нужно передать не копию, а оригинал переменной nTick, и все изменения, проделанные над этой переменной внутри функции, будут отражаться
на значении этой переменной снаружи функции. Такое
поведение называют побочный эффект функции.
Мне кажется что в первом варианте не
будет алерт выдавать постоянно новый тик 0. Или будет?

Всё. Понял.
Если в функции написать nTick++; то будет увеличиватся значение в алерте. А так просто поработали с данными передаными и не изменили сами данные. Если надо менять сами данные которые передаются то перед вводной переменной в функции надо ставить &
 
Последнее редактирование:
  • Like
Реакции: Dom

AlexeyVik

Программист mql4 mql5
Сам начал разбиратся. Еле накопал информацию и казалось уже понял. Но тут наткнулся на пример с журнала fortrader. Хороший пример. Но правильный на 95 или 100%.
Передача параметров в функцию по ссылке (по адресу)
Эта вещь прекрасно известна программистам на любом из универсальных языков программирования,
например, на C, а ещё более на C++. Напишем самый простейший советник
(файл t2.mq4 — здесь и далее имена тестовых примеров в прилагаемом архиве), и поместим его на
график любой валютной пары:
PHP:
Expand Collapse Copy
int start() {
static int nTick = 0;
Inc( nTick );
Alert( «новый тик № » + nTick );
}
//—————————————
void Inc( int n ) { n++; }
Результатом выполнения будет непрерывное повторение одного и того же результата: «новый тик №0»… Переданное в функцию значение n изменяется там, но это не производит
никакого влияния на внешнее окружение функции (вызвавшую функцию
start()) — в функцию передаётся копия переменной nTick, так обычно работает вызов функций в MQL4.
PHP:
Expand Collapse Copy
Добавим один символ (&) в описание функции Inc() :
void Inc( int& n ) { n++; }
Выполнение советника радикально изменится:
новый тик № 1
новый тик № 2
новый тик № 3
…
Значок & указал, что в функцию нужно передать не копию, а оригинал переменной nTick, и все изменения, проделанные над этой переменной внутри функции, будут отражаться
на значении этой переменной снаружи функции. Такое
поведение называют побочный эффект функции.
Мне кажется что в первом варианте не
будет алерт выдавать постоянно новый тик 0. Или будет?

Всё. Понял.
Если в функции написать nTick++; то будет увеличиватся значение в алерте. А так просто поработали с данными передаными и не изменили сами данные. Если надо менять сами данные которые передаются то перед вводной переменной в функции надо ставить &
Если в функции написать nTick++; то будет ошибка компиляции потому что переменная nTick локальна для функции start() не смотря на то что объявлена статической.
 

eevviill

Заблокирован
Класы, структуры

Клас это база данных про определённый объект?
Если да, то по упрощенному это обычная функция которая возвращает-хранит данные про объект?
Если да то зачем класы?
 

Milord

Местный знаток
В том то и дело что пока, требуются небольшие корректировки.
Запросто могут, в одном из следующих билдов ещё улучшить, выкинув большинство "устаревших" функций.

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