Precisa de uma fórmula de tamanho LOT de gerenciamento de dinheiro baseada em SL e Risco de Conta! - página 4

 
darelco:

... nesta parte do código é um problema de nova compilação (erro ---> 'MarketInfo' - tipo de expressão de mudança ilegal) talvez tudo estivesse bem até a atualização para MT4 build 600+ ... mas desde então não funciona mais.

Então, você poderia por favor postar uma versão mais nova ... se, é claro, você ainda estiver por perto.


Eu acho que se você mudar

                switch ( MarketInfo( strSymbol, MODE_DIGITS ) )

para

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

Ele irá compilar ok

 
darelco:

... nesta parte do código é um problema de nova compilação (erro ---> 'MarketInfo' - tipo de expressão de mudança ilegal) talvez tudo estivesse bem até a atualização para MT4 build 600+ ... mas desde então não funciona mais.

Então, você poderia por favor postar uma versão mais nova ... se, é claro, você ainda estiver por perto.


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

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

"Os valores de Expressão e de Parâmetros só podem ser os valores do tipo int. A Expressão pode ser uma constante, uma variável, uma chamada de função ou uma expressão. Cada 'caso' de variação pode ser marcado por uma constante inteira, uma constante de caráter ou uma expressão constante. Uma expressão constante não pode incluir variáveis ou chamadas de função".

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

Mais uma vez, você encontra uma solução mais simples e melhor.
 
GumRai:
Mais uma vez, você encontra uma solução mais simples e melhor.
Todos nós aprendemos uns com os outros.
 
                int dig=MarketInfo( strSymbol, MODE_DIGITS ) ;
                switch ( dig )
ou
   switch((int)MarketInfo(strSymbol,MODE_DIGITS))
ou o estilo do objeto (trabalhos com exceção dos moldes com ponteiro)
   switch( int(MarketInfo(strSymbol,MODE_DIGITS)) )
 

Em minhas diferentes EA, é escrito assim:

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: Em minhas diferentes EA, é escrito assim:

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


  1. A margem livre não tem nada a ver com seu risco. São seus corretores que param de perder (50% de sua conta).
  2. Você deve ter lido o tópico inteiro e não deve ter sido afixado. Resumido:
    • Você coloca a parada onde ela precisa estar - onde a razão para o comércio não é mais válida. Por exemplo, a troca de um suporte de apoio, a parada vai abaixo do suporte.
    • Saldo da conta *%/100 = RISCO = OrderLots * (|OrderOpenPrice -OrderStopLoss| * DeltaPerLot+ CommissionPerLot) (Nota OOP-OSL inclui o SPREAD, e DeltaPerLot está normalmente em torno de $10/pip, mas leva em conta as taxas de câmbio do parvs. moeda de sua conta).
    • NÃO use TickValue por si só - DeltaPerLot
    • Você deve normalizar os lotes de forma proactiva e verificar contra mínimo e máximo.
    • Você também deve verificar o FreeMargin para evitar parar