Подгрузка параметров в советник

 

Добрый день, коллеги

написал первый советник, гоняю на разных парах, пытаюсь подобрать лучшие пары и параметры для них. Получается, что есть параметры по умолчанию, а для некоторых пар их необходимо менять. Вопрос - как принято осуществлять загрузку нужных параметров. Например, если пары нет в списке на особые параметры - то параметры по умолчанию, если есть - по подгрузить. Что в mql используется? В прошлом программировании я бы создал некий конфигурационный файл и его читал при старте. Здесь тоже так делать- например в функции OnInit ? А если потом юзер нажмет F7 и что-то поменяет - я об этом узнаю? Еще проблема - названия инструментов - они меняются в зависимости от типа счета - EURUSD, EURUSD_m, EURUSD_e. Т.е. чтении конфига и сравнении с текущим инструментом нужно не прямое сравнение, а вхождение подстроки в строку? 

Олег 

        

 
    //---- Блок определения торгового инструмента
    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;

    }
 
OlegSng:

Добрый день, коллеги

написал первый советник, гоняю на разных парах, пытаюсь подобрать лучшие пары и параметры для них. Получается, что есть параметры по умолчанию, а для некоторых пар их необходимо менять. Вопрос - как принято осуществлять загрузку нужных параметров. Например, если пары нет в списке на особые параметры - то параметры по умолчанию, если есть - по подгрузить. Что в 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

Применен другой шаблон графика

REASON_INITFAILED

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++;
 
OlegSng:

Я не сторонник жесткого зашивания в код переменных по сути параметров. Так меняешь.дописываешь в конфиг, его разослал и все, а иначе необходимо ковыряться в коде/перекомпилировать, плодятся версии. Когда у тебя один экземпляр - то все равно, а вдруг есть тиражирование - то ой. По прошлому опыту знаю, что синхронизация версий даже при наличии 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. 

LINQ for C++
LINQ for C++
  • cpplinq.codeplex.com
LINQ for C++ (cpplinq) is an extensible C++11 library of higher-order functions for range manipulation. cpplinq draws inspiration from LINQ for C#. See Dr. Dobbs article by Gaston Hillar for an excellent introduction to cpplinq: http://www.drdobbs.com/cpp/linq-like-list-manipulation-in-c/240166882 Documentation See documentation in order to...
 
Alexey Volchanskiy:

В чем тут смысл? В MQL4/5 есть возможность использовать внешние DLL, в которых можно творить, что душе угодно, даже многопоточность, которой в MQL тоже нет. DLL пишутся на С++, если нужен C#, с DLL на С++ пишется враппер на C#. То есть какой-то сложный код при желании можно вынести в DLL. 

Если бы еще DLL цеплялись по человечески, а не методами аналогичными DOS программированию, совсем замечательно было бы. Авторам МТ написать бы всего одну DLL, и вообще все проблемы с программированием для МТ были бы решены. :)
 
Yuriy Asaulenko:
Если бы еще DLL цеплялись по человечески, а не методами аналогичными DOS программированию, совсем замечательно было бы. Авторам МТ написать бы всего одну DLL, и вообще все проблемы с программированием для МТ были бы решены. :)
Вы имеете в виду, подключение DLL как в .NET? Сейчас DLL должны быть в формате 20-летней давности, то есть нативные win api. 
 
Alexey Volchanskiy:
Вы имеете в виду, подключение DLL как в .NET? Сейчас DLL должны быть в формате 20-летней давности, то есть нативные win api. 

Да хоть как в VBA - в референсес, и все дела. В NET все примерно аналогично, только доп XML.  Да и NET DLL прекрасно работают с обычными программами, правильно приготовленные.

Вообще-то хотелось бы API DLL к МТ4(5), и никакого MQL. :) Как в терминале Альфы, например - в референсес DLL засунул - и хоть С++, хоть VB.NET. В MQL слишком много танцев с бубном. Если бы разработчики МТ такую DLL написали (предоставили) -это была бы последняя проблема языка MQL.

ЗЫ Неск лет тому, видел-играл  с импортным терминалом. Там  встроенный NET редактор (на всяк случай), но можно и из VS.

Причина обращения: