Serve una formula di moneymanagement LOT size basata su SL e rischio del conto! - pagina 4

 
darelco:

... in questa parte di codice è un problema con la nuova compilazione (errore ---> 'MarketInfo' - tipo di espressione switch illegale) forse era tutto OK fino all'aggiornamento a MT4 build 600+ ... ma da allora non funziona più.

Quindi, potresti per favore postare qualche versione più recente ... se ovviamente sei ancora in giro.


Penso che se si cambia

                switch ( MarketInfo( strSymbol, MODE_DIGITS ) )

a

                int dig=MarketInfo( strSymbol, MODE_DIGITS ) ;
                switch ( dig )

Si compila bene

 
darelco:

... in questa parte di codice c'è un problema con la nuova compilazione (errore ---> 'MarketInfo' - tipo di espressione switch illegale) forse era tutto OK fino all'aggiornamento a MT4 build 600+ ... ma da allora non funziona più.

Quindi, potresti per favore postare qualche versione più recente ... se ovviamente sei ancora in giro.


   switch((int)MarketInfo(strSymbol,MODE_DIGITS))
 

https://book.mql4.com/operators/switch

"I valori di Expression e di Parameters possono essere solo i valori di tipo int. L'espressione può essere una costante, una variabile, una chiamata di funzione o un'espressione. Ogni variazione 'caso' può essere contrassegnata da una costante intera, una costante di carattere o un'espressione costante. Un'espressione costante non può includere variabili o chiamate di funzione".

 
angevoyageur:
   switch((int)MarketInfo(strSymbol,MODE_DIGITS))

Ancora una volta, hai trovato una soluzione più semplice e migliore.
 
GumRai:
Ancora una volta, hai trovato una soluzione più semplice e migliore.
Tutti impariamo l'uno dall'altro.
 
                int dig=MarketInfo( strSymbol, MODE_DIGITS ) ;
                switch ( dig )
o
   switch((int)MarketInfo(strSymbol,MODE_DIGITS))
o lo stile dell'oggetto (funziona tranne che per i cast di puntatori)
   switch( int(MarketInfo(strSymbol,MODE_DIGITS)) )
 

Nel mio diverso EA, si scrive così:

extern double      Risk_Percent                   = 3;
extern int         StopLoss                       = 50;

//+------------------------------------------------------------------+
  {
   double lot = MathCeil(AccountFreeMargin() * Risk_Percent / 1000) / 100;
   if(lot<MarketInfo(Symbol(),MODE_MINLOT))lot=MarketInfo(Symbol(),MODE_MINLOT);
   if(lot>MarketInfo(Symbol(),MODE_MAXLOT))lot=MarketInfo(Symbol(),MODE_MAXLOT);
   return (MathMin(NormalizeDouble(lot,PipMultiplier),MaxLotSize));
  }
//+------------------------------------------------------------------+
   if(_Digits==5 || _Digits==3)PipMultiplier=10;
   else PipMultiplier=1;
   slippage=Slippage*PipMultiplier;
   if(_Digits<4)
     {
      point=0.01;
     }
   else
     {
      point=0.0001;
     }
   return(0);
//+------------------------------------------------------------------+

 
Sebastien Pelle: Nel mio diverso EA, è scritto così:

   double lot = MathCeil(AccountFreeMargin() * Risk_Percent / 1000) /


  1. Il margine libero non ha niente a che fare con il tuo rischio. È lo stop loss del tuo broker (50% del tuo conto).
  2. Avresti dovuto leggere l'intero thread e non postare. Riassunto:
    • Posizionate lo stop dove deve essere - dove la ragione del commercio non è più valida. Per esempio, facendo trading sul rimbalzo di un supporto, lo stop va sotto il supporto.
    • Saldo del conto * percent/100 = RISCHIO = OrderLots * (|OrderOpenPrice - OrderStopLoss| * DeltaPerLot+ CommissionPerLot) (Nota OOP-OSL include lo SPREAD, e DeltaPerLot è di solito circa $10/pip ma tiene conto dei tassi di cambio della coppia contro la valuta del tuo conto).
    • NON usare TickValue da solo - DeltaPerLot
    • Devi normalizzare i lotti in modo appropriato e controllare il min e max.
    • Devi anche controllare FreeMargin per evitare lo stop out
Motivazione: