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

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


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

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


В первом уроке нет описания как обратиться к внешней переменной.

к любой переменной обращаются по имени (названию). Я не буду делать задание за Вас.
Не обращайте внимания на мелочи, задание такое: ввести в программу любое число, проанализировать и вывести сообщение на экран. Как ввести число читайте в справке.
Ссылка на сообщение
Поделиться на другие сайты

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

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

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

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

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

Перейти

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

Перейти

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

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

уважаемые, подскажите, что я делаю не так - дважды отправлял запрос на скачивание КУРСА, стаканчик симпатичный с уведомлением ГОТОВО тоже дважды получил, а КУРСА все нет :|
спасибо


Добавлено: 06-09-2015 23:22:02

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

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

Oll я нашел ошибку...только не знаю как ее исправить...вот кусок кода который вы скидывали:
static double minBB = 0;
if (curtime >= Start_calculation * 60 && curtime {
if (IsNewBar())
{
double bb = iCustom(NULL, 0, "Bollinger BandWidth", BBPeriod, StdDeviation, 0, 1);
if ( bb
}
}
else
{
if ( minBB > 0 ) Comment("Min BB =", NormalizeDouble(minBB,_Digits) );
minBB = 0;
}
ошибка в выделенной строке...этот индюк просто выводит минимальное растояние между верхней и нижней лентами Боллинджера...т е там не может быть отрицательного значения...я попытался сам чтото придумать, но не вышло...

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

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

if (curtime >= Start_calculation * 60 && curtime {
if (IsNewBar())
{
double bb = iCustom(NULL, 0, "Bollinger BandWidth", BBPeriod, StdDeviation, 0, 1);
if ( bb }
}
else
{
if ( minBB > 0 ) Comment("Min BB =", NormalizeDouble(minBB,_Digits) );
minBB = 0;
}
а эти скобки стоят на месте???а то логика тогда не понятна...

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

Обучение языку MQL4 под MetaTrader 4 Опубликовано
kempo скобки на месте. логика следующая: если время наше, то раз в бар проверяем индюк и сравниваем с минимумом, если время не наше, то публикуем минимум и переменную в исходное.
Ссылка на сообщение
Поделиться на другие сайты

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

Добрый день, подскажите пожалуйста, чем заменить Sleep при тестировании в тестере? нужна паузу после выполнения определенного условия на 1 час.

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

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

Вопрос наверно тупой, но все же задам. Возможно ли в mql описать умный указатель?
Пока придумал только убогий вариант через макросы :*(

#define declare_smart_pointer(type_name, type) \
class type_name { \
type *_obj; \
public: \
type_name(type *obj) { _obj = obj; } \
~type_name() { delete _obj; } \
type* get() { return _obj; } \
};

class order_count_t {
public:
int count;
int stop_count;

int all_count() {
return count + stop_count;
}

order_count_t() {
count = 0;
stop_count = 0;
}
};

declare_smart_pointer(order_count_t_sp, order_count_t)
Изменено пользователем Qj
Ссылка на сообщение
Поделиться на другие сайты

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

В тестере? т.е. Вы хотите замедлить тест? - попробуйте GetTickCount(), правда я не знаю как он в тестере работает, или нужен цикл бестолковых вычислений.

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

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

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

class timer_t {
private:
int _interval_in_sec;
datetime _start;

public:
timer_t() {
reset();
}

void reset() {
_start = TimeCurrent();
}

bool is_elapsed() {
return get_distance() >= _interval_in_sec;
}

int get_distance() {
return ( int ) ( TimeCurrent() - _start );
}

static timer_t *create ( int interval_in_sec ) {
return timer_t::create ( TimeCurrent(), interval_in_sec );
}

static timer_t *create ( datetime start, int interval_in_sec ) {
timer_t *result = new timer_t();
result._start = start;
result._interval_in_sec = interval_in_sec;
return result;
}
};
Изменено пользователем Qj
  • Лайк 3
Ссылка на сообщение
Поделиться на другие сайты

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

Подскажите пожалуйста , если использовать вместо блока void OnTick() , блок void OnTimer(). Я так понимаю в блоке инициализации ставим функцию EventSetTimer(60); где значение 60 это интервал времени в секундах, через сколько секунд выполняется программа void OnTimer(). Соответственно, если я поставлю большее значение например 100 секунд, будет ли в таком случае меньше затрачиваться ресурсов компьютера или ВПС сервера? Т.е. сделать так, чтобы бот работал не по тикам, а по таймеру, будет ли в таком случае меньше тратиться ресурсов железа на работу советника?

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

Обучение языку MQL4 под MetaTrader 4 Опубликовано
Pavel_Bass будет меньше нагружать. но дело не в способе запуска - сова написана не рационально или используется тяжёлый индюк.
  • Лайк 1
Ссылка на сообщение
Поделиться на другие сайты

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

Приветствую! есть вот такой индикатор который рисует вертикальные линии в заданные часы, но хотелось бы чтобы линии он рисовал на перспективу хотя бы на день а не за пять минуть до приближения цены. Можно ли это в нем как то поправить?

10_Vert_Line.mq4

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

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

Подскажите, как прописать условие:
если последний открытый ордер был бай, то следующий только сел, и наоборот, чтоб тип окрываемого ордера чередовался.
Я записал это так:
if(Type!=-1 && Type!=Last_Type)
{
ticket=OrderSend(Symbol(),Type,LOT,oprice,Slip,0,0,NULL,Magic,0);
if(ticket>0)
{
OrderModify(ticket,OrderOpenPrice(),SL1,TP1,0);
Last_Type=Type;
}
}

Начало выдавать ошибку (131)

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

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


Подскажите, как прописать условие:
если последний открытый ордер был бай, то следующий только сел, и наоборот, чтоб тип окрываемого ордера чередовался.
Я записал это так:
if(Type!=-1 && Type!=Last_Type)
{
ticket=OrderSend(Symbol(),Type,LOT,oprice,Slip,0,0,NULL,Magic,0);
if(ticket>0)
{
OrderModify(ticket,OrderOpenPrice(),SL1,TP1,0);
Last_Type=Type;
}
}

Начало выдавать ошибку (131)


Order:131:Invalid Trade Volume у вас не правильно задан лот.
Ссылка на сообщение
Поделиться на другие сайты

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

Подскажите, как бороться с ошибкой: 4204: no object name
Создаю на каждом новом баре трендовые линии, перед каждым созданием удаляю все линии с графика. Все линии создаются. В чем может быть проблема?

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

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

Перед удалением нужно проверять на существование объекта:
if (ObjectFind("объект") >= 0)
ObjectDelete("объект");

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

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


Перед удалением нужно проверять на существование объекта:
if (ObjectFind("объект") >= 0)
ObjectDelete("объект");



В этом то и загвоздка, потому что я вначале нахожу свои объекты, а потом удаляю



ObjectsDelete("имя");

void ObjectsDelete(string search){ //Удаление определенных объектов с графика
for (int i = ObjectsTotal() - 1; i >= 0; i--) {
if (StringFind(ObjectName(i), search) != -1) ObjectDelete(ObjectName(i));
}
}


upd
Разобрался. Ошибка была не в удалении вовсе. Добавил в if ObjectFind(k) - все заработало. Но не понятно, почему он выдавал ошибку, если шла все равно проверка на тип существующего объекта. Возможно как то поизящнее написать эту часть кода?
for (int k = ObjectsTotal(); k >= 0; k--) { 
if (ObjectFind(k) != -1 && ObjectType(ObjectName(k))==OBJ_TREND {NearLine = true; break;}
}


upd2
Запутал всех, включая себя )
Ошибка была из-за этой строчки:
for (int k = ObjectsTotal(); k >= 0; k--) 

исправив ее на
for(int k=0; k
- она пропала и не понадобилась проверка на существование линий Изменено пользователем Rever27
Ссылка на сообщение
Поделиться на другие сайты

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

Может кто подскажет, как усреднить TakeProfit для всех открытых позиций (OP_BUY и OP_SELL могут быть открыты одновременно)?

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

Обучение языку MQL4 под MetaTrader 4 Опубликовано
Rever27 в цикле по перебору от 0 только не удаляйте объекты. кстати в процедуре удаления всё сделано правильно.

rom_kaxxx вопрос не понял - Вы хотите закрыть разнонаправленные ордера по общему тейку? Ваш вопрос в расчёте уровня закрытия или алгоритме выставления СЛ/ТР?
Ссылка на сообщение
Поделиться на другие сайты

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


rom_kaxxx вопрос не понял - Вы хотите закрыть разнонаправленные ордера по общему тейку? Ваш вопрос в расчёте уровня закрытия или алгоритме выставления СЛ/ТР?



Алгоритм выставления я написал, некорректно идет расчет уровня закрытия. Надо для всех открытых ордеров посчитать уровень бу и + учесть ТР, чтоб сова в холостую не торговала.
Ссылка на сообщение
Поделиться на другие сайты

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



rom_kaxxx вопрос не понял - Вы хотите закрыть разнонаправленные ордера по общему тейку? Ваш вопрос в расчёте уровня закрытия или алгоритме выставления СЛ/ТР?

Алгоритм выставления я написал, некорректно идет расчет уровня закрытия. Надо для всех открытых ордеров посчитать уровень бу и + учесть ТР, чтоб сова в холостую не торговала.
Задачка хорошая. Тут будет 2 решения (имхо):
- надо вычислить общий объём ордеров в каждую сторону и отдельно уровни БУ для каждой стороны.
- объёмы должны быть разные, иначе общего уровня БУ либо не будет, либо будет очень далеко...
- потом вычислить общий БУ для "бай в +" и общий БУ для "селл в +" по формуле:
если (бай в +) то общБУ = (Лотс*БУс - Лотб*БУб) / (Лотс-Лотб)

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

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

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

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

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

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

Войти

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

Войти

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


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

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