Ti stai perdendo delle opportunità di trading:
- App di trading gratuite
- Oltre 8.000 segnali per il copy trading
- Notizie economiche per esplorare i mercati finanziari
Registrazione
Accedi
Accetti la politica del sito e le condizioni d’uso
Se non hai un account, registrati
Bene ragazzi, la prima parte è fatta (lettura dei tassi di tutte le coppie).
Ora ho bisogno di utilizzare i tassi di tutte le coppie copiate con la funzione ArrayCopyRates per potenziare alcuni indicatori grafici come un RSI... come ho disegnato nell'immagine qui sotto:
Nella mia domanda iniziale intendo sapere come fare questo... e non sulla lettura dei tassi. Non credo che avrò bisogno di copiare i tassi prima di disegnarlo, ma era bene sapere come fare... ora ho solo bisogno di scoprire un modo per dividere l'area dell'indicatore per tracciare tutte le coppie...
Non c'è modo di dividere l'area dell'indicatore. Tutto deve essere disegnato separatamente, nessun buffer, nessun autoscaling. Vedi
Hai visto un'immagine simile? (MetaQuotes Software Corp.) - MQL4 forum - Pagina 12
Hai visto un'immagine simile? (MetaQuotes Software Corp.) - MQL4 forum - Pagina 14
Hai visto una tale immagine? (MetaQuotes Software Corp.) - MQL4 forum - Pagina 36
Non c'è modo di dividere l'area dell'indicatore. Tutto deve essere disegnato separatamente, nessun buffer, nessun autoscaling. Vedi
Hai visto un'immagine simile? (MetaQuotes Software Corp.) - MQL4 forum - Pagina 12
Hai visto un'immagine simile? (MetaQuotes Software Corp.) - MQL4 forum - Pagina 14
Hai visto una tale immagine? (MetaQuotes Software Corp.) - MQL4 forum - Pagina 36
Questo è un indicatore che ho preso da qualche parte, non ho mai provato a decifrarlo. Mostra una rappresentazione di 3 timeframes del grafico corrente. La cosa assurda è che le candele sono disegnate con istogrammi. Abbastanza pulito, ma non è quello che mi interessa in questo momento.
Auguri
Un aggiornamento per coloro che seguono questo thread!
Ho aiutato l'OP via PM a sistemare il suo codice perché ha difficoltà con l'inglese ed entrambi parliamo portoghese. Nei nostri test ci siamo imbattuti in un altro "strano" che sta accadendo con la funzione"ArrayCopyRates()". Quando si usa un array MqlRates con"ArrayCopyRates()" in un EA, l'array di dati è virtuale e riporta sempre lo stato attuale delle cose, quindi i dati sono sempre freschi.
Tuttavia, in un indicatore, questo non sembra essere il caso. L'array non è una copia virtuale ma una copia statica impostata nel tempo nel momento in cui è stato chiamato"ArrayCopyRates()". I dati non si aggiornano quando il Symbol è diverso dal simbolo del grafico. Quando è lo stesso simbolo del grafico, allora i dati dell'array sono "live" e si aggiornano come previsto, ma quando è di un altro simbolo, è una copia statica.
Quindi, per funzionare in un indicatore, si deve chiamare la funzione "ArrayCopyRates()" ad ogni chiamata all'evento OnCalculate() se sono necessari dati freschi.
Solo per espandere le tue scoperte Fernando - anche se il simbolo è lo stesso del grafico, se il timeframe è diverso allora l'array è statico.
Quindi per avere una copia virtuale, in un indicatore, deve essere lo stesso simbolo E lo stesso timeframe. Tutto il resto è statico.
Supponendo che sia metà settimana per trovare il massimo e il minimo del giorno precedente uso semplicemente:
Lo = iLow(NULL, PERIOD_D1, 1);
Va bene, ma ora ho bisogno di trovare il giorno precedente a che ora era il massimo e il minimo. Ho deciso di approssimare il tempo alla candela 1h al massimo e al minimo usando iHighest e iLowest. Ed è qui che sono iniziati i problemi.
PrevDayEnd = iBarShift(NULL, PERIOD_H1, iTime(NULL, PERIOD_D1, 0)-1);
PrevDayBegin--;
MqlRates mqlrates_array_d1[];
MqlRates mqlrates_array_h1[];
MqlRates mqlrates_array[];
ArrayCopyRates(mqlrates_array_d1,NULL,PERIOD_D1);
ArrayCopyRates(mqlrates_array_h1,NULL,PERIOD_H1);
ArrayCopyRates(mqlrates_array,NULL,0);
OnInit();
:
isHistoryLoading = true;
:
OnCalculate( ... )
:
MqlRates mqlrates_array_d1[];
MqlRates mqlrates_array_h1[];
MqlRates mqlrates_array[];
if(isHistoryLoading)
{
ResetLastError();
if(ArrayCopyRates(mqlrates_array_d1,NULL,PERIOD_D1)>0)
{
if(GetLastError() == 0)
{
if((iTime(NULL,PERIOD_D1,0) > 0) && (iTime(NULL,PERIOD_D1,1) > 0))
{
ResetLastError();
if(ArrayCopyRates(mqlrates_array_h1,NULL,PERIOD_H1)>0)
{
if(GetLastError() == 0)
{
if((iTime(NULL,PERIOD_H1,0) > 0) && (iTime(NULL,PERIOD_H1,1) > 0))
{
ResetLastError();
if(ArrayCopyRates(mqlrates_array,NULL,0)>0)
{
if(GetLastError() == 0)
{
if((iTime(NULL,0,0) > 0) && (iTime(NULL,0,1) > 0))
{
isHistoryLoading = false;
if(DebugLog)
Print("Chart up-to-date!");
}
}
}
}
}
}
}
}
}
}
if(isHistoryLoading)
{
if(DebugLog)
Print("Waiting for chart to update!");
return(rates_total);
}
:
:
if(ObjectFind(Trend2Name) != -1) // Check whether mid range line exists
{
if((TimeDay(ObjectGetInteger(0,Trend2Name,OBJPROP_TIME,0))==TimeDay(TimeCurrent()))
&& (TimeMonth(ObjectGetInteger(0,Trend2Name,OBJPROP_TIME,0))==TimeMonth(TimeCurrent()))
&& (TimeYear(ObjectGetInteger(0,Trend2Name,OBJPROP_TIME,0))==TimeYear(TimeCurrent()))) // Indicator has already been ploted today
{
return(rates_total);
}
else // Indicator exists but in a past date, so delete it and plot it on current day
{
if(DebugLog)
Print("Indicator in a past date! Deleting it and creating it today!");
if(ObjectFind(FibName) != -1)
FiboLevelsDelete(0,FibName);
// Indicator will be created by the OnChartEvent() when it detects the fib was deleted.
}
}
else // Indicator doesn't exist, so create it
{
if(DebugLog)
Print("Indicator doesn't exist! Creating it.");
CreateIndicator();
}
:
Dopo alcuni tick i dati vengono parzialmente caricati e il pezzo di codice di cui sopra rileverà che le linee sono state tracciate in un giorno precedente, cancellerà il fib e attiverà un ricalcolo degli intervalli e un nuovo disegno degli oggetti (cioè fib, trendline, ecc.).
CurrDayBegin = iTime(NULL, PERIOD_D1, 0);
while(TimeDayOfWeek(iTime(NULL, PERIOD_H1, iBarShift(NULL, PERIOD_H1, CurrDayBegin))) != TimeDayOfWeek(TimeCurrent()))
// If iBarShift can't find the 0am candle and returns the 11pm candle of prev day.
CurrDayBegin = CurrDayBegin + 3600; // Move 1h until you find the 1st candle of today.Questi sono screenshot dell'indicatore:
(1) Calcolato utilizzando la storia incompleta (si prega di notare che le linee orizzontali non iniziano all'inizio del giorno)
(2) Ricalcolato usando la storia completa (linee orizzontali che iniziano all'inizio del giorno)