Ancora sul passaggio di variabili
Forums › ProRealTime forum Italiano › Supporto ProBuilder › Ancora sul passaggio di variabili
- This topic has 14 replies, 2 voices, and was last updated 1 year ago by Alessandro Furlani.
-
-
05/26/2023 at 11:04 AM #215202
Buongiorno a tutti. Ho continuato a sviluppare robot con il metodo di realizzare uno script Pro-Order che chiama al suo interno uno script Pro-Builder che contiene tutti gli indici e le variabili che servono a decidere quando entrare a mercato e come, comunicando allo script Pro-Order i segnali di apertura, chiusura etc…. Questo perchè mi consente di disegnare a video quello che faccio indicando anche i livelli di Stoploss e Takeprofit, cosa che non potrei fare da dentro uno script Pro-Order.
Di conseguenza uso molto i metodi di passaggio delle variabili tra i due script cioè:
- passo da Pro-Order a Pro-Builder le varibili tramite l’istruzione CALL
- Prendo altre variabili (segnali, etc…) dallo script Pro-Builder tramite la funzione RETURN
finora tutto bene, perchè le varibili passate da PO a PB erano di fatto delle costanti impostate al running (quelle che si possono impostare con il simbolino della chiave inglese).
Quando però ho tentato di passare nella CALL una varibile calcolata da PO, mi sono accorto che il valore di questa variabile non cambia come dovrebbe essere ma rimane congelata al primo ciclo di calcolo.
Esempio:
pippo=EndPointAverage[epa](POSITIONPERF)
pippo1=LinearRegressionSlope[20](pippo)
if pippo1>0 then
superpippo=1
else
superpippo=-1
endifsignalbuy, signalshort, logex, shotex, unitsize, ptp, psl, trail, ema1, ema2, ema3 = CALL “ENDPOINTZL-STRATEGY 1.0 T” [mtp, msl, openlong, openshort, maxloss, ATRscale, trail, reduperc, EMA12lenght, EMA3lenght, mm, pippo, superpippo]
In pratica monitorando la variabile superpippo, mi sono accorto che questa cambia regolarmente ad ogni calcolo ma quello che viene passato nella CALL rimane congelato al primo giro di calcolo.
come si può ovviare a questa cosa ?
Grazie
05/27/2023 at 10:23 AM #215256Forse hai lasciato quella variabile settata nel codice dell’indicatore.
Se usi questo indicatore, che ho chiamato indPROVA (con Variabile aggiunta alle variabili dell’indicatore, tramite la chiave inglese):
12//Variabile = 1RETURN Variabile AS "Variabile"ed utilizzi questo codice:
12345ONCE x = 1x = -xRisultato = CALL "indPROVA"[x]buy at -close limit //istruzione fittizia (ProOrder richiede almeno un'istruzione BUY nel codice)graph Risultatofunzionerà regolarmente.
Se, tuttavia, dimentichi di commentare la linea 1 nell’indicatore:
12Variabile = 1RETURN Variabile AS "Variabile"allora il dato che tu gli invii sarà sempre sovrascritto da quello che hai indicato alla riga 1 ed il risultato non cambierà mai.
Se non fosse questo il motivo, allora occorre vedere il codice.
05/29/2023 at 12:02 AM #215324Ti ringrazio Roberto ma è esattamente quello che ho fatto con alcune differenze.
Provo a scrivere qui sotto un codice semplificato.
//ricavo la variabile che devo passare all’indicatore tramite un altro indicatore
pippo=EndPointAverage[11](POSITIONPERF)
pippo1=LinearRegressionSlope[20](pippo)
if pippo1>0 then
superpippo=1
else
superpippo=-1
endif//quindi passo le due variabili pippo e superpippo all’indicatore tramite la call
signalbuy, signalshort = CALL “ind_pippo” [pippo, superpippo]
A questo punto tramite l’istruzione call e la return dell’indicatore chiamato “ind_pippo”, confronto i risultati e mentre pippo e superpippo visualizzati con la graph cambiano, candela per candela, quelli passati all’indicatore ind_pippo e visualizzati nel pannello variabili tramite return, rimangono statici.
05/29/2023 at 1:04 AM #215325Intendi dire che questi due dati variano:
12graph Pippograph Superpippomentre questi due no:
12graph signalbuygraph signalshortse è così, il problema dovrebbe essere nell’indicatore.
05/29/2023 at 2:10 PM #215339No intendo dire che :
graph Pippograph SuperpippoVariano correttamente ma quando li ricevo dalla return non sono uguali a quelli della graph e sono sempre gli stessi, non variano05/29/2023 at 4:05 PM #215352I dati che ricevi sono signalbuy e signalshort. Non capisco cosa intendi dire.
05/29/2023 at 5:30 PM #215358Scusami ma sono nel pieno marasma. Non capisco cosa succede, se lo script lo faccio semplice questa istruzione messa in pro-order funziona:
clf=EndPointAverage[epa](POSITIONPERF)
Appena aggiungo delle cose, anche non legate a quella istruzione, non funziona più.
Se poi vado a commentare le istruzioni appena immesse, continua a non funzionare anche se, di fatto dovrebbe essere come prima.
Se cancello fisicamente le istruzioni che avevo commentato, ricomincia a funzionare.
Mi devo fermare perchè è evidente che c’è qualcosa che non capisco.
05/29/2023 at 6:55 PM #215361No so, a me pare funzioni:
123456789101112ONCE epa = 10clf=EndPointAverage[epa](POSITIONPERF)IF close CROSSES OVER Average[10,0](close) THENBUY at MarketENDIFIF close CROSSES UNDER Average[10,0](close) AND LongOnMarket THENSELL at MarketENDIFSET TARGET pPROFIT 200SET STOP pLOSS 100graph PositionPerf coloured("Red")graph clf coloured("Lime")hai tenuto presente che POSITIONPERF è 0 quando non si è a mercato?
Quindi ci sono tratti, quelli più lunghi di 10 periodi, in cui sia CLF che POSITIONPERF sono 0 (vedi riquadri ARANCIONI nella foto) ed altri in cui POSITIONPERF è 0 da meno di 10 periodi, per cui CLF viene valorizzata comunque dalla media delle barre precedenti (vedi riquadri ROSSI nella stessa foto).
05/29/2023 at 10:35 PM #215371così funziona anche a me. Il problema è quando passo il dato di clf ad un custom indicator. Credo che non sia possibile passare variabile dinamiche ma solo statiche.
Ora faccio l’ennesima prova per vedere se è vero.
Grazie comunque dell’aiuto
05/29/2023 at 11:02 PM #215372allora ecco la prova che ho fatto che mi conferma quello che pensavo, cioè posso passare solo costanti, non varibili dinamiche.
questo il codice del pro-builder “test passaggio var strate”
——Variabile stratsma
once emasma = 0
emasma = average[20,1](stratsma)
return emasma
questo il codice del Pro-Order “test passaggio var order”
//ONCE epa = 10
//clf=EndPointAverage[epa](POSITIONPERF)
sma=average[20,0](close)
oremasma=call “test passaggio var strate” [sma]IF close CROSSES OVER Average[10,0](close) THEN
BUY at Market
ENDIF
IF close CROSSES UNDER Average[10,0](close) AND LongOnMarket THEN
SELL at Market
ENDIF
SET TARGET pPROFIT 200
SET STOP pLOSS 100
graph PositionPerf coloured(“Red”)
//graph clf coloured(“Lime”)
graph sma coloured(“Lime”)
graph oremasma coloured( “white”)
che produce l’immagine in allegato. Come puoi vedere la variabile emasma che torna dall’indice, ha valore sempre 1 mnìentre essendo una EMA di una SMA dovrebbe cambiare parecchio. Inoltre quando torna indietro al Pro_order che lo chiama assumel lo stesso valore di SMA.
come la risolviamo ?
05/29/2023 at 11:20 PM #215374così si vede ancora meglio, ho duplicato variabili e calcoli per vedere cosa succede dentro a pro-build e pro-ord.
Script pro-ord “test passaggio var order”
//ONCE epa = 10
clf=EndPointAverage[10](POSITIONPERF)
orpositionperf = POSITIONPERF
sma=average[20,0](close)
oremasma, orclf=call “test passaggio var strate” [sma, orpositionperf]IF close CROSSES OVER Average[10,0](close) THEN
BUY at Market
ENDIF
IF close CROSSES UNDER Average[10,0](close) AND LongOnMarket THEN
SELL at Market
ENDIF
SET TARGET pPROFIT 200
SET STOP pLOSS 100
graph PositionPerf coloured(“Red”)
graph clf+2 coloured(“Lime”)
graph sma coloured(“grey”)
graph oremasma coloured( “white”)graph orclf coloured (“green”)
————————————————————————————————
script pro-build “test passaggio var strate”
variabili stratsma, positionp
once emasma = 0
once positionp = 0
emasma = average[20,1](stratsma)
clf=EndPointAverage[10](positionp)
return emasma as “stemasma”, clf as “stclf”lo stesso calcolo non ritorna nulla sul grafico dell’indice
05/30/2023 at 12:42 AM #215377Ah… solo adesso con la foto ho capito cosa vuoi dire.
Non è possibile. Le strategie non hanno un rapporto con gli indicatori sul grafico, i quali, a loro volta, non sanno niente delle strategie che girano e che li stanno utilizzando.
Quando viene creato il file ITF, al suo interno c’è una copia di tutti gli indicatori usati e sono questi che lavorano, quelli sul grafico è come fossero indicatori diversi.
Se fai un indicatore SOLO per la strategia, non ha senso che tu lo metta sul grafico, resterà sempre con i valori iniziali.
05/30/2023 at 11:04 AM #215394si l’ho capito anch’io, facevo un errore di principio.
Comunque si riesce a fare TS che ti fanno vedere tutto quello che succede sul grafico. Io ne ho realizzati diversi. Basta mettere tutta la logica di apertura e chiusura dentro all’indicatore e passare solo il segnale alla parte Pro-Order. Funza benissimo.
In questo caso non và perchè ho il problema che il dato che mi serve lo posso prendere solo dentro a Pro-Order [Positionperf] e quindi il trasporto funziona solo dallo script pro-order all’indice richiamato non a quello che visualizzo.
Questo è un limite importante di ProRealTime che avevo notato fin dall’inizio e che mi sono dimenticato.
Conosci altri modi per avere il dato di equity oppure il Positionperf in uno script pro-builder ?
05/31/2023 at 1:04 AM #215464L’unico modo sarebbe creare un indicatore che simuli le entrate, le uscite, con stop loss, take profit ed eventuali trailing stop e gestione lotti.
In pratica devi inserire la strategia all’interno dell’indicatore, dove al posto di BUY, SELLSHORT, SELL ed EXITSHORT metti delle variabili che ti indicano che sei a mercato, Long o Short, oppure no. Ovviamente devi farti tutti i calcolo di quando lo stop loss o il tale profit vengono colpiti, profitti e perdite per simulare POSITIONPERF ed eventualmente STRATEGYPROFIT.
Non è che sia enormemente complicato, un pò lo è, ma è particolarmente lungo a farsi.
Ti ho codificato questo, con un pò di tempo, dove manca il Trailing Stop, la Gestione dei Lotti (position sizing) e PositionPerf è calcolato in pips (sotto al calcolo ti ho messo una riga commentata per avere in alternativa il dato in denaro). Se la desideri in % come l’originale basta che modifichi il calcolo.
Ovviamente non tiene conto dello Spread, non ha una gestione degli ordini pendenti e non considera lo slippage che può esserci in reale o demo
L’indicatore puoi metterlo sia SUL grafico che SOTTO di esso (o anche entrambi), come puoi vedere dalla foto.
L’entrata è una freccia gialla messa sotto la barra di entrata, ma puoi mettere 1 alla variabile BarraFreccia per ottenere lo stesso effetto del backtest.
12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152// Simulatore//// https://www.prorealcode.com/topic/ancora-sul-passaggio-di-variabili///ONCE LongAtMarket = 0 //invece di LongOnMarketONCE AtMarket = 0 //invece di OnMarketONCE PosPerf = 0 //invece di PositionPerfONCE StratProfit = 0 //invece di StrategyProfitONCE Entrata = 0ONCE UscitaTP = 0ONCE UscitaSL = 0ONCE WinningTrades= 0ONCE LosingTrades = 0ONCE BarraFreccia = 0 //mettere 1 per spostarla sulla barra successiva (cone fa il BackTest)ONCE SL = 100 //100 pip per lo Stop LossONCE TP = SL * 2 //2x pip per il Take Profit// Uscita in Stop LossIF LongAtMarket AND low <= UscitaSL THENLongAtMarket = 0 //segnalare di non essere più a mercatoLosingTrades = LosingTrades + 1 //conteggiare i trade perdentiStratProfit = StratProfit - ((SL * PipSize) * PipValue)PosPerf = 0Entrata = 0UscitaTP = 0UscitaSL = 0DrawText("▉",BarIndex,high + range*2,Dialog,Bold,5) coloured("Red")ENDIF// Uscita in Take ProfitIF LongAtMarket AND high >= UscitaTP THENLongAtMarket = 0 //segnalare di non essere più a mercatoWinningTrades= WinningTrades + 1 //conteggiare i trade vincentiStratProfit = StratProfit + ((TP * PipSize) * PipValue)PosPerf = 0Entrata = 0UscitaTP = 0UscitaSL = 0DrawText("▉",BarIndex,high + range*2,Dialog,Bold,5) coloured("Blue")ENDIF// aggiornare POSTIONPERFIF LongAtMarket THENPosPerf = (close - Entrata) / PipSize //PositionPerf in pipsENDIF//myEMA = average[20,1](close)IF Close CROSSES OVER myEMA AND not LongAtMarket THENLongAtMarket = 1 //segnalare che siamo ENTRATI longEntrata = close //è il TradePriceUscitaSL = Entrata - (SL * PipSize) //prezzo di Stop LossUscitaTP = Entrata + (TP * PipSize) //prezzo di Take ProfitDrawarrowUP(BarIndex + BarraFreccia,low - range*2) coloured("Gold")ENDIFRETURN PosPerf AS "PositionPerf",StratProfit AS "StrategyProfit",WinningTrades AS "Winning Trades",LosingTrades AS "Losing Trades",Entrata AS "Entrata",UscitaTP AS "TP",UscitaSL AS "SL"05/31/2023 at 11:17 AM #215495ti ringrazio molto Roberto, lo avevo già fatto. Stavo solo cercando un metodo semplice per gestire la equity e switchare on/off il robot quando la equity cambia direzione.
Se PRT mi avesse dato la possibilità di accedere ai dati della equity da pro-builder sarebbe stato tutto più facile.
Niente, mi rassegnerò a dovermi calcolare tutto da solo.
Grazie per l’aiuto
-
AuthorPosts
Find exclusive trading pro-tools on