L'ho provato su un paio di indicatori. entrambi funzionavano bene, ora no.
2) ci sono spesso problemi quando si cerca di eseguire il test con la connessione ai core (funziona con l'ennesima esecuzione). vedi l'immagine.
TheXpert: Un gruppo di telepati sta già esaminando il tuo problema.
non c'è bisogno di essere un telepate per capire che iCustom() non funziona come dovrebbe.
per testarlo, potete eseguire il codice dell'Expert Advisor: doppio buffer[]; ResetLastError(); int MA_handle = iCustom(NULL, 0, "Examples\Custom Moving Average", 21, 0, MODE_SMMA); //int MA_handle = iMA(NULL, 0, 21, 0, MODE_SMMA, PRICE_MEDIAN); Print("MA_handle = ", MA_handle, " error = ", GetLastError()); int copy = CopyBuffer(MA_handle, 0, 0, 5, buffer); if (copy == -1) Print("Failed to get Custom Moving Average indicator"); else for (int i = 0; i < 5; i++) Print("buffer[", i, "] = ", buffer[i];
e verrà visualizzato il messaggio "Failed to get Custom Moving Average indicator values".
Cioè, CopyBuffer dà un errore (restituisce -1) per la maniglia dell'indicatore iCustom(). Se prendiamo l'indicatore standard iMA(), lo stesso codice funziona!
Urain: Guardate la direzione di indicizzazione dell'array risultante, forse ha bisogno di essere espansa.
tutto va bene con la direzione di indicizzazione e nelle build precedenti questo funzionava anche. nella 448 e 450 non funzionava. Ho suggerito molte volte che gli sviluppatori dovrebbero testare più a fondo la funzionalità principale del terminale, ma da una build all'altra ottengono diversi errori critici invece di quelli critici. Cioè una cosa viene aggiustata e un'altra cosa che normalmente funzionava si rompe e non c'è una fine in vista.
Lo slittamento prima di copiare i dati, richiede tempo per calcolare l'indicatore, quindi anche se la maniglia ritorna correttamente, i dati non sono ancora stati calcolati,
In generale, si raccomanda di chiamare gli indicatori nell'inite, e richiedere i dati già in OnTick() o altre funzioni speciali.
double buffer[];
ResetLastError();
int MA_handle = iCustom(NULL, 0, "Examples\\Custom Moving Average", 21, 0, MODE_SMMA);
//int MA_handle = iMA(NULL, 0, 21, 0, MODE_SMMA, PRICE_MEDIAN);Print("MA_handle = ", MA_handle, " error = ", GetLastError());
Sleep(100);
int copy = CopyBuffer(MA_handle, 0, 0, 5, buffer);
if (copy == -1) Print("Неудачная попытка получить значения индикатора Custom Moving Average");
elsefor (int i = 0; i < 5; i++) Print("buffer[", i, "] = ", buffer[i]);
di nuovo, copi 5 dati dalla barra zero, ma nel copybuffer la barra zero è da qualche parte intorno al 1970 (dipende dalle impostazioni della barra massima), ecco perché ho detto di guardare l'indicizzazione dell'array.
Lo slittamento prima di copiare i dati, richiede tempo per calcolare l'indicatore, quindi anche se la maniglia ritorna correttamente, i dati non sono ancora stati calcolati.
Sleep(1000); // 1 secondo dopo aver chiamato iCustom() ha aiutato, MA. Dovrei ora prendere il tempo di ritardo? Come faccio a sapere quanto tempo ci vorrà per il processo di calcolo? è sbagliato dare la maniglia corretta dell'indicatore che punta alla spazzatura! e deve aver funzionato correttamente prima perché non c'era questo problema.
Urain:
in generale, si raccomanda di chiamare gli indicatori nell'initis, e chiedere i dati già in OnTick() o altre funzioni speciali.
Questo è un buon consiglio per me, grazie ) perché se avessi fatto così, non avrei visto il problema...
Di nuovo stai copiando 5 dati dalla barra zero, ma in copyBuffer la barra zero è da qualche parte intorno al 1970 (dipende dalle impostazioni della barra massima), ecco perché ho detto di guardare l'indicizzazione dell'array.
Per quanto ho capito dalla documentazione di aiuto, in CopyBuffer() la barra zero è in realtà "tempo presente", e già quando la copi, l'array è espanso.
Sleep(1000); // 1 sec. dopo aver chiamato iCustom() ha aiutato, MA... Dovrei ora prendere il tempo di ritardo? Come faccio a sapere quanto tempo impiegherà il processo di calcolo? è sbagliato dare la maniglia corretta dell'indicatore che indica la spazzatura! e deve aver funzionato correttamente prima, perché non c'era questo problema.
Non è necessario regolare il tempo di ritardo per la funzione Sleep(), se si divide per tempo la chiamata iCustom e l'accesso ai valori di questo indicatore. Inoltre, c'è la funzione BarsCalculated()
Non so se questo è un bug, ma penso che ci siano errori nel codice delle librerie per tutti i tipi di muvings (SignalFrAMA, SignalAMA, SignalMA, SignalDEMA, SignalTEMA) per il master, vediCSignalTEMA::ShortCondition()
//| "Voting" that price will grow. |//| INPUT: no. |//| OUTPUT: number of "votes" that price will grow. |//| REMARK: no. |//+------------------------------------------------------------------+int CSignalTEMA::LongCondition()
{
int result=0;
int idx =StartIndex();
//--- analyze positional relationship of the close price and the indicator at the first analyzed barif(DiffCloseMA(idx)<0.0)
{
//--- the close price is below the indicatorif(IS_PATTERN_USAGE(1) && DiffOpenMA(idx)>0.0 && DiffMA(idx)>0.0)
{
//--- the open price is above the indicator (i.e. there was an intersection), but the indicator is directed upwards
result=m_pattern_1;
//--- consider that this is an unformed "piercing" and suggest to enter the market at the current price
m_base_price=0.0;
}
}
else
{
//--- the close price is above the indicator (the indicator has no objections to buying)if(IS_PATTERN_USAGE(0))
result=m_pattern_0;
//--- if the model 2 is usedif(IS_PATTERN_USAGE(2) && DiffMA(idx)>0.0)
{
//--- the indicator is directed upwardsif(DiffOpenMA(idx)<0.0)
{
//--- the open price is below the indicator (i.e. there was an intersection)
result=m_pattern_2;
//--- suggest to enter the market at the "roll back"
m_base_price=m_symbol.NormalizePrice(MA(idx));
}
else
{
//--- the open price is above the indicatorif(DiffLowMA(idx)<0.0)
{
//--- the low price is below the indicator
result=m_pattern_2;
//--- consider that this is a formed "piercing" and suggest to enter the market at the current price
m_base_price=0.0;
}
}
}
}
//--- return the resultreturn(result);
}
//+------------------------------------------------------------------+//| "Voting" that price will fall. |//| INPUT: no. |//| OUTPUT: number of "votes" that price will fall. |//| REMARK: no. |//+------------------------------------------------------------------+int CSignalTEMA::ShortCondition()
{
int result=0;
int idx =StartIndex();
//--- analyze positional relationship of the close price and the indicator at the first analyzed barif(DiffCloseMA(idx)>0.0)
{
//--- the close price is above the indicatorif(IS_PATTERN_USAGE(1) && DiffOpenMA(idx)<0.0 && DiffMA(idx)<0.0)
{
//--- the open price is below the indicator (i.e. there was an intersection), but the indicator is directed downwards
result=m_pattern_1;
//--- consider that this is an unformed "piercing" and suggest to enter the market at the current price
m_base_price=0.0;
}
}
else
{
//--- the close price is below the indicator (the indicator has no objections to buying)if(IS_PATTERN_USAGE(0))
result=m_pattern_0;
//--- if the model 2 is usedif(IS_PATTERN_USAGE(2) && DiffMA(idx)<0.0)
{
//--- the indicator is directed downwardsif(DiffOpenMA(idx)<0.0)---------------------------------------->ДОЛЖЕН БЫТЬ ЗНАК "БОЛЬШЕ"!!!
{
//--- the open price is above the indicator (i.e. there was an intersection)
result=m_pattern_2;
//--- suggest to enter the market at the "roll back"
m_base_price=m_symbol.NormalizePrice(MA(idx));
}
else
{
//--- the open price is below the indicatorif(DiffHighMA(idx)>0.0)
{
//--- the high price is above the indicator
result=m_pattern_2;
//--- consider that this is a formed "piercing" and suggest to enter the market at the current price
m_base_price=0.0;
}
}
}
}
//--- return the resultreturn(result);
}
Anche nella libreria SignalMA in
int CSignalMA::ShortCondition()
{
.......
//--- analyze positional relationship of the close price and the indicator at the first analyzed barif(DiffCloseMA(idx)>0.0)
{
.......
}
else
{
//--- the close price is below the indicator (the indicator has no objections to buying)if(IS_PATTERN_USAGE(0))
result=m_pattern_0;
//--- if the model 2 is used
То что ниже не корректно:
if(DiffMA(idx)<0.0)
{
//--- the indicator is directed downwardsif(IS_PATTERN_USAGE(2) && DiffOpenMA(idx)<0.0)
{
.....
}
Последние 2 условия должны выглядеть так:
if(IS_PATTERN_USAGE(2) && DiffMA(idx)<0.0)
{
//--- the indicator is directed downwardsif(DiffOpenMA(idx)>0.0)
{
.....
}
Non so se questo è un bug, ma penso che ci siano errori nel codice delle librerie per tutti i tipi di muvings (SignalFrAMA, SignalAMA, SignalMA, SignalDEMA, SignalTEMA) per il master, vedi CSignalTEMA::ShortCondition()
Anche nella libreria SignalMA in
Grazie mille. Sarà corretto. (Dannato copia-incolla)
Quale?
L'ho provato su un paio di indicatori. entrambi funzionavano bene, ora no.
2) ci sono spesso problemi quando si cerca di eseguire il test con la connessione ai core (funziona con l'ennesima esecuzione). vedi l'immagine.
Un gruppo di telepati sta già esaminando il tuo problema.
non c'è bisogno di essere un telepate per capire che iCustom() non funziona come dovrebbe.
per testarlo, potete eseguire il codice dell'Expert Advisor:
doppio buffer[];
ResetLastError();
int MA_handle = iCustom(NULL, 0, "Examples\Custom Moving Average", 21, 0, MODE_SMMA);
//int MA_handle = iMA(NULL, 0, 21, 0, MODE_SMMA, PRICE_MEDIAN);
Print("MA_handle = ", MA_handle, " error = ", GetLastError());
int copy = CopyBuffer(MA_handle, 0, 0, 5, buffer);
if (copy == -1) Print("Failed to get Custom Moving Average indicator");
else
for (int i = 0; i < 5; i++) Print("buffer[", i, "] = ", buffer[i];
e verrà visualizzato il messaggio "Failed to get Custom Moving Average indicator values".
Cioè, CopyBuffer dà un errore (restituisce -1) per la maniglia dell'indicatore iCustom(). Se prendiamo l'indicatore standard iMA(), lo stesso codice funziona!
Guardate la direzione di indicizzazione dell'array risultante, forse ha bisogno di essere espansa.
tutto va bene con la direzione di indicizzazione e nelle build precedenti questo funzionava anche. nella 448 e 450 non funzionava.
Ho suggerito molte volte che gli sviluppatori dovrebbero testare più a fondo la funzionalità principale del terminale,
ma da una build all'altra ottengono diversi errori critici invece di quelli critici.
Cioè una cosa viene aggiustata e un'altra cosa che normalmente funzionava si rompe e non c'è una fine in vista.
Lo slittamento prima di copiare i dati, richiede tempo per calcolare l'indicatore, quindi anche se la maniglia ritorna correttamente, i dati non sono ancora stati calcolati,
In generale, si raccomanda di chiamare gli indicatori nell'inite, e richiedere i dati già in OnTick() o altre funzioni speciali.
di nuovo, copi 5 dati dalla barra zero, ma nel copybuffer la barra zero è da qualche parte intorno al 1970 (dipende dalle impostazioni della barra massima), ecco perché ho detto di guardare l'indicizzazione dell'array.
Lo slittamento prima di copiare i dati, richiede tempo per calcolare l'indicatore, quindi anche se la maniglia ritorna correttamente, i dati non sono ancora stati calcolati.
Sleep(1000); // 1 secondo dopo aver chiamato iCustom() ha aiutato, MA. Dovrei ora prendere il tempo di ritardo? Come faccio a sapere quanto tempo ci vorrà per il processo di calcolo?
è sbagliato dare la maniglia corretta dell'indicatore che punta alla spazzatura! e deve aver funzionato correttamente prima perché non c'era questo problema.
in generale, si raccomanda di chiamare gli indicatori nell'initis, e chiedere i dati già in OnTick() o altre funzioni speciali.
Questo è un buon consiglio per me, grazie ) perché se avessi fatto così, non avrei visto il problema...
Di nuovo stai copiando 5 dati dalla barra zero, ma in copyBuffer la barra zero è da qualche parte intorno al 1970 (dipende dalle impostazioni della barra massima), ecco perché ho detto di guardare l'indicizzazione dell'array.
Per quanto ho capito dalla documentazione di aiuto, in CopyBuffer() la barra zero è in realtà "tempo presente", e già quando la copi, l'array è espanso.
Sleep(1000); // 1 sec. dopo aver chiamato iCustom() ha aiutato, MA... Dovrei ora prendere il tempo di ritardo? Come faccio a sapere quanto tempo impiegherà il processo di calcolo?
è sbagliato dare la maniglia corretta dell'indicatore che indica la spazzatura! e deve aver funzionato correttamente prima, perché non c'era questo problema.
Le seguenti opzioni dell'indicatore (cerchiate in rosso) possono essere impostate programmaticamente?
Non ho trovato un modo per farlo.
Non so se questo è un bug, ma penso che ci siano errori nel codice delle librerie per tutti i tipi di muvings (SignalFrAMA, SignalAMA, SignalMA, SignalDEMA, SignalTEMA) per il master, vediCSignalTEMA::ShortCondition()
Anche nella libreria SignalMA in
Non so se questo è un bug, ma penso che ci siano errori nel codice delle librerie per tutti i tipi di muvings (SignalFrAMA, SignalAMA, SignalMA, SignalDEMA, SignalTEMA) per il master, vedi CSignalTEMA::ShortCondition()
Anche nella libreria SignalMA in
https://www.mql5.com/ru/forum/1111/page391#comment_67358
Indicare la linea completa della chiamata.
/i:<percorso della cartella MQL5>.
Dare la stringa di chiamata completa.
Ecco tutte le opzioni provate:
Dopo ogni tentativo, è stato effettuato un controllo per vedere se il file esisteva nel percorso
D:\Users\Дмитрий\AppData\Roaming\MetaQuotes\Terminal\44 D6FB562C883F0C70690F3306A3851D\MQL5\Scripts\sInstallerTestScript.ex5L'intruso sul sentiero
D:\Users\Дмитрий\AppData\Roaming\MetaQuotes\Terminal\44 D6FB562C883F0C70690F3306A3851D\MQL5\Include\InstallerTestInclude\IncInstallerTest.mqhesiste.
Il controllo dell'esistenza è stato eseguito dalla funzione: