MQL4 Как заставить советника продолжать работать при смене профиля?

 

Столкнулся  с большой проблемой: при смене профиля в МТ4, советники на старом (закрытом) профиле перестают работать. А если снова открыть тот профиль, на котором стояли советники, они просят заново вводить все параметры, т.е. инициализируются повторно. 

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

Прошу помочь.

 В настройках все так:

 

Советник на данный момент имеет такой вид:

//+------------------------------------------------------------------+
//|                                                      ProjectName |
//|                                      Copyright 2012, CompanyName |
//|                                       http://www.companyname.net |
//+------------------------------------------------------------------+
#property strict
input double checkline=0; // контрольная ближняя граница
input double BE=0; // уровень безубыточности
input int direction=0; //направление торговли: 1 - вверх (long), 2 - вниз (short)
input int ticket=0; // номер ордера
int Slippage= 50; // проскальзывание в пп.
int Magic = 0001; // магический номер эксперта
string com="Перевод в БУ"; // комментарий ордера
//+------------------------------------------------------------------+
//| expert start function                                            |
//+------------------------------------------------------------------+
datetime start_time;
void OnInit()
  {
   string name="START_BAR";
   ObjectCreate(0,name,OBJ_VLINE,0,Time[0],0);
   ChartRedraw();
   MessageBox("Try to move VLINE, then press OK");
   start_time=ObjectGetInteger(0,name,OBJPROP_TIME);
   ObjectDelete(0,name);
   MessageBox(TimeToString(start_time));
 }
 
 void OnTick()
 {
  int bar=iBarShift(0,0,start_time);
  int a=(bar-1); //первый бар поиска после ERC
  double cp_high=0;
  int ab=0;
  int ac=0;
  int cp_close_up=0;
  int cp_close_eng=0;
 
  if (direction==1) // поиск первой базовой свечи "a"
    for (a;a>0;a--)
    {
    if ((Close[a]>=Open[a] && (Close[a]-Open[a])*2<=(High[a]-Low[a])) || Close[a]<Open[a]) 
    {
    cp_high=iHigh(0,0,iHighest(0,0,MODE_HIGH,2,a));
    ab=(a-1);
    ac=(a-1); // следующая после первой базовой свеча
    break;
    }
    };
    
  if (direction==1) // поиск закрытия выше первой базовой свечи
    for (ab;ab>0;ab--)
    {
    if (Close[ab]>cp_high) 
    {cp_close_up=1;
    break;}
    };
    
 if (direction==1) // поиск первой поглощающей свечи после первой базовой свечи
    for (ac;ac>0;ac--)
    {
    if (((Close[ac]-Open[ac])*2>(High[ac]-Low[ac])) || (Close[ac]>High[ac+1]))
    {cp_close_eng=1;
    break;}
    };
 
 if (cp_close_up==1 && cp_close_eng==1 && OrderSelect(ticket,SELECT_BY_TICKET && OrderCloseTime()==0) && OrderType()==2)
 OrderDelete(ticket);

 
 
  Print(" bar=",bar," a=",a," cp_high=",cp_high," ac=",ac," OrderType=",OrderType());

 }
 
Ivan Molchanov:

Столкнулся  с большой проблемой: при смене профиля в МТ4, советники на старом (закрытом) профиле перестают работать. А если снова открыть тот профиль, на котором стояли советники, они просят заново вводить все параметры, т.е. инициализируются повторно. 

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

Прошу помочь.

 В настройках все так:

 

Советник на данный момент имеет такой вид:

Советники и индикаторы вызывают OnInit даже при смене таймфрейма. Я правильно понял, что на разных профилях работают разные советники? Или одни и те же, но настройки разные?

Если советники разные, может так сработает.

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

// привожу код полностью из моего робота, так понятнее будет

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);                              
    }
    // раз мы здесь, значит первый запуск и надо все открыть, создать, настроить... 
    OpenLogFiles();
    TrButtons.DeleteButtons();
    TrButtons.CreateButtons();
    CreatePriceLines();
    InitParams();
    EventSetTimer(SEC_TIMER_INTERVAL);
    LastDeinitReason = 0;
    return(INIT_SUCCEEDED);
} 

void OnDeinit(const int reason)
{
    Print("UninitializeReason() from OnDeinit = ", UninitializeReason()); // это для отладки, можно потом удалить
    LastDeinitReason = reason;
    if(reason==REASON_CHARTCHANGE || reason==REASON_TEMPLATE || reason==REASON_PARAMETERS) // если причины были такие, ничего не делаем
        return;
    EventKillTimer();
    CloseLogFiles();
    TrButtons.DeleteButtons();
    DeletePriceLines();
}
 
Alexey Volchanskiy:

Советники и индикаторы вызывают OnInit даже при смене таймфрейма. Я правильно понял, что на разных профилях работают разные советники? Или одни и те же, но настройки разные?

Если советники разные, может так сработает.

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

Спасибо, попробую.

Уточню, что речь идет об одном советнике, но с разными настройками.

Почему-то я решил, что эта проблема весьма распространена (ну не один же я пользуюсь несколькими профилями :) ) и уже имеет давно решение :( 

 

Пока я решил пойти по пути наименьшего сопротивления и просто советников буду запускать во втором терминале, где не будет необходимости переключаться по профилям. А анализ буду вести в первом терминале.

Тем не менее, если у кого есть решение вопроса на уровне советника, буду рад. 

 
Ivan Molchanov:

Спасибо, попробую.

Уточню, что речь идет об одном советнике, но с разными настройками.

Почему-то я решил, что эта проблема весьма распространена (ну не один же я пользуюсь несколькими профилями :) ) и уже имеет давно решение :( 

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

Что такое "смена профиля"?

1. Закрытие всех открытых графиков и сохранение их состояний в соответствующих chr-файлах в папке текущего профиля. Все эксперты и кастомные индикаторы деинициализируются и выгружаются

2. Открытие новых графиков из соответствующих chr-файлов, содержащихся в папке нового профиля. Новые эксперты и индикаторы загружаются и инициализируются.

А не факт, что на вновь открытых графиках есть те же самые эксперты и индикаторы. Там вообще может быть не прикреплено никаких экспертов

 

Спасибо всем, я понял, что это сложно (если вообще возможно) сделать. Мне это точно не под силу.

Просто меня ввело в заблуждение наличие настройки в "настройках", позволяющее не отключать автоматическую торговлю при смене профиля.  Видимо, я не правильно понял, что она означает. Ну да ладно, я наладил второй терминал, где открываю нужные графики и вешаю советника, а ручной анализ веду в основном терминале.