Invece di Close[2] metti il valore dell'indicatore sulla seconda barra (per esempio iRSI(.......,2) ) e invece di Close[1] metti il valore dell'indicatore sulla prima barra. E uroven è il valore del livello.
Potete dirmi se qualcuno ha visto un volume laterale del giorno sul lato destro del grafico per mt5, per mt4 l'ho trovato qui https://www.mql5.com/ru/code/9777. Ho due varianti: o riscrivere le variabili o trovarne una già pronta. Oppure non vedo il senso di ordinare,,,,,,, , ho bisogno di verificare una teoria di equilibrio ,,,,. Ho trovato un lavoro per mt5 dove il profilo della giornata di ieri è disegnato a sinistra ma c'è un inconveniente importante, non mostra cosa succede oggi. Quindi voglio aggiungere alle informazioni del pattern grafico sulla destra quello che sta succedendo al momento del trading
Tral_Start__Upgr è equiparato a una variabile esterna di tipo int ed è uguale a 5.
Tral_Size__Upgr è similmente uguale a 4
TV - valore di tick, =10
SommaLotSellDBL = 0,04
L'ho letto. Ho visto come funzionerebbe se Tral_Start__Upgr, Tral_Size__Upgr e le loro variabili esterne fossero definite come doppie. Cioè quando tutto è dello stesso tipo senza alcuna conversione e perdita di dati. Il risultato è lo stesso. Cosa ho sbagliato?
Maria Baburina: Leggere. Ho visto come funzionerebbe se Tral_Start__Upgr, Tral_Size__Upgr e le loro variabili esterne fossero definite come doppie. Cioè quando tutto è dello stesso tipo senza alcuna conversione e perdita di dati. Il risultato è lo stesso. Cosa ho sbagliato?
Un cieco che parla con un sordo. Se volete che qualcuno lo testi, avete bisogno del minimo codice possibile che possa essere compilato su un'altra macchina e testato. Nessun codice - niente di cui parlare.
#property indicator_chart_window#property indicator_buffers1#property indicator_plots1class CLASS
{
public:
double Buffer[];
CLASS( void )
{
SetIndexBuffer(0, this.Buffer);
}
};
CLASS* Class;
voidOnInit( void )
{
Class = new CLASS;
delete Class;
Class = new CLASS;
Class.Buffer[0] = 0; // array out of rangedelete Class;
return;
}
intOnCalculate( constint rates_total,
constint prev_calculated,
constdatetime &time[],
constdouble &open[],
constdouble &high[],
constdouble &low[],
constdouble &close[],
constlong &tick_volume[],
constlong &volume[],
constint &spread[] )
{
return(rates_total);
}
In quattro ha funzionato bene! In cinque è una rottura. È un'altra limitazione architettonica rispetto al quad? Dammi un link a una discussione su questo, non sono riuscito a trovarlo da solo.
Ho capito bene che si può assegnare qualcosa ai buffer degli indicatori solo dopo la prima chiamata del terminale stesso (non manualmente) a OnCalculate?
comp: Ho capito bene, che qualcosa può essere assegnato ai buffer degli indicatori solo dopo la prima chiamata del terminale (non manualmente) OnCalculate?
Si può accedere ai buffer degli indicatori dopo che OnCalculate() è stato chiamato. Allo stesso tempo, il buffer dell'indicatore stesso dovrebbe essere dichiarato nell'area delle variabili globali:
Si può accedere ai buffer degli indicatori dopo che OnCalculate() è stato chiamato.
A quanto pare, si sbaglia. Si può applicare solo quando il terminale chiama OnCalculate. In questo caso, la condizione in MT4 è più flessibile, perché è sufficiente chiamare OnCalculate solo una volta. E in MT5, dovete aspettare la chiamata di OnCalculate dal terminale stesso ogni volta dopo il SetIndexBuffer. Prova
#property strict#property indicator_chart_window#property indicator_buffers1#ifdef __MQL5__#property indicator_plots1#endif
#ifdef __MQL5__#define TRUEtrue#define FALSEfalse#endif
class CLASS
{
public:
double Buffer[];
CLASS( void )
{
::SetIndexBuffer(0, this.Buffer);
}
#define TIMESERIES(X) \
::ArraySetAsSeries(X, TRUE); \
Size = ::MathMin(Copy##X(::Symbol(), ::Period(), 0, bars, X), Size);
staticint FullOnCalculate( void )
{
int Spread[];
long RealVolume[];
int Size = INT_MAX;
#ifdef __MQL4__constint bars = ::Bars;
#endif
#ifdef __MQL5__constint bars = ::Bars(::Symbol(), ::Period());
#endif
TIMESERIES(Spread)
TIMESERIES(RealVolume)
#ifdef __MQL4__return(::OnCalculate(Size, 0, Time, Open, High, Low, Close, RealVolume, Volume, Spread));
#endif
#ifdef __MQL5__datetimeTime[];
doubleOpen[];
doubleHigh[];
doubleLow[];
doubleClose[];
long TickVolume[];
TIMESERIES(Time)
TIMESERIES(Open)
TIMESERIES(High)
TIMESERIES(Low)
TIMESERIES(Close)
TIMESERIES(TickVolume)
return(::OnCalculate(Size, 0, Time, Open, High, Low, Close, RealVolume, TickVolume, Spread));
#endif
}
};
CLASS* Class;
bool FirstRunOnCalculate = TRUE; // Необходимо TRUE, т.к. вызов OnCalculate только самим терминалом инициирует индикаторный буферvoidOnChartEvent( constint id, constlong& lparam, constdouble& dparam, conststring& sparam )
{
if (id == CHARTEVENT_CHART_CHANGE)
{
Print(__FUNCTION__);
::OnDeinit();
::Class = new CLASS;
if (!FirstRunOnCalculate)
CLASS::FullOnCalculate(); // Тут будет задница для MT5 (в MT4 - без проблем), т.к. после SetIndexBuffer в MT5 надо дожидаться вызова OnCalculate САМИМ терминалом
}
return;
}
voidOnDeinit( constint Reason = 0 )
{
if (::CheckPointer(::Class) == POINTER_DYNAMIC)
delete ::Class;
return;
}
intOnCalculate( constint rates_total,
constint prev_calculated,
constdatetime &time[],
constdouble &open[],
constdouble &high[],
constdouble &low[],
constdouble &close[],
constlong &tick_volume[],
constlong &volume[],
constint &spread[] )
{
Print(__FUNCTION__);
if (FirstRunOnCalculate)
FirstRunOnCalculate = FALSE;
if (::CheckPointer(::Class) != POINTER_INVALID)
::Class.Buffer[0] = 0; // array out of range - MT5-ERROR!!!return(rates_total);
}
In MT4 questo indicatore funziona senza problemi, in MT5 si blocca con un errore. Come si è scoperto, in MT4 basta aspettare la prima chiamata di OnCalculate da parte del terminale e fare quello che si vuole con i buffer, compresa la loro ridefinizione usando SetIndexBuffer. Ma in MT5 dopo OGNI SetIndexBuffer è necessario attendere la prima chiamata di OnCalculate da parte del terminale.
Questa peculiarità non è documentata da nessuna parte. E non sembra corrispondere alla definizione di "principiante".
Possiamo aspettarci che in MT5 questo comportamento sia lo stesso di MT4? Cioè dopo la prima chiamata di OnCalculate da parte del terminale stesso sarebbe possibile chiamare SetIndexBuffer senza problemi?
A quanto pare, si sbaglia. Potete chiamarlo solo quando OnCalculate è chiamato dal terminale stesso. In questo caso, in MT4 la condizione è più flessibile, perché è necessario chiamare OnCalculate solo una volta. Ma in MT5, dovete aspettare la chiamata di OnCalculate dal terminale stesso ogni volta dopo il SetIndexBuffer. Prova
In MT4 questo indicatore funziona senza problemi, in MT5 si blocca con un errore. Come si è scoperto, in MT4 devi solo aspettare la prima chiamata di OnCalculate da parte del terminale e poi fare quello che vuoi con i buffer, compresa la loro ridefinizione usando SetIndexBuffer. Ma in MT5 dopo OGNI SetIndexBuffer è necessario attendere la prima chiamata di OnCalculate da parte del terminale.
Questa caratteristica non è documentata da nessuna parte. E non sembra corrispondere alla definizione di "principiante".
Possiamo aspettarci che in MT5 questo comportamento sia lo stesso di MT4? Cioè dopo la prima chiamata di OnCalculate da parte del terminale stesso sarà possibile chiamare SetIndexBuffer senza problemi?
Non impegnatevi nella verbosità - naturalmente, la chiamata di OnCalculate implica una chiamata del terminale stesso, perché
La funzione OnCalculate() viene chiamata solo negli indicatori personalizzati quando è necessario calcolare i valori dell'indicatore tramite l'eventoCalculate. Questo di solito accade quando viene ricevuto un nuovo tick per il simbolo per il quale l'indicatore è calcolato. L'indicatore non ha bisogno di essere collegato a nessun grafico di prezzo di questo simbolo.
Invece di Close[2] metti il valore dell'indicatore sulla seconda barra (per esempio iRSI(.......,2) ) e invece di Close[1] metti il valore dell'indicatore sulla prima barra. E uroven è il valore del livello.
E il resto vi è già stato detto sopra.
Prerequisito:
ProfitSellDBL è calcolato qui
Profit_Upgr = 0.01
Tral_Start__Upgr è equiparato a una variabile esterna di tipo int ed è uguale a 5.
Tral_Size__Upgr è similmente uguale a 4
TV - valore di tick, =10
SommaLotSellDBL = 0,04
Leggere. Ho visto come funzionerebbe se Tral_Start__Upgr, Tral_Size__Upgr e le loro variabili esterne fossero definite come doppie. Cioè quando tutto è dello stesso tipo senza alcuna conversione e perdita di dati. Il risultato è lo stesso. Cosa ho sbagliato?
Un cieco che parla con un sordo. Se volete che qualcuno lo testi, avete bisogno del minimo codice possibile che possa essere compilato su un'altra macchina e testato. Nessun codice - niente di cui parlare.
Aggiunto: Utilizzare il debug:
-Preconfigurazione
-Punti diarresto
-Avviare ildebug
-Espressioniosservabili
-Chiama la pila
-debuggingpasso dopo passo
-Arrestare, riprendere e terminare il debug
-debug dellastoria
Forum sul trading, sistemi di trading automatico e test di strategie di trading
Bug, bug, domande
comp, 2016.04.03 18:21
Errore di runtime
In quattro ha funzionato bene! In cinque è una rottura. È un'altra limitazione architettonica rispetto al quad? Dammi un link a una discussione su questo, non sono riuscito a trovarlo da solo.
Ho capito bene, che qualcosa può essere assegnato ai buffer degli indicatori solo dopo la prima chiamata del terminale (non manualmente) OnCalculate?
Si può accedere ai buffer degli indicatori dopo che OnCalculate() è stato chiamato. Allo stesso tempo, il buffer dell'indicatore stesso dovrebbe essere dichiarato nell'area delle variabili globali:
Penso di aver trovato quello che stavo cercando, ma l'antichità del codice dà un errore
Aiutami a sistemarlo ...... se non è troppo disturbo.
e se potete aiutarmi a girarlo sul lato destro dello schermo sarebbe fantastico.
Si può accedere ai buffer degli indicatori dopo che OnCalculate() è stato chiamato.
A quanto pare, si sbaglia. Si può applicare solo quando il terminale chiama OnCalculate. In questo caso, la condizione in MT4 è più flessibile, perché è sufficiente chiamare OnCalculate solo una volta. E in MT5, dovete aspettare la chiamata di OnCalculate dal terminale stesso ogni volta dopo il SetIndexBuffer. Prova
In MT4 questo indicatore funziona senza problemi, in MT5 si blocca con un errore. Come si è scoperto, in MT4 basta aspettare la prima chiamata di OnCalculate da parte del terminale e fare quello che si vuole con i buffer, compresa la loro ridefinizione usando SetIndexBuffer. Ma in MT5 dopo OGNI SetIndexBuffer è necessario attendere la prima chiamata di OnCalculate da parte del terminale.
Questa peculiarità non è documentata da nessuna parte. E non sembra corrispondere alla definizione di "principiante".
Possiamo aspettarci che in MT5 questo comportamento sia lo stesso di MT4? Cioè dopo la prima chiamata di OnCalculate da parte del terminale stesso sarebbe possibile chiamare SetIndexBuffer senza problemi?
A quanto pare, si sbaglia. Potete chiamarlo solo quando OnCalculate è chiamato dal terminale stesso. In questo caso, in MT4 la condizione è più flessibile, perché è necessario chiamare OnCalculate solo una volta. Ma in MT5, dovete aspettare la chiamata di OnCalculate dal terminale stesso ogni volta dopo il SetIndexBuffer. Prova
In MT4 questo indicatore funziona senza problemi, in MT5 si blocca con un errore. Come si è scoperto, in MT4 devi solo aspettare la prima chiamata di OnCalculate da parte del terminale e poi fare quello che vuoi con i buffer, compresa la loro ridefinizione usando SetIndexBuffer. Ma in MT5 dopo OGNI SetIndexBuffer è necessario attendere la prima chiamata di OnCalculate da parte del terminale.
Questa caratteristica non è documentata da nessuna parte. E non sembra corrispondere alla definizione di "principiante".
Possiamo aspettarci che in MT5 questo comportamento sia lo stesso di MT4? Cioè dopo la prima chiamata di OnCalculate da parte del terminale stesso sarà possibile chiamare SetIndexBuffer senza problemi?