ProRealCode - Trading & Coding with ProRealTime™
Salve a tutti vi scrivo per chiedervi, gentilmente, aiuto per cercare di completare il seguente pattern che dovrebbe riproporre quello di Gramza. Mi servono due informazioni:
Es.: time frame 15 minuti: entro in posizione long alle 9:15 e lo stop è qualche punto sotto il minimo della candela delle 9:00. Incomincio a guadagnare e alle 9:30 lo stop si dovrà spostare qualche punto sotto il minimo della candela delle 9:15 e così via.
Grazie a chiunque mi aiuterà.
defparam flatbefore = 080000
defparam flatafter = 173000
DEFPARAM CumulateOrders = False // Posizioni cumulate disattivate
Hammer = (Close<Open AND (Open-Low) >= 2*(Open-Close))
Hammer2 = (Close>Open AND (high-open) >= 2*(Close-Open))
ShootingStar = (close>open and (high-close)>=2*(close-open))
ShootingStar2 = (close<open and (close-low)>=2*(open-close))
Candelarossa = (open>close)
Candelaverde = (open<close)
s = high
t = high[1]
z = high[2]
stoploss = (close CROSSES UNDER low[1])
// Condizioni per entrare su posizioni long
IF NOT longOnMarket and s<t and t<z and (hammer or hammer2 or ShootingStar or ShootingStar2 or candelaverde) THEN
buy 1 CONTRACTS at high+1 stop
ENDIF
s = low
t = low[1]
z = low[2]
stoploss = (close CROSSES over high[1])
// Condizioni per entrare su posizioni short
IF NOT shortOnMarket and s>t and t>z and (hammer or hammer2 or ShootingStar or ShootingStar2 or candelarossa) THEN
sellshort 1 CONTRACTS at low-1 stop
ENDIF
// Stop e target
set stop ploss stoploss
SET TARGET pPROFIT 10
Buon pomeriggio, nessuno mi può aiutare col pattern di Gramza?
Per settare lo STOP LOSS iniziale:
IF close > open THEN //LONG
MinLow = low
StopLoss = ((close - low) / pipsize) + 2 //2 pips sotto il minimo
ELSE //SHORT
MaxHigh = high
StopLoss = ((high - close) / pipsize) + 2 //2 pips sopra il massimo
ENDIF
.
.
SET STOP PLOSS StopLoss
Per il TRAILING STOP, basta confrontare il minimo/massimo di ogni barra con le variabili (di cui sopra) ed eventualmente aggiornarle ed inserire l’ordine di STOP con il nuovo valore:
IF LongOnMarket THEN //per i LONG
IF low > MinLow THEN //verificare che sia un MINIMO più alto
MinLow = Low //aggiornare la variabile
ENDIF
SELL AT MinLow STOP //aggiornare l'ordine di STOP ad ogni candela
ENDIF
IF ShortOnMarket THEN //per gli SHORT
IF high < MaxHigh THEN //verificare che sia un MASSIMO più basso
MaxHigh = high //aggiornare la variabile
ENDIF
EXITSHORT AT MaxHigh STOP //aggiornare l'ordine di STOP ad ogni candela
ENDIF
Non l’ho verificato, devi testarlo tu.
Gli ordini LIMIT e STOP (non quelli a mercato) vengono annullati automaticamente da ProOrder alla chiusura di ciascuna candela, in questo caso ogni 15 minuti, quindi vanno reinseriti di nuovo ad ogni candela, anche se non è stato fatto un nuovo massimo/minimo, questo per il trailing. Resta, invece, sempre valido l’rdine di STOP indicato inizialmente all’apertura dell’operazione.
Per la tua riga di codice
stoploss = (close CROSSES over high[1])
non va bene, in quanto mette nella variabile “stoploss” un valore logico (0 oppure 1), in quanto gli assegna il valore vero/falso del fatto che CLOSE abbia un incrocio rialzista col MASSIMO precedente.
Inoltre, sew ho ben capito cosa intendi per massimi/minimi precedenti, tu intendi quelli che precedono la candela d’entrata. Non c’è bisogno di mettere low [1] o high[1] o close[1], in quanto ogni strategia viene eseguita alla chiusura della candela (che quindi è quella corrente, non la precedente), ad esempio all 09:00 viene eseguita la tua strategia sul 15 minuti e le condizioni vengono testate sulla candela aperta alle 08:45:00, la precedente è quella delle 08:30:00. Il trade, se deve essere aperto, viene aperto SEMPRE all’apetrtura della candella a quella appena chiusa, quindi nell’esempio di cui sopra alle 09:00:00. E’ un pochino complicato all’inizio capire alcuni meccanismi di ProOrder.
Riepilogando: alle 09:00:00 viene eseguita la strategia verificando che le condizioni siano soddisfatte sulla candela delle 08:45:00 che si è appena chiusa e, in caso affermativo, viene aperta un’operazione Long/Short sulla candele delle 09:00:00 che sta per aprirsi.
Scusami per qualche errore di battitura, in particolare la frase “Il trade, se deve essere aperto, viene aperto SEMPRE all’apetrtura della candella a quella appena chiusa,” va intesa come “”Il trade, se deve essere aperto, viene aperto SEMPRE all’apertura della candela successiva a quella appena chiusa,”.
Roberto
Ci mancherebbe. Grazie, gentilissimo. Provo e ti faccio sapere
Un’altra gentilezza se possibile. Nel back test c’è la funzione Probacktest in modalità tick per tick che se spuntata mi cambia di molto i risultati del back test stesso.
Non riesco a capire: deve spuntare la casella o devo lasciarla? Non vorrei che penso che una strategia vada bene e invece poi non è buona.
Grazie.
Purtroppo ProOreder, fino a fine 2016, aveva il problema dello Stop Loss e del Take Profit sulla stessa barra.
In pratica quando capitava che nel corso della stessa barra ci fossero sia lo Stop Loss che il Take Profit, ProOrder prendeva per buono il Take Profit, anche se, nella realtà poteva essere successo che fosse stato colpito per primo lo Stop Loss, con ovvii risultati di backtest falsati!
Questo per come era impostata la piattaforma. Dall’1/1/2017 con la nuova versione il problema è stato risolto aggiungendo quella dicitura che tu hai detto, da spuntare o meno.
In realtà sarebbe bene (almeno sui timeframe maggiori) spuntarla sempre perché in tal modo quando capitano sia Stop Loss che Take Profit sulla stessa candela ProOrder la esamina tick per tick per vedere quale dei due viene colpito per primo, in modo da avere backtest affidabili. Questo però rallenta il sistema e quindi il backtest, inoltre tale modalità non può essere usata se il backtest parte da un pò di tempo indietro, ad esempio con il Daily mi pare si possano testare in quel modo solo gli ultimi 2-3 anni, non di più, per altri timeframe meno ancora.
Quindi il backtest, senza quella spunta, è meno affidabile, a meno che tu non operi su timeframe brevi, forse dal 15 minuti in giù, non saprei, prova a fare i test con e senza la spunta, se il risultato non cambia significa che quel problema non c’è.
Nelle prime fasi di scrittura di una strategia si può omettere la spunta per velocizzare il backtest, per poi aggiungerla nelle fasi finali.
Gent.mo Roberto ho provato a fare le modifiche che mi hai proposto ma purtroppo, per quanto riguarda lo stop, appena entro in posizione viene inserito sul massimo della candela in cui entro (a me servirebbe sul max della candela precedente) e poi quando va in trailing stop mi sposta lo stop subito sul massimo della candela successiva ma in questo modo deve andare per forza nella mia direzione altrimenti con un minimo ritracciamento lo stop viene preso subito.
Sul codice seguente che mi hai proposto, siccome non partiva, ho riportato minlow=minlow e maxhigh=maxhigh, non so però se corretto (anche se mi fa partire il trading system).
Grazie per la disponibilità.
L’istruzione
buy 1 CONTRACTS at high+1 stop
potrebbe non essere MAI eseguita, ad esempio su EurUsd che vale 1.1700 circa, perché aggiungendoci 1 diventa 2.1700 e NON si verificherà per un bel pò, mentre potrebbe andare bene con lo YEN od il DAX, ma è solo un caso. Per essere sicuro che funzioni sempre aggiungendo (o togliendo) 1 pip devi scrivere:
buy 1 CONTRACTS at (high + (1 * pipsize)) stop
è ProOrder che, conoscendo il valore di ogni pip per ciascuno strumento, fa i dovuti aggiustamenti.
Con ancora un pò di tempo a disposizione proverò a fare ulteriori verifiche.
Questo è il tuo codice come io l’ho modificato:
defparam flatbefore = 080000
defparam flatafter = 173000
DEFPARAM CumulateOrders = False // Posizioni cumulate disattivate
Hammer = (Close<Open AND (Open-Low) >= 2*(Open-Close))
Hammer2 = (Close>Open AND (high-open) >= 2*(Close-Open))
ShootingStar = (close>open and (high-close)>=2*(close-open))
ShootingStar2 = (close<open and (close-low)>=2*(open-close))
Candelarossa = (open>close)
Candelaverde = (open<close)
IF close > open THEN //LONG
MinLow = low
StopLoss = ((close - low) / pipsize) + 2 //2 pips sotto il minimo
ELSE //SHORT
MaxHigh = high
StopLoss = ((high - close) / pipsize) + 2 //2 pips sopra il massimo
ENDIF
s = high
t = high[1]
z = high[2]
// Condizioni per entrare su posizioni long
IF s<t and t<z and (hammer or hammer2 or ShootingStar or ShootingStar2 or candelaverde) THEN
buy 1 CONTRACTS at (high + (1 * pipsize)) stop
ENDIF
s = low
t = low[1]
z = low[2]
// Condizioni per entrare su posizioni short
IF s>t and t>z and (hammer or hammer2 or ShootingStar or ShootingStar2 or candelarossa) THEN
sellshort 1 CONTRACTS at (low - (1 * pipsize)) stop
ENDIF
// Stop e target
set stop ploss stoploss
SET TARGET pPROFIT 10
//
GRAPH StopLoss AS "SL"
GRAPH MinLow AS "Min"
GRAPH MaxHigh AS "Max"
Ho aggiunto i calcoli dello StopLoss, come avevo suggerito, poi ho modificato gli IF long e short perché non serve verificarlo, in quanto con DEFPARAM CumulateOrders gli hai già impedito di eseguire più di un’operazione.
Con le tre istruzioni GRAPH finali (puoi commentarle quando non vuoi usarle) puoi vedere i valori delle variabili.
A me funziona, non m’interessa se profittevole o meno in quanto non sono entrato nel merito della logica. Questo lo devi fare tu.
Si scusa grazie col forex sbagliavo. Per il resto lo sto provando in demo e mi sembra tutto ok. Continuo a testarlo. Ho solo dovuto togliere graph perché mi dava errore (allego l’immagine).
Avrei anche un’altra richiesta, gentilmente, da fare. Vorrei cercare di sfruttare l’entrata su massimi e minimi tipo “turtle soup”: in pratica se ho un nuovo massimo a 20 periodi dovrei entrare short quando raggiunge il massimo precedente e posizionare lo stop sopra il massimo della candela di entrata in cui si è verificato il nuovo massimo. Allego il codice preso nella libreria a cui ho fatto delle modifiche: riesco ad entrare short sotto il minimo della candela precedente a 20 periodi e viceversa long ma mi mancano le seguenti due condizioni:
Ringrazio sempre della disponibilità.
DEFPARAM CumulateOrders = False
n = 2
// Conditions pour ouvrir une position acheteuse
c1 = close < lowest[20](low)[1]
ctime = time > 060000 and time < 220000
IF c1 AND ctime THEN
BUY n CONTRACT AT lowest[20](low)[1] + 1 stop
ENDIF
// Conditions pour fermer une position acheteuse
c3 = high > highest[5](high)[1]
IF c3 THEN
SELL AT MARKET
ENDIF
// Conditions pour ouvrir une position vendeuse
c1 = close > highest[20](high)[1]
ctime = time > 060000 and time < 220000
IF c1 AND ctime THEN
SELLSHORT n CONTRACT AT highest[20](high)[1] - 1 stop
ENDIF
// Conditions pour fermer une position vendeuse
c3 = low > lowest[5](low)[1]
IF c3 THEN
EXITSHORT AT MARKET
ENDIF
// Stops et objectifs
SET STOP LOSS 60
set target pprofit 10
No, si può entrare solo subito DOPO la chiusura della barra, all’apertura della successiva. Questo almeno finché non verrà rilasciata una verione, speriamo entro fine anno, che sarà slegata al timeframe.
Ricorda che
AT lowest[20](low)[1] + 1
Può andare bene per il dax o altri indici, o per coppie come UsdJpy, per le altre no, dovresti usare
AT lowest[20](low)[1] + (1 * pipsize)
Il massimo giornaliero, se sei sul daily, è semplicemente dato da
high
che è la chiusura della barra in corso, poi il trade, a condizioni verificate, verrà aperto all’apertura della successiva.
Se usi un TF (TimeFrame) inferiore al giorno puoi anche avere il massimo/minimo giornaliero, sapendo quante candele sono passate, usando
highest[](max)
oppure
lowest[](low)
Se, ad esempio, sei su un TF ad 1 minuto e sono le 090000 ed il nuovo giorno è iniziato alle 000001, sai che sono trascorse 540 barre (9 ore per 60 barre ogni ora) ed indichi 60 nelle parentesi quadre.
Per la perdita massima, basta che verifichi tu che i PIPS calcolati come Stop Loss non la superino, se sei sul MiniDAX, ad esmpio, dove 1 PIP = 1 Euro, verifica di non avere uno Stop Loss maggiore.
Tieni presente che il broker prevede anche Stop Loss minimi, ad esempio IG chiede almeno 6 pips di Stop Loss per il DAX, quindi se indichi un valore inferiore il trade non viene eseguito, la strategia riceve un errore e ProOrder la termina e dovrai intervenire manualmente per farla ripartire.
Ad ogni modo, sei vuoi cercare dettagli su un’istruzione, thread e post su un particolare tema, puoi usare il box di ricerca che sta sotto il tuo avatar, basta che ci vada sopra col mouse e si apre ed è subito in alto, come puoi vedere dalla foto allegata.
Scusami, ma le righe 1, 2 e 3 precedenti vanno sostituite con
highest[](high)
oppure
lowest[](low)
Pattern di Gramza
This topic contains 53 replies,
has 5 voices, and was last updated by volpiemanuele
7 years, 9 months ago.
| Forum: | ProOrder: Trading Automatico & Backtesting |
| Language: | Italian |
| Started: | 08/21/2017 |
| Status: | Active |
| Attachments: | 7 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.