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

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


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

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

Интересно такой подход быстро сольет счет. Пытался решить проблему сам, никак, не дорос до уровня! Заранее спасибо!

Вы описали классический мартингейл- увеличение ставки после стопа.
Риски сродни сеткам: вместо увеличения лота после стопа можете открывать усредняющий увеличенный лот.
Лучше найти стратегию с положительным мат. ожиданием.
Что касается алгоритма, который Вы описали, то нужно перед открытием ордера делать анализ истории. Глубину анализа(количество ордеров, совокупный лосс в деньгах и/или пипсах) Вы сами определяете сообразно своему виденью ситуации и стратегии.
Получить готовую функцию вряд ли получится- все индивидуально.

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

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

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

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

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

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

Перейти

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

Перейти

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

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

Вы описали классический мартингейл- увеличение ставки после стопа.
Риски сродни сеткам: вместо увеличения лота после стопа можете открывать усредняющий увеличенный лот.
Лучше найти стратегию с положительным мат. ожиданием.
Что касается алгоритма, который Вы описали, то нужно перед открытием ордера делать анализ истории. Глубину анализа(количество ордеров, совокупный лосс в деньгах и/или пипсах) Вы сами определяете сообразно своему виденью ситуации и стратегии.
Получить готовую функцию вряд ли получится- все индивидуально.

Про мартин понятно. А вот классическую сетку не хочу и усредняться после каждого ордера тоже не хочу, тест показал что максимум бывает 9 убытков подряд и 9й бывает достаточно большим если я удвоюсь 9 раз подряд и поймаю стоп будет печаль. в основном убытки не большие (не сл, а закрытие сделки по противоположному сигналу) но ощутимые в сумме за месяц вот я их и хочу объединить в группу, врядли будет подряд 5 убытков по 5 групп. А как это реализовать в коде не знаю. Может подскажет кто нибудь где подсмотреть?

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

Обучение языку MQL4 под MetaTrader 4 Опубликовано
11 часов назад, Mar@der сказал:

А вот классическую сетку не хочу и усредняться после каждого ордера тоже не хочу

Мартин с одним ордером в рынке и сетка с несколькими ордерами с точки зрения рисков равнозначны (если не брать во внимание требуемую маржу).
Готовый код вряд ли найдете.
Разбейте задачу на подзадачи. Для подзадач найти примеры будет легче. И Вам в целях обучения будет полезнее писать самому код, нежели копипастить

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

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

Всем доброго времени.

Хочу открыться на нулевом баре, есть функция:

//+---------------------------Функция обнаружения нового бара---------------------------------------+
bool Fun_New_Bar()                               // Ф-ия обнаружения ..
  {
// .. нового бара
   static datetime Prev_Time=0;                  // Время текущего бара
   bool res= false;                              // возвращаемый результат
   if(Prev_Time!=Time[0])                        // Сравниваем время
     {
      Prev_Time=Time[0];                         // Теперь время такое
      res = true;                             // Поймался новый бар
     }
   return(res);
  }

Далее чтоб снять показатели с индикатора пишу:

if(Fun_New_Bar())
   {
   Signal_low   = iCustom(NULL,PERIOD_M15, "indikator",0,0); 
    }

где последний "0" означает текущий нулевой бар, в итоге не открывает на нулевом баре. Что делать?)

Мое предположение - надо поменять в функции условие:

//+---------------------------Функция обнаружения нового бара---------------------------------------+
bool Fun_New_Bar()                               // Ф-ия обнаружения ..
  {
// .. нового бара
   static datetime Prev_Time=0;                  // Время текущего бара
   bool res= false;                              // возвращаемый результат
   if(Prev_Time==Time[0])                        // Сравниваем время
     {
      res = true;                             // Поймался новый бар
     }
   return(res);
  }

Вот так я смогу открыться на нулевом баре? 

Дело в том что если открываю на первом, то существенно теряется профит(

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

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

Что делать?

Чем отличается цена открытия 0-го бара от цены закрытия 1-го? Если опустить случай гэпа...

И на открытии 0го бара показания индикатора не понятно, что показывает-цен ещё нет.

Так что обычно входят на 0м баре по показаниям индикатора на 1м

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

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

Так что обычно входят на 0м баре по показаниям индикатора на 1м

Это да, но я хочу войти на 0м баре без показаний первого, ведь показания сигнала есть у индикатора, я проверял, и вот с этим сигналом мне и надо войти на 0-й бар.

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

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

Это да, но я хочу войти на 0м баре без показаний первого, ведь показания сигнала есть у индикатора, я проверял, и вот с этим сигналом мне и надо войти на 0-й бар.

Тогда в чет проблема?
Индюк сигналит как положено...
То, что не можешь войти, наверно в другом месте проблема?
И у проблемы должно быть описание (ошибки исполнения или ошибка в логике сигнала). 
п.с. входишь всегда на 0-м баре.
Другое дело- с какого индекса индикаторного буфера ты снимаешь сигнал.
Но проблема точно не в функции Fun_New_Bar(). Ее задача прокукарекать, что открылся новый бар, а там хоть не рассветай

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

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

MathPow, Математическая функция, которая позволяет множителю сетки работать ниже значения 1.5

lot = NormalizeDouble(f_lot * MathPow(Multiplier, Trades). Кто то знает больше

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

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

Это да, но я хочу войти на 0м баре без показаний первого, ведь показания сигнала есть у индикатора, я проверял, и вот с этим сигналом мне и надо войти на 0-й бар.

Сделай скрин с окном данных и что на нулевом баре показывает индюк. Вариантов просто не много, он может не показывать в буфере ничего, может через тик разрешать и продажу и покупку, может продолжать прошлую тенденцию. А самое противное он может перерисоваться на 1 баре. Бывало есть индюк и "глазами торговать" сказка, а в сову не вставишь, потому что "точные показания" только с открытия бара 2! Я может зря лезу. просто в последние пару недель разочаровался в своих индюках, в ручке огонь, на автомате беда!

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

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

Мартин с одним ордером в рынке и сетка с несколькими ордерами с точки зрения рисков равнозначны (если не брать во внимание требуемую маржу).
Готовый код вряд ли найдете.
Разбейте задачу на подзадачи. Для подзадач найти примеры будет легче. И Вам в целях обучения будет полезнее писать самому код, нежели копипастить

Бро, подскажи мне как подчитать убытки вчерашнего дня, не доход за период, а только убыточные ордера. То что я делаю сейчас Ненормативная лексика, сова в цикле считает или сумму всех сделок или убытки за рандомный период!

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

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

Бро, подскажи мне как подчитать убытки вчерашнего дня, не доход за период, а только убыточные ордера. То что я делаю сейчас Ненормативная лексика, сова в цикле считает или сумму всех сделок или убытки за рандомный период!

   datetime lastDayStart = iTime(Symbol(), PERIOD_D1, 1);
   datetime todayStart = iTime(Symbol(), PERIOD_D1, 0);
   double lastDayLoss = 0.0;
   for(int i = OrdersHistoryTotal(); i >= 0; i--) {
      if(OrderSelect(i, SELECT_BY_POS, MODE_HISTORY)
      && OrderSymbol() == Symbol()
      && OrderMagicNumber() == MyMagicNumber
      && OrderType() <= OP_SELL
      && OrderProfit() < 0 //только если ордер убыточный. При желании можно сравнивать с нулем сумму OrderProfit, OrderSwap и OrderCommission
      && OrderCloseTime() >= lastDayStart //если закрытие после начала прошлого дня. По желанию можно сравнивать по открытию, но тогда нужно проверить, что ордер уже закрыт
      && OrderCloseTime() < todayStart //тоже самое, можно сверять открытие
      ) {
         lastDayLoss += OrderProfit() + OrderSwap() + OrderCommission();
      }
   }
   Print("Last day loss = ", DoubleToString(lastDayLoss, 2);

 

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

Обучение языку MQL4 под MetaTrader 4 Опубликовано
8 часов назад, Rigal сказал:
datetime lastDayStart = iTime(Symbol(), PERIOD_D1, 1);

@Rigal, брать в МТ4 данные с неродного ТФ разве не чревато проблемами в тестере?
В свое время сталкивался, что на одних котировках все было нормально, а на других (закачанных через ТикСтори) подтянуть старший ТФ не получалось. Вычислял начало дня через танцы с бубном.
Сейчас, с добавлением структур, стало проще (с т.з. надежности), но длиннее (ИМХО):
 

void StartDay()
{
   MqlDateTime dt;
   MqlDateTime dt_start;
   
   TimeToStruct(TimeCurrent(), dt);
   dt_start.year = dt.year;
   dt_start.mon  = dt.mon;
   dt_start.day  = dt.day;
   dt_start.hour = 0;
   dt_start.min  = 0;
   
   datetime DayStart = StructToTime(dt_start);
}

 

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

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

MathPow, Математическая функция, которая позволяет множителю сетки работать ниже значения 1.5

lot = NormalizeDouble(f_lot * MathPow(Multiplier, Trades). Кто то знает больше

Это вопрос?
И если вопрос, то о чем?

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

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

@Rigal , в Коржике ты иногда открываешь новыве окна для прогрузки истории. Или с другой целью?

Как ты определяешь нужно ли символу прогрузить историю?

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

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

Это вопрос?
И если вопрос, то о чем?

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

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

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

Хотелось бы подробней развернуть тему с множителем.

Справка mql:

Возводит основание в указанную степень.
double  MathPow(
   double  base,         // основание 
   double  exponent      // показатель степени
   );

Например, стартовый лот = 0.1;
Множитель для следующего ордера = 2.0;

результат:
image.png.f99ea7353176af658bdc69c461db6212.png

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

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

@Rigal , в Коржике ты иногда открываешь новыве окна для прогрузки истории. Или с другой целью?

Как ты определяешь нужно ли символу прогрузить историю?

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

На "холодном" терминале, как правило, за один запуск успешно прогружаются 5-7 символов, а потом, вероятно, очередь переполняется. Повторные запуски прогружают следующие 5-7.

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

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

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

@Rigal, брать в МТ4 данные с неродного ТФ разве не чревато проблемами в тестере?
В свое время сталкивался, что на одних котировках все было нормально, а на других (закачанных через ТикСтори) подтянуть старший ТФ не получалось. Вычислял начало дня через танцы с бубном.
Сейчас, с добавлением структур, стало проще (с т.з. надежности), но длиннее (ИМХО):
 

void StartDay()
{
   MqlDateTime dt;
   MqlDateTime dt_start;
   
   TimeToStruct(TimeCurrent(), dt);
   dt_start.year = dt.year;
   dt_start.mon  = dt.mon;
   dt_start.day  = dt.day;
   dt_start.hour = 0;
   dt_start.min  = 0;
   
   datetime DayStart = StructToTime(dt_start);
}

 

Проблема обращения к другим ТФ возникает в тестере (и только в тестере) в двух случаях: при использовании котировок из кванта и после неправильной/непроделанной загрузки "родных" котировок метака (открыть центр истории, затребовать загрузку минуток, дождаться завершения, полюбоваться астрономическим числом баров истории, прокликать все таймфреймы для пересчета)

Ваше замечание абсолютно справедливо.

Я иногда забываю, что люди пользуются квантом.

Реализовать ваш способ можно, кстати, гораздо проще и без структур: вычесть из текущего времени количество секунд в текущем дне. Примерно так:

datetime startOfToday = TimeCurrent() - TimeCurrent() % 86400; //это 60 * 60 * 24, результат лучше проверить, я мог запамятовать

У приведенного вами метода есть только один недостаток, который никак не влияет на применимость к упомянутой проблеме, но о нем полезно помнить в более общем случае: вы не определяете начало дня с точки зрения брокера. Только начало дня с точки зрения часового пояса брокера.

В случае, когда нужно все же найти первый бар/открытие рынка - на время опереться нельзя, нужно ковыряться в барах, но можно это делать на текущем ТФ.

 

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

  • 2 weeks later...
Обучение языку MQL4 под MetaTrader 4 Опубликовано
double GetLots()
  {
   double lot=LOTS;

   if(lot==0)
      lot = AccountBalance()*risk/100/10000/MarketInfo(Symbol(),MODE_MARGINREQUIRED);

   if(CountTrades()>0)
      lot=NormalizeDouble(LOTS*MathPow(LotMultiply,CountTrades()),2);
      
   if(lot>MaxLot)
     {
      lot=LOTS;
      if(lot==0)
         lot = AccountBalance()*risk/100/10000/MarketInfo(Symbol(),MODE_MARGINREQUIRED);
     }

   return(lot);
 
 
  }

Я ни у кого ничего не смог здесь добиться, так как здесь люди очень умные, и на глупые вопросы не отвечают. Собрал такой простой код множитель, если кого интересует, где  GetLots можно добавить в функцию, в блок кода открытия первого ордера OnTick,start, у кого какой, остальное в переменные .

Это для тех, кто еще не знает, что есть такие множители

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

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

Имеется .csv в котором 5М строк где : дата, пара, показатель.


Хочу перенести базу с .csv в .mqh, и потом работать в тестере, мультивалютный режим.

Как это правильнее сделать?

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

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

Как это правильнее сделать?

Не совсем понятно, что именно.

Как по мне - то для mql5 лучшего способа для подобной работы, чем встроенные функции терминала по работе c SQLite - нет.

 

https://www.mql5.com/ru/docs/database/databaseimport

https://www.mql5.com/ru/docs/database

 

Для MQL4 тоже есть библиотека:

https://github.com/dingmaotu/mql-sqlite3

 

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

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

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

Вы очень странно добивались умного ответа задавая супер лаконичные вопросы. На которые, кстати, были попытки дать ответ, но кроме "хмм.." никакой реакции..
Что касается Вашей функции автолота, то при выполнении условия:

7 часов назад, Lexa000 сказал:
if(lot>MaxLot)
     {
      lot=LOTS;
      if(lot==0)
         lot = AccountBalance()*risk/100/10000/MarketInfo(Symbol(),MODE_MARGINREQUIRED);
     }

 

лотность очередного и всех последующих ордеров сбросится к минимальному значению LOTS (или к минимальному расчетному через риск), что не логично в сетках. Как правило, если стоит задача ограничить рост лотности, то открывают с определенного колена ордера с Максимальным заданным значение лота (MaxLot)

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

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

Не совсем понятно, что именно.

Как по мне - то для mql5 лучшего способа для подобной работы, чем встроенные функции терминала по работе c SQLite - нет.

 

https://www.mql5.com/ru/docs/database/databaseimport

https://www.mql5.com/ru/docs/database

 

Для MQL4 тоже есть библиотека:

https://github.com/dingmaotu/mql-sqlite3

Спасибо, @elavr

 

Так же интересует, можно ли большой .csv запихнуть внутрь ех4/ех5?

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

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

Так же интересует, можно ли большой .csv запихнуть внутрь ех4/ех5?

Что такое внутрь? Если подразумевается загрузить в массив - то почему бы и нет.  

https://www.mql5.com/ru/docs/files

Вопрос только в одном - скорости чтения CVS файла и последующей скорости обработки загруженных данных.

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

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

Что такое внутрь? Если подразумевается загрузить в массив - то почему бы и нет.  

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

Например, отправить на форум ех4, в котором уже есть csv данные 

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

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

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

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

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

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

Войти

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

Войти

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


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

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