if(StringFind(Symbol(),"EURUSD", 0) != -1 && Period() == 60) set_EURUSD_H1();
else if(StringFind(Symbol(),"GBPUSD", 0) != -1 && Period() == 60) set_GBPUSD_H1();
else if(StringFind(Symbol(),"USDCHF", 0) != -1 && Period() == 60) set_USDCHF_H1();
else if(StringFind(Symbol(),"USDJPY", 0) != -1 && Period() == 60) set_USDJPY_H1();
else if(StringFind(Symbol(),"USDCAD", 0) != -1 && Period() == 60) set_USDCAD_H1();
else if(StringFind(Symbol(),"AUDUSD", 0) != -1 && Period() == 60) set_AUDUSD_H1();
else if(StringFind(Symbol(),"NZDUSD", 0) != -1 && Period() == 60) set_NZDUSD_H1();
else
{
Alert("Error Symbol or TimeFrame");
Print("Error. " + "Symbol = " + Symbol() + ", TimeFrame = " + Period() + ". For correctly work the expert you should set Symbol or TimeFrame = EURUSD_H1, GBPUSD_H1, USDJPY_H1, USDCHF_H1, USDCAD_H1, AUDUSD_H1, NZDUSD_H1");
Modul_1 = false;
Modul_2 = false;
}
Добрый день, коллеги
написал первый советник, гоняю на разных парах, пытаюсь подобрать лучшие пары и параметры для них. Получается, что есть параметры по умолчанию, а для некоторых пар их необходимо менять. Вопрос - как принято осуществлять загрузку нужных параметров. Например, если пары нет в списке на особые параметры - то параметры по умолчанию, если есть - по подгрузить. Что в mql используется? В прошлом программировании я бы создал некий конфигурационный файл и его читал при старте. Здесь тоже так делать- например в функции OnInit ? А если потом юзер нажмет F7 и что-то поменяет - я об этом узнаю? Еще проблема - названия инструментов - они меняются в зависимости от типа счета - EURUSD, EURUSD_m, EURUSD_e. Т.е. чтении конфига и сравнении с текущим инструментом нужно не прямое сравнение, а вхождение подстроки в строку?
Олег
Я так понял, есть желание загружать параметры извне? Да, можно в OnInit, но надо учитывать, что параметры input и extern в панели настроек при этом меняться не будут. Я вообще делаю копии переменных input и extern в глобальные переменные и уже с ними работаю. Делаю это потому, что многие параметры меняю из собственной панели, аналог вашей загрузки из файла.
Если юзер нажмет F7 и поменяет параметры - смотрите в справке
Причины деинициализации
Коды причины деинициализации эксперта, возвращаемые функцией UninitializeReason(). Могут иметь любые из следующих значений:
Константа | Значение | Описание |
REASON_PROGRAM | 0 | Эксперт прекратил свою работу, вызвав функцию ExpertRemove() |
REASON_REMOVE | 1 | Программа удалена с графика |
REASON_RECOMPILE | 2 | Программа перекомпилирована |
REASON_CHARTCHANGE | 3 | Символ или период графика был изменен |
REASON_CHARTCLOSE | 4 | График закрыт |
REASON_PARAMETERS | 5 | Входные параметры были изменены пользователем |
REASON_ACCOUNT | 6 | Активирован другой счет либо произошло переподключение к торговому серверу вследствие изменения настроек счета |
REASON_TEMPLATE | 7 | Применен другой шаблон графика |
8 | Признак того, что обработчик OnInit() вернул ненулевое значение | |
REASON_CLOSE | 9 | Терминал был закрыт |
И в коде пишу вот так, чтобы не перенициализироваться при смене чарта или таймфрейма
int LastDeinitReason = 0; int OnInit() { Print("UninitializeReason() from OnInit = ", UninitializeReason()); if(LastDeinitReason==REASON_CHARTCHANGE || LastDeinitReason==REASON_TEMPLATE) { LastDeinitReason = 0; return(INIT_SUCCEEDED); } if(LastDeinitReason==REASON_PARAMETERS) { SetParams(); return(INIT_SUCCEEDED); } // обычная инициализация при старте } void OnDeinit(const int reason) { LastDeinitReason = reason; if(reason==REASON_CHARTCHANGE || reason==REASON_TEMPLATE || reason==REASON_PARAMETERS) return; // деинициализация при выходе }
Я не сторонник жесткого зашивания в код переменных по сути параметров. Так меняешь.дописываешь в конфиг, его разослал и все, а иначе необходимо ковыряться в коде/перекомпилировать, плодятся версии. Когда у тебя один экземпляр - то все равно, а вдруг есть тиражирование - то ой. По прошлому опыту знаю, что синхронизация версий даже при наличии 4-6 точек потребления программы (у меня это были удаленные офисы в пределах одной компании, но в разных городах/частях города) - еще тот головняк. Сейчас, конечно, технологии двинулись и можно удаленно управлять рабочим столом, а 15 лет назад попробуй поменять исполняемый модуль и метаданные в другом городе. Только ногами.
По сути программирования в mql понял, что все навыки можно применять и язык/возможности все больше и больше нравиться, языковой барьер понемногу уходит - я с Си-подобными дела никогда не имел. Немного расстраивает редактор текста - необычен, курсор скачет, сильно не хватает SQL - команд, например Select ... from вместо унылого перебирания в цикле фор ордеров по каким-то параметрам. Что то вроде
for select o.OrderTicket, o.OpenPrice
from Ordesrs o
where (o.OrderSymbol = Symbol()) and
(o.OrderMagicNumber = Magic) and
(o.OrderType = OP_BUYSTOP)
into .......
order by o.OrderOpenTime do begin
.....
end
вместо
for(CurrentOrder=Total-1; CurrentOrder>=0; CurrentOrder--) if(OrderSelect(CurrentOrder,SELECT_BY_POS)) if(OrderSymbol()==Symbol()) if(OrderMagicNumber()==Magic) { if(OrderType()==OP_BUYSTOP) { if (AllowLong) { BuyStop++;
Я не сторонник жесткого зашивания в код переменных по сути параметров. Так меняешь.дописываешь в конфиг, его разослал и все, а иначе необходимо ковыряться в коде/перекомпилировать, плодятся версии. Когда у тебя один экземпляр - то все равно, а вдруг есть тиражирование - то ой. По прошлому опыту знаю, что синхронизация версий даже при наличии 4-6 точек потребления программы (у меня это были удаленные офисы в пределах одной компании, но в разных городах/частях города) - еще тот головняк. Сейчас, конечно, технологии двинулись и можно удаленно управлять рабочим столом, а 15 лет назад попробуй поменять исполняемый модуль и метаданные в другом городе. Только ногами.
По сути программирования в mql понял, что все навыки можно применять и язык/возможности все больше и больше нравиться, языковой барьер понемногу уходит - я с Си-подобными дела никогда не имел. Немного расстраивает редактор текста - необычен, курсор скачет, сильно не хватает SQL - команд, например Select ... from вместо унылого перебирания в цикле фор ордеров по каким-то параметрам. Что то вроде
for select o.OrderTicket, o.OpenPrice
from Ordesrs o
where (o.OrderSymbol = Symbol()) and
(o.OrderMagicNumber = Magic) and
(o.OrderType = OP_BUYSTOP)
into .......
order by o.OrderOpenTime do begin
.....
end
вместо
Запросов c SQL-подобным синтаксисом в MQL4/5 нет. Но поддержка этого встроена в C# и есть сторонние библиотеки под С++, например https://cpplinq.codeplex.com/, эта технология в рамках C# называется LINQ или LINQ to SQL.
Пожно погуглить LINQ C++, будут ссылки на другие библиотеки.
В чем тут смысл? В MQL4/5 есть возможность использовать внешние DLL, в которых можно творить, что душе угодно, даже многопоточность, которой в MQL тоже нет. DLL пишутся на С++, если нужен C#, с DLL на С++ пишется враппер на C#. То есть какой-то сложный код при желании можно вынести в DLL.
- cpplinq.codeplex.com
В чем тут смысл? В MQL4/5 есть возможность использовать внешние DLL, в которых можно творить, что душе угодно, даже многопоточность, которой в MQL тоже нет. DLL пишутся на С++, если нужен C#, с DLL на С++ пишется враппер на C#. То есть какой-то сложный код при желании можно вынести в DLL.
Если бы еще DLL цеплялись по человечески, а не методами аналогичными DOS программированию, совсем замечательно было бы. Авторам МТ написать бы всего одну DLL, и вообще все проблемы с программированием для МТ были бы решены. :)
Вы имеете в виду, подключение DLL как в .NET? Сейчас DLL должны быть в формате 20-летней давности, то есть нативные win api.
Да хоть как в VBA - в референсес, и все дела. В NET все примерно аналогично, только доп XML. Да и NET DLL прекрасно работают с обычными программами, правильно приготовленные.
Вообще-то хотелось бы API DLL к МТ4(5), и никакого MQL. :) Как в терминале Альфы, например - в референсес DLL засунул - и хоть С++, хоть VB.NET. В MQL слишком много танцев с бубном. Если бы разработчики МТ такую DLL написали (предоставили) -это была бы последняя проблема языка MQL.
ЗЫ Неск лет тому, видел-играл с импортным терминалом. Там встроенный NET редактор (на всяк случай), но можно и из VS.
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Вы принимаете политику сайта и условия использования
Добрый день, коллеги
написал первый советник, гоняю на разных парах, пытаюсь подобрать лучшие пары и параметры для них. Получается, что есть параметры по умолчанию, а для некоторых пар их необходимо менять. Вопрос - как принято осуществлять загрузку нужных параметров. Например, если пары нет в списке на особые параметры - то параметры по умолчанию, если есть - по подгрузить. Что в mql используется? В прошлом программировании я бы создал некий конфигурационный файл и его читал при старте. Здесь тоже так делать- например в функции OnInit ? А если потом юзер нажмет F7 и что-то поменяет - я об этом узнаю? Еще проблема - названия инструментов - они меняются в зависимости от типа счета - EURUSD, EURUSD_m, EURUSD_e. Т.е. чтении конфига и сравнении с текущим инструментом нужно не прямое сравнение, а вхождение подстроки в строку?
Олег