Dettagli sull'ultima operazione eseguita

Viewing 10 posts - 1 through 10 (of 10 total)
  • Author
    Posts
  • #124069 quote
    MarcoDSP
    Participant
    Junior

    salve a tutti, sto cercando di creare un sistema che consideri la quantità di lotti investiti nell’ultima operazione, e se questa è stata chiusa in profitto o perdita, al fine di determinare la quantità di lotti da utilizzare per aprire una nuova posizione. Non riesco a trovare nessun comando che mi restituisca questi parametri dell’ultima operazione conclusa.
    Qualcuno sa dirmi se sia possibile? grazie mille

    #124074 quote
    robertogozzi
    Moderator
    Master

    Puoi usare COUNTOFPOSITION https://www.prorealcode.com/documentation/countofposition/

    ci sono anche COUNTOFLONGSHARES e COUNTOFSHORTSHARES.

    #124951 quote
    MarcoDSP
    Participant
    Junior

    grazie mille Roberto!! e scusa per la risposta tardiva, proverò ad utilizzare il comando COUNTOFPOSITION

    #125355 quote
    MarcoDSP
    Participant
    Junior

    scusami Roberto, ma non riesco a capire come utilizzare il codice. Nella pagina di esempio il codice viene usato per aggiungere un ordine ad una posizione short già aperta se il prezzo scende di 10 punti.

    myMACD = MACD[12,26,9](close)
    short = myMACD crosses under 0
    
    //first order
    IF NOT ShortOnMarket AND short THEN
       SELLSHORT 1 CONTRACTS AT MARKET
    ENDIF
    
    MAXSHARES = abs(COUNTOFPOSITION) <= 10
    
    //let's add another order while price continue to get lower (more than 10 points) than the last order taken with a condition of 5 bars elapsed since then
    IF TRADEINDEX(1)>5 AND TRADEPRICE(1)-Close>10*pointsize AND ShortOnMarket AND MAXSHARES THEN
       SELLSHORT 1 CONTRACTS AT MARKET
    ENDIF
    
    SET STOP TRAILING 50

    Non riesco a capire come fare a verificare se l’ultima posizione è stata chiusa in profitto o perdita, e in base a questo comprare il doppio dei lotti se è stata chiusa in perdita, oppure comprare 1 solo lotto se è stata chiusa in profitto.

    scusami ancora, ma con le variabili ancora non ce la faccio

    grazie mille

    #125362 quote
    robertogozzi
    Moderator
    Master

    COUNTOFPOSITION serve a sapere quante posizioni hai aperto, per sapere se l’ultima operazione si è chiusa in profitto, o meno, devi usare STRATEGYPROFIT, che viene aggiornato ad ogni chiusura di posizione.

    Se STRATEGYPROFIT > STRATEGYPROFIT[1] vuol dire che hai avuto un profitto.

    #125437 quote
    MarcoDSP
    Participant
    Junior

    grazie mille Roberto il codice che riesco ad elaborare è questo, ma non apre nessuna posizione, non capisco l’errore che sicuramente commetto

    defparam preloadbars=100
    
    
    
    // Condizioni per entrare su posizioni long
    indicator1 = TriangularAverage[24](close)
    c1 = (close[0] > indicator1[0])
    c2 = (close[0] > close[1])
    
    IF c1 AND c2 THEN
    if STRATEGYPROFIT > STRATEGYPROFIT[1] then
    positionsize = positionsize[1] * 2
    else
    positionsize = positionsize
    endif
    size = min(1,positionsize)
    BUY size SHARE AT MARKET
    endif
    
    // Condizioni per entrare su posizioni short
    indicator2 = TriangularAverage[24](close)
    c3 = (close[0] < indicator2[0])
    c4 = (close[0] < close[1])
    
    IF c3 AND c4 THEN
    if STRATEGYPROFIT > STRATEGYPROFIT[1] then
    positionsize = positionsize[1] * 2
    else
    positionsize = positionsize
    endif
    size = min(1,positionsize)
    SELLSHORT size SHARE AT MARKET
    endif
    
    // Stop e target
    SET STOP %LOSS 0.2
    SET TARGET %PROFIT 0.2
    #125463 quote
    robertogozzi
    Moderator
    Master
    1. DEFPARAM PRELOAD ha un default di 2000 che è generalmente sufficiente per caricare indicatori (a meno che non abbiano un numero di periodi maggiori di 2000!), però non serve molto diminuirli. A volte veiene per fare qualcosa di particolare, ma è preferibile non metterlo, oppure mettere il valore massimo che è 10000.
    2. la verifica di STRATEGYPROFIT va comunque fatta al di fuori di un blocco IF…ENDIF, perché deve farla SEMPRE, altrimenti se la fa solo quando le tue condizioni sono vere è raro che entrambi i valori, quello attuale e quello della candela precedente, siano diversi.
    3. devi usare MAX per la SIZE, non MIN(), altrimenti è unutile che tu raddoppi, ti prenderebbe sempre il minore, quindi 1. Ma inizialmente è 0 e prende sempre 0.
    4. POSITIONSIZE devi moltiplicarlo per SIZE, non per se stesso, altrimenti è zero inizialmente e resta sempre zero (ad ogni modo moltiplicarlo per due mi pare esagerato, generalmente si somma 1 al valore precedente)
    5. a POSITIONSIZE (o a SIZE nella mia modifica), nella moltiplicazione, non occorre mettere [1], in quanto ad ogni nuova candela tutte le variabili vengono mantenute nel valore precedente, quindi basta solo cambiare il valore attuale.
    6. dovresti prevedere anche una diminuzione di POSITIONSIZE quando c’è una perdita, altrimenti arrivi ad un numero altissimo!
    7. anche [0] con CLOSE ecc… non è necessario, va indicato un valore solo se > 0 (cioè per le candele precedenti a quella corrente). Forse te lo ha messo automaticamente la creazione assistita, quindi va bene così.
    8. per entrare a mercato, Long o Short che sia, secondo me è opportuno aggiungere alle tue condizioni AND NOT ONMARKET, altrimenti te ne accumula un’esagerazione.

    Eccolo modificato:

    defparam preloadbars=10000
    if STRATEGYPROFIT > STRATEGYPROFIT[1] then
       positionsize = size * 2
    ENDIF
    // Condizioni per entrare su posizioni long
    indicator1 = TriangularAverage[24](close)
    c1 = (close > indicator1)
    c2 = (close > close[1])
     
    IF c1 AND c2 AND Not OnMarket THEN
       size = max(1,positionsize)
       BUY size SHARE AT MARKET
    endif
    // Condizioni per entrare su posizioni short
    indicator2 = TriangularAverage[24](close)
    c3 = (close < indicator2)
    c4 = (close < close[1])
    IF c3 AND c4 AND Not OnMarket THEN
       size = max(1,positionsize)
       SELLSHORT size SHARE AT MARKET
    endif
    // Stop e target
    SET STOP   %LOSS   0.8
    SET TARGET %PROFIT 1.2
    MarcoDSP thanked this post
    #125477 quote
    MarcoDSP
    Participant
    Junior

    Grazie ancora Roberto, adesso funziona tutto, unica cosa le posizioni diventano giganti perchè dovrebbe incrementare la posizione solo quando il trade precedente è stato chiuso in perdita, mentre quando il trade precedente è chiuso con profitto dovrebbe aprire una posizione minima con 1 solo lotto. In sostanza l’idea è quella di raddoppiare la posizione per annullare la perdita e ritornare sempre almeno in pareggio, mentre quando i trade vanno in profit la posizione rimane sempre minima.

    #125483 quote
    robertogozzi
    Moderator
    Master

    Ok, allora le righe 2-4 sostituiscile con queste:

    if STRATEGYPROFIT < STRATEGYPROFIT[1] then
       positionsize = size * 2
    ELSIF STRATEGYPROFIT > STRATEGYPROFIT[1] then
       positionsize = 1
    ENDIF
    MarcoDSP thanked this post
    #125517 quote
    MarcoDSP
    Participant
    Junior

    if STRATEGYPROFIT < STRATEGYPROFIT[1] then    positionsize = size * 2 ELSIF STRATEGYPROFIT > STRATEGYPROFIT[1] then    positionsize = 1 ENDIF

    Perfetto!! grazie mille Roberto, adesso mi è chiaro

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

Dettagli sull'ultima operazione eseguita


ProOrder: Trading Automatico & Backtesting

New Reply
Author
author-avatar
MarcoDSP @marco_cardone Participant
Summary

This topic contains 9 replies,
has 2 voices, and was last updated by MarcoDSP
5 years, 10 months ago.

Topic Details
Forum: ProOrder: Trading Automatico & Backtesting
Language: Italian
Started: 03/31/2020
Status: Active
Attachments: No files
Logo Logo
Loading...