Errori, bug, domande - pagina 2930

 

Tradurre un indicatore da mt4 a mt5

Il problema è nella dimensioneDRAW_HISTOGRAM

Quando imposto "1" o "2" la dimensione cambia, ma "3" o "4" = la dimensione è ancora "2".


Perché tutto funziona in MT4, ma c'è un tale problema con MT5?

#property indicator_separate_window
#property indicator_plots   4
#property indicator_buffers 4
#property indicator_color1 clrDodgerBlue
#property indicator_color2 clrDodgerBlue
#property indicator_color3 clrLimeGreen
#property indicator_color4 clrFireBrick
#property indicator_width1 3
#property indicator_width2 3
#property indicator_width3 3
#property indicator_width4 3

Risultato in mt4


Risultato in mt5, mostra solo "2" spessore, anche se ho "3" nelle impostazioni



Inoltre, impostare la proprietà in OnInit() non aiuta

PlotIndexSetInteger(0,PLOT_LINE_WIDTH, 3);

 

Errore critico durante il debug:

struct sA
  {
   int               i;
   string            s;
  };
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
class cA
  {
public:
   sA                my_array[];
  };
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void OnStart()
  {
   cA *ca;
   ca=new cA();
   ArrayResize(ca.my_array,1);
   ZeroMemory(ca.my_array);
   ArrayPrint(ca.my_array);
  }

Risultato:

2020.12.27 17:04:26.966 1 (EURUSD,M1)   Access violation at 0x000001FE5AF10199 read to 0xFFFFFFFFFFFFFFFF in 'D:\Alpari MT5\MQL5\Scripts\Test\1.ex5'
2020.12.27 17:04:26.967 1 (EURUSD,M1)      crash -->  000001FE5AF10199 8B4318            mov        eax, [rbx+0x18]
2020.12.27 17:04:26.967 1 (EURUSD,M1)                 000001FE5AF1019C 4089442420        mov        [rsp+0x20], eax
2020.12.27 17:04:26.967 1 (EURUSD,M1)                 000001FE5AF101A1 41B910000000      mov        r9d, 0x10
2020.12.27 17:04:26.967 1 (EURUSD,M1)                 000001FE5AF101A7 49B8B807F15AFE01  mov        r8, 0x1fe5af107b8
2020.12.27 17:04:26.967 1 (EURUSD,M1)                                  0000
2020.12.27 17:04:26.967 1 (EURUSD,M1)                 000001FE5AF101B1 488D17            lea        rdx, [rdi]
2020.12.27 17:04:26.967 1 (EURUSD,M1)                 000001FE5AF101B4 48B998D45F5FFE01  mov        rcx, 0x1fe5f5fd498
2020.12.27 17:04:26.967 1 (EURUSD,M1)                                  0000
2020.12.27 17:04:26.967 1 (EURUSD,M1)                 000001FE5AF101BE 49FF96A8120000    call       qword near [r14+0x12a8]  ; #11378 (terminal64.exe)
2020.12.27 17:04:26.967 1 (EURUSD,M1)   
2020.12.27 17:04:26.967 1 (EURUSD,M1)   00: 0x000001FE5AF10199
2020.12.27 17:04:26.967 1 (EURUSD,M1)   01: 0x000001FE633F0010
2020.12.27 17:04:26.967 1 (EURUSD,M1)   
L'ultima versione beta al momento
Документация по MQL5: Программы MQL5 / Ошибки выполнения
Документация по MQL5: Программы MQL5 / Ошибки выполнения
  • www.mql5.com
Ошибки выполнения - Программы MQL5 - Справочник MQL5 - Справочник по языку алгоритмического/автоматического трейдинга для MetaTrader 5
 
Qualcuno ha trovato un modo per ottenere un manico di indicatore per visualizzare una proprietà nella finestra principale o nella sottofinestra? Sto parlando di indicatori arbitrari di terze parti che vengono creati usando IndicatorCreate e poi potrebbero essere aggiunti al grafico usandoChartIndicatorAdd su richiesta dell'utente.
 
Stanislav Korotky:
Qualcuno ha trovato un modo per far sì che la maniglia dell'indicatore visualizzi la proprietà nella finestra principale o nella sottofinestra? Sto parlando di indicatori personalizzati che vengono creati usando IndicatorCreate e poi possono essere aggiunti al grafico usando ChartIndicatorAdd.

Potresti probabilmente infilare l'indicatore in OBJ_CHART e vedere dove si trova.

 
Stanislav Korotky:
Qualcuno ha trovato un modo per ottenere una proprietà di visualizzazione da una maniglia dell'indicatore nella finestra principale o nella sottofinestra? Sto parlando di indicatori personalizzati che vengono creati usando IndicatorCreate e poi possono essere aggiunti al grafico da ChartIndicatorAdd su richiesta dell'utente.

ha fatto qualcosa di simile.
Ecco uno che ho trovato. Non ricordo se funziona o no. Si prega di controllare.

bool FindIndicatorByHandle(long handle, string &symbol, ENUM_TIMEFRAMES &timeframe, long &ChartId, int &sub_win, string &Name) {
   long chart_id =ChartFirst();
   while (chart_id!=-1) {
      int total_sub = (int)ChartGetInteger(chart_id,CHART_WINDOWS_TOTAL);
      int total_ind; 
      for(int i=0; i<total_sub; i++) {
         total_ind = ChartIndicatorsTotal(chart_id,i);
         for (int j=0; j<total_ind; j++) {
            string name = ChartIndicatorName(chart_id,i,j);
            if (ChartIndicatorGet(chart_id,i,name)== handle) {
               ChartId=chart_id;
               symbol= ChartSymbol(chart_id);
               timeframe=ChartPeriod(chart_id);
               sub_win=i;
               Name=name;
               return true;
            }
         }
      }
      chart_id=ChartNext(chart_id);
   }
   return false;
}
Il codice cerca tutti i grafici aperti per un indicatore in base al suo handle. Restituisce simbolo, timeframe, id del grafico, sottofinestra e nome dell'indicatore.
 
fxsaber:

Immagino che potresti mettere l'indicatore in OBJ_CHART e vedere dove si trova.

Farò una prova, per ora ho dovuto fare l'opzione per specificarlo dall'utente.

 
Nikolai Semko:

ha fatto qualcosa di simile.
Ecco uno che ho trovato. Non ricordo se funziona o no. Si prega di controllare.

A giudicare dal codice, cerca tutti i grafici aperti per un indicatore in base al suo handle. Restituisce simbolo, timeframe, id del grafico, sottofinestra e nome dell'indicatore.

Non corrisponde alla tua domanda: gli indicatori creati da IndicatorCreate non sono collocati in nessuna finestra - si "siedono" al suo interno, e il compito è quello di collocare tale indicatore tramite il suo manico nella finestra. Ora, MQL5 permette di aggiungere un handle arbitrario alla finestra principale o sottofinestra usando la funzione ChartIndicatorAdd, indipendentemente dalle "proprietà" dell'indicatore (senza errori!), e il risultato appare molto strano quando l'aggiunta non viene eseguita come previsto.

 

C'è un problema più grande con gli indicatori.

Alcuni di loro implementano il gestore OnCalculate secondo la versione semplificata con una matrice di input, e per loro è possibile selezionare il tipo di prezzo per il calcolo. Come fai a sapere dal programma MQL5 di terze parti che l'indicatore si aspetta questo tipo di prezzo, che deve essere passato dopo tutti i parametri durante la creazione dell'indicatore? Sembra che non ci sia modo. E se non lo fai, l'indicatore è disegnato dalla #proprietà indicator_applied_price che non è accessibile dall'esterno. Ecco un semplice Expert Advisor che aggiunge l'indicatore/AMA al grafico programmaticamente:

int OnInit()
{
  const int h = iCustom(NULL, 0, "Examples/AMA");
  if(h == INVALID_HANDLE)
  {
    Print("iCustom failed: ", _LastError);
    return INIT_FAILED;
  }

  if(!ChartIndicatorAdd(0, 0, h))
  {
    Print("ChartIndicatorAdd failed: ", _LastError);
    return INIT_FAILED;
  }
  ChartRedraw();
  
  return INIT_SUCCEEDED;
}

Se poi cambiamo il timeframe del grafico, otteniamo 2 indicatori AMA: uno a prezzo di chiusura (creato programmaticamente) e uno a prezzo aperto (generato a causa del cambio di timeframe e della #proprietà indicator_applied_price PRICE_OPEN; non è chiaro perché questa proprietà non sia catturata anche da iCustom).

 

Per continuare il tema degli indicatori, allego l'Expert Advisor che ho usato per scoprire ed evitare il problema con i parametri MqlParam.

Il compito dell'Expert Advisor è quello di aggiungere l'indicatore "Examples/Price_Channel" al grafico, se non è ancora presente, con gli stessi parametri.

Per fare questo, creiamo un'istanza usando iCustom/IndicatorCreate, otteniamo un array dei suoi parametri attraverso IndicatorParameters, e poi chiamiamo nel ciclo IndicatorParameters per gli indicatori che già esistono nel grafico: se non c'è corrispondenza dei parametri dell'array, l'indicatore viene aggiunto al grafico, se c'è una corrispondenza, il nuovo handle viene semplicemente distrutto.

Il problema è che l'uguaglianza dei parametri non funziona sempre come previsto. In particolare, c'è un tale caso di test a prova di errore. Posizioniamo l'Expert Advisor su qualsiasi grafico vuoto e clicchiamo - si crea la prima istanza dell'indicatore. Poi passiamo a qualsiasi altro timeframe del grafico (il vecchio indicatore rimane) e clicchiamo di nuovo. Stranamente, viene creata la seconda istanza dell'indicatore.

Dall'analisi dell'esecuzione e del log è chiaro che questo è dovuto all'equalizzazione errata delle stringhe del nome dell'indicatore nei parametri. Le stringhe lì sono lunghe 260 caratteri, ma il terminale 0 si trova molto prima. Dopo c'è qualche informazione di servizio o spazzatura. Quindi il confronto delle stringhe "==" o StringCompare tiene conto di questa "spazzatura" e si ottiene l'ineguaglianza delle stringhe.

Se convertiamo le stringhe in un array di char, gli array ottengono una corrispondenza completa. Se si converte in un array corto, si ottiene una schifezza. Tutto sommato, alcuni comportamenti non coerenti non descritti nella documentazione.

Window N: 1
   0, Price Channel(22), 12
    [type] [integer_value] [double_value]                                                                                                                                                                                                                                                         [string_value]
[0]     14               0          0.000 "Indicators\Examples/Price_Channel"                                                                                                                                                                                                                                   
[1]      7              22          0.000 null                                                                                                                                                                                                                                                                  
ind1: 'Indicators\Examples/Price_Channel
ind2: 'Indicators\Examples/Price_Channel
260 0 / 260 0
Char arrays 34 34
 73 110 100 105  99  97 116 111 114 115  92  69 120  97 109 112 108 101 115  47  80 114 105  99 101  95  67 104  97 110 110 101 108   0
 73 110 100 105  99  97 116 111 114 115  92  69 120  97 109 112 108 101 115  47  80 114 105  99 101  95  67 104  97 110 110 101 108   0
Short arrays 260 260
[  0]    73   110   100   105    99    97   116   111   114   115    92    69   120    97   109   112   108   101   115    47    80   114   105    99
[ 24]   101    95    67   104    97   110   110   101   108     0   103   110    97   108     0     0     0     0     0     0     0     0     0     0
[ 48]     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0
[ 72]     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0
[ 96]     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0
[120]     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0
[144]     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0
[168]     0     0     0     0     0     0     0     0     0     0     0     0    13  3328 58074    86 13696    54     0     0 35120  3210     0     0
[192]     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0
[216]     0     0     0     0 61841 38184 17648 16370     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0
[240]     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0
[  0]    73   110   100   105    99    97   116   111   114   115    92    69   120    97   109   112   108   101   115    47    80   114   105    99
[ 24]   101    95    67   104    97   110   110   101   108     0   103   110    97   108     0    32    32    77    32    65    32    82    32    75
[ 48]    32    83     0    32    99   111   109   109    97    32   115   101   112    97   114    97   116   101   100    32   108   105   115   116
[ 72]    41     0    32   112   114   111   116   111   116   121   112   101   115    41     0     0   115     0     0     0     0     0     0     0
[ 96]   528     0     0     0     0    45     0     0     3     0     0     0   512     0     0     0  1160    45     0     0  7256 30655     0     0
[120]     0     0     0     0   512     0     0     0     0 65535  2272     0 29648    45     0     0     0     0     0     0     0     0     0     0
[144]     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0
[168]     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0
[192]     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0
[216]     3     0     0     0 26341 16284     1     0  1308    16     0     0 49814 30635     0     0     0     0     0     0 32016    37     0     0
[240]     2     0     0     0 50336 16481     1     0     2     0     0     0     3     0     0     0 45520    37     0     0
1 0

Non sono sicuro di quale sia esattamente il bug, se è nel principio di elaborazione delle stringhe in MQL o qualcos'altro.

Se qualcuno conosce le sfumature, per favore mi dia un suggerimento.

File:
 
Stanislav Korotky:

Se qualcuno è a conoscenza delle sfumature, per favore mi dia un consiglio.

Questo è il tipo di caratteristica che, anche se la conoscete, dovete riportare tutto il livello nella vostra testa da capo.

Qui ha fatto la definizione di disponibilità di sé. Sembrava funzionare quando si cambiavano i TF.

Init_Sync
Init_Sync
  • www.mql5.com
Библиотека делает синхронизированными Init/Deinit индикаторов