ProRealCode - Trading & Coding with ProRealTime™
Buonasera a tutti, vorrei impostare un ordine di acquisto limite sul prezzo d’incrocio a rialzo di 2 medie mobili (la breve che incrocia a rialzo quella a lungo periodo), in pratica comprare sul pullback ed impostare uno stop loss sotto tale livello.
Qualcuno sa come fare?
Grazie mille
Massimo
Non è chiarissima la tua richiesta, vuoi comprare al prezzo d’incrocio al rialzo delle due medie, oppure sul pullback?
Devi però definire cos’è per te un pullback, un certo numero fisso di pips, oppure quale livello?
Vuoi per caso comprare quando, dopo l’incrocio al rialzo, il prezzo tocca una media, quale delle due?
Roberto
Ciao Roberto,
l’idea è che quando avviene un incrocio a rialzo per se: ema 5 crossover ema 20, voglio impostare un ordine di acquisto limite sul livello di prezzo dell’incrocio che resti in attesa per un n° di candele che imposto, per es: 50 periodi.
Se il prezzo ritraccia e tocca il livello di prezzo d’incrocio compra (questo lo definisco un pullback).
Quando entra in posizione imposta subito anche uno stop loss sotto il più basso minimo delle ultime candele prima e compresa dell’incrocio, es: ultime 10 barre (lowest [10](low)).
In questo modo non compro sulla forza di movimento del prezzo ma attendo un ritracciamento per comprare.
Poi vorrei impostare un trailing profit oppure un take profit basato sul prezzo d’entrata-stop loss.
Ti allego un grafico che fa chiarezza per esempio.
Grazie
Max
Ok, proverò a buttare giù qualcosa e ti farò sapere.
Roberto
Ho creato questa strategia per il DAX, TF h1:
DEFPARAM CumulateOrders = false
ONCE PositionSize = 1
ONCE Crossing = 0 //Inizializzare CROSSING a 0
ONCE CrossingPrice = 0
ONCE MaxLookBack = 5 //Numero di candele da esaminare per il minimo da usare...
ONCE StopLoss = 0 //...come Stop Loss dopo l'incrocio
ONCE BarID = 0 //Numero della candela in cui avviene l'incrocio
ONCE MaxWaitingBars = 30 //Numero max. di candela da attendere dopo l'incrocio
ONCE MaxCandles = 60 //Uscire dopo questo numero di candele
ONCE AvgType = 2 //2 = wma (media ponderata)
IF (Barindex - Tradeindex) >= MaxCandles THEN //Chiudere la posizione dopo un certo numero di candele
SELL AT MARKET
ENDIF
IF OnMarket OR ((BarIndex - BarID) >= MaxWaitingBars) THEN
Crossing = 0 //Redsettare le variabili al valore di default dopo...
StopLoss = 0 //...l'apertura di un'operazione oppure dopo un certo...
BarID = 0 //...numero di candele
CrossingPrice = 0
ENDIF
FastEma = Average[4,AvgType](close) //4
SlowEma = Average[12,AvgType](close)//12
IF FastEma CROSSES OVER SlowEma AND (NOT Crossing) THEN
Crossing = 1 //Settare CROSSING ad 1 per segnalare l'avvenuto incrocio
StopLoss = lowest[MaxLookBack](low) //Salvare il prezzo di Stop Loss
BarID = Barindex //Salvare il numero di candela dell'incrocio
CrossingPrice = close //Prezzo di entrata (ordine pendente)
ENDIF
// LONG
IF Crossing THEN
SET Stop Loss StopLoss
SET Target Profit (CrossingPrice + (CrossingPrice - StopLoss)) //TP = SL
BUY PositionSize CONTRACTS AT CrossingPrice LIMIT //Ordine pendente sul ritracciamento
ENDIF
//GRAPH CrossingPrice
//GRAPH StopLoss
//GRAPH (CrossingPrice + (CrossingPrice - StopLoss))
//GRAPH Crossing
//GRAPH BarID
Ho dovuto mettere un limite al numero di barre, altrimenti l’operazione avrebbe potuto durare migliaia di ore!
Inoltre tieni presente che il prezzo d’incrocio è sempre quello di chiusura della barra, perché ovviamente NON è possibile sapere se l’incrocio avviene dentro la barra ed esattamente a quale prezzo.
Ho messo le medie Mobili in modo generico, così è sufficiente cambiare la variabile AVGTYPE per usare un metodo diverso di calcolo.
Roberto
Ciao Roberto, chiarissimo grazie mille.
Se voglio fare anche la vendita allo scoperto, devo implementare il codice in questo modo?
IF FastEma CROSSES UNDER SlowEma AND (NOT Crossing) THEN
Crossing = 1 //Settare CROSSING ad 1 per segnalare l'avvenuto incrocio
StopLoss = highest[MaxLookBack](high) //Salvare il prezzo di Stop Loss
BarID = Barindex //Salvare il numero di candela dell'incrocio
CrossingPrice = close //Prezzo di entrata (ordine pendente)
ENDIF
// SHORT
IF Crossing THEN
SET Stop Loss StopLoss
SET Target Profit (CrossingPrice - (StopLoss-CrossingPrice)) //TP = SL
SELLSHORT PositionSize CONTRACTS AT CrossingPrice LIMIT //Ordine pendente sul ritracciamento
ENDIF
No, servono altre variabili e verifiche incrociate, in modo che se ad un incrocio al rialzo ne segue a breve uno al ribasso, occorre azzerare i segnali del primo.
Ma stai tranquillo, la spiegazione è più complessa della realizzazione.
Appena trovo 15 minuti domani faccio la modifica e la posto.
Ah ok, grazie mille Roberto!
Ho fatto le modifiche per aggiungere la vendita, provale (ovviamente i vari parametri, Medie, numero Barre, ecc…. devi aggiustarle te al tuo TF ed alle tua preferenze):
DEFPARAM CumulateOrders = false
ONCE PositionSize = 1
ONCE CrossingUP = 0 //Inizializzare CROSSING UP a 0
ONCE CrossingDN = 0 //Inizializzare CROSSING DOWN a 0
ONCE CrossingPrice = 0
ONCE MaxLookBack = 5 //Numero di candele da esaminare per il minimo da usare...
ONCE StopLoss = 0 //...come Stop Loss dopo l'incrocio
ONCE BarID = 0 //Numero della candela in cui avviene l'incrocio
ONCE MaxWaitingBars = 30 //Numero max. di candela da attendere dopo l'incrocio
ONCE MaxCandles = 60 //Uscire dopo questo numero di candele
ONCE AvgType = 2 //2 = wma (media ponderata)
IF (Barindex - Tradeindex) >= MaxCandles THEN //Chiudere la posizione dopo un certo numero di candele
SELL AT MARKET
EXITSHORT AT MARKET
ENDIF
IF OnMarket OR ((BarIndex - BarID) >= MaxWaitingBars) THEN
CrossingDN = 0
CrossingUP = 0 //Resettare le variabili al valore di default dopo...
StopLoss = 0 //...l'apertura di un'operazione oppure dopo un certo...
BarID = 0 //...numero di candele
CrossingPrice = 0
ENDIF
FastEma = Average[4,AvgType](close) //4
SlowEma = Average[12,AvgType](close)//12
// LONG
IF FastEma CROSSES OVER SlowEma AND (NOT CrossingUP) THEN
CrossingDN = 0 //Azzerare eventuali precedenti incroci ribassisti
CrossingUP = 1 //Settare CROSSING ad 1 per segnalare l'avvenuto incrocio
StopLoss = lowest[MaxLookBack](low) //Salvare il prezzo di Stop Loss
BarID = Barindex //Salvare il numero di candela dell'incrocio
CrossingPrice = close //Prezzo di entrata (ordine pendente)
ENDIF
IF CrossingUP THEN
SET Stop Loss StopLoss
SET Target Profit (CrossingPrice + (CrossingPrice - StopLoss)) //TP = SL
BUY PositionSize CONTRACTS AT CrossingPrice LIMIT //Ordine pendente sul ritracciamento
ENDIF
// SHORT
IF FastEma CROSSES UNDER SlowEma AND (NOT CrossingDN) THEN
CrossingUP = 0 //Azzerare eventuali precedenti incroci rialzisti
CrossingDN = 1 //Settare CROSSING ad 1 per segnalare l'avvenuto incrocio
StopLoss = highest[MaxLookBack](high) //Salvare il prezzo di Stop Loss
BarID = Barindex //Salvare il numero di candela dell'incrocio
CrossingPrice = close //Prezzo di entrata (ordine pendente)
ENDIF
IF CrossingDN THEN
SET Stop Loss StopLoss
SET Target Profit (CrossingPrice + (CrossingPrice - StopLoss)) //TP = SL
SELLSHORT PositionSize CONTRACTS AT CrossingPrice LIMIT //Ordine pendente sul ritracciamento
ENDIF
//GRAPH CrossingPrice
//GRAPH StopLoss
//GRAPH (CrossingPrice + (CrossingPrice - StopLoss))
//GRAPH Crossing
//GRAPH BarID
Roberto
Grande Roberto!! lo provo e ti faccio sapere!
grazie per la disponibilità e la velocità di programmazione!
Max
Ciao Roberto, ho verificato i due sistemi, solo long e long/short ma purtroppo entra in posizione sulla candela successiva all’incrocio e non successivamente quando il prezzo ritraccia sul prezzo a cui è avvenuto l’incrocio.
Sono da rivedere i codici, proverò a lavorarci su.
Grazie comunque!
non successivamente quando il prezzo ritraccia sul prezzo a cui è avvenuto l’incrocio.
Dovrebbe essere perché Roberto ha usato ordini LIMIT.
Quello che può succedere è che il prezzo sia troppo vicino per mettere l’ordine LIMIT o già sotto di esso per un ordine di acquisto ad esempio.
Inoltre, tenere presente che il codice è letto solo una volta per bar e molte cose possono accadere tra 2 bar aperti.
Come ha detto Nicolas, durante una candela di un’ora possono succedere molte cose!
Ho variato il codice mettendo l’entrata a MERCATO, invece che con ordini LIMIT. Questo, però, può aggravare il problema, secondo me, perché entrare a mercato alla chiusura della barra, invece che con ordine limit, può farti entrare con molti PIPS di differenza!
Inoltre, siccome può capitare che il prezzo ritracci subito, ho aggiunto la variabile Bar2Elapse per stabilire che tu vuoi prendere per buono il ritracciamento solo DOPO “n” barre, quind puoi settarla a 0 per accettere anche un ritracciamento immediato, oppure quando tu ritieni più opportuno.
DEFPARAM CumulateOrders = false
ONCE PositionSize = 1
ONCE CrossingUP = 0 //Inizializzare CROSSING UP a 0
ONCE CrossingDN = 0 //Inizializzare CROSSING DOWN a 0
ONCE CrossingPrice = 0
ONCE MaxLookBack = 5 //Numero di candele da esaminare per il minimo da usare...
ONCE StopLoss = 0 //...come Stop Loss dopo l'incrocio
ONCE BarID = 0 //Numero della candela in cui avviene l'incrocio
ONCE MaxWaitingBars = 30 //Numero max. di candela da attendere dopo l'incrocio
ONCE MaxCandles = 60 //Uscire dopo questo numero di candele
ONCE AvgType = 2 //2 = wma (media ponderata)
ONCE Bar2Elapse = 5 //Numero di barre di attesa prima di entrare
IF (Barindex - Tradeindex) >= MaxCandles THEN //Chiudere la posizione dopo un certo numero di candele
SELL AT MARKET
EXITSHORT AT MARKET
ENDIF
IF OnMarket OR ((BarIndex - BarID) >= MaxWaitingBars) THEN
CrossingDN = 0
CrossingUP = 0 //Resettare le variabili al valore di default dopo...
StopLoss = 0 //...l'apertura di un'operazione oppure dopo un certo...
BarID = 0 //...numero di candele
CrossingPrice = 0
ENDIF
FastEma = Average[4,AvgType](close) //4
SlowEma = Average[12,AvgType](close)//12
// LONG
IF FastEma CROSSES OVER SlowEma AND (NOT CrossingUP) THEN
CrossingDN = 0 //Azzerare eventuali precedenti incroci ribassisti
CrossingUP = 1 //Settare CROSSING ad 1 per segnalare l'avvenuto incrocio
StopLoss = lowest[MaxLookBack](low) //Salvare il prezzo di Stop Loss
BarID = Barindex //Salvare il numero di candela dell'incrocio
CrossingPrice = close //Prezzo di entrata (ordine pendente)
ENDIF
IF CrossingUP AND (BarIndex - BarID) >= Bar2Elapse THEN
SET Stop Loss StopLoss
SET Target Profit (CrossingPrice + (CrossingPrice - StopLoss)) //TP = SL
//BUY PositionSize CONTRACTS AT CrossingPrice LIMIT //Ordine pendente sul ritracciamento
IF close >= CrossingPrice THEN
BUY PositionSize CONTRACTS AT MARKET //Ordine a mercato sul ritracciamento
ENDIF
ENDIF
// SHORT
IF FastEma CROSSES UNDER SlowEma AND (NOT CrossingDN) THEN
CrossingUP = 0 //Azzerare eventuali precedenti incroci rialzisti
CrossingDN = 1 //Settare CROSSING ad 1 per segnalare l'avvenuto incrocio
StopLoss = highest[MaxLookBack](high)//Salvare il prezzo di Stop Loss
BarID = Barindex //Salvare il numero di candela dell'incrocio
CrossingPrice = close //Prezzo di entrata (ordine pendente)
ENDIF
IF CrossingDN AND (BarIndex - BarID) >= Bar2Elapse THEN
SET Stop Loss StopLoss
SET Target Profit (CrossingPrice + (CrossingPrice - StopLoss)) //TP = SL
//SELLSHORT PositionSize CONTRACTS AT CrossingPrice LIMIT //Ordine pendente sul ritracciamento
IF close <= CrossingPrice THEN
SELLSHORT PositionSize CONTRACTS AT MARKET //Ordine a mercato sul ritracciamento
ENDIF
ENDIF
//GRAPH CrossingPrice
//GRAPH StopLoss
//GRAPH (CrossingPrice + (CrossingPrice - StopLoss))
//GRAPH Crossing
//GRAPH BarID
Roberto
Ciao Ragazzi,
allego i backtest x tutti e 3 i sistemi…i primi due, solo long and long/short limit comprano alla barra successiva all’incrocio, at market successivamente.
Ho segnato con linee spesse blu dove avviene l’incrocio e quindi il livello che il prezzo che dovrebbe ritestare x entrare in posizione, con il cerchio dove il sistema entra in posizione (si vede dalle barre verde/rossa e frecce del backtest).
Massimo
Era dovuto al fatto che avevo preso come riferimento il prezzo della chiusura della candela in cui avveniuva l’incrocio, per cui entrava sempre all’apertura della successiva. Adesso ho variato il prezzo d’entrata sulla Media veloce, mi sembra vada meglio, prova
DEFPARAM CumulateOrders = false
ONCE PositionSize = 1
ONCE CrossingUP = 0 //Inizializzare CROSSING UP a 0
ONCE CrossingDN = 0 //Inizializzare CROSSING DOWN a 0
ONCE CrossingPrice = 0
ONCE MaxLookBack = 5 //Numero di candele da esaminare per il minimo da usare...
ONCE StopLoss = 0 //...come Stop Loss dopo l'incrocio
ONCE BarID = 0 //Numero della candela in cui avviene l'incrocio
ONCE MaxWaitingBars = 30 //Numero max. di candela da attendere dopo l'incrocio
ONCE MaxCandles = 60 //Uscire dopo questo numero di candele
ONCE AvgType = 2 //2 = wma (media ponderata)
ONCE Bar2Elapse = 5 //Numero di barre di attesa prima di entrare
IF (Barindex - Tradeindex) >= MaxCandles THEN //Chiudere la posizione dopo un certo numero di candele
SELL AT MARKET
EXITSHORT AT MARKET
ENDIF
IF OnMarket OR ((BarIndex - BarID) >= MaxWaitingBars) THEN
CrossingDN = 0
CrossingUP = 0 //Resettare le variabili al valore di default dopo...
StopLoss = 0 //...l'apertura di un'operazione oppure dopo un certo...
BarID = 0 //...numero di candele
CrossingPrice = 0
ENDIF
FastEma = Average[4,AvgType](close) //4
SlowEma = Average[12,AvgType](close)//12
// LONG
IF FastEma CROSSES OVER SlowEma AND (NOT CrossingUP) THEN
CrossingDN = 0 //Azzerare eventuali precedenti incroci ribassisti
CrossingUP = 1 //Settare CROSSING ad 1 per segnalare l'avvenuto incrocio
StopLoss = lowest[MaxLookBack](low) //Salvare il prezzo di Stop Loss
BarID = Barindex //Salvare il numero di candela dell'incrocio
CrossingPrice = FastEma //close //Prezzo di entrata (ordine pendente)
ENDIF
IF CrossingUP AND (BarIndex - BarID) >= Bar2Elapse THEN
SET Stop Loss StopLoss
SET Target Profit (CrossingPrice + (CrossingPrice - StopLoss)) //TP = SL
//BUY PositionSize CONTRACTS AT CrossingPrice LIMIT //Ordine pendente sul ritracciamento
IF close >= CrossingPrice THEN
BUY PositionSize CONTRACTS AT MARKET //Ordine a mercato sul ritracciamento
ENDIF
ENDIF
// SHORT
IF FastEma CROSSES UNDER SlowEma AND (NOT CrossingDN) THEN
CrossingUP = 0 //Azzerare eventuali precedenti incroci rialzisti
CrossingDN = 1 //Settare CROSSING ad 1 per segnalare l'avvenuto incrocio
StopLoss = highest[MaxLookBack](high)//Salvare il prezzo di Stop Loss
BarID = Barindex //Salvare il numero di candela dell'incrocio
CrossingPrice = FastEma //close //Prezzo di entrata (ordine pendente)
ENDIF
IF CrossingDN AND (BarIndex - BarID) >= Bar2Elapse THEN
SET Stop Loss StopLoss
SET Target Profit (CrossingPrice + (CrossingPrice - StopLoss)) //TP = SL
//SELLSHORT PositionSize CONTRACTS AT CrossingPrice LIMIT //Ordine pendente sul ritracciamento
IF close <= CrossingPrice THEN
SELLSHORT PositionSize CONTRACTS AT MARKET //Ordine a mercato sul ritracciamento
ENDIF
ENDIF
//GRAPH CrossingPrice
//GRAPH StopLoss
//GRAPH (CrossingPrice + (CrossingPrice - StopLoss))
//GRAPH Crossing
//GRAPH BarID
Se tu preferissi fare l’pentrata sul prezzo della media lenta basta la riga dove c’è
CrossingPrice = FastEma
con
CrossingPrice = SlowEma
Buy limite al prezzo d'incrocio di medie mobili.
This topic contains 17 replies,
has 3 voices, and was last updated by maximus78
8 years, 3 months ago.
| Forum: | ProOrder: Trading Automatico & Backtesting |
| Language: | Italian |
| Started: | 10/08/2017 |
| Status: | Active |
| Attachments: | 4 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.