Risposta

ERRORE DI CALCOLO NELLA GESTIONE DEL DENARO

13 risposte

loonet

Abbonato, bbp_partecipante, comunità, cliente, sq-ultimate, 15 risposte.

Visita il profilo

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.

risultato della compravendita.jpg

 
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.

 

0

JS17

Cliente, bbp_partecipante, comunità, 73 risposte.

Visita il profilo

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 🙂

0

loonet

Abbonato, bbp_partecipante, comunità, cliente, sq-ultimate, 15 risposte.

Visita il profilo

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)

0

Mark Fric

Amministratore, sq-ultimate, 2 risposte.

Visita il profilo

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

0

loonet

Abbonato, bbp_partecipante, comunità, cliente, sq-ultimate, 15 risposte.

Visita il profilo

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.

0

JS17

Cliente, bbp_partecipante, comunità, 73 risposte.

Visita il profilo

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

0

Mark Fric

Amministratore, sq-ultimate, 2 risposte.

Visita il profilo

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

0

JS17

Cliente, bbp_partecipante, comunità, 73 risposte.

Visita il profilo

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"?

0

tomas262

Amministratore, sq-ultimate, 2 risposte.

Visita il profilo

9 anni fa #130205

Il valore del campo % deve essere maggiore di zero, ad esempio 0,1, 1 ecc.

0

NirvanaFx

Cliente, bbp_partecipante, comunità, 5 risposte.

Visita il profilo

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.

0

tartaruga

Abbonato, bbp_partecipante, comunità, 6 risposte.

Visita il profilo

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

 

0

tomas262

Amministratore, sq-ultimate, 2 risposte.

Visita il profilo

8 anni fa #131257

Ok, potresti allegare il file SQW?

0

och

Abbonato, bbp_partecipante, comunità, 2 risposte.

Visita il profilo

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

0

Mark Fric

Amministratore, sq-ultimate, 2 risposte.

Visita il profilo

8 anni fa #133753

Ciao Olivier,

 

hai ragione, c'è questo errore. Domani rilascerò un aggiornamento con una correzione.

Marchio
Architetto StrategyQuant

0

Stai visualizzando 13 risposte - da 1 a 13 (di 13 totali)