
Вы упускаете торговые возможности:
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Регистрация
Вход
Вы принимаете политику сайта и условия использования
Если у вас нет учетной записи, зарегистрируйтесь
Mathemat писал(а) >>
Вот такая строка проходит нормально (MA_Method объявлен как ENUM_MA_METHOD):
MA_Method = (ENUM_MA_METHOD) 3;
а вот такая - нет, ругается компилятор:
MA_Method = 3;
Сразу две оговорки:
1. То, что я выше написал, в таком виде на MQL5 нереализуемо, ввиду отсутствия возможности перегрузки операторов.
2. По-хорошему, кастовать перечисления к инту это плохо
Но, в принципе, такой код нормальный:
Тип можно узнать по имени.
В общем и в целом в принципе, не так плохо, как я думал вначале, и главное -- реализуемо.
Правда, разработчикам придется попотеть, ибо надо будет располагать параметры в том же порядке, который есть в индикаторе.
Кстати, я конечно могу ошибкаться, но с некоторыми оговорками это можно реализовать на пользовательском уровне.
Т.е. просто дописать руками апгрейд.
TheXpert писал(а) >>
Кстати, я конечно могу ошибкаться, но с некоторыми оговорками это можно реализовать на пользовательском уровне.
Реализация параметров для кастомного индикатора (пример)
Унификация:
Собсно, использование:
Mathemat, писал наполовину из интереса, наполовину для Вас. Так что надеюсь хотя бы на тестирование с Вашей стороны.
Ибо код сырой и непроверенный, а штука довольно прикольная в использовании.
Реализация в аттаче.
Ага, Андрей, спасибо. Посмотрю, как времени чуть побольше будет.
Извини Алексей, спрошу не по теме. Но тут много старых программистов собралось, авось кто нибудь ответит.
Мне нужно использовать двумерный массив, в котором размер одного из измерений мне заранее известен. Скажем-50, array[][50], или array[50][] и он используется в функции, размер второго измерения заранее не известен.
ArrayResize(array, n), где n параметр, который подается на функцию, изменит размерность в первом измерении.
Получится array[n][50].
Теперь мне нужно отсортировать массив по тому измерению, у которого размерность 50, и возможно это сделать так: ArraySort(array,MODE_ASCEND)
Но эта стандартная функция может сортировать только по первому измерению в MQL4, и, если я правильно понял, в MQL5.
Вопрос: Как отсортировать массив стандартными средствами языка, так, что бы то измерение, которое обозначено n не сортировалось?
array[i] - указатель на i-й вектор размерностью 50.
Если речь идет об MQL5, то достаточно сделать по аналогии ArraySort(array[i], MODE_ASCEND).
//Такой код не годится, так как сортировка по n-ному измерению
void func(int n)
{
double array[][50];
ArrayResize(array, n);
ArraySort(array,MODE_ASCEND);
}
//Такой код не годится, так как массив изменит размерность 50 на размерность n первого измерения
void func(int n)
{
double array[50][];
ArrayResize(array, n);
ArraySort(array,MODE_ASCEND);
}
Условия задачи были такими: 50 - размерное измерение не должно изменить размер, а измерение n не должно сортироваться. Приходится заранее выставлять намного больший размер массива, что очень накладно.
Нужно решение на MQL4 или MQL5?
MQL5 - привел выше.
MQL4 - проще (быстро и надежно) написать свою сортировку. Вы же понимаете, что сортировать можно только значения внутри каждого вектора. Вектора между собой сотировать можно только по какому-то своему придуманному критерию, который надо будет заложить в функцию сортировки.
Поэтому, замечательно было бы иметь штатную или возможность написать на MQL5 аналог qsort. Но, вроде, в MQL5 отсутствуют указатели на функции. Поэтому штатную функцию сортировки по ЛЮБОМУ критерию скорее всего реализовать не получится.
getch писал(а) >>
Нужно решение на MQL4 или MQL5?
MQL5 - привел выше.
Ваше решение отсортирует по второму измерению?
Я говорю о том, что штатная функция сортирует только по первому измерению, и нельзя сортировать по второму. Мне не нужно сортировать по обоим измерениям одновременно, только по одному из них. А изменять размерность можно только первого измерения.
Ещё раз. Мне нужно сортировать по измерению, размерность которого 50. А изменять размерность того измерения, у которого размерность n.
Свою функцию можно написать, но она будет медленнее, чем была бы штатная.
Ваше решение отсортирует по второму измерению?
Я говорю о том, что штатная функция сортирует только по первому измерению, и нельзя сортировать по второму. Мне не нужно сортировать по обоим измерениям одновременно, только по одному из них. А изменять размерность можно только первого измерения.
Ещё раз. Мне нужно сортировать по измерению, размерность которого 50. А изменять размерность того измерения, у которого размерность n.
Свою функцию можно написать, но она будет медленнее, чем была бы штатная.
Да, решение через array[i] отсортирует массив по второму измерения, т.к. array[i] - это одномерный массив. На MQL4 не пробовал, думаю, не получится штатно из-за узости MQL4.
Своя функция на MQL4 не всегда будет быстрее штатной. Причина простая: штатная функция - универсальная (хоть и быстрая), но не могущая использовать особенности вашего массива, которые вы можете для оптимальности использовать в своей функции.
Очень часто сталкивался с тем, что своя функция работала в разы быстрее штатной в таких ситуациях.