......................funzioni (ricerca, calcolo, ecc.) generalmente restituiscono lunghezza/dimensione, o -1 se non hanno successo, il che rende la gestione degli errori molto più semplice.
papaklass: Quali problemi state cercando di risolvere lavorando con i file?
È necessario scrivere lo stato delle posizioni in un file e utilizzare MT4 per leggere questi dati. Avete bisogno di una correlazione delle posizioni di un simbolo con altri simboli. Per esempio, se c'è già una certa quantità di posizioni su EURUSD, non si dovrebbero aprire altre posizioni per GBPUSD. So come farlo senza operazioni su file, voglio solo imparare a lavorare con le operazioni su file, solo per allargare i miei orizzonti.
Si prega di fornire un esempio di codice su come chiamare un indicatore di risorse collegate da un EA, che a sua volta utilizza un altro indicatore di risorse collegate in sé. Per esempio, c'è un indicatore A, e B è chiamato da esso. C'è anche l'esperto C che usa A. Cosa si dovrebbe scrivere in #resource e quando si chiama iCustom in tutti i casi?
L'aiuto non è scritto chiaramente a questo proposito. La solita costruzione nell'indicatore A:#resource "\Indicators\B.ex4" e poiiCustom(::Indicators\B.ex4) funziona bene quando A è lanciato da solo.Ma se A è inserito in Expert Advisor#resource "\Indicators\A.ex4", un errorenon può caricare la risorsa per l'indicatore allegato appareindicando qualche percorso assoluto sintetizzato sbagliato che in qualche modo menziona la directory Libraries, mentre l'indicatore B è cercato all'interno di se stesso (MQL4\Libraries\::Indicators\B.ex4::Indicators\B.ex4).
Per quanto riguarda ArraySize, ho sollevato un problema simile su MQL4 l'altro giorno: https://www.mql5.com/ru/forum/152471. Per quanto ho capito, tutto dovrebbe essere lo stesso in MQL5.
Forse, il mio messaggio è stato considerato lì :) Per quanto riguarda questo problema, il Service Desk ha risposto che la causa del problema era il funzionamento errato dell'ottimizzatore e cambieranno il tipo a uint nelle nuove build. In realtà è uint ora, solo non documentato :) Lo cambieranno in uint anche per ArrayResize, ma ho consigliato loro di cambiarlo in ulong, altrimenti dovranno tornare a questo problema a causa della mancanza di valori a 32 bit quando si memorizzano grandi volumi.
Per quanto riguarda il valore -1 su errore, non ci dovrebbero essere problemi perché: (int)-1 = (uint)-1 = 0xFFFFFFFFFFFFFF = UINT_MAX, cioè la rappresentazione in bit è la stessa. Anche se l'operazione di confronto darà un risultato diverso. cioè se il codice era
diventerà errato.
Grazie ancora per la richiesta, il tipo di ritorno delle funzioni ArraySize e ArrayRange non sarà cambiato, lasceremo il tipo int. Abbiamo corretto l'ottimizzatore di codice, ora l'errore descritto da te non si verificherà.
Il numero totale di elementi nell'array MQL non può superare INT_MAX e questo non cambierà. Se avete bisogno di array di dimensioni maggiori in un programma MQL, dovete creare una classe separata (per esempio, CBigArray).
Cercando di padroneggiare iCustom in mql5. L'ho imparato in mql4 :)
Il problema è quello di disegnare qualcosa di simile al MACD, ma invece di una media mobile rapida si dovrebbe usare l'indicatore VIDYA, che si trova nella cartella Examples.
Ho preso un codice MACD standard e ho messo i parametri per VIDYA al posto della MA. Il problema è che tutto si compila ma non si disegna nulla.
Ho segnato due punti nel codice qui sotto dove ho cambiato il codice MACD standard. Altrimenti tutto è uguale. Per favore, ditemi cos'altro mi manca. Suppongo che sia a valle da qualche parte nel codice...
inputint InpSlowEMA=84; // Slow EMA periodinputint InpSignalSMA=9; // Signal SMA periodinputENUM_APPLIED_PRICE InpAppliedPrice=PRICE_CLOSE; // Applied price//--- indicator buffersdouble ExtMacdBuffer[];
double ExtSignalBuffer[];
double ExtFastMaBuffer[];
double ExtSlowMaBuffer[];
//--- MA handlesint ExtFastMaHandle;
int ExtSlowMaHandle;
//+------------------------------------------------------------------+//| Custom indicator initialization function |//+------------------------------------------------------------------+voidOnInit()
{
//--- indicator buffers mappingSetIndexBuffer(0,ExtMacdBuffer,INDICATOR_DATA);
SetIndexBuffer(1,ExtSignalBuffer,INDICATOR_DATA);
SetIndexBuffer(2,ExtFastMaBuffer,INDICATOR_CALCULATIONS);
SetIndexBuffer(3,ExtSlowMaBuffer,INDICATOR_CALCULATIONS);
//--- sets first bar from what index will be drawnPlotIndexSetInteger(1,PLOT_DRAW_BEGIN,InpSignalSMA-1);
//--- name for Dindicator subwindow labelIndicatorSetString(INDICATOR_SHORTNAME,"MACD("+string(InpSlowEMA)+","+string(InpSignalSMA)+")");
//--- get MA handles
ExtSlowMaHandle=iMA(NULL,0,InpSlowEMA,0,MODE_SMA,InpAppliedPrice);
//--- initialization done
}
//+------------------------------------------------------------------+//| Moving Averages Convergence/Divergence |//+------------------------------------------------------------------+intOnCalculate(constint rates_total,constint prev_calculated,
constdatetime &Time[],
constdouble &Open[],
constdouble &High[],
constdouble &Low[],
constdouble &Close[],
constlong &TickVolume[],
constlong &Volume[],
constint &Spread[])
{
//--- check for dataif(rates_total<InpSignalSMA)
return(0);
//--- not all data may be calculatedint calculated=BarsCalculated(ExtFastMaHandle);
if(calculated<rates_total)
{
Print("Not all data of ExtFastMaHandle is calculated (",calculated,"bars ). Error",GetLastError());
return(0);
}
calculated=BarsCalculated(ExtSlowMaHandle);
if(calculated<rates_total)
{
Print("Not all data of ExtSlowMaHandle is calculated (",calculated,"bars ). Error",GetLastError());
return(0);
}
//--- we can copy not all dataint to_copy;
if(prev_calculated>rates_total || prev_calculated<0) to_copy=rates_total;
else
{
to_copy=rates_total-prev_calculated;
if(prev_calculated>0) to_copy++;
}
//--- get Fast EMA bufferif(IsStopped()) return(0); //Checking for stop flagif(CopyBuffer(ExtFastMaHandle,0,0,to_copy,ExtFastMaBuffer)<=0)
{
Print("Getting fast EMA is failed! Error",GetLastError());
return(0);
}
//--- get SlowSMA bufferif(IsStopped()) return(0); //Checking for stop flagif(CopyBuffer(ExtSlowMaHandle,0,0,to_copy,ExtSlowMaBuffer)<=0)
{
Print("Getting slow SMA is failed! Error",GetLastError());
return(0);
}
//---int limit;
if(prev_calculated==0)
limit=0;
else limit=prev_calculated-1;
//--- calculate MACDfor(int i=limit;i<rates_total && !IsStopped();i++)
ExtMacdBuffer[i]=ExtFastMaBuffer[i]-ExtSlowMaBuffer[i];
//--- calculate Signal
SimpleMAOnBuffer(rates_total,prev_calculated,0,InpSignalSMA,ExtMacdBuffer,ExtSignalBuffer);
//--- OnCalculate done. Return new prev_calculated.return(rates_total);
}
//+------------------------------------------------------------------+
Cercando di padroneggiare iCustom in mql5. In mql4 sono riuscito a padroneggiarlo virtuosamente :)
Cosa scrive nel registro? Nessun controllo degli errori (per esempio, quando si riceve un handle). Il numero del buffer nel nuovo indicatore corrisponde a quello vecchio?
Non so se questo è già successo, ma la questione è, nuova barra, il valore PLOT_EMPTY_VALUE per il buffer è impostato a 0.0, ma in realtà ci sono a volte valori completamente diversi
......................funzioni (ricerca, calcolo, ecc.) generalmente restituiscono lunghezza/dimensione, o -1 se non hanno successo, il che rende la gestione degli errori molto più semplice.
Saluti. Qualche consiglio per i neofiti su quali funzioni usare per impostare un takeout comune su una griglia di ordini in caso di segnale inverso?
Sto imparando le operazioni sui file. Qualcuno sa se MQL4/5 è più veloce con i file csv o txt?
Quali problemi state cercando di risolvere lavorando con i file?
Si prega di fornire un esempio di codice su come chiamare un indicatore di risorse collegate da un EA, che a sua volta utilizza un altro indicatore di risorse collegate in sé. Per esempio, c'è un indicatore A, e B è chiamato da esso. C'è anche l'esperto C che usa A. Cosa si dovrebbe scrivere in #resource e quando si chiama iCustom in tutti i casi?
L'aiuto non è scritto chiaramente a questo proposito. La solita costruzione nell'indicatore A:#resource "\Indicators\B.ex4" e poiiCustom(::Indicators\B.ex4) funziona bene quando A è lanciato da solo.Ma se A è inserito in Expert Advisor#resource "\Indicators\A.ex4", un errorenon può caricare la risorsa per l'indicatore allegato appareindicando qualche percorso assoluto sintetizzato sbagliato che in qualche modo menziona la directory Libraries, mentre l'indicatore B è cercato all'interno di se stesso (MQL4\Libraries\::Indicators\B.ex4::Indicators\B.ex4).
Per quanto riguarda ArraySize, ho sollevato un problema simile su MQL4 l'altro giorno: https://www.mql5.com/ru/forum/152471. Per quanto ho capito, tutto dovrebbe essere lo stesso in MQL5.
Forse, il mio messaggio è stato considerato lì :) Per quanto riguarda questo problema, il Service Desk ha risposto che la causa del problema era il funzionamento errato dell'ottimizzatore e cambieranno il tipo a uint nelle nuove build. In realtà è uint ora, solo non documentato :) Lo cambieranno in uint anche per ArrayResize, ma ho consigliato loro di cambiarlo in ulong, altrimenti dovranno tornare a questo problema a causa della mancanza di valori a 32 bit quando si memorizzano grandi volumi.
Per quanto riguarda il valore -1 su errore, non ci dovrebbero essere problemi perché: (int)-1 = (uint)-1 = 0xFFFFFFFFFFFFFF = UINT_MAX, cioè la rappresentazione in bit è la stessa. Anche se l'operazione di confronto darà un risultato diverso. cioè se il codice era
diventerà errato.
Il numero totale di elementi nell'array MQL non può superare INT_MAX e questo non cambierà.
Se avete bisogno di array di dimensioni maggiori in un programma MQL, dovete creare una classe separata (per esempio, CBigArray).
Cercando di padroneggiare iCustom in mql5. L'ho imparato in mql4 :)
Il problema è quello di disegnare qualcosa di simile al MACD, ma invece di una media mobile rapida si dovrebbe usare l'indicatore VIDYA, che si trova nella cartella Examples.
Ho preso un codice MACD standard e ho messo i parametri per VIDYA al posto della MA. Il problema è che tutto si compila ma non si disegna nulla.
Ho segnato due punti nel codice qui sotto dove ho cambiato il codice MACD standard. Altrimenti tutto è uguale. Per favore, ditemi cos'altro mi manca. Suppongo che sia a valle da qualche parte nel codice...
Первый вставленный кусок:input int Per=7; // Per input int Per1=21; // Per1 input int Shift=0; // ShiftКонецВторой вставленный кусокКонецCercando di padroneggiare iCustom in mql5. In mql4 sono riuscito a padroneggiarlo virtuosamente :)
Non so se questo è già successo, ma la questione è, nuova barra, il valore PLOT_EMPTY_VALUE per il buffer è impostato a 0.0, ma in realtà ci sono a volte valori completamente diversi