Ancora sul passaggio di variabili

Viewing 15 posts - 1 through 15 (of 15 total)
  • Author
    Posts
  • #215202 quote
    Alessandro Furlani
    Participant
    Average

    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
    endif

    signalbuy, 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

    #215256 quote
    robertogozzi
    Moderator
    Master

    Forse 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):

    //Variabile = 1
    RETURN Variabile AS "Variabile"

    ed utilizzi questo codice:

    ONCE x = 1
    x = -x
    Risultato = CALL "indPROVA"[x]
    buy at -close limit    //istruzione fittizia (ProOrder richiede almeno un'istruzione BUY nel codice)
    graph Risultato

    funzionerà regolarmente.

    Se, tuttavia, dimentichi di commentare la linea 1 nell’indicatore:

    Variabile = 1
    RETURN 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.

    #215324 quote
    Alessandro Furlani
    Participant
    Average

    Ti 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.

    #215325 quote
    robertogozzi
    Moderator
    Master

    Intendi dire che questi due dati variano:

    graph Pippo
    graph Superpippo

    mentre questi due no:

    graph signalbuy
    graph signalshort

    se è così, il problema dovrebbe essere nell’indicatore.

    #215339 quote
    Alessandro Furlani
    Participant
    Average

    No intendo dire che :

    graph Pippo
    graph Superpippo
    Variano correttamente  ma quando li ricevo dalla return non sono uguali a quelli della graph e sono sempre gli stessi, non variano
    #215352 quote
    robertogozzi
    Moderator
    Master

    I dati che ricevi sono signalbuy e signalshort. Non capisco cosa intendi dire.

    #215358 quote
    Alessandro Furlani
    Participant
    Average

    Scusami 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.

    #215361 quote
    robertogozzi
    Moderator
    Master

    No so, a me pare funzioni:

    ONCE epa = 10
    clf=EndPointAverage[epa](POSITIONPERF)
    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")

    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).

    x-3.jpg x-3.jpg
    #215371 quote
    Alessandro Furlani
    Participant
    Average

    così 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

    #215372 quote
    Alessandro Furlani
    Participant
    Average

    allora 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 ?

    Prova-variabili.jpg Prova-variabili.jpg
    #215374 quote
    Alessandro Furlani
    Participant
    Average

    così 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

    Prova-variabili-2.jpg Prova-variabili-2.jpg
    #215377 quote
    robertogozzi
    Moderator
    Master

    Ah… 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.

    #215394 quote
    Alessandro Furlani
    Participant
    Average

    si 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 ?

    #215464 quote
    robertogozzi
    Moderator
    Master

    L’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.

    // Simulatore
    //
    // https://www.prorealcode.com/topic/ancora-sul-passaggio-di-variabili/
    //
    ONCE LongAtMarket = 0       //invece di LongOnMarket
    ONCE AtMarket     = 0       //invece di OnMarket
    ONCE PosPerf      = 0       //invece di PositionPerf
    ONCE StratProfit  = 0       //invece di StrategyProfit
    ONCE Entrata      = 0
    ONCE UscitaTP     = 0
    ONCE UscitaSL     = 0
    ONCE WinningTrades= 0
    ONCE LosingTrades = 0
    ONCE BarraFreccia = 0       //mettere 1 per spostarla sulla barra successiva (cone fa il BackTest)
    ONCE SL           = 100     //100  pip per lo Stop Loss
    ONCE TP           = SL * 2  //2x   pip per il Take Profit
    // Uscita in Stop Loss
    IF LongAtMarket AND low <= UscitaSL THEN
    LongAtMarket = 0                 //segnalare di non essere più a mercato
    LosingTrades = LosingTrades + 1  //conteggiare i trade perdenti
    StratProfit  = StratProfit - ((SL * PipSize) * PipValue)
    PosPerf      = 0
    Entrata      = 0
    UscitaTP     = 0
    UscitaSL     = 0
    DrawText("▉",BarIndex,high + range*2,Dialog,Bold,5) coloured("Red")
    ENDIF
    // Uscita in Take Profit
    IF LongAtMarket AND high >= UscitaTP THEN
    LongAtMarket = 0                 //segnalare di non essere più a mercato
    WinningTrades= WinningTrades + 1 //conteggiare i trade vincenti
    StratProfit  = StratProfit + ((TP * PipSize) * PipValue)
    PosPerf      = 0
    Entrata      = 0
    UscitaTP     = 0
    UscitaSL     = 0
    DrawText("▉",BarIndex,high + range*2,Dialog,Bold,5) coloured("Blue")
    ENDIF
    // aggiornare POSTIONPERF
    IF LongAtMarket THEN
    PosPerf      = (close - Entrata) / PipSize              //PositionPerf in pips
    ENDIF
    //
    myEMA           = average[20,1](close)
    IF Close CROSSES OVER myEMA AND not LongAtMarket THEN
    LongAtMarket = 1         //segnalare che siamo ENTRATI long
    Entrata      = close     //è il TradePrice
    UscitaSL     = Entrata - (SL * PipSize) //prezzo di Stop Loss
    UscitaTP     = Entrata + (TP * PipSize) //prezzo di Take Profit
    DrawarrowUP(BarIndex + BarraFreccia,low - range*2) coloured("Gold")
    ENDIF
    RETURN PosPerf AS "PositionPerf",StratProfit AS "StrategyProfit",WinningTrades AS "Winning Trades",LosingTrades AS "Losing Trades",Entrata AS "Entrata",UscitaTP AS "TP",UscitaSL AS "SL"
    x-4.jpg x-4.jpg Simulatore.itf
    #215495 quote
    Alessandro Furlani
    Participant
    Average

    ti 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

Viewing 15 posts - 1 through 15 (of 15 total)
  • You must be logged in to reply to this topic.

Ancora sul passaggio di variabili


ProBuilder: Indicatori & Strumenti Personalizzati

New Reply
Summary

This topic contains 14 replies,
has 2 voices, and was last updated by Alessandro Furlani
2 years, 9 months ago.

Topic Details
Forum: ProBuilder: Indicatori & Strumenti Personalizzati
Language: Italian
Started: 05/26/2023
Status: Active
Attachments: 5 files
Logo Logo
Loading...