Download MetaTrader 5

ReInit indicator when account changes

To add comments, please log in or register
ale
68
ale  

Can MT4 deinit and reinit an indicator when one changes account or server?


I have read around that there should an option for that, but I cannot find it.

whroeder1
15554
whroeder1  
There is no "option for that" because it's automatic. Uninitialization Reason Codes - MQL4 Documentation REASON_ACCOUNT
ale
68
ale  
WHRoeder:
There is no "option for that" because it's automatic. Uninitialization Reason Codes - MQL4 Documentation REASON_ACCOUNT




This is what I thought, but I did many tests and it seems to me that MT4 (build 765) does not reinitialize the indicators.


This is a minimal indicator to test:


//+------------------------------------------------------------------+
//|                                                ChangeAccount.mq4 |
//+------------------------------------------------------------------+
#property strict
#property indicator_chart_window

int OnInit() {
        SetIndexLabel(0, NULL);
        
        Print("Initializing. Demo? ", IsDemo());

        return INIT_SUCCEEDED;
}

void OnDeinit(const int reason) {
        Print("OnDeinit, reason = ", reason, " (code REASON_ACCOUNT = ", REASON_ACCOUNT, ")");
}

int OnCalculate(const int rates_total,
                const int prev_calculated,
                const datetime &time[],
                const double &open[],
                const double &high[],
                const double &low[],
                const double &close[],
                const long &tick_volume[],
                const long &volume[],
                const int &spread[]) {
        return 0;
}
OnInit is called only when I add the indicator or I recompile the indicator. If I double-click on another account to log in it, the indicator is not reinitialized. Why?
Ex Ovo Omnia
3293
Ex Ovo Omnia  
ale:


This is what I thought, but I did many tests and it seems to me that MT4 (build 765) does not reinitialize the indicators.


This is a minimal indicator to test:


OnInit is called only when I add the indicator or I recompile the indicator. If I double-click on another account to log in it, the indicator is not reinitialized. Why?

 

 Unlike EAs, indicators never reload with account or server change. It's been like this since I can remember. Neither there is an easy function to support reloading the indicator. You have to watch the account number yourself and recalculate the indicator if the account changes.

whroeder1
15554
whroeder1  
  1. Ovo:  Unlike EAs, indicators never reload with account or server change. It's been like this since I can remember. Neither there is an easy function to support reloading the indicator. You have to watch the account number yourself and recalculate the indicator if the account changes.

    Since indicators are based on chart's pair/TF, there is no need for them to recalculate anything. Try changing one of those and you will see a deinit/init cycle.

  2. ale: OnInit is called only when I add the indicator or I recompile the indicator. If I double-click on another account to log in it, the indicator is not reinitialized. Why?
    A deinit/init cycles is NEVER a reinitialization (recompile being the exception.) Globally/static declared variables are set once on load.
Алексей Тарабанов
7326
Алексей Тарабанов  
WHRoeder:
  1. Ovo:  Unlike EAs, indicators never reload with account or server change. It's been like this since I can remember. Neither there is an easy function to support reloading the indicator. You have to watch the account number yourself and recalculate the indicator if the account changes.

    Since indicators are based on chart's pair/TF, there is no need for them to recalculate anything. Try changing one of those and you will see a deinit/init cycle.

  2. ale: OnInit is called only when I add the indicator or I recompile the indicator. If I double-click on another account to log in it, the indicator is not reinitialized. Why?
    A deinit/init cycles is NEVER a reinitialization (recompile being the exception.) Globally/static declared variables are set once on load.

Also, init is no reinit? if not recompile? 

It`s clear:  In Spring I Like to Spring across the Spring Like a Spring. 

Ex Ovo Omnia
3293
Ex Ovo Omnia  
tara:

Also, init is no reinit? if not recompile? 

It`s clear:  In Spring I Like to Spring across the Spring Like a Spring. 

Lol, actually there is confusing behaviour in EAs (not indicators) that they do not unload variables/objects at global level with timeframe/symbol change. Nevertheless indicators do reset them, so I do not understand his objections either.
ale
68
ale  

So there is not way to make MT4 call OnInit (or any other function) when an account is changed.

All I can do is check every time in OnCalculate if the account number is equal to the past account number. This makes the indicator much more slow :(

Thank you

Ex Ovo Omnia
3293
Ex Ovo Omnia  
ale:

So there is not way to make MT4 call OnInit (or any other function) when an account is changed.

All I can do is check every time in OnCalculate if the account number is equal to the past account number. This makes the indicator much more slow :(

Thank you

Not "much more slow" as it is quite fast operation from my point of view, but rather more complicated.
whroeder1
15554
whroeder1  
tara: Also, init is no reinit? if not recompile? 
extern int test=0
void OnInit(){
  ++test; Comment(IntegerToString(test));
}
Try that and change timeframes and then recompile. What happens?
Ex Ovo Omnia
3293
Ex Ovo Omnia  
WHRoeder:
Try that and change timeframes and then recompile. What happens?
The timeframes change and then the source gets recompiled. Beside that nothing unexpected.
12
To add comments, please log in or register