Alexfm2000 Опубликовано 16 января, 2021 Поделиться Обучение языку MQL4 под MetaTrader 4 Опубликовано 16 января, 2021 5 часов назад, usver73 сказал: Вот накидал с комментариями usver73 огромное вам спасибо за написание разных версий с подробными комментариями! В StrategyTester провел тесты по контрольным точкам, что-то только странное получается, у вас в цикле for указан поиск фракталов от 1 до 15 баров. Но в тестере ищет за период 48 баров. И что ещё интересно находит иногда фракталы а иногда просто бары которые не являются фракталами. Добавил индексацию через ArraySetAsSeries(arrFractals, true) в функции OnDeInit. Ещё вопрос цикл для вывода информации о фракталах вы написали в функции OnDeInit(), это просто для удобства проведения тестов в тестере стратегий? Я просто обычно когда отдельные функции пишу в скрипте их тестирую либо ставлю их в OnInit() когда рынок закрыт, но попробовал цикл который вы поставилив OnDeInit() переставить в OnInit(), только тогда не находит фракталы. Ссылка на сообщение Поделиться на другие сайты More sharing options...
usver73 Опубликовано 16 января, 2021 Поделиться Обучение языку MQL4 под MetaTrader 4 Опубликовано 16 января, 2021 Только что, 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 Ссылка на сообщение Поделиться на другие сайты More sharing options...
Alexfm2000 Опубликовано 16 января, 2021 Поделиться Обучение языку MQL4 под MetaTrader 4 Опубликовано 16 января, 2021 51 минуту назад, usver73 сказал: Чтение в DeInit делается один раз при завершении работы советника, т.е. когда массив заполнен наа всем прогоне. В OnInit массив пустой- там нечего читать. Можно в OnTick() затолкать(внутри проверки NewBar() ), тогда будет на каждой свече печать всю информацию из массива. Как Вы это определили? Вообще, для поиска ошибки нужно добавить еще массив времени, тогда будет понятно- есть ли дубли По поводу DeInit спасибо большое, очень полезная информация, учту на будущее. По поводу определения я в тестере сделал прогон и далее замерил отрезок нулевого бара и до последнего найденного фрактала, тоесть в данном случаи это с индексом 1. Провел тест с версией 2.1 и сделал сравнение индикатора с 0.00001 как вы посоветовали. Результат не изменился. Для теста я использовал даты 12.01.2021 - 14.01.2021. Ссылка на сообщение Поделиться на другие сайты More sharing options...
usver73 Опубликовано 16 января, 2021 Поделиться Обучение языку MQL4 под MetaTrader 4 Опубликовано 16 января, 2021 35 минут назад, Alexfm2000 сказал: Провел тест с версией 2.1 и сделал сравнение индикатора с 0.00001 как вы посоветовали. Результат не изменился. Это изменение призвано исключить свечи, где не было фракталов. И что, весь массив заполняется за один вызов функции? Что то я сомневаюсь.. Можно добавить глоб. переменную, которая наращмввется при каждом вызове функции. И выводить её в журнал с количеством элементов в массиве. Так мы увидим, что за один вызов функции находит один фрактал Ссылка на сообщение Поделиться на другие сайты More sharing options...
Alexfm2000 Опубликовано 16 января, 2021 Поделиться Обучение языку MQL4 под MetaTrader 4 Опубликовано 16 января, 2021 15 минут назад, usver73 сказал: Это изменение призвано исключить свечи, где не было фракталов. И что, весь массив заполняется за один вызов функции? Что то я сомневаюсь.. Можно добавить глоб. переменную, которая наращмввется при каждом вызове функции. И выводить её в журнал с количеством элементов в массиве. Так мы увидим, что за один вызов функции находит один фрактал Видимо вы правы! Так как тесты проходят в тестере вызов функции производился не один раз, поэтому наверно и было такое больше количество баров (48) сейчас попробовал изменить дату 14.01.21 - 15.01.21 и нашло 8 фракталов и 9 с 0-вым значением. Да и теперь нашлись только одни фракталы без мусора. Ваша функция исправила ситуацию!!! По поводу такой функции с наращиванием интересно посмотреть как она будет работать. Ссылка на сообщение Поделиться на другие сайты More sharing options...
Vsegut Опубликовано 17 января, 2021 Поделиться Обучение языку MQL4 под MetaTrader 4 Опубликовано 17 января, 2021 помогите пожалуйста исправить функцию, у меня не как не получается. //+------------------------------------------------------------------+ // Если сегодня был профит, то больше не торгуем | //+------------------------------------------------------------------+ 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); } Ссылка на сообщение Поделиться на другие сайты More sharing options...
Alexfm2000 Опубликовано 17 января, 2021 Поделиться Обучение языку MQL4 под MetaTrader 4 Опубликовано 17 января, 2021 4 часа назад, Vsegut сказал: помогите пожалуйста исправить функцию, у меня не как не получается. Здравствуйте, если я правильно понял вы в функции проверяете был ли достигнут профит по сделкам, то есть проверяете исторические данные, тогда скорее всего нужно переставить MODE_TRADES на MODE_HISTORY то есть проверять только те ордера которые уже были закрыты. 4 часа назад, Vsegut сказал: if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) 1 Ссылка на сообщение Поделиться на другие сайты More sharing options...
usver73 Опубликовано 19 января, 2021 Поделиться Обучение языку MQL4 под MetaTrader 4 Опубликовано 19 января, 2021 В 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 Ссылка на сообщение Поделиться на другие сайты More sharing options...
diodio Опубликовано 22 января, 2021 Поделиться Обучение языку MQL4 под MetaTrader 4 Опубликовано 22 января, 2021 Всем привет. У меня такой вопрос, переменная может равняться функции, которая была создана? Например volume_up = PositionBar() Ссылка на сообщение Поделиться на другие сайты More sharing options...
Alexfm2000 Опубликовано 22 января, 2021 Поделиться Обучение языку MQL4 под MetaTrader 4 Опубликовано 22 января, 2021 4 часа назад, diodio сказал: Всем привет. У меня такой вопрос, переменная может равняться функции, которая была создана? Например volume_up = PositionBar() Добрый день, да вы можете присвоить переменной функцию, только не забудьте указать тип переменной например int volume_up = PositionBar(); Ссылка на сообщение Поделиться на другие сайты More sharing options...
Vsegut Опубликовано 23 января, 2021 Поделиться Обучение языку MQL4 под MetaTrader 4 Опубликовано 23 января, 2021 В 19.01.2021 в 15:29, usver73 сказал: Из задачи не понятно- ищется профит по первой попавшееся сделке(как сейчас) или нужно найти общий профит всех закрытых ордеров? я хочу найти, был ли профит именно сегодня. То есть запретить советнику торговать если сегодня был профит. ЕСЛИ можете исправите пожалуйста а то я совсем запутался в этой функции. СПАСИБО. Ссылка на сообщение Поделиться на другие сайты More sharing options...
Vsegut Опубликовано 23 января, 2021 Поделиться Обучение языку MQL4 под MetaTrader 4 Опубликовано 23 января, 2021 В 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); } Ссылка на сообщение Поделиться на другие сайты More sharing options...
Vsegut Опубликовано 23 января, 2021 Поделиться Обучение языку MQL4 под MetaTrader 4 Опубликовано 23 января, 2021 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); } //+------------------------------------------------------------------+ Ссылка на сообщение Поделиться на другие сайты More sharing options...
usver73 Опубликовано 23 января, 2021 Поделиться Обучение языку MQL4 под MetaTrader 4 Опубликовано 23 января, 2021 2 часа назад, Vsegut сказал: 14 часов назад, Vsegut сказал: Символ любой главное запретить советнику торговать если сегодня был профит. А может вот такой вариант будет лучше? если DayProfit() == 0 то торгуем Все зависит от задачи. Если нужно найти любой закрытый в плюс ордер, то зачем Вам количество таких ордеров? Делайте как было изначально return (true). И я бы поставил close_ord_day = TimeDayOfYear(OrderCloseTime()); //номер дня найденого закрытого ордера if (close_ord_day == nomer_day) сразу после OrderSelect. когда у Вас будет большая история, то зачем проверять все условия на тип, профит и т.д., если изначально нас интересует день закрытия ордера? и ещё: через год истории в выборку будут попадать прошлогодние ордера. нужно сразу подумать, как решить этот вопрос Ссылка на сообщение Поделиться на другие сайты More sharing options...
Vsegut Опубликовано 24 января, 2021 Поделиться Обучение языку MQL4 под MetaTrader 4 Опубликовано 24 января, 2021 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); } Ссылка на сообщение Поделиться на другие сайты More sharing options...
Just Trader Опубликовано 26 января, 2021 Поделиться Обучение языку MQL4 под MetaTrader 4 Опубликовано 26 января, 2021 Ребята есть вот такой кусок кода из сеточника double op = CalculateProfit(); if (op >= Profit) { CloseAll(); } во внешнюю переменную Profit я написал 1 доллар, но как сделать так чтобы если например кол-во сделок у меня больше одного то уже закрывался не 1 баксом прибылью, а например 2 баксами? Изменено 26 января, 2021 пользователем Just Trader Ссылка на сообщение Поделиться на другие сайты More sharing options...
Rever27 Опубликовано 27 января, 2021 Поделиться Обучение языку MQL4 под MetaTrader 4 Опубликовано 27 января, 2021 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 Ссылка на сообщение Поделиться на другие сайты More sharing options...
Uplife Опубликовано 27 января, 2021 Поделиться Обучение языку MQL4 под MetaTrader 4 Опубликовано 27 января, 2021 Помогите пожалуйста,кому не сложно,перенести конструкцию графической модели в алгоритм. Ссылка на сообщение Поделиться на другие сайты More sharing options...
Alexnik90 Опубликовано 2 февраля, 2021 Поделиться Обучение языку MQL4 под MetaTrader 4 Опубликовано 2 февраля, 2021 Здравствуйте. Подскажите пожалуйста, как можно скачать какой либо файл из интернета, например этот: https://www.myfxbook.com/calendar_statement.csv ? Ссылка на сообщение Поделиться на другие сайты More sharing options...
ademen Опубликовано 2 февраля, 2021 Поделиться Обучение языку MQL4 под MetaTrader 4 Опубликовано 2 февраля, 2021 Графические объекты в любом случаи сильно грузят впс? Поставил цель сделать панельку для сбора статистики по спреду, но разница в плане производительности с панелькой и без примерно в 4 раз. Делал с помочью EditCreate. @Rigal , вы с помощью каких инструментов делаете панельки? Сильно грузит впс? Можете сделать еще одну тему по этой библиотеке в коллекцию к вашим отличным библиотекам? Или просто скинуть файл для ознакомления. 1 Ссылка на сообщение Поделиться на другие сайты More sharing options...
Rigal Опубликовано 3 февраля, 2021 Поделиться Обучение языку MQL4 под MetaTrader 4 Опубликовано 3 февраля, 2021 7 часов назад, ademen сказал: Графические объекты в любом случаи сильно грузят впс? Поставил цель сделать панельку для сбора статистики по спреду, но разница в плане производительности с панелькой и без примерно в 4 раз. Делал с помочью EditCreate. @Rigal , вы с помощью каких инструментов делаете панельки? Сильно грузит впс? Можете сделать еще одну тему по этой библиотеке в коллекцию к вашим отличным библиотекам? Или просто скинуть файл для ознакомления. У меня нет единой библиотеки для графики. Я пишу объектно-ориенторованный код с использованием стандартных библиотек, включенных в поставку МТ Для повышения производительности теста и опта панельки прячутся за интерфейсом и в невизуальном тесте и опте заменяются заглушкой. 2 Ссылка на сообщение Поделиться на другие сайты More sharing options...
elavr Опубликовано 3 февраля, 2021 Поделиться Обучение языку MQL4 под MetaTrader 4 Опубликовано 3 февраля, 2021 8 часов назад, ademen сказал: Графические объекты в любом случаи сильно грузят впс? Поставил цель сделать панельку для сбора статистики по спреду, но разница в плане производительности с панелькой и без примерно в 4 раз. Делал с помочью EditCreate. @Rigal , вы с помощью каких инструментов делаете панельки? Сильно грузит впс? Можете сделать еще одну тему по этой библиотеке в коллекцию к вашим отличным библиотекам? Или просто скинуть файл для ознакомления. Хмм, если рассматривать МТ5(как правило спред для мт4 и мт5 одинаковых счетов у одного брокера сопоставим ), то есть ли смысл делать такую панель когда можно получить эту информацию из котировок? Просто делал такого советника для теста. TestSQLite.mq5 Изменено 3 февраля, 2021 пользователем elavr Ссылка на сообщение Поделиться на другие сайты More sharing options...
Alexnik90 Опубликовано 3 февраля, 2021 Поделиться Обучение языку MQL4 под MetaTrader 4 Опубликовано 3 февраля, 2021 1 час назад, Jadavin сказал: Нажмите правой кнопкой мыши на ссылке -> "Сохранить объект как...". Это в браузере Firefox. В других наверняка аналогично. Ты прикалываешься?)) Я в теме про Обучению MQL4 спросил как скачать тот файл, имеется в виду как это реализовать через код. Ссылка на сообщение Поделиться на другие сайты More sharing options...
Rever27 Опубликовано 3 февраля, 2021 Поделиться Обучение языку MQL4 под MetaTrader 4 Опубликовано 3 февраля, 2021 20 часов назад, Alexnik90 сказал: Здравствуйте. Подскажите пожалуйста, как можно скачать какой либо файл из интернета, Насколько я знаю, через MetaEditor никак. Возможно какие то WinAPI есть, но я не нашел. Есть такой вариант через программу: https://www.mql5.com/ru/articles/1502 И вот еще готовый вариант через программу: https://www.mql5.com/ru/code/9306 Изменено 3 февраля, 2021 пользователем Rever27 1 Ссылка на сообщение Поделиться на другие сайты More sharing options...
Alexnik90 Опубликовано 3 февраля, 2021 Поделиться Обучение языку MQL4 под MetaTrader 4 Опубликовано 3 февраля, 2021 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 этой информации, в каком то другом виде она там присутствует, и не знаю в каком и как ее достать, и от куда она туда поступает, не нашел ссылку. Ссылка на сообщение Поделиться на другие сайты More sharing options...
Рекомендуемые сообщения
Для публикации сообщений создайте учётную запись или авторизуйтесь
Вы должны быть пользователем, чтобы оставить комментарий
Создать учетную запись
Зарегистрируйте новую учётную запись в нашем сообществе. Это очень просто!
Регистрация нового пользователяВойти
Уже есть аккаунт? Войти в систему.
Войти