Gestione del denaro Problem - % fisso e dimensione del lotto
5 risposte
Julianrob
9 anni fa #113227
Ciao Mark,
Innanzitutto grazie mille per l'aiuto che mi avete dato finora. Sembra che io abbia difficoltà con la gestione del denaro con questo EA - sto usando MM predefiniti nelle mie regole di strategia.
Nella sezione della strategia ho le variabili per la dimensione del lotto e la percentuale fissa definita come valore doppio, ma quando eseguo questo EA su AUDUSD o EURUSD con una dimensione del lotto di 0,10, apre sempre le operazioni con una dimensione del lotto di 0,01.
Quando imposto AccountRiskPerTrade a 5, si aprono dimensioni di negoziazione di 5 lotti per ogni operazione, ma non si compongono i guadagni. Si prega di fare riferimento alle immagini allegate.
Per lo stop loss e il take profit, utilizzo valori fissi impostati come variabili, a cifra singola e di tipo int (intero).
Qualsiasi aiuto sarebbe fantastico, grazie.
Mark Fric
9 anni fa #128549
Salve,
In base alla scelta del MM, i lotti vengono calcolati dinamicamente in base allo SL e all'equity del conto corrente. Il LotSize viene utilizzato solo se il MM non può essere calcolato, di solito quando non è stato definito uno SL per l'ordine.
Ma se il rischio per operazione è impostato su 0, questo non ha senso.
Se si desidera utilizzare una dimensione fissa del lotto, si deve utilizzare "Nessuna gestione del denaro", altrimenti si deve impostare la quantità di % del conto che si desidera rischiare in ogni operazione.
Il problema della dimensione calcolata è che la variabile LottiDecimali è impostata su 2, il che significa che arrotonderà i lotti a due numeri decimali.
Esso non compone i guadagni - funzionerà quando imposterete il rischio per operazione a un valore non nullo.
Marchio
Architetto StrategyQuant
Julianrob
9 anni fa #128585
Grazie Mark, ho capito.
loonet
9 anni fa #129589
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.
Ho quindi cercato di correggere la funzione EAW sqMMFixedRisk sostituendola con una mia funzione che riporto qui di seguito:
//------ 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); if (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); } //--------------------------------------------------------------------
Utilizzandolo si può anche evitare di impostare il parametro Lotti Decimali e il Tasso di cambio della valuta base Parametri MM che diventano ininfluenti.
geektrader
9 anni fa #129667
SQ sembra avere qualche problema con il corretto dimensionamento della posizione in relazione a StopLoss / Valuta di base del conto e alla coppia negoziata, in quanto tutti questi fattori devono essere presi in considerazione per calcolare correttamente la dimensione del lotto da negoziare. Per aiutarvi, ecco il mio codice che ho perfezionato e che uso da 5 anni in MT4. Tiene conto dello SL, della valuta in cui è nominata la coppia e della valuta in cui è nominato il conto negoziato, in modo da perdere sempre l'% corretto se viene colpito uno SL. Inoltre controlla le dimensioni minime e massime consentite per i lotti e le fasi dei lotti e il margine richiesto e si assicura che il margine venga utilizzato solo fino a 73% quando viene colpito uno SL completo, in modo da non essere fermati a causa di un margine troppo basso (che sarebbe comunque un folle overtrading). Forse Mark può adattarlo per SQ.
Basta passargli lo SL e il numero massimo di operazioni che si aprono successivamente (io lo uso per fare una media e quando voglio perdere solo un importo specifico su tutte queste operazioni - per il trading diretto basta passargli "1"):
double GetLotSize(double TotalRiskPercentageAllTrades, double Stop_Loss, int MaximumTrades) { int DigitsMulti = 1; se (Digits == 5 || Digits == 3) DigitsMulti = 10; Stop_Loss = Stop_Loss * DigitsMulti; double divided_by = 0; double Lotti = 0; se (TotalRiskPercentageAllTrades != 0) { double RiskBalance = AccountBalance() * (TotalRiskPercentageAllTrades / 100.0); se (MarketInfo(Symbol(), MODE_TICKSIZE) != 0 && Stop_Loss != 0) divided_by = MarketInfo(Symbol(), MODE_TICKVALUE) * (MarketInfo(Symbol(), MODE_POINT) / MarketInfo(Symbol(), MODE_TICKSIZE)); se (divided_by == 0) Print("Gestione del denaro temporaneamente disabilitata a causa della divisione per: ", divided_by); altrimenti Lotti = RiskBalance / divided_by / Stop_Loss; } Lotti = Lotti / MaximumTrades; Lotti = MathMax(Lotti, MarketInfo(Symbol(), MODE_MINLOT)); Lotti = MathMin(Lotti, MarketInfo(Symbol(), MODE_MAXLOT)); se (MarketInfo(Symbol(), MODE_MARGINREQUIRED) != 0) Lotti = MathMin(Lotti, AccountEquity() / MarketInfo(Symbol(), MODE_MARGINREQUIRED) * 0.73); Lotti = MathCeil(Lotti / MarketInfo(Symbol(), MODE_LOTSTEP)) * MarketInfo(Symbol(), MODE_LOTSTEP); Lotti = MathMax(Lotti, MarketInfo(Symbol(), MODE_MINLOT)); return(Lotti); }
Julianrob
9 anni fa #129673
Grazie per le informazioni.
Ho scoperto come abilitare sia il rischio di gestione del denaro % che l'opzione di dimensione del lotto fisso nelle variabili nella codifica dell'EA. La semplice soluzione che ho utilizzato è stata quella di creare una variabile con valore booleano true/false e chiamarla "UseRiskPercent".
Poi ho una regola che apre l'operazione utilizzando il rischio di gestione del denaro% solo se la variabile UseRiskPercent è impostata su TRUE. Una seconda regola, che è un clone della prima, dice che se UseRiskPercent è impostato su false, per l'operazione si usa invece un lotto fisso.
Giuliano
Stai visualizzando 5 risposte - da 1 a 5 (di 5 totali)