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

Обучение языку MQL5 под MetaTrader 5


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

Обучение языку MQL5 под MetaTrader 5 Опубликовано (изменено)


на офигенном компе БК-0010-01

Ба! Коллега! Тоже начинал с этого...
Насчёт массивов Вы не правы - это просто указатели на место в памяти с данными.
Почему удобно их пользовать?:
У Вас есть функция вычисляющая направление входа, Вы его заранее не знаете.
и есть проверка на наличие ордеров. Для Вашего решения надо в зависимости от направления выбирать переменную с кол-вом ордеров, типа
если new_dir == OP_BUY то count_BUY и так же для селл - так значительно больше операций получается.
в моём примере достаточно count[new_dir] - и вы сразу получаете кол-во ордеров, в общем рекомендую попробовать


Я правильно понимаю что значения по енуму в числовом эквиваленте идут от нуля до 8 по принципу как в mql4?
Тоесть:
ORDER_TYPE_BUY 0 POSITION_TYPE_BUY
ORDER_TYPE_SELL 1 POSITION_TYPE_SELL
ORDER_TYPE_BUY_LIMIT 2
ORDER_TYPE_SELL_LIMIT 3
ORDER_TYPE_BUY_STOP 4
ORDER_TYPE_SELL_STOP 5
ORDER_TYPE_BUY_STOP_LIMIT 6
ORDER_TYPE_SELL_STOP_LIMIT 7
ORDER_TYPE_CLOSE_BY 8

точнее даже ордера могут иметь значения 2-8, а позиции 0 и 1. и считать их нужно перебирая позиции и ордера отдельно Изменено пользователем djnet
Ссылка на сообщение
Поделиться на другие сайты

  • Ответов 294
  • Создано
  • Последний ответ

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

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

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

Здравствуйте, друзья юные программисты! В этой ветке предлагаю обсуждать все возникающие вопросы в процессе освоения тонкостей языка MQL5. В настоящий момент мы записываем цикл уроков по MQL5, пока

Перейти

Уважаемые коллеги, добавлю от себя... По ссылке полный справочник по функциям MQL5, с примерами, который вы можете скачать себе локально. Хорошая штука, рекомендую :) https://yadi.sk/d/BBFYJw_-trnbN

Перейти

Нечеловеческое спасибо за тему >000 ЧИТАЕМ В ПЕРВУЮ ОЧЕРЕДЬ ПОЛНАЯ ДОКУМЕНТАЦИЯ ПО MQL5, ОНЛАЙН, БЕСПЛАТНО И БЕЗ СМС Руководство по интерфейсу // Алгоритимеческий трейдинг на MQL5 // Описание те

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

точнее даже ордера могут иметь значения 2-8, а позиции 0 и 1. и считать их нужно перебирая позиции и ордера отдельно

я не разделяю - смысла нет. сделал универсальную функцию и посчитал всё. если не используются ордера, то 0 будут в ячейке массива.
Ссылка на сообщение
Поделиться на другие сайты

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

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


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

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


Код покажи. А ордера были?


Спойлер


int op_count[9];
void OnTick()
CountTrades(); //считаем открытые ордера
BarsTyps();
if(UseMartin)//сопровождение позиций мартингейлом
{
if(op_count[POSITION_TYPE_BUY]>=1)
{
блаблабла
}

void CountTrades()
{
count_buy=0;
count_buyst=0;
count_buylim=0;
count_sell=0;
count_sellst=0;
count_selllim=0;
int aTotal=PositionsTotal();
ulong aTicket;
long aMagic;
string aSymbol;
for(int i=0; i {
aTicket = PositionGetTicket(i);
aSymbol = PositionGetString(POSITION_SYMBOL);
ENUM_POSITION_TYPE aType=(ENUM_POSITION_TYPE)PositionGetInteger(POSITION_TYPE);
aMagic=PositionGetInteger(POSITION_MAGIC);
if(aSymbol==_Symbol && aMagic==m_magic)
{
op_count[(int)aType]++;
}
}
}



Позиции были, причем если перебирать aType через switch, то все пучком считается, если вывести aType в журнал то видно что там 0 или 1 в зависимости от позиции, а вот если вывести в журнал arrayprint op_count после записи aType в массив то там все позиции по нулям.
Ссылка на сообщение
Поделиться на другие сайты

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

Вроде всё правильно, надо только обнулить массив перед циклом - ArrayFill()
надо принты ставить - выяснить где счет теряется...

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

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


Вроде всё правильно, надо только обнулить массив перед циклом - ArrayFill()
надо принты ставить - выяснить где счет теряется...


Все косяк найден, код верный, в тестере тестилась другая версия совы, а там были ошибки, не обратил внимания какая версия была выбрана. =)) =)) =))
поубирал все лишнее, причесал, получилось вот так:
Спойлер


void CountTrades()
{
ArrayFill(op_count,0,9,0);
ulong aTicket;
for(int i=0; i {
aTicket=PositionGetTicket(i);
if(PositionGetString(POSITION_SYMBOL)==_Symbol && PositionGetInteger(POSITION_MAGIC)==m_magic)
{
ENUM_POSITION_TYPE aType=(ENUM_POSITION_TYPE)PositionGetInteger(POSITION_TYPE);
op_count[(int)aType]++;
}
}
}


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

  • 4 weeks later...
  • 2 weeks later...
Обучение языку MQL5 под MetaTrader 5 Опубликовано

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

MQL5: Работа с ордерами

MQL5: Пишем первый советник


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

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

Добрый вечер, извините я видимо не очень точно спросил. Выложенные уроки все просмотрены, проштудированы и осваиваются. Огромное спасибо за Ваш труд.
В вопросе постом выше я хотел узнать будут ли подборки типа "форекс для чайников", "MQL програмирование курс молодого бойца" и тд., только заточенные под MQL5 ?

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

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


Добрый вечер, извините я видимо не очень точно спросил. Выложенные уроки все просмотрены, проштудированы и осваиваются. Огромное спасибо за Ваш труд.
В вопросе постом выше я хотел узнать будут ли подборки типа "форекс для чайников", "MQL програмирование курс молодого бойца" и тд., только заточенные под MQL5 ?


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

  • 2 weeks later...
Обучение языку MQL5 под MetaTrader 5 Опубликовано

Я тут решил в рамках собственного развития в mql5 переписать сову по спрингу версии 8.25 под пятый метак, заодно ее там тоже потестить ну и от себя что то добавить.
Так вот собственно вопросы:
Если я ее тут буду по частям выкладывать и задавать глупые вопросы (ну или умные) никто не будет против?
Если потом выложу готовую версию никто не надает мне по попе?:) Все таки большой труд группы людей....

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

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


Я тут решил в рамках собственного развития в mql5 переписать сову по спрингу версии 8.25 под пятый метак, заодно ее там тоже потестить ну и от себя что то добавить.
Так вот собственно вопросы:
Если я ее тут буду по частям выкладывать и задавать глупые вопросы (ну или умные) никто не будет против?
Если потом выложу готовую версию никто не надает мне по попе?:) Все таки большой труд группы людей....


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

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

Созрел первый вопрос:
есть в сове по спрингу функция Get_Week_StartBar()
собственно в оригинале выглядит так:

Спойлер



int Get_Week_StartBar(int Shift=1)
{
Shift--;
bool res=true;
int i=(Shift*PERIOD_D1*5+PERIOD_D1 *(TimeDayOfWeek(Time[0])+3))/_Period;//(TimeDayOfWeek (Time[0])+4)/_Period -720/_Period-1;
while(Time); i-=PERIOD_D1/_Period;}//если на стартовом баре нет котировок, то смещаем его на сутки
while(res)
{
i++;
if(TimeDayOfWeek(Time)==1 && TimeDayOfWeek(Time[i+1])!=1) res=false;
}
return(i);
}




Что делает понятно, ищет первый бар текущего таймфрема предыдущей недели.
В mql5 так не сделать, поэтому вот мой вариант:
Спойлер


int Get_Week_StartBar(int Shift=1)
{

bool res=true;

MqlDateTime dt0,dt1;

datetime d0=iTime(_Symbol,0,i);

TimeToStruct(d0,dt0);

int curdayofweek=dt0.day_of_week; //текущий день недели

int curdayofyear=dt0.day_of_year; //текущий день года

int daytostruct=4+curdayofweek;

dt0.day_of_year=dt0.day_of_year-daytostruct; //вычитаем 4 дня от текущего

datetime d0=StructToTime(dt0);

int i=iBarShift(_Symbol,PERIOD_CURRENT,d0,false);

if(i
{

Print(__FUNCTION__,"Ошибка получения индекса бара");

return(i);

}

while(res)

{

i++;

MqlDateTime dt0,dt1;

datetime d0=iTime(_Symbol,0,i);

datetime d1=iTime(_Symbol,0,i+1);

TimeToStruct(d0,dt0);

TimeToStruct(d1,dt1);

if(dto.day_of_week==1 && dt1.day_of_week!=1)res=false;

}

return(i);
}




Не могу быть уверенным, что это самый подходящий вариант. Или норм? Или не будет работать? Вообщем критику пожалуйста :)
Ссылка на сообщение
Поделиться на другие сайты

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

Я тут решил в рамках собственного развития в mql5 переписать сову по спрингу версии 8.25 под пятый метак, заодно ее там тоже потестить ну и от себя что то добавить.


По мне так не очень удачный выбор исходника. Коль уж делать на MQL5, так что нибудь требующее МТФ и/или мультивалютное, то, что не реализуемо на mql4.
И конкретно Spring 8.хх содержит неудачные идеи, в частности, динамический расчет контрольной свечи. Этот блок точно нужно переосмысливать...
Ссылка на сообщение
Поделиться на другие сайты

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


Я тут решил в рамках собственного развития в mql5 переписать сову по спрингу версии 8.25 под пятый метак, заодно ее там тоже потестить ну и от себя что то добавить.


По мне так не очень удачный выбор исходника. Коль уж делать на MQL5, так что нибудь требующее МТФ и/или мультивалютное, то, что не реализуемо на mql4.
И конкретно Spring 8.хх содержит неудачные идеи, в частности, динамический расчет контрольной свечи. Этот блок точно нужно переосмысливать...


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

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

Вы определяете переменные d0 - 3 раза и d1 - 2 раза. Будет ошибка.

в начале функции datetime d0=iTime(_Symbol,0,i); - i не определено
Сама логика не универсальна и будет привязана к гмт-оффсету брокера. Если так и задумано - ОК.
Ссылка на сообщение
Поделиться на другие сайты

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



Вы определяете переменные d0 - 3 раза и d1 - 2 раза. Будет ошибка.

в начале функции datetime d0=iTime(_Symbol,0,i); - i не определено
Сама логика не универсальна и будет привязана к гмт-оффсету брокера. Если так и задумано - ОК.



Согласен, копипаст это зло))) i в начале тоже лишнее, там просто 0. Насчет не универсальности и привязки можно поподробнее?, я не поймал суть мысли. Можете свой вариант набросать? С пояснениями.
Ссылка на сообщение
Поделиться на другие сайты

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


Сама логика не универсальна и будет привязана к гмт-оффсету брокера. Если так и задумано - ОК.


Насчет не универсальности и привязки можно поподробнее?, я не поймал суть мысли. Можете свой вариант набросать? С пояснениями.

Вдумайтесь когда выдаст тру данное условие: if(dto.day_of_week==1 && dt1.day_of_week!=1)?
day_of_week меняет значение в 00:00:00 по времени брокера! - значит и код Ваш зависит от оффсета.
Когда делал сову по Ва-банку заметил, что практически все брокеры начинают торги одновременно, но время у всех может быть своё. Если торги начнутся в воскресенье, то Ваша функция всё-равно выдаст 1 бар понедельника, часа через 2 после начала торгов, а у другого брокера всё будет правильно.
Ещё я фильтровал дыры в котировках.
Ссылка на сообщение
Поделиться на другие сайты

Обучение языку MQL5 под MetaTrader 5 Опубликовано (изменено)



Сама логика не универсальна и будет привязана к гмт-оффсету брокера. Если так и задумано - ОК.


Насчет не универсальности и привязки можно поподробнее?, я не поймал суть мысли. Можете свой вариант набросать? С пояснениями.

Вдумайтесь когда выдаст тру данное условие: if(dto.day_of_week==1 && dt1.day_of_week!=1)?
day_of_week меняет значение в 00:00:00 по времени брокера! - значит и код Ваш зависит от оффсета.
Когда делал сову по Ва-банку заметил, что практически все брокеры начинают торги одновременно, но время у всех может быть своё. Если торги начнутся в воскресенье, то Ваша функция всё-равно выдаст 1 бар понедельника, часа через 2 после начала торгов, а у другого брокера всё будет правильно.
Ещё я фильтровал дыры в котировках.


Согласен с вами, вообще столкнулся на тестах с тем что котировки дукасов (мт4) выползали на субботу, во время перехода с зимнего на летнее или обратно. Долго мудрил с конвертацией, но потом плюнул. и просто сделал банальный запрет совам на любые действия в сб и вс. Я не так много видел брокеров, но те которые видел, начинали торговлю в пн. Тем не менее, опять же в целях общего развития в программировании наверное будет правильным исключить ошибку в таких случаях. Тогда наверно есть смысл отработать еще одну проверку:
Если if(dto.day_of_week==1 && dt1.day_of_week!=1 && dt1.day_of_week!=0) то едем по старому сценарию, а если dt1.day_of_week==0 то ищем дальше. Так?
Собственно с функцией поиска последнего бара недели видимо надо так же проверять и субботу.
Насчет фильтров дыр в котировках, это я вообще пока не представляю как.

п.с. Добрался до динамического расчета сигнальной. ща посмотри......
п.с.с Не увидел ничего плохого, обычное среднее арифметическое по N недельным свечам Что хотите изменить? Только вот мою функцию поиска первого бара недели придется переделать, ибо под эту задачу она не подходит, у меня нет переменной начального смещения shift. И вот тут я начинаю тупить...... Вроде сделал. Изменено пользователем djnet
Ссылка на сообщение
Поделиться на другие сайты

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

п.с.с Не увидел ничего плохого, обычное среднее арифметическое по N недельным свечам Что хотите изменить?


Ошибка не в коде, а в идее: в начале года диапазон движения узок, сл-но средняя величина небольшая. Рассчитываем шаг, и ТП, которые тоже получаются маленькими. А потом начинается веселье- первое хорошее движение просаживает депо...
Впрочем, к программированию это не относится, можно снести пост.
Ссылка на сообщение
Поделиться на другие сайты

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


п.с.с Не увидел ничего плохого, обычное среднее арифметическое по N недельным свечам Что хотите изменить?


Ошибка не в коде, а в идее: в начале года диапазон движения узок, сл-но средняя величина небольшая. Рассчитываем шаг, и ТП, которые тоже получаются маленькими. А потом начинается веселье- первое хорошее движение просаживает депо...
Впрочем, к программированию это не относится, можно снести пост.

Мысль ясна и вполне логична. Я правда в спринге динамический расчет не использовал в своей торговле, я просто нашел оптимальные значения размеров свечей по каждой торгуемой паре. Ну и кое где ограничил верхний предел, например по евроканадцу у меня максимальный размер свечи ограничен 350 п. Если пара прошла больше, я не захожу. А если больше 500п то вообще встаю по движению.
Ссылка на сообщение
Поделиться на другие сайты

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

Ув. программисты, подскажите: кусочек 8.25 спринг mql4
// =========трал по теням===============

if(TypeTS==1 && MathMod((double)Time[0],iTmfrm*60)==0 && timePrevTS!=Time[0])
Выделил жирным то, что не понимаю. Что именно тут получаем? и зачем?

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

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

MathMod((double)Time[0],iTmfrm*60)==0


Первая секунда нового бара :), видимо...
Довольно криво - будет срабатывать крайне редко. Отследить закрытие бара нужно по другому.
  • Лайк 1
Ссылка на сообщение
Поделиться на другие сайты

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

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

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

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

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

Войти

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

Войти

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


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

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