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

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


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

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

Вот накидал с комментариями
 

 usver73 огромное вам спасибо за написание разных версий с подробными комментариями! В StrategyTester провел тесты по контрольным точкам, что-то только странное получается, у вас в цикле for указан поиск фракталов от 1 до 15 баров. Но в тестере ищет за период 48 баров. И что ещё интересно находит иногда фракталы а иногда просто бары которые не являются фракталами. Добавил индексацию  через ArraySetAsSeries(arrFractals, true) в функции OnDeInit.

 

image.png.d2e5b734f204840000ad9fae23f1e5a4.pngimage.png.b536c22014ae854431c67fce9f4d46a1.png 

 

Ещё вопрос цикл для вывода информации о фракталах вы написали в функции OnDeInit(), это просто для удобства проведения тестов в тестере стратегий?

Я просто обычно когда отдельные функции пишу в скрипте их тестирую либо ставлю их в OnInit() когда рынок закрыт, но попробовал цикл который вы поставилив OnDeInit() переставить в OnInit(), только тогда не находит фракталы.

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

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

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

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

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

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

Перейти

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

Перейти

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

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

Ещё вопрос цикл для вывода информации о фракталах вы написали в функции OnDeInit(), это просто для удобства проведения тестов в тестере стратегий?

Я просто обычно когда отдельные функции пишу в скрипте их тестирую либо ставлю их в OnInit() когда рынок закрыт, но попробовал цикл который вы поставилив OnDeInit() переставить в OnInit(), только тогда не находит фракталы.

Чтение в DeInit делается один раз при завершении работы советника, т.е. когда массив заполнен наа всем прогоне. В OnInit массив пустой- там нечего читать. Можно в OnTick() затолкать(внутри проверки NewBar() ), тогда будет на каждой свече печать всю информацию из массива.
 

Только что, Alexfm2000 сказал:

цикле for указан поиск фракталов от 1 до 15 баров. Но в тестере ищет за период 48 баров.

Как Вы это определили?
Вообще, для поиска ошибки нужно добавить еще массив времени, тогда будет понятно- есть ли дубли

Только что, Alexfm2000 сказал:

Добавил индексацию  через ArraySetAsSeries(arrFractals, true) в функции OnDeInit.

а это зачем? Если хотите печатать в обратной последовательности, то цикл будет

for(int i= ArraySize(arrFractal); i>0 ;  i--)

 

Только что, Alexfm2000 сказал:

И что ещё интересно находит иногда фракталы а иногда просто бары которые не являются

Подозреваю, что индикатор возвращает double с каким-то мусором.
Если так, то нужно сравнивать значение индикатора на с 0, а, например с 0,00001 (для пятизнака).
переделал v.2
 

test_fractal_2.1.mq4

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

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

Чтение в DeInit делается один раз при завершении работы советника, т.е. когда массив заполнен наа всем прогоне. В OnInit массив пустой- там нечего читать. Можно в OnTick() затолкать(внутри проверки NewBar() ), тогда будет на каждой свече печать всю информацию из массива.
 

Как Вы это определили?
Вообще, для поиска ошибки нужно добавить еще массив времени, тогда будет понятно- есть ли дубли

 

По поводу DeInit спасибо большое, очень полезная информация, учту на будущее.

 

По поводу определения я в тестере сделал прогон и далее замерил отрезок нулевого бара и до последнего найденного фрактала, тоесть в данном случаи это с индексом 1. Провел тест с версией 2.1 и сделал сравнение индикатора с 0.00001 как вы посоветовали. Результат не изменился. 

Для теста я использовал даты 12.01.2021 - 14.01.2021.

image.png.8fba07b0aec1b01a504756da71164a6b.png

image.png.2b60f4d2438d0b23dfcc353dff74e9bd.png

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

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

Провел тест с версией 2.1 и сделал сравнение индикатора с 0.00001 как вы посоветовали. Результат не изменился. 

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

И что, весь массив заполняется за один вызов функции? Что то я сомневаюсь..

Можно добавить глоб. переменную,  которая наращмввется при каждом вызове функции.  И выводить её в журнал с количеством элементов в массиве.

Так мы увидим, что за один вызов функции находит один фрактал

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

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

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

И что, весь массив заполняется за один вызов функции? Что то я сомневаюсь..

Можно добавить глоб. переменную,  которая наращмввется при каждом вызове функции.  И выводить её в журнал с количеством элементов в массиве.

Так мы увидим, что за один вызов функции находит один фрактал

Видимо вы правы! Так как тесты проходят в тестере вызов функции производился не один раз, поэтому наверно и было такое больше количество баров (48) сейчас попробовал изменить дату 14.01.21 - 15.01.21 и нашло 8 фракталов и 9 с 0-вым значением. Да и теперь нашлись только одни фракталы без мусора. Ваша функция исправила ситуацию!!! По поводу такой функции с наращиванием интересно посмотреть как она будет работать.

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

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

помогите пожалуйста исправить функцию, у меня не как не получается.

//+------------------------------------------------------------------+
//  Если сегодня был профит, то больше не торгуем                    |
//+------------------------------------------------------------------+ 
bool DayProfit() 
{
  int nomer_day = TimeDayOfYear(TimeCurrent());
  int close_ord_day=0;
  for (int i=OrdersHistoryTotal()-1; i>=0; i--)
  {
    if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) 
    {
     if (OrderType()==OP_BUY || OrderType()==OP_SELL) 
      {
       if (OrderMagicNumber()==Magic) 
        {
         close_ord_day = TimeDayOfYear(OrderCloseTime());
         if (close_ord_day < nomer_day) return(true);
        }
      }
     }
    }
  return(false);
}

 

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

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

помогите пожалуйста исправить функцию, у меня не как не получается.

Здравствуйте, 

если я правильно понял вы в функции проверяете был ли достигнут профит по сделкам, то есть проверяете исторические данные, тогда скорее всего нужно переставить MODE_TRADES на MODE_HISTORY то есть проверять только те ордера которые уже были закрыты.

4 часа назад, Vsegut сказал:

if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES))

 

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

Обучение языку MQL4 под MetaTrader 4 Опубликовано
В 18.01.2021 в 02:00, Alexfm2000 сказал:

то есть проверять только те ордера которые уже были закрыты.

В 17.01.2021 в 21:17, Vsegut сказал:

if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES))

 

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

Из задачи не понятно- ищется профит по первой попавшееся сделке(как сейчас) или нужно найти общий профит всех закрытых ордеров?

Нет выборки по символу.. э то специально или ошибка?

if (close_ord_day < nomer_day) 

здесь < нужно заметить на ==

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

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

Всем привет. У меня такой вопрос, переменная может равняться функции, которая была создана?

Например  volume_up = PositionBar()

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

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

Всем привет. У меня такой вопрос, переменная может равняться функции, которая была создана?

Например  volume_up = PositionBar()

Добрый день, 

да вы можете присвоить переменной функцию, только не забудьте указать тип переменной например

int volume_up = PositionBar();

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

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

Из задачи не понятно- ищется профит по первой попавшееся сделке(как сейчас) или нужно найти общий профит всех закрытых ордеров?

я хочу найти, был ли профит именно сегодня. То есть запретить советнику торговать если сегодня был профит. ЕСЛИ можете исправите пожалуйста а то я совсем запутался в этой функции. СПАСИБО.

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

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

Нет выборки по символу.. э то специально или ошибка?

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

//+------------------------------------------------------------------+
//  Если сегодня был профит, то больше не торгуем                    |
//+------------------------------------------------------------------+ 
bool DayProfit() 
{
  int nomer_day = TimeDayOfYear(TimeCurrent());  //номер текущего дня
  int close_ord_day=0;                           
  for (int i=OrdersHistoryTotal()-1; i>=0; i--)
  {
    if (OrderSelect(i, SELECT_BY_POS, MODE_HISTORY)) 
    {
     if (OrderType()==OP_BUY || OrderType()==OP_SELL) 
      {
       if (OrderMagicNumber()==Magic && OrderProfit()>0) 
        {
         close_ord_day = TimeDayOfYear(OrderCloseTime());  //номер дня найденого закрытого ордера
         if (close_ord_day < nomer_day) return(true);
        }
      }
     }
    }
  return(false);
}

 

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

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

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

А может вот такой вариант будет лучше? если    DayProfit() == 0   то  торгуем. 

//+------------------------------------------------------------------+
//  Если сегодня был профит, то больше не торгуем                    |
//+------------------------------------------------------------------+ 
int DayProfit() 
{
  int count = 0;
  int nomer_day = TimeDayOfYear(TimeCurrent());  //номер текущего дня
  int close_ord_day=0;                           
  for (int i=OrdersHistoryTotal()-1; i>=0; i--)
  {
    if (OrderSelect(i, SELECT_BY_POS, MODE_HISTORY)) 
    {
     if (OrderType()==OP_BUY || OrderType()==OP_SELL) 
      {
       if (OrderMagicNumber()==Magic && OrderProfit()>0) 
        {
         close_ord_day = TimeDayOfYear(OrderCloseTime());  //номер дня найденого закрытого ордера
         if (close_ord_day == nomer_day)
           count++;
        }
      }
     }
    }
  return(count);
}
//+------------------------------------------------------------------+

 

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

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

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

А может вот такой вариант будет лучше? если    DayProfit() == 0   то  торгуем

Все зависит от задачи. 

Если нужно найти любой закрытый в плюс ордер,  то зачем Вам  количество таких  ордеров?

Делайте как было изначально return (true).

И я бы поставил 

         close_ord_day = TimeDayOfYear(OrderCloseTime());  //номер дня найденого закрытого ордера
         if (close_ord_day == nomer_day)

сразу  после OrderSelect. 

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

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

нужно сразу подумать,  как решить этот вопрос

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

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

сразу  после OrderSelect. 

так ?

//+------------------------------------------------------------------+
//  Если сегодня был профит, то больше не торгуем                    |
//+------------------------------------------------------------------+ 
bool DayProfit() 
{
  int nomer_day = TimeDayOfYear(TimeCurrent());  //номер текущего дня
  int close_ord_day=0;                           
  for (int i=OrdersHistoryTotal()-1; i>=0; i--)
  {
    if (OrderSelect(i, SELECT_BY_POS, MODE_HISTORY)) 
    {
      close_ord_day = TimeDayOfYear(OrderCloseTime());  //номер дня найденого закрытого ордера
      if (close_ord_day == nomer_day && OrderMagicNumber()==Magic && OrderProfit()>0)
        return(true);
    }
  }
  return(false);
}

 

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

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

Ребята есть вот такой кусок кода из сеточника

 

      double op = CalculateProfit();
      if (op >= Profit)
      {
      CloseAll();
      }  

во внешнюю переменную Profit я написал 1 доллар,  но как сделать так чтобы если например кол-во сделок у меня больше одного то уже закрывался не 1 баксом прибылью, а например 2 баксами?

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

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

как сделать так чтобы если например кол-во сделок у меня больше одного то уже закрывался не 1 баксом прибылью, а например 2 баксами?

//+------------------------------------------------------------------+
//|                                                           11.mq4 |
//|                                  Copyright (c) Trade Llike a Pro |
//|                                            https://www.tlap.com/ |
//+------------------------------------------------------------------+
#property copyright "Copyright (c) Trade Llike a Pro"
#property link      "https://www.tlap.com/"
#property version   "1.00"
#property strict

double Profit1 = 1;
double Profit2 = 2;

//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
      int count = CountOrder(-1); //подсчет кол-ва ордеров
      
      double op = CalculateProfit();
      if ((count == 0 && op >= Profit1) || (count > 1 && op >= Profit2))
      {
      CloseAll();
      }    
  }
//+------------------------------------------------------------------+

//+------------------------------------------------------------------+
int CountOrder(int Order_Type) {
   int orders=0;
   for(int i=OrdersTotal()-1;i>=0;i--){
      if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES)==false) continue;
      if(OrderSymbol()!=_Symbol || OrderMagicNumber() != MagicNumber) continue;
      
      if(Order_Type == OrderType() || Order_Type == -1) orders++;
   }
   return orders;
}

 

Как то так. Добавляешь счетчик открытых ордеров вначале. Можно считать либо по конкретному направлению, либо все ордера вообще. Далее проверка, что если ордеров нет и прибыль больше чем Profit1, то закрываешь. Если это условие не подходит, то проверяется второе условия: если ордеров больше, чем один и прибыль больше Profit2.

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

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

Здравствуйте. Подскажите пожалуйста, как можно скачать какой либо файл из интернета, например этот: https://www.myfxbook.com/calendar_statement.csv ?

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

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

Графические объекты в любом случаи сильно грузят впс? Поставил цель сделать панельку для сбора статистики по спреду, но разница в плане производительности с панелькой и без примерно в 4 раз. Делал с помочью EditCreate.

 

@Rigal , вы с помощью каких инструментов делаете панельки? Сильно грузит впс? Можете сделать еще одну тему по этой библиотеке в коллекцию к вашим отличным библиотекам? Или просто скинуть файл для ознакомления.

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

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

Графические объекты в любом случаи сильно грузят впс? Поставил цель сделать панельку для сбора статистики по спреду, но разница в плане производительности с панелькой и без примерно в 4 раз. Делал с помочью EditCreate.

 

@Rigal , вы с помощью каких инструментов делаете панельки? Сильно грузит впс? Можете сделать еще одну тему по этой библиотеке в коллекцию к вашим отличным библиотекам? Или просто скинуть файл для ознакомления.

У меня нет единой библиотеки для графики.

Я пишу объектно-ориенторованный код с использованием стандартных библиотек, включенных в поставку МТ

Для повышения производительности теста и опта панельки прячутся за интерфейсом и в невизуальном тесте и опте заменяются заглушкой. 

 

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

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

Графические объекты в любом случаи сильно грузят впс? Поставил цель сделать панельку для сбора статистики по спреду, но разница в плане производительности с панелькой и без примерно в 4 раз. Делал с помочью EditCreate.

 

@Rigal , вы с помощью каких инструментов делаете панельки? Сильно грузит впс? Можете сделать еще одну тему по этой библиотеке в коллекцию к вашим отличным библиотекам? Или просто скинуть файл для ознакомления.

Хмм, если рассматривать МТ5(как правило спред для мт4 и мт5 одинаковых счетов у одного брокера сопоставим ), то есть ли смысл делать такую панель когда можно получить эту информацию из котировок?

 

Просто делал такого советника для теста.

TestSQLite.mq5

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

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

Нажмите правой кнопкой мыши на ссылке -> "Сохранить объект как...". Это в браузере Firefox. В других наверняка аналогично.

Ты прикалываешься?)) Я в теме про Обучению MQL4 спросил как скачать тот файл, имеется в виду как это реализовать через код.

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

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

Здравствуйте. Подскажите пожалуйста, как можно скачать какой либо файл из интернета,

Насколько я знаю, через MetaEditor никак. Возможно какие то WinAPI есть, но я не нашел.

Есть такой вариант через программу: 
https://www.mql5.com/ru/articles/1502

И вот еще готовый вариант через программу: https://www.mql5.com/ru/code/9306

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

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

Насколько я знаю, через MetaEditor никак. Возможно какие то WinAPI есть, но я не нашел.

Есть такой вариант через программу: 
https://www.mql5.com/ru/articles/1502

И вот еще готовый вариант через программу: https://www.mql5.com/ru/code/9306

Спасибо большое. Это я находил, думал может есть вариант без стороннего софта это делать, через dll какую ни будь, например wininet.dll, или подобный? Видел варианты через wininet.dll, но не рабочие, по крайней мере в том виде, какие они были. Для меня эта тема темный лес, что то в интернет выкладывать или наоборот доставать. Поэтому не разберусь там. Точнее я могу достать некоторую информацию со страниц HTML через WebRequest, но что посложнее мне уже не по зумам.

Например хотелось стакан ордеров научится выводить на мт4, хотя бы демо счетов, эти данные доступны всем в Оанда, но как от туда достать эту информацию не знаю, всю голову сломал, нету в коде страницы HTML этой информации, в каком то другом виде она там присутствует, и не знаю в каком и как ее достать, и от куда она туда поступает, не нашел ссылку.

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

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

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

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

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

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

Войти

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

Войти

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


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

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