Перейти к содержанию

Обучение языку MQL4 под MetaTrader 4


Рекомендуемые сообщения

Обучение языку MQL4 под MetaTrader 4 Опубликовано
1 час назад, usver73 сказал:

ты его объявляешь на глобальном уровне, т.е. он будет доступен во всех функциях. Не нужно его передавать при вызове функции подсчета.
Все это обкашлено 100 раз...

Значит этот вариант правильный был?

void CountOrder()
  {
   ArrayInitialize(arrCountOrders,0); 

   for(int x=OrdersTotal()-1; x>=0; x--)
     {
      if(OrderSelect(x, SELECT_BY_POS, MODE_TRADES)==false)
         continue;
      if(OrderSymbol()!=Symbol() || OrderMagicNumber() != Magic)
         continue;
      arrCountOrders[OrderType()]++;
     }
   return;
  }

В принципе он работает, но я засомневался просмотрев последний урок Павла, выложенный выше. Хотел уточнить синтаксис. Можно обойтись и без массива, как  показал Rever27 первый пример, он все равно работает разово.

Изменено пользователем diodio
Ссылка на сообщение
Поделиться на другие сайты

  • Ответов 6,8k
  • Создано
  • Последний ответ

Популярные авторы

Популярные авторы

Популярные посты

Смотрим видео-уроки, изучаем MQL:       Скачать видеокурс «MQL программирование. Как самому написать форекс советник/ индикатор/ скрипт»   P.S. Тема про Обучение MQ

Перейти

Циклы цикл for Иногда необходимо повторять одно и то же действие несколько раз подряд. Для этого используют циклы. К примеру, мы хотим проанализировать последние 10 баров и выяснить наименьшую цен

Перейти

Речь идет о том, что не будет значимых нововведений. А только баги периодически будут править. А вот все новое мол - в МТ5. Когда они вживую сказали то же самое на конференции в Москве, я уточнил: "То

Перейти
Обучение языку MQL4 под MetaTrader 4 Опубликовано
22 минуты назад, diodio сказал:

Можно обойтись и без массива, как ты показал первый пример, он все равно работает разово.

Можно, как Rever27 показал.

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

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

Изменено пользователем usver73
Ссылка на сообщение
Поделиться на другие сайты

Обучение языку MQL4 под MetaTrader 4 Опубликовано
6 часов назад, diodio сказал:

В принципе он работает, но я засомневался просмотрев последний урок

В программировании нет понятия "в принципе работает, но сомневаюсь правильно я сделал или нет". В программировании есть понятия "работает" или "не работает". Не важно как мы этого добились в обход горы или напрямик через гору. Если программа выдала результат, значит работает и это правильно. В программирование есть понятие чувство хорошего тона, как "принято" и "не принято" писать код.

Изменено пользователем MikR0ReR
Ссылка на сообщение
Поделиться на другие сайты

Обучение языку MQL4 под MetaTrader 4 Опубликовано

Всем привет! Нашел в старом советнике вариант торговли по времени. Код был таким:

input enum_curtime   CT =1;//выбор времени по брокеру или GMT

void OnTick()
  {

   if(CT==0)
      curtime=TimeCurrent();
   else
      curtime=TimeGMT();
  ....
  }

Насколько верна эта запись? После компиляции выдает ошибку именно на эту строку:

input enum_curtime   CT =1;//выбор времени по брокеру или GMT

Видать параметры устарели, и вообще нужно ли так писать, можно просто переменную СТ записать так:

input int   CT =0;//выбор времени по брокеру или GMT

и тогда функция вернет время сервера. Но я думаю что это не верно, тогда как записать по "новому"?

Ссылка на сообщение
Поделиться на другие сайты

Обучение языку MQL4 под MetaTrader 4 Опубликовано

@diodio Приветствую.

  • Вы из старого советника забыли перенести еще часть кода, он примерно будет выглядеть так.
enum enum_curtime
{
первая строчка что там
вторая строчка что там
};

И поэтому в вашем случае

input enum_curtime   CT =1;//выбор времени по брокеру или GMT

он (компилятор) будет ругаться, что нет типа данных при объявлении переменой "CT".

  • Переименовать запись правильный вариант, чтоб избавится от ошибки, которая связана с отсутствием части кода (выше описано).

либо:

Если той части кода не было в старом коде, значит достался он не полным. Тогда можно дописать самому, как показано выше. И значение первой строчки подставить в место "1".

Изменено пользователем MikR0ReR
  • Лайк 1
Ссылка на сообщение
Поделиться на другие сайты

Обучение языку MQL4 под MetaTrader 4 Опубликовано
2 часа назад, diodio сказал:

Всем привет! Нашел в старом советнике вариант торговли по времени. Код был таким:

Насколько верна эта запись? После компиляции выдает ошибку именно на эту строку:


input enum_curtime   CT =1;//выбор времени по брокеру или GMT

Видать параметры устарели, и вообще нужно ли так писать, можно просто переменную СТ записать так:


input int   CT =0;//выбор времени по брокеру или GMT

и тогда функция вернет время сервера. Но я думаю что это не верно, тогда как записать по "новому"?

УУ, батенька.

Ну ок, enums 

enum E_TIME {
  ET_BROKER,	//По времени брокера
  ET_GMT,		//По времени GMT
};

input E_TIME  	CT = ET_BROKER;//выбор времени по брокеру или GMT

void OnTick()
  {
  datetime referenceTime = 0; //инициализируем для порядка
	switch(CT). {//enum хорош тем,  что он - целочисленный тип, можно ветвить по switch
      case ET_BROKER:
        referenceTime = TimeCurrent();
        break;
      case ET_GMT:
        referenceTime = TimeGMT(); //со временем GMT в терминале засада,  оно вычисляется с использованием локального времени и таймзоны компьютера, куча багов
        break;
      default: 
        Print("Unimplemented time type: ",  EnumToString(CT));
        ExpertRemove();
   }
  //и дальше используем переменую referenceTime
  ....
  }

 

 

  • Лайк 2
Ссылка на сообщение
Поделиться на другие сайты

Обучение языку MQL4 под MetaTrader 4 Опубликовано

Всем привет! Хотелось бы выразить думаю не только мое желание)))  Так сказать предложение на ближайшее будущее тем кто создает видео уроки по программированию . Создайте пожалуйста  урок где в советнике в место рыночных ордеров  размещаются отложенные ордера.  Расскажите как это  выполнять в коде.  Особенно интересует как выставить лимитник на уровне пересечение машек с разными периодами когда фактическая цена расположена выше или ниже этого пересечения.

Ссылка на сообщение
Поделиться на другие сайты

Обучение языку MQL4 под MetaTrader 4 Опубликовано
9 минут назад, mishastar сказал:

Всем привет! Хотелось бы выразить думаю не только мое желание)))  Так сказать предложение на ближайшее будущее тем кто создает видео уроки по программированию . Создайте пожалуйста  урок где в советнике в место рыночных ордеров  размещаются отложенные ордера.  Расскажите как это  выполнять в коде.  Особенно интересует как выставить лимитник на уровне пересечение машек с разными периодами когда фактическая цена расположена выше или ниже этого пересечения.

Темой следующего урока по MQL4, который должен выйти в начале сентября, как раз будет советник, работающий с отложками. Следите за обновлениями на портале или на канале в YouTube.

Изменено пользователем lsv107
Ссылка на сообщение
Поделиться на другие сайты

Обучение языку MQL4 под MetaTrader 4 Опубликовано

По уроку 5 "ТРЕЙЛИНГ-СТОП" сделал советник – работает. При покупке стоп лосс передвигается только вверх по тралу. Но при продаже - стоп лосс Cоветник 5.7zпередвигается за ценой на каждом новом тике вверх-вниз - ???  (см. видео).

Ссылка на сообщение
Поделиться на другие сайты

Обучение языку MQL4 под MetaTrader 4 Опубликовано

Всем привет! У кого есть информационная панель готовая, себе перекинуть. Можно некрасивую:) Поделитесь если можете.

Ссылка на сообщение
Поделиться на другие сайты

Обучение языку MQL4 под MetaTrader 4 Опубликовано

 

21 час назад, diodio сказал:

Всем привет! У кого есть информационная панель готовая, себе перекинуть. Можно некрасивую:) Поделитесь если можете.

В разделе индикаторы есть информационные. Тебе туда

Ссылка на сообщение
Поделиться на другие сайты

Обучение языку MQL4 под MetaTrader 4 Опубликовано

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

Ссылка на сообщение
Поделиться на другие сайты

Обучение языку MQL4 под MetaTrader 4 Опубликовано

Добрый день.

1)Хочу с 01.12.2019 по 31.12.2019 найти средний бар по размеру и вывести его Hight и Low.

2)Как найти цену закрытия бара на указанную дату скажем на начало этого года 01.01.2020 а если его нет на случай выходного то следующая дата 02.01.2020

Ссылка на сообщение
Поделиться на другие сайты

Обучение языку MQL4 под MetaTrader 4 Опубликовано
3 часа назад, scherbakovss сказал:

2)Как найти цену закрытия бара на указанную дату скажем на начало этого года 01.01.2020 а если его нет на случай выходного то следующая дата 02.01.2020

   datetime some_time=D'2020.08.22 00:00';
   int bar = -1;
   int extra_time = 0; //дополнительное время
   
   do { 
      bar = iBarShift(NULL,0,some_time+extra_time,true);
      extra_time += 24*60*60; //прибавляем к текущему времени 1 день
   }
   while(bar == -1 && !IsStopped()); //выполнять цикл, пока bar не перестанет быть равен -1
   

Вводите время нужное. Узнаете бар (bar) на котором это время отображается. Если же такого бара нет, то значение bar будет равно -1. Тогда цикл do while прибавляет ко времени этого бара 24 часа (т.е. один день) и снова проверяет, будет ли такой бар на графике и так, пока не будет найден нужный.

 

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

int bar = iBarShift(NULL,0,some_time,false);

 

  • Лайк 1
Ссылка на сообщение
Поделиться на другие сайты

Обучение языку MQL4 под MetaTrader 4 Опубликовано

Всем доброго времени. Что-то не получается снять показания с индикатора «BT 1 ssa». Может кто подскажет? Пользуюсь обычным кодом: 

double a1 = iCustom(NULL,0, "BT 1 ssa",0,1); // 
double a2 = iCustom(NULL,0, "BT 1 ssa",1,1); // 

     Comment(
             "a1 = " + DoubleToString(a1) + "\n" +
             "a2 = " + DoubleToString(a2) + "\n"           
            );          

Оба буфера в итоге показывают одинаковые значения одновременно. В самом файле индикатора прописаны ещё 2, которые я прикрепил.

BT 1 ssa.mq4 JStochastic.mq4 SSA of price.mq4

Ссылка на сообщение
Поделиться на другие сайты

Обучение языку MQL4 под MetaTrader 4 Опубликовано
2 часа назад, diodio сказал:

Что-то не получается снять показания с индикатора «BT 1 ssa».

В вызове индикатора после

"BT 1 ssa"

нужно прописать все входные параметры индикатора, а их там 7 штук
Посмотри справку

Изменено пользователем usver73
Ссылка на сообщение
Поделиться на другие сайты

Обучение языку MQL4 под MetaTrader 4 Опубликовано
1 минуту назад, usver73 сказал:

В вызове индикатора после "0" нужно прописать все входные параметры индикатора, а их там 7 штук
Посмотри справку

Я так тоже делал, все значения прописывал, результат такой же, оба буфера показывают одинаковые результаты: 0,000000 и пустое значение 2147863,000000 если я правильно написал, но все равно это пустое значение. В чем может быть ещё тормоза? Может в самом индикаторе тянутся значения с других 2-х индикаторов и это как-то мешает?

Ссылка на сообщение
Поделиться на другие сайты

Обучение языку MQL4 под MetaTrader 4 Опубликовано
59 минут назад, diodio сказал:

Может в самом индикаторе тянутся значения с других 2-х индикаторов и это как-то мешает?

вряд ли. Он ведь рисует, если накинуть на график?
Скорее всего ошибка вызова

Ссылка на сообщение
Поделиться на другие сайты

Обучение языку MQL4 под MetaTrader 4 Опубликовано
19 минут назад, usver73 сказал:

вряд ли. Он ведь рисует, если накинуть на график?
Скорее всего ошибка вызова

а может значение не типа double должно быть? но это же индикатор по типу допустим машки, и они все должны на выходе иметь дробное значение

а как можно исправить ошибку вызова?

Ссылка на сообщение
Поделиться на другие сайты

Обучение языку MQL4 под MetaTrader 4 Опубликовано

Вообщем тут дело в том что индикатор использует DLL. При переносе индикатора на график при тестировании и при включении галочки DLL, он все равно не выдает значения, а когда на весь терминал устанавливаю в советнике использовать DLL, то тоже не выдает значение в тестере, но что было замечено при остановке тестирования в нижнем окне появляется индикатор со всеми нулевыми значениями и тут уже галочку никак не поставить потому что тестирование остановилось. Можно ли в самом индикаторе прописать использование DLL сразу?

Установка галочки в индикаторе или советника на использование библиотеки DLL влияет только на торговлю в реальном времени. Значит получается индикатор в тестере не прогнать а только в реальном времени? Может есть выход?

Изменено пользователем diodio
Ссылка на сообщение
Поделиться на другие сайты

Обучение языку MQL4 под MetaTrader 4 Опубликовано

@diodio Добрый день. Пришлите дополнительные файлы "libSSA.dll" "JJMASeries.mqh".

 

Еще нужно "PriceSeries.mqh".

Изменено пользователем MikR0ReR
Ссылка на сообщение
Поделиться на другие сайты

Обучение языку MQL4 под MetaTrader 4 Опубликовано
  • @diodio Все работает*.
  • "SSA of price" рисует. Проверено в тестере.
  • "BT 1 ssa" рисует. Ну это и очевидно, он же строится на "SSA of price". Проверено в тестере.

 

*Нужно ставить галочку "DLL" в настройках терминала либо при запуске модуля (эксперт, скрипт, индикатор).

Изменено пользователем MikR0ReR
Ссылка на сообщение
Поделиться на другие сайты

Обучение языку MQL4 под MetaTrader 4 Опубликовано
18 часов назад, MikR0ReR сказал:

@diodio Добрый день. Пришлите дополнительные файлы "libSSA.dll" "JJMASeries.mqh".

 

Еще нужно "PriceSeries.mqh".

 

libSSA.dll JJMASeries.mqh PriceSeries.mqh

Ссылка на сообщение
Поделиться на другие сайты

Для публикации сообщений создайте учётную запись или авторизуйтесь

Вы должны быть пользователем, чтобы оставить комментарий

Создать учетную запись

Зарегистрируйте новую учётную запись в нашем сообществе. Это очень просто!

Регистрация нового пользователя

Войти

Уже есть аккаунт? Войти в систему.

Войти

  • Специальное предложение


  • Рекомендуемые брокеры

  • ×
    ×
    • Создать...