ERRORE DI CALCOLO NELLA GESTIONE DEL DENARO
13 risposte
loonet
9 anni fa #113539
Ciao Mark, sono Riccardo di Sapienza Finanziaria.
Vorrei farvi notare che, a mio parere, il MAE ha un bug nel calcolo del rischio di gestione del denaro con % fisso del capitale del conto.
Per il sistema di trading che sto pianificando ho fissato un rischio per operazione di 1%
Provate a guardare ad esempio cosa succede nel trade # 79 che ho evidenziato nell'immagine allegata.
Prima dell'operazione #79 sul mio conto ho un saldo di 21680 USD e ho impostato un rischio per operazione di 1%.
Significa che potrei perdere circa 217 dollari se prendo l'SL.
Il trade # 79 è un'operazione BUY con prezzo di entrata a 1,3703 e SL a 1,3640.
L'operazione va a mercato con 3:40 lotti, quindi ogni pip è di 34 USD.
La transazione si chiude con una perdita di 1241 pip (= 63 x 34).
In realtà per rispettare un rischio per operazione di 1%, il sistema di trading avrebbe dovuto aprire l'operazione con 0,34 lotti e non con 3,40 lotti.
Sono un programmatore MQL e ho cercato di correggere la funzione sqMMFixedRisk di EAW sostituendola con una mia funzione che riporto qui sotto per aiutarvi a risolvere il bug:
//------ sqMMFixedRisk corretto da Riccardo double sqMMFixedRisk (int orderMagicNumber, int orderType) { double LotSize=0; double _riskInPercent = RiskPercent; double _maximumLots = 5,0; double slSize = sqMMGetOrderStopLossDistance(orderMagicNumber, orderType) * gPointPow; double riskPerTrade=AccountBalance() *(_riskInPercent/100); se(slSize 0 && TickValue>0) { LotSize = MarketInfo(Symbol(),MODE_TICKSIZE) * riskPerTrade / (slSize * TickValue * MarketInfo(Symbol(),MODE_POINT) ); int err=GetLastError(); if(err==4013) { //ERR_ZERO_DIVIDE Verbose("Errore: divisione per zero: StopLoss:",slSize," TickValue:",TickValue," LotSize:",LotSize); return(-1); } } //--- Gestione di MAXLOT e MINLOT double Smallest_Lot = MarketInfo(Symbol(), MODE_MINLOT); double Largest_Lot = MarketInfo(Symbol(), MODE_MAXLOT); se (LotSize Largest_Lot) LotSize = Largest_Lot; if(LotSize > _maximumLots) { LotSize = _maximumLots; } //-------------------------------------------- //--- LotSize arrotondato rispetto al LOTSTEP del broker if(MarketInfo(Symbol(),MODE_LOTSTEP)==1) { LotSize=NormalizzaDouble(LotSize,0); } if(MarketInfo(Symbol(),MODE_LOTSTEP)==0.1) { LotSize=NormalizzaDoppio(LotSize,1); } se(MarketInfo(Symbol(),MODE_LOTSTEP)==0.01) { LotSize=NormalizzaDoppio(LotSize,2); } se(MarketInfo(Symbol(),MODE_LOTSTEP)==0.001) { LotSize=NormalizzaDoppio(LotSize,3); } //-------------------------------------------- return (LotSize); } //--------------------------------------------------------------------
Utilizzando tale funzione è anche possibile evitare di impostare il parametro Lotti Decimali e il Tasso di cambio della valuta base Parametri MM che diventeranno ininfluenti.
JS17
9 anni fa #129896
Riccardo
Grazie per questo, ma ho alcune domande da porre
1. Quale parte del codice del MAE deve essere eliminata?
2. È necessario dichiarare qualche nuova variabile perché il codice funzioni?
Grazie 🙂
loonet
9 anni fa #130005
1. È sufficiente sostituire la funzione sqMMFixedRisk con il codice che ho postato.
2. Non è necessario dichiarare alcuna variabile aggiuntiva (si tenga conto che con la mia funzione la variabile Lotti Decimali e il Tasso di cambio della valuta base I parametri di gestione del denaro di Ea Wizard diventano ininfluenti)
Mark Fric
9 anni fa #130015
Ciao Riccardo,
Mi scusi se mi ci vuole troppo tempo per rispondere. Ho già esaminato la vostra funzione e l'ho testata, ma è molto diversa dalla nostra funzione e non ho avuto il tempo di testarla a fondo in tutti gli ambienti, compreso il trading di CFD, ecc.
Mi piacerebbe farlo in qualsiasi momento, ma sono sempre troppo occupato con cose inaspettate.
Marchio
Architetto StrategyQuant
loonet
9 anni fa #130020
Grazie Marc,
Lo uso fondamentalmente per il trading sul Forex.
Ho confrontato il calcolo tra la funzione originale e quella modificata.
La funzione originale mi dà uno strano comportamento nel calcolo dei lotti: in alcuni casi sembra che non tenga conto della percentuale di rischio che ho fissato.
Se vuoi posso inviarti un esempio dei risultati del backtest ottenuti utilizzando entrambe le funzioni.
JS17
9 anni fa #130049
Riccardo,
Grazie per la risposta e la spiegazione - dato che Mark ha risposto ora aspetterò che finisca i suoi test - grazie ancora
Mark Fric
9 anni fa #130154
L'ho testato e tutto sembra funzionare correttamente, quindi ho appena rilasciato un aggiornamento automatico dell'EA Wizard che contiene la correzione del Money Management di Riccardo.
Marchio
Architetto StrategyQuant
JS17
9 anni fa #130163
Posso chiedere che se quando utilizzo questa funzione inserisco 0 nel rischio %, la funzione utilizzerà il valore inserito in "lotti se nessun MM"?
tomas262
9 anni fa #130205
Il valore del campo % deve essere maggiore di zero, ad esempio 0,1, 1 ecc.
NirvanaFx
8 anni fa #130401
Ho provato a utilizzare il Rischio in % e, qualunque cosa provi, qualunque percentuale inserisca nel campo (ad esempio, 1,20,.06. .3, ecc.) è l'esatta fisso dimensione del lotto che viene scambiato. Non varia affatto la dimensione del lotto. Non si imposta di default sui lotti se non c'è un MM o qualcosa del genere e ho lo stoploss per il calcolo del rischio. Si tratta di un bug che qualcun altro ha riscontrato di recente? Ho anche l'ultimo aggiornamento.
tartaruga
8 anni fa #131241
Ciao Marc e Tomas,
Questo sembra il thread più simile a quello che sto vivendo.
Viene impostato il MM a % fisso del capitale proprio e lo Stop Loss globale. Tutte le operazioni sono impostate per utilizzare queste impostazioni.
Nel TEster in MT4, tutte le dimensioni dei lotti sono predefinite a 0,01 lotti su EURUSD.
In allegato il codice che sto utilizzando. Per favore, fatemi sapere se riuscite a vedere qualcosa.
Sto usando MT4 Build 840
Grazie e saluti
Tim
tomas262
8 anni fa #131257
Ok, potresti allegare il file SQW?
och
8 anni fa #133734
Salve,
Non sono sicuro che questo sia il posto giusto per postare questa osservazione, ma credo che ci sia anche un errore nel calcolo del lotto StrategyQuant (v3.8.1):
Riga 14 : if(MathMod(lotMM*100, lotStep*100) > 0) {
dovrebbe essere
se(MathMod(lotMM1*100, lotStep*100) > 0) {
double computeMMFromRiskPerTrade(double riskPerTrade, double slSize) { se(slSize 0) { lotMM = lotMM1 - MathMod(lotMM1, lotStep); } altrimenti { lotMM = lotMM1; } lotMM = NormalizeDouble( lotMM, LotsDecimals); se(MarketInfo(Symbol(), MODE_LOTSIZE)==10000.0) lotMM=lotMM*10.0 ; lotMM=NormalizzaDoppio(lotMM,LottiDecimali); //Log("Calcolo dei lotti, rischio: ", riskPerTrade, ", lotMM1: ", lotMM1, ", lotStep: ", lotStep, ", lotti: ", lotMM); double Smallest_Lot = MarketInfo(Symbol(), MODE_MINLOT); double Largest_Lot = MarketInfo(Symbol(), MODE_MAXLOT); se (lotMM Largest_Lot) lotMM = Largest_Lot; if(lotMM > MaximumLots) { lotMM = MaximumLots; } //Log("Dimensione SL: ", slSize, ", LotMM: ", lotMM); return (lotMM); }
Saluti,
och
Mark Fric
8 anni fa #133753
Ciao Olivier,
hai ragione, c'è questo errore. Domani rilascerò un aggiornamento con una correzione.
Marchio
Architetto StrategyQuant
Stai visualizzando 13 risposte - da 1 a 13 (di 13 totali)