ProRealCode - Trading & Coding with ProRealTime™
Attenzione perché l’ho modificato, dopo che l’avevi letto, per differenziare tra LONG e SHORT.
Ciao,
provo ad allegare qui sotto l’ultimissima versione del codice comprensiva delle tue ultime indicazioni/modifiche.
Ti chiederei cortesemente di darci uno sguardo e di correggere per favore eventuali errori.
Purtroppo, nonostante abbia fatto la massima attenzione tenendo sempre in considerazione i tuoi consigli, il sistema non funziona perché deve esserci forse un errore di sintassi nelle istruzioni che io non riesco ad individuare.
Nella categoria che ho denominato PARAMETRI ho inserito tutte le caratteristiche di base del sistema.
Nella categoria CONDIZIONI (che è quella che mi ha dato da sempre meno problemi rispetto alle altre) inserisco la strategia vera e propria.
Nella categoria che ho denominato COMPORTAMENTI vi sono (è forse proprio qui sta l’errore) le “reazioni” che deve avere il sistema al verificarsi delle varie situazioni di prezzo.
Prima di scriverti ho provato e riprovato ma purtroppo ho veramente bisogno di un tuo intervento risolutore.
Ti ringrazio come sempre per la disponibilità.
🙂
//PARAMETRI
//inserire qui sotto tutti i parametri BASE del codice
// Definizione dei parametri del codice
DEFPARAM CumulateOrders = False // Posizioni cumulate disattivate
MioRischio = 100 //importo massimo in euro che voglio rischiare per ogni singola operazione
PercStop1 = 0.50 //attiva il pareggio al 50% del profitto
PercStop2 = 0.80 //attiva lo SL a metà del profitto quanto questo ragguinge l'80%
//DEFPARAM FlatAfter = 220000 //Range orario DOPO il quale non bisogna più essere in posizione (eventuale)
//DEFPARAM FLATBEFORE = 090000 //Range orario PRIMA del quale non bisogna ancora essere in posizione (eventuale)
//INSERIRE EVENTUALE PARAMETRO DAY OF THE WEEK PER ULTERIORE FILTRO DA TESTARE
IF OnMarket THEN
Prezzo=0 //azzera la variabile Prezzo per non soddisfare le condizioni del pattern
ENDIF //se si è già a mercato
IF Not OnMarket THEN
BreakEven = 0 //azzera la variabile Prezzo per non soddisfare le condizioni del pattern
ENDIF //se non si è già a mercato
//CONDIZIONI
//inserire qui sotto tutte le condizioni che caratterizzano il pattern o la strategia da tradare
AO=Average[5](MedianPrice)-Average[34](MedianPrice)
Cond1 = AO[1]>AO[2] AND AO[1]<0
Cond2 = AO[2]>AO[3] AND AO[2]<0
Cond3 = AO[3]>AO[4] AND AO[3]<0
Cond4 = AO[4]<AO[5] AND AO[4]<0
Cond5 = AO[5]<0
CondTOT = Cond1 AND Cond2 AND Cond3 AND Cond4 AND Cond5 AND Prezzo //Condizione globale da tradare
//COMPORTAMENTI
//inserire qui sotto come si deve comportare la strategia quando è ONMARKET
IF CondTOT THEN
TargetProfit = ((HIGH[0] - LOW[0]))*PIPSIZE //VALORE in PIPS del mio TARGET INIZIALE
Prezzo = HIGH[0] //VALORE al quale si entra in posizione se vengono soddisfatte TUTTE le CONDIZIONI
StopLoss = ((HIGH[0] - LOW[0]) //VALORE in PIPS dello STOP LOSS INIZIALE da settare in base alla strategia
ENDIF
Moltiplicatore = MioRischio/(StopLoss/Prezzo) //QUANTITA' dello strumento da negoziare per avere in caso di perdita un valore
//corrispondente a MIORISCHIO (nei parametri iniziali)
IF not onmarket AND CondTOT THEN
BUY Moltiplicatore SHARES AT (Prezzo+0.0000) STOP //Ordine automatico di ENTRATA LONG in posizione con eventuale aggiunta di pips
ENDIF
IF LongOnMarket AND ((close - Tradeprice) >= (TargetProfit * PercStop2))
IF LongOnMarket THEN
Breakeven = max(BreakEven,Tradeprice + (TargetProfit / 2)) //mettere al sicuro il 50% del profitto (è un BreakEven + metà profitto)
ENDIF
ENDIF
IF LongOnMarket AND ((close - Tradeprice) >= (TargetProfit * PercStop1))
Breakeven = Tradeprice
ENDIF
IF OnMarket THEN
SELL AT Breakeven STOP
ENDIF
…ho tolto le istruzioni per i comportamenti “SHORT” perché preferisco sempre tenere separati i due tipi di strategia al fine di analizzare meglio i risultati (e per incasinarmi di meno durante la programmazione, già difficile così…)
Grazie !
Gli errori di sintassi sono dovuti alla mancanza di THEN alla fine delle righe 51 e 56.
Hai calcolato lo Stop Loss, ma lo usi solo in un’espressione, non lo piazzi come ordine di uscita (con SET STOP LOSS)?
Aggiungi queste righe subito dopo la riga 30:
graphonprice AO coloured(0,0,0,255) AS "ao"
graphonprice AO[1] coloured(0,0,0,255) AS "ao1"
graphonprice AO[2] coloured(0,0,0,255) AS "ao2"
graphonprice AO[3] coloured(0,0,0,255) AS "ao3"
graphonprice AO[4] coloured(0,0,0,255) AS "ao4"
graphonprice AO[5] coloured(0,0,0,255) AS "ao5"
vedrai (come da foto allegata) come risultano i valori calcolati (dovrai allargare molto il grafico nella parte bassa dove ci sono i tracciati delle variabili).
Vedrai che AO[1] non può essere contemporaneamente < 0 e > di AO[2].
Inoltre, perché alla riga 28 hai scritto AO[4]<AO[5] invece di AO[4]>AO[5] ?
Ciao,
allego il codice con le modifiche che mi hai suggerito (il THEN alla fine delle righe 51 e 51) ed ho rivisto anche le condizioni risistemando i segni di maggiore e minore ed adesso mi sembra che siano corretti.
ho provato a far girare la strategia su EUR/USD daily (dal 1979 ad oggi) ma stranamente non produce nessuna operazione !!! (ho quindi provato anche su altre coppie di valute ma anche qui nulla, e mi sembra molto strano).
potresti per favore far girare anche tu il codice ed eventualmente vedere dove sta l’errore ?
dopo le condizioni (riga 39 e seguenti) ho “fissato” il target, stop e prezzo affinché non vengano aggiornate di candela in candela come mi avevi consigliato sin dall’inizio, ed anche qui dovrebbe essere ok.
Proprio non capisco. 🙁
inoltre (visto che con il tuo aiuto sono giunto quasi al termine di questo mio primo codice base che servirà per testare tutte le mie strategie) vorrei chiederti ancora due piccoli chiarimenti:
in una delle tue precedenti risposte mi avevi dato indicazione di una tecnica per definire il numero di giorni in cui riproporre l’ordine di acquisto sul mercato. Potresti per favore ripetermi ed indicarmi come e dove inserire nel codice questa istruzione? in pratica vorrei aggiungere una riga di codice con un comando del tipo, ad esempio, “RipetizioneOrdine” assegnando un valore che se è uguale a 1 significa che l’ordine deve essere valido SOLO per la giornata successiva al verificarsi delle condizioni, se è uguale a 2 significa che l’ordine deve essere valido SOLO per i due giorni successivi, ecc. Ti chiedo questo perché vi sono delle strategie che prevedono la regola del “Entry on next bar only”. Così potrei settarlo in questi casi a 1 ed invece settarlo a 999 quando l’ordine pendente deve rimanere sempre valido fino al verificarsi di un nuovo pattern.
Ultima cosa (e forse la più importante, ed è colpa mia che non l’ho indicata e chiesta esplicitamente…): dopo che ho raggiunto il 50% del mio target sposto lo stop in pari; dopo che eventualmente ho raggiunto l’ 80% sposto lo stop a metà del target per proteggere parte dei guadagni potenzialmente già acquisiti. Ma da qui in poi il sistema cosa fa ?? Spostando la stop a metà del target iniziale il sistema dovrebbe contemporaneamente far partire un TRAILING STOP con un valore pari a “StopLoss” di riga 42 per lasciar correre l’operazione il più possibile fino a quando il mercato non si gira contro. Ma mi pare che questo tipo di istruzione non sia presente nel programma. Mi potresti per favore dare un suggerimento su come procedere ??
GRAZIE !!
//PARAMETRI
//inserire qui sotto tutti i parametri BASE del codice
// Definizione dei parametri del codice
DEFPARAM CumulateOrders = False // Posizioni cumulate disattivate
MioRischio = 100 //importo massimo in euro che voglio rischiare per ogni singola operazione
PercStop1 = 0.50 //attiva il pareggio al 50% del profitto
PercStop2 = 0.80 //attiva lo SL a metà del profitto quanto questo ragguinge l'80%
//DEFPARAM FlatAfter = 220000 //Range orario DOPO il quale non bisogna più essere in posizione (eventuale)
//DEFPARAM FLATBEFORE = 090000 //Range orario PRIMA del quale non bisogna ancora essere in posizione (eventuale)
//INSERIRE EVENTUALE PARAMETRO DAY OF THE WEEK PER ULTERIORE FILTRO DA TESTARE
IF OnMarket THEN
Prezzo=0 //azzera la variabile Prezzo per non soddisfare le condizioni del pattern
ENDIF //se si è già a mercato
IF Not OnMarket THEN
BreakEven = 0 //azzera la variabile Prezzo per non soddisfare le condizioni del pattern
ENDIF //se non si è già a mercato
//CONDIZIONI
//inserire qui sotto tutte le condizioni che caratterizzano il pattern o la strategia da tradare
AO=Average[5](MedianPrice)-Average[34](MedianPrice)
Cond1 = AO[0]>AO[1] AND AO[0]<0
Cond2 = AO[1]<AO[2] AND AO[1]<0
Cond3 = AO[2]<AO[3] AND AO[2]<0
Cond4 = AO[3]<AO[4] AND AO[3]<0
Cond5 = AO[4]<0
CondTOT = Cond1 AND Cond2 AND Cond3 AND Cond4 AND Cond5 AND Prezzo //Condizione globale da tradare
//COMPORTAMENTI
//inserire qui sotto come si deve comportare la strategia quando è ONMARKET
IF CondTOT THEN
TargetProfit = ((HIGH[0] - LOW[0])) //VALORE in PIPS del mio TARGET INIZIALE
Prezzo = HIGH[0] //VALORE al quale si entra in posizione se vengono soddisfatte TUTTE le CONDIZIONI
StopLoss = (HIGH[0] - LOW[0]) //VALORE in PIPS dello STOP LOSS INIZIALE da settare in base alla
ENDIF
Moltiplicatore = MioRischio/(StopLoss/Prezzo) //QUANTITA' dello strumento da negoziare per avere in caso di perdita un valore
//corrispondente a MIORISCHIO (nei parametri iniziali)
IF not onmarket AND CondTOT THEN
BUY Moltiplicatore SHARES AT (Prezzo+0.0000) STOP //Ordine automatico di ENTRATA LONG in posizione con eventuale aggiunta di pips
ENDIF
IF LongOnMarket AND ((close - Tradeprice) >= (TargetProfit * PercStop2)) THEN
IF LongOnMarket THEN
Breakeven = max(BreakEven,Tradeprice + (TargetProfit / 2)) //mettere al sicuro il 50% del profitto (è un BreakEven + metà profitto)
ENDIF
ENDIF
IF LongOnMarket AND ((close - Tradeprice) >= (TargetProfit * PercStop1)) THEN
Breakeven = Tradeprice
ENDIF
IF OnMarket THEN
SELL AT Breakeven STOP
ENDIF
ho allegato per comodità anche un esempio di come deve essere l’oscillatore per generare tutte le condizioni di entry (evidenziato nel riquadro arancione).
Tutti i valori sono inferiori a zero.
Entro al superamento del massimo della barra corrispondente al primo oscillatore di colore verde, e per essere verde deve avere un valore superiore al precedente.
la sequenza è 3 consecutive rosse e la quarta verde. (e per sapere se la prima delle quattro è rossa devo conoscere e testare anche il valore di quella precedente… come avevamo detto tempo fa).
inoltre ho notato adesso che non esiste uno stop loss iniziale protettivo per determinare il punto di uscita qualora entrassimo in posizione al superamento del valore di entry anche di un solo Pip e poi il mercato incominciasse subito a girarsi contro…
posso semplicemente aggiungere alla riga 62 questa istruzione
SET STOP pLOSS StopLoss
oppure ci sono altre particolarità da considerare ?
Grazie mille.
Ciao.
ciao,
ho risolto autonomamente parte dei problemi dopo aver riletto decine di post sul forum.
a breve ti mostrerò la versione aggiornata del codice che però continua ad avere un paio di problemi ai quali non so dare risposta.
grazie.
ciao.
Ciao,
in questo giorni ho effettuato centinaia di prove per capire il funzionamento di alcune istruzioni ed incominciare con i test di alcune strategie.
Adesso, però, ho proprio bisogno di un aiuto perché non so come uscirne da questo problema 🙁
Ho messo in grigio numerose righe per potermi concentrare su di un parametro alla volta e capirne bene i comportamenti. Ritengo che ci sia qualcosa di non corretto sullo spostamento dello stop in pari.
Lo stop loss della riga 71 funziona alla perfezione ed il quantitativo di valuta impostato alla riga 45 mi permette (in caso di perdita) di rispettare l’importo da rischiare indicato alla riga 6. E fin qui ho “assimilato” il funzionamento di questi comandi.
il vero problema riguarda le righe dalla 64 alla 69 🙁
analizzando con carta e penna e calcolatrice alla mano ogni singola operazione generata dal sistema (esempio: USD/CAD daily dal 3 aprile 2017 ad oggi) ho notato che lo spostamento dello stop loss al valore del prezzo di ingresso quando raggiungo il 50% del mio target viene completamente ignorato !
ecco una operazione specifica che mi fa pensare che qualcosa non vada per il verso giusto:
in data 21 giugno 2017 entro long al superamento del massimo del 20 giugno 2017 al valore di 1.3285 (fin qui tutto ok e l’ingresso è scattato correttamente)
il mio TP (che è anche il mio SL iniziale) è dato dalla differenza tra max e min del 20 giugno 2017 ovvero 81 pips.
il giorno 21 giugno 2017 il prezzo arriva a toccare un massimo di giornata di 1,3348 ovvero 63 pips sopra in mio prezzo di ingresso. Essendo 63 pips oltre il 50% del mio target di 81 pips il sistema avrebbe dovuto spostare automaticamente lo SL dal minimo della candela del 20 giugno 2017 al prezzo di entrata ovvero il valore massimo della candela sempre del 20 giugno 2017. (ma questo NON è avvenuto). Nonostante la presenza di una istruzione per portare lo stop in pari, il mio SL è rimasto settato al minimo della candela del 20 giugno 2017.
il mercato poi si è girato contro ed anziché uscire in data 22 giugno 2017 al mio prezzo di ingresso sono uscito in data 27 giugno 2017 allo sfondamento del minimo del 20 giugno ovvero il mio SL iniziale.
Potresti cortesemente rivedere un attimo il codice che ho allegato? e che deriva da quello che gentilmente mi avevi fornito in un tuo post precedente… forse c’è un dettaglio che ancora mi sfugge.
Grazie mille e spero di poter ricevere presto una tua soluzione al problema.
Ciao.
//PARAMETRI
//inserire qui sotto tutti i parametri BASE del codice
// Definizione dei parametri del codice
DEFPARAM CumulateOrders = False // Posizioni cumulate disattivate
MioRischio = 100 //importo massimo in euro che voglio rischiare per ogni singola operazione
PercStop1 = 0.50 //attiva il pareggio al 50% del profitto
//PercStop2 = 0.80 //attiva lo SL a metà del profitto quanto questo ragguinge l'80%
//DEFPARAM FlatAfter = 220000 //Range orario DOPO il quale non bisogna più essere in posizione (eventuale)
//DEFPARAM FLATBEFORE = 090000 //Range orario PRIMA del quale non bisogna ancora essere in posizione (eventuale)
//INSERIRE EVENTUALE PARAMETRO DAY OF THE WEEK PER ULTERIORE FILTRO DA TESTARE
//IF OnMarket THEN
//Prezzo=0 //azzera la variabile Prezzo per non soddisfare le condizioni del pattern
//ENDIF //se si è già a mercato
IF Not OnMarket THEN
BreakEven = 0
ENDIF
//CONDIZIONI
//inserire qui sotto tutte le condizioni che caratterizzano il pattern o la strategia da tradare
AO=Average[5](MedianPrice)-Average[34](MedianPrice)
Cond1 = AO[0]>AO[1] AND AO[0]<0
Cond2 = AO[1]<AO[2] AND AO[1]<0
Cond3 = AO[2]<AO[3] AND AO[2]<0
Cond4 = AO[3]<AO[4] AND AO[3]<0
Cond5 = AO[4]<0
CondTOT = Cond1 AND Cond2 AND Cond3 AND Cond4 AND Cond5 //Condizione globale da tradare
//COMPORTAMENTI
//inserire qui sotto come si deve comportare la strategia quando è ONMARKET
IF CondTOT THEN
TargetProfit = (HIGH[0] - LOW[0])*10000 //VALORE in PIPS del mio TARGET INIZIALE
Prezzo = HIGH[0] //VALORE al quale si entra in posizione se vengono soddisfatte TUTTE le CONDIZIONI
StopLoss = (HIGH[0] - LOW[0])*10000 //VALORE in PIPS dello STOP LOSS INIZIALE da settare in base alla
ENDIF
Moltiplicatore = (MioRischio/(StopLoss*Prezzo))*10000 //QUANTITA' dello strumento da negoziare per avere in caso di perdita un valore
//corrispondente a MIORISCHIO (nei parametri iniziali)
IF not onmarket AND CondTOT THEN
BUY Moltiplicatore lots AT (Prezzo+0.0000) STOP //Ordine automatico di ENTRATA LONG in posizione con eventuale aggiunta di pips
ENDIF
//IF LongOnMarket AND ((close - Tradeprice) >= (TargetProfit * PercStop2)) THEN
//IF LongOnMarket THEN
//Breakeven = max(BreakEven,Tradeprice + (TargetProfit / 2)) //mettere al sicuro il 50% del profitto (è un BreakEven + metà profitto)
//ENDIF
//ENDIF
IF LongOnMarket AND ((close - Tradeprice) >= (TargetProfit * PercStop1)) THEN
Breakeven = Tradeprice
ENDIF
IF OnMarket THEN
SELL Moltiplicatore lots AT Breakeven STOP
ENDIF
SET STOP pLOSS StopLoss
graph Moltiplicatore
inoltre, purtroppo, ho notato un altro problema importante…
come si può vedere dalla videata allegata, sono entrato (sempre USD/CAD daily) in data 11 gennaio 2018 e sono correttamente uscito in data 15 gennaio allo sfondamento dello SL posto al valore minimo del 10 gennaio, data del mio setup (in questo caso non è stato necessario lo spostamento dello stop in pari e quindi non si è verificato il problema specificato nel post precedente.
ho fatto questa precisazione per chiarire che dal 16 gennaio NON sono long .
in data 31 gennaio si ripresenta il segnale di setup (4 barre dell’oscillatore rosse seguite da una verde ed entry al superamento del massimo della candela corrispondente a questa prima barra verde).
in data 1 febbraio non avviene nulla poiché il massimo del 31 gennaio non viene superato, ma in data 2 febbraio viene superato il massimo del 31 gennaio (producendo fino al massimo del 9 febbraio anche una interessante performance).
purtroppo però il sistema non mi ha fatto entrare long, ed analizzando anche questo aspetto su ogni singola operazione fatta e visivamente su quelle che potenzialmente si sarebbero dovute tradare, ho notato che il segnale di acquisto rimane valido SOLO per il giorno successivo al giorno di setup e non anche per i giorni seguenti :(:( (dovrebbe rimanere valido fino a quando o si verifica un nuovo setup oppure fino a quando il prezzo scende sotto il minimo della candela di setup azzerando il segnale).
Come posso fare per ovviare a questo problema e mantenere l’ordine pendente anche per il giorni successivi ??
Grazie mille.
Cos’è quel numero 10000 che usi spesso come moltiplicatore?
ciao !!!
grazie che stai già vedendo i miei problemi…
uso 10000 come moltiplicatore per ottenere il numero esatto di pips quando faccio una differenza tra due prezzi
esempio: 1,1375 – 1,1340 = 0,0035
che moltiplicato per 10000 mi restituisce 35 che è il numero di pips
perché mi sono ricordato il tuo suggerimento quando mi facevi notare che le operazioni venivano aperte e subito dopo chiuse perché avevo dettato un TP troppo piccolo… ad esempio di 0,0035 pips anziché di 35 pips 🙂
inoltre ho notato che moltiplicando per 10000 e dettando nei parametri di PRT 1 come lotto per FX e non 10000 come impostato di default, riesco ad ottenere il calcolo preciso della quantità di valuta da tradare per rispettare il valore impostato alla voce “miorischio” poiché in base al prezzo ed in base al numero di pips di SL io compro ogni volta una quantità diversa di valuta.
ho chiarito il tuo dubbio ? 🙂
spero di poter avere presto qualche tua dritta su come procedere per i problemi sopra elencati.
ti ringrazio molto per la Tua consueta disponibilità e pazienza 😉
ciao.
Non credo sia il problema di 10000 (vedrò meglio domattina), ma in ogni caso usa “/pipsize” (divisione) che è universale e ti garantisce di non dovere aggiustare il valore quando cambi lo strumento, quando devi convertire da un prezzo a pips (in questo caso una differenza di prezzi),
Usa invece “*pipsize” (moltiplicazione) per convertire un numero in Pips, ad esempio:
BUY 1 CONTRACT at High + 5 * pipsize STOP //acquista al prezzo Massimo + 5 pips
ok, grazie.
provo immediatamente a modificare il mio codice utilizzando la funzione pipsize.
sicuramente i problemi che ti ho indicato nei miei due post precedenti non riguardano il discorso dei 10000, ovviamente.
probabilmente si tratta magari solo di una banalità, che però purtroppo mi sta facendo diventare matto. 🙁
se non riuscirò a risolverle da solo, ti chiederò poi ancora un paio di indicazioni su due cosucce… ma adesso non voglio mettere troppa carne al fuoco e sopratutto voglio provare a capire in prima persona come funzionano i vari comandi e solo dopo proverò a chiederti un aiuto, altrimenti non farò mai nessun progresso da solo.
GRAZIE !
Per favore allega foto chiare e dettagliate, non vedo né lo strumento, né il time frame usato, né il periodo di riferimento, oppure dimmeli te.
Oppure il codice che hai postato è diverso da quello che hai provato, perché su UsdCad daily mi apre una posizione nel 1978 e la chiude nel 2006, come vedi dalla foto. Risulta anche una quantità di contratti enorme.
Devo potere replicare esattamente la tua situazione, altrimenti non posso fare niente!
Richiesta aiuto per settaggio TARGET PROFIT
This topic contains 116 replies,
has 2 voices, and was last updated by
robertogozzi
6 years, 9 months ago.
| Forum: | ProOrder: Trading Automatico & Backtesting |
| Language: | Italian |
| Started: | 02/15/2019 |
| Status: | Active |
| Attachments: | 26 files |
The information collected on this form is stored in a computer file by ProRealCode to create and access your ProRealCode profile. This data is kept in a secure database for the duration of the member's membership. They will be kept as long as you use our services and will be automatically deleted after 3 years of inactivity. Your personal data is used to create your private profile on ProRealCode. This data is maintained by SAS ProRealCode, 407 rue Freycinet, 59151 Arleux, France. If you subscribe to our newsletters, your email address is provided to our service provider "MailChimp" located in the United States, with whom we have signed a confidentiality agreement. This company is also compliant with the EU/Swiss Privacy Shield, and the GDPR. For any request for correction or deletion concerning your data, you can directly contact the ProRealCode team by email at privacy@prorealcode.com If you would like to lodge a complaint regarding the use of your personal data, you can contact your data protection supervisory authority.