ProRealCode - Trading & Coding with ProRealTime™
Ciao Roberto, ho provato un tuo codice per la determinazione del massimo numero di operazioni al giorno che mi piace come è scritto, ma, a volte, dà dei risultati differenti (e penso sbagliati) rispetto ad un codice classico che uso (ma che mi piace di meno come è scritto) per ottenere lo stesso risultato.
Il tuo nuovo codice lo ho ripreso dal seguente link [rif: 191639]: https://www.prorealcode.com/topic/help-coding-breakout-strategy/
Provando entrambi i codici su un TS di prova danno risultato differenti [ test su Nasdaq cfd – 10 minuti – 100k]. Sai quale può essere il motivo?
Ecco i codici con il TS di base:
PROVA A
if intradayBarIndex=0 then
count=0
endif
if ( (not onMarket and onMarket[1] and not onMarket[2]) or (tradeIndex(1)=tradeIndex(2) and tradeIndex(1)=barIndex[1] and tradeIndex(1)>0) or (not onMarket and onMarket[1])) then
count = count+1
endif
//--------------------------------------------------------------
if close crosses over average[50,0](close) and not onMarket and count < 3 then
buy 1 contract at market
endif
set target pProfit 100
set stop pLoss 100
PROVA B (tuo nuovo codice)
once maxTrades = 3
once tally = 0
if intradayBarIndex = 0 then
tally = 0
endif
newTrades = (onMarket and not onMarket[1]) or (longOnMarket and shortOnMarket[1]) or (longOnMarket[1] and shortOnMarket) or ((not OnMarket and not onMarket[1]) and (strategyProfit <> strategyProfit[1]))
if newTrades then
tally = tally +1
endif
//--------------------------------------------------------------
if close crosses over average[50,0](close) and not onMarket and tally < maxTrades then
buy 1 contract at market
endif
set target pProfit 100
set stop pLoss 100
Ed ecco il test:
Verificando le date e gli orari d’apertura, magari esportando il risultato su eXcel, in quali candele ci sono le differenze?
Ciao Roberto, ho trovato alcune operazioni discordanti.
1) In tutti i casi è lo snippet classico (prova A) che salta un operazione senza che sia chiaro il motivo. Ti segnalo alcune operazioni cosi puoi controllare il motivo del malfunzionamento: 21 settembre 2021 – 28 gennaio 2022 – 19 aprile 2022 (vd immagine A ed A2)
2) [Il 28 gennaio 2022 ( vd immagine B) poi c’è un operazione visibile nel probacktest ed anche nell’indicatore delle posizioni, ma non segnalata da nessuno dei due codici (e non presente quindi nel listato delle operazioni)
In merito alla prova A:
Le differenze sono dovute al fatto che il codice A fa una verifica diversa, quindi non tiene conto del fatto che un’operazione sia iniziata il giorno prima, mentre il codice B fa una verifica appena entrato a mercato, quindi se è del giorno precedente non influisce sul giorno successivo in quanto tu azzeri il conteggio con la prima barra del giorno dopo.
Per ottenere lo stesso risultato (non in senso finanziario, solo per il controllo delle operazioni fatte), aggiungi questa riga all’inizio:
defparam flatafter = 220000
Grazie, Roberto, penso di utilizzare il tuo codice B. Mi piace di più come è scritto e preferisco che il conteggio sia interno ad ogni giornata senza mischiare i giorni.
Ciao Roberto, ho provato il tuo codice sul massimo numero di operazioni aggiornato e le nuove istruzioni di Nicolas. Su questo TS molto semplice sono equivalenti.
once maxTrades = 3 //maxNumberDailyTrades
once tally = 0
if intradayBarIndex = 0 then
tally = 0
endif
newTrades = (onMarket and not onMarket[1]) or (longOnMarket and shortOnMarket[1]) or (longOnMarket[1] and shortOnMarket) or ((not OnMarket and not onMarket[1]) and (strategyProfit <> strategyProfit[1])) or ((tradeIndex(1) = tradeIndex(2)) and (barIndex = tradeIndex(1)) and (barIndex > 0) and (strategyProfit = strategyProfit[1]))
if newTrades then
tally = tally +1
endif
//--------------------------------------------------------------------------------
if close crosses over average[50,0](close) and not longOnMarket and tally < maxTrades then
buy 1 contract at market
endif
set target pProfit 100
set stop pLoss 100
once maxOrders = 3
if intradayBarIndex = 0 then //reset orders count
ordersCount = 0
endif
if longTriggered then //check if an order has opened in the current bar
ordersCount = ordersCount + 1
endif
//--------------------------------------------------------------------------------
if close crosses over average[50,0](close) and not longOnMarket and ordersCount < maxOrders then
buy 1 contract at market
endif
set target pProfit 100
set stop pLoss 100
Devo dire grazie. Con un limite di ordini al giorno risolvi molti problemi nei mercati laterali.
Oltre al limite degli ordini, uso la massima perdita giornaliere e l’attesa tra un trade e l’altro.
Ho assemblato questi 3 snipper in uno complessivo che chiamo: cManagemente (da aggiungere alle tue condizioni di entrata).
Se ti interessa ecco un esempio (puoi chiaramente ottimizzare i parametri.
//----------------------------------------------------------------
maxDailyLoss = 200 //maxMonetaryDailyLoss
realPosition=positionPerf*positionPrice/pointSize*pointValue
once tradeAllowed = 1
if intradayBarIndex = 0 then
myProfit=strategyProfit
tradeAllowed = 1
endif
if (strategyProfit+realPosition) <= (myProfit-maxDailyLoss) then
tradeAllowed = 0
endif
//----------------------------------------------------------------------------------------------------------
once maxTrades = 5 //maxNumberDailyTrades
once tally = 0
if intradayBarIndex = 0 then
tally = 0
endif
newTrades = (onMarket and not onMarket[1]) or ((not onMarket and not onMarket[1]) and (strategyProfit <> strategyProfit[1])) or (longOnMarket and ShortOnMarket[1]) or (longOnMarket[1] and shortOnMarket) or ((tradeIndex(1) = tradeIndex(2)) and (barIndex = tradeIndex(1)) and (barIndex > 0) and (strategyProfit = strategyProfit[1]))
if newTrades then
tally = tally +1
endif
//-------------------------------------------------------------------------------------------------------
once barCount = 0 //barsToWaitAfterTrade
waitingBars = 10
once tradeCount = 1
newTrades = (onMarket and not onMarket[1]) or ((not onMarket and not onMarket[1]) and (strategyProfit <> strategyProfit[1])) or (longOnMarket and ShortOnMarket[1]) or (longOnMarket[1] and shortOnMarket) or ((tradeIndex(1) = tradeIndex(2)) and (barIndex = tradeIndex(1)) and (barIndex > 0) and (strategyProfit = strategyProfit[1]))
if newTrades then
tradeCount = 0
barCount = 0
endif
if not longOnMarket then
barCount = barCount + 1
endif
if barCount > waitingBars then
tradeCount = 1
endif
//**********************************************************************************************
cManagement = tradeAllowed and tally < maxTrades and barCount > waitingBars
//***********************************************************************************************
nella riga 35 meglio scrivere : if not onMarket then
@Mauro
È possibile che questo codice genera uno per 0 errori? Ho aggiunto questa variante al mio codice … backtest völlig in ordine, ma quando si avvia il messaggio di errore viene che un indicatore mostra un valore negativo.
//Max-Orders per Day
once maxOrdersL = maxiL
once maxOrdersS = maxiS
if intradayBarIndex = 0 then //reset orders count
ordersCountL = 0
ordersCountS = 0
endif
if longTriggered then //check if an order has opened in the current bar
ordersCountL = ordersCountL + 1
endif
if shortTriggered then //check if an order has opened in the current bar
ordersCountS = ordersCountS + 1
endif
//
Lo ho testato in questo TS di prova e funziona.
//S&P 500 - 15m - test: 50k
//-------------------------------
//Max-Orders per Day
once maxOrdersL = maxiL
once maxOrdersS = maxiS
if intradayBarIndex = 0 then //reset orders count
ordersCountL = 0
ordersCountS = 0
endif
if longTriggered then //check if an order has opened in the current bar
ordersCountL = ordersCountL + 1
endif
if shortTriggered then //check if an order has opened in the current bar
ordersCountS = ordersCountS + 1
endif
//
//-------------------------------------------------------------------------
if close crosses over average[50,0](close) and not onMarket and ordersCountL < maxOrdersL then
buy 1 contract at market
endif
if close crosses under average[50,0](close) and not onMarket and ordersCountS < maxOrdersS then
sellShort 1 contract at market
endif
//-----------------------------------------------------------------------
set target pProfit 100
set stop pLoss 50
Ok, ho trovato l’errore. Un valore inutilizzato nell’ottimizzatore è stato impostato su “0”.
Scusa, errore mio.
Grazie mille per il tuo post mauro.
lo snippet è interessante.
Ciao, mauro
Torno da voi perché sto cercando di integrare il vostro codice qui allegato se non sbaglio
Dalla linea 32 del mio algo, ma senza la condizione di media 50, non succede nulla cambiando i miei take profit e stop che sono 11 e 34 e un’operazione al giorno.
Se puoi, puoi farmi una copia di come la inseriresti nel mio codice. Grazie.
Mi dispiace, sono ancora nelle prime fasi di creazione del codice.
// Définition des paramètres du code
DEFPARAM CumulateOrders = False // Cumul des positions désactivé
// Annule tous les ordres en attente et ferme toutes les positions à l'heure "FLATAFTER"
DEFPARAM FLATAFTER = 173000
// Empêche le système de placer des ordres pour entrer sur le marché ou augmenter la taille d'une position avant l'heure spécifiée
noEntryBeforeTime = 153000
timeEnterBefore = time >= noEntryBeforeTime
// Empêche le système de placer des ordres pour entrer sur le marché ou augmenter la taille d'une position après l'heure spécifiée
noEntryAfterTime = 173000
timeEnterAfter = time < noEntryAfterTime
// Empêche le système de placer de nouveaux ordres sur les jours de la semaine spécifiés
daysForbiddenEntry = OpenDayOfWeek = 6 OR OpenDayOfWeek = 0
// Conditions pour ouvrir une position acheteuse
indicator1 = RSI[14](close)
c1 = (indicator1 CROSSES OVER 30)
IF c1 AND timeEnterBefore AND timeEnterAfter AND not daysForbiddenEntry THEN
BUY 1 CONTRACT AT MARKET
ENDIF
// Conditions pour ouvrir une position en vente à découvert
indicator2 = RSI[14](close)
c2 = (indicator2 CROSSES UNDER 70)
IF c2 AND timeEnterBefore AND timeEnterAfter AND not daysForbiddenEntry THEN
SELLSHORT 1 CONTRACT AT MARKET
ENDIF
once maxOrders = 1
if intradayBarIndex = 0 then //reset orders count
ordersCount = 0
endif
if longTriggered then //check if an order has opened in the current bar
ordersCount = ordersCount + 1
endif
// Stops et objectifs
SET STOP pTRAILING 31
SET TARGET pPROFIT 11
IF Not OnMarket THEN
//
// when NOT OnMarket reset values to default values
//
TrailStart = 5 //30 Start trailing profits from this point
BasePerCent = 0.000 //20.0% Profit percentage to keep when setting BerakEven
StepSize = 10 //10 Pip chunks to increase Percentage
PerCentInc = 0.100 //10.0% PerCent increment after each StepSize chunk
BarNumber = 10 //10 Add further % so that trades don't keep running too long
BarPerCent = 0.100 //10% Add this additional percentage every BarNumber bars
RoundTO = -0.5 //-0.5 rounds always to Lower integer, +0.4 rounds always to Higher integer, 0 defaults PRT behaviour
PriceDistance = 7 * pipsize //7 minimun distance from current price
y1 = 0 //reset to 0
y2 = 0 //reset to 0
ProfitPerCent = BasePerCent //reset to desired default value
TradeBar = BarIndex
ELSIF LongOnMarket AND close > (TradePrice + (y1 * pipsize)) THEN //LONG positions
//
// compute the value of the Percentage of profits, if any, to lock in for LONG trades
//
x1 = (close - tradeprice) / pipsize //convert price to pips
IF x1 >= TrailStart THEN // go ahead only if N+ pips
Diff1 = abs(TrailStart - x1) //difference from current profit and TrailStart
Chunks1 = max(0,round((Diff1 / StepSize) + RoundTO)) //number of STEPSIZE chunks
ProfitPerCent = BasePerCent + (BasePerCent * (Chunks1 * PerCentInc)) //compute new size of ProfitPerCent
// compute number of bars elapsed and add an additionl percentage
// (this percentage is different from PerCentInc, since it's a direct percentage, not a Percentage of BasePerCent)
// (if BasePerCent is 20% and this is 10%, the whole percentage will be 30%, not 22%)
BarCount = BarIndex - TradeBar
IF BarCount MOD BarNumber = 0 THEN
ProfitPerCent = ProfitPerCent + BarPerCent
ENDIF
//
ProfitPerCent = max(ProfitPerCent[1],min(100,ProfitPerCent)) //make sure ProfitPerCent doess not exceed 100%
y1 = max(x1 * ProfitPerCent, y1) //y1 = % of max profit
ENDIF
ELSIF ShortOnMarket AND close < (TradePrice - (y2 * pipsize)) THEN //SHORT positions
//
// compute the value of the Percentage of profits, if any, to lock in for SHORT trades
//
x2 = (tradeprice - close) / pipsize //convert price to pips
IF x2 >= TrailStart THEN // go ahead only if N+ pips
Diff2 = abs(TrailStart - x2) //difference from current profit and TrailStart
Chunks2 = max(0,round((Diff2 / StepSize) + RoundTO)) //number of STEPSIZE chunks
ProfitPerCent = BasePerCent + (BasePerCent * (Chunks2 * PerCentInc)) //compute new size of ProfitPerCent
// compute number of bars elapsed and add an additionl percentage
// (this percentage is different from PerCentInc, since it's a direct percentage, not a Percentage of BasePerCent)
// (if BasePerCent is 20% and this is 10%, the whole percentage will be 30%, not 22%)
BarCount = BarIndex - TradeBar
IF BarCount MOD BarNumber = 0 THEN
ProfitPerCent = ProfitPerCent + BarPerCent
ENDIF
//
ProfitPerCent = max(ProfitPerCent[1],min(100,ProfitPerCent)) //make sure ProfitPerCent doess not exceed 100%
y2 = max(x2 * ProfitPerCent, y2) //y2 = % of max profit
ENDIF
ENDIF
IF y1 THEN //Place pending STOP order when y1 > 0 (LONG positions)
SellPrice = Tradeprice + (y1 * pipsize) //convert pips to price
//
// check the minimun distance between ExitPrice and current price
//
IF abs(close - SellPrice) > PriceDistance THEN
//
// place either a LIMIT or STOP pending order according to current price positioning
//
IF close >= SellPrice THEN
SELL AT SellPrice STOP
ELSE
SELL AT SellPrice LIMIT
ENDIF
ELSE
//
//sell AT MARKET when EXITPRICE does not meet the broker's minimun distance from current price
//
SELL AT Market
ENDIF
ENDIF
IF y2 THEN //Place pending STOP order when y2 > 0 (SHORT positions)
ExitPrice = Tradeprice - (y2 * pipsize) //convert pips to price
//
// check the minimun distance between ExitPrice and current price
//
IF abs(close - ExitPrice) > PriceDistance THEN
//
// place either a LIMIT or STOP pending order according to current price positioning
//
IF close <= ExitPrice THEN
EXITSHORT AT ExitPrice STOP
ELSE
EXITSHORT AT ExitPrice LIMIT
ENDIF
ELSE
//
//ExitShort AT MARKET when EXITPRICE does not meet the broker's minimun distance from current price
//
EXITSHORT AT Market
ENDIF
ENDIF
Devi inserire l’istruzione anche nelle condizioni di acquisto e vendita.
// Définition des paramètres du code
DEFPARAM CumulateOrders = False // Cumul des positions désactivé
// Annule tous les ordres en attente et ferme toutes les positions à l'heure "FLATAFTER"
DEFPARAM FLATAFTER = 173000
// Empêche le système de placer des ordres pour entrer sur le marché ou augmenter la taille d'une position avant l'heure spécifiée
noEntryBeforeTime = 153000
timeEnterBefore = time >= noEntryBeforeTime
// Empêche le système de placer des ordres pour entrer sur le marché ou augmenter la taille d'une position après l'heure spécifiée
noEntryAfterTime = 173000
timeEnterAfter = time < noEntryAfterTime
// Empêche le système de placer de nouveaux ordres sur les jours de la semaine spécifiés
daysForbiddenEntry = OpenDayOfWeek = 6 OR OpenDayOfWeek = 0
// Conditions pour ouvrir une position acheteuse
indicator1 = RSI[14](close)
c1 = (indicator1 CROSSES OVER 30)
IF c1 AND timeEnterBefore AND timeEnterAfter AND not daysForbiddenEntry and ordersCountL < maxOrdersL THEN
BUY 1 CONTRACT AT MARKET
ENDIF
// Conditions pour ouvrir une position en vente à découvert
indicator2 = RSI[14](close)
c2 = (indicator2 CROSSES UNDER 70)
IF c2 AND timeEnterBefore AND timeEnterAfter AND not daysForbiddenEntry and ordersCountS < maxOrdersS THEN
SELLSHORT 1 CONTRACT AT MARKET
ENDIF
//---------------------------------------------------------------------------------------------------------------
//Max-Orders per Day
once maxOrdersL = 1 //long
once maxOrdersS = 1 //short
if intradayBarIndex = 0 then //reset orders count
ordersCountL = 0
ordersCountS = 0
endif
if longTriggered then //check if an order has opened in the current bar
ordersCountL = ordersCountL + 1
endif
if shortTriggered then //check if an order has opened in the current bar
ordersCountS = ordersCountS + 1
endif
//------------------------------------------------------------------------------------------------------------------------
// Stops et objectifs
SET STOP pTRAILING 31
SET TARGET pPROFIT 11
IF Not OnMarket THEN
//
// when NOT OnMarket reset values to default values
//
TrailStart = 5 //30 Start trailing profits from this point
BasePerCent = 0.000 //20.0% Profit percentage to keep when setting BerakEven
StepSize = 10 //10 Pip chunks to increase Percentage
PerCentInc = 0.100 //10.0% PerCent increment after each StepSize chunk
BarNumber = 10 //10 Add further % so that trades don't keep running too long
BarPerCent = 0.100 //10% Add this additional percentage every BarNumber bars
RoundTO = -0.5 //-0.5 rounds always to Lower integer, +0.4 rounds always to Higher integer, 0 defaults PRT behaviour
PriceDistance = 7 * pipsize //7 minimun distance from current price
y1 = 0 //reset to 0
y2 = 0 //reset to 0
ProfitPerCent = BasePerCent //reset to desired default value
TradeBar = BarIndex
ELSIF LongOnMarket AND close > (TradePrice + (y1 * pipsize)) THEN //LONG positions
//
// compute the value of the Percentage of profits, if any, to lock in for LONG trades
//
x1 = (close - tradeprice) / pipsize //convert price to pips
IF x1 >= TrailStart THEN // go ahead only if N+ pips
Diff1 = abs(TrailStart - x1) //difference from current profit and TrailStart
Chunks1 = max(0,round((Diff1 / StepSize) + RoundTO)) //number of STEPSIZE chunks
ProfitPerCent = BasePerCent + (BasePerCent * (Chunks1 * PerCentInc)) //compute new size of ProfitPerCent
// compute number of bars elapsed and add an additionl percentage
// (this percentage is different from PerCentInc, since it's a direct percentage, not a Percentage of BasePerCent)
// (if BasePerCent is 20% and this is 10%, the whole percentage will be 30%, not 22%)
BarCount = BarIndex - TradeBar
IF BarCount MOD BarNumber = 0 THEN
ProfitPerCent = ProfitPerCent + BarPerCent
ENDIF
//
ProfitPerCent = max(ProfitPerCent[1],min(100,ProfitPerCent)) //make sure ProfitPerCent doess not exceed 100%
y1 = max(x1 * ProfitPerCent, y1) //y1 = % of max profit
ENDIF
ELSIF ShortOnMarket AND close < (TradePrice - (y2 * pipsize)) THEN //SHORT positions
//
// compute the value of the Percentage of profits, if any, to lock in for SHORT trades
//
x2 = (tradeprice - close) / pipsize //convert price to pips
IF x2 >= TrailStart THEN // go ahead only if N+ pips
Diff2 = abs(TrailStart - x2) //difference from current profit and TrailStart
Chunks2 = max(0,round((Diff2 / StepSize) + RoundTO)) //number of STEPSIZE chunks
ProfitPerCent = BasePerCent + (BasePerCent * (Chunks2 * PerCentInc)) //compute new size of ProfitPerCent
// compute number of bars elapsed and add an additionl percentage
// (this percentage is different from PerCentInc, since it's a direct percentage, not a Percentage of BasePerCent)
// (if BasePerCent is 20% and this is 10%, the whole percentage will be 30%, not 22%)
BarCount = BarIndex - TradeBar
IF BarCount MOD BarNumber = 0 THEN
ProfitPerCent = ProfitPerCent + BarPerCent
ENDIF
//
ProfitPerCent = max(ProfitPerCent[1],min(100,ProfitPerCent)) //make sure ProfitPerCent doess not exceed 100%
y2 = max(x2 * ProfitPerCent, y2) //y2 = % of max profit
ENDIF
ENDIF
IF y1 THEN //Place pending STOP order when y1 > 0 (LONG positions)
SellPrice = Tradeprice + (y1 * pipsize) //convert pips to price
//
// check the minimun distance between ExitPrice and current price
//
IF abs(close - SellPrice) > PriceDistance THEN
//
// place either a LIMIT or STOP pending order according to current price positioning
//
IF close >= SellPrice THEN
SELL AT SellPrice STOP
ELSE
SELL AT SellPrice LIMIT
ENDIF
ELSE
//
//sell AT MARKET when EXITPRICE does not meet the broker's minimun distance from current price
//
SELL AT Market
ENDIF
ENDIF
IF y2 THEN //Place pending STOP order when y2 > 0 (SHORT positions)
ExitPrice = Tradeprice - (y2 * pipsize) //convert pips to price
//
// check the minimun distance between ExitPrice and current price
//
IF abs(close - ExitPrice) > PriceDistance THEN
//
// place either a LIMIT or STOP pending order according to current price positioning
//
IF close <= ExitPrice THEN
EXITSHORT AT ExitPrice STOP
ELSE
EXITSHORT AT ExitPrice LIMIT
ENDIF
ELSE
//
//ExitShort AT MARKET when EXITPRICE does not meet the broker's minimun distance from current price
//
EXITSHORT AT Market
ENDIF
ENDIF
Controllo codice maxTrades x day
This topic contains 19 replies,
has 5 voices, and was last updated by MauroPro
3 years, 8 months ago.
| Forum: | ProOrder: Trading Automatico & Backtesting |
| Language: | Italian |
| Started: | 05/07/2022 |
| Status: | Active |
| Attachments: | 6 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.