TP e SL com moeda real.

 

Boa tarde. Gostaria de saber se é possível fazer para que o SL e TK identificasse valores em real. Por exemplo, quero digitar no parâmetro 50 reais de stop e nao 50 pontos.

Obs.: Isso operando no mini indice porque nos Ativos está funcionando como moeda real já.

                      


double volume=1;
int stop = 50;
int gain = 50;
        
string symbol="_Symbol";
int    digits=(int)SymbolInfoInteger(symbol,SYMBOL_DIGITS);
double point=SymbolInfoDouble(symbol,SYMBOL_POINT);   
double bid=SymbolInfoDouble(symbol,SYMBOL_BID);           
double SL=bid-stop*point;                                 
SL=NormalizeDouble(SL,digits);                            
double TP=bid+gain*point;                             
TP=NormalizeDouble(TP,digits);  

Att,

 
Lucas Xavier:

Boa tarde. Gostaria de saber se é possível fazer para que o SL e TK identificasse valores em real. Por exemplo, quero digitar no parâmetro 50 reais de stop e nao 50 pontos.

Att,

Um código bem simples, fácil de converter para MQ5, e você pode escolher entre 3 formas de gerenciamento do capital: Percentagem, Montante (como você quer) ou Lote Fixo:

enum ENUM_RISK_BY
  {
   RiskPercentage,   // Percentage
   RiskAmount,       // Amount
   RiskFixedLot      // Fixed Lot
  };

//=== Global input variables
input ENUM_RISK_BY  PosRiskBy    = RiskPercentage;   // Set Positions Risk By
input double        PosRisk      = 0.5;              // Positions Risk
input int           StopLoss     = 300;              // Stop Loss (Points)
input int           TakeProfit   = 600;              // Take Profit (Points)




//+-----------------------------------------------------------------------------------------------------------------+
//| Calculate volume function                                                                                       |
//+-----------------------------------------------------------------------------------------------------------------+
double CalculateVolume(int OpType, double SL)
  {
   //--- Local variables
   double TickValue, Risk, Lot;

   //--- Checks Set Positions Risk By
   if(PosRiskBy == RiskFixedLot) {return(PosRisk);}

   //--- Tick Value
   if(OpType == OP_BUY)
     {
      TickValue = ((Ask - SL) / Point) * MarketInfo(Symbol(), MODE_TICKVALUE);
     }
   else
     {
      TickValue = ((SL - Bid) / Point) * MarketInfo(Symbol(), MODE_TICKVALUE);
     }
   if(TickValue == 0.0) {return(0.0);}
   //--- Volume Size
   Risk = PosRisk;
   if(PosRiskBy == RiskPercentage) {Risk = (AccountBalance() + AccountCredit()) * (PosRisk / 100);}
   Lot = NormalizeDouble(Risk / TickValue, 2);

   return(Lot);
  }
 
Vinicius de Oliveira:

Um código bem simples, fácil de converter para MQ5, e você pode escolher entre 3 formas de gerenciamento do capital: Percentagem, Montante (como você quer) ou Lote Fixo:

Essa função é do MQL4? Estou tentando coloca-la no MQL5 e não estou tendo sucesso. Mas entendi o calculo e vou tentar criar uma nova função aqui.
 
Lucas Xavier:
Essa função é do MQL4? Estou tentando coloca-la no MQL5 e não estou tendo sucesso. Mas entendi o calculo e vou tentar criar uma nova função aqui.

Sim, é MQL4. Essa função calcula o lote com duas casas decimais, ou seja, considera que a sua corretora aceita lotes a partir de 0.01.


Sugiro também que você acrescente a verificação a seguir (já serve para MQL5):

   //--- Minimal and Maximal allowed volume for trade operations
   MinVolume = SymbolInfoDouble(Symbol(), SYMBOL_VOLUME_MIN);
   MaxVolume = SymbolInfoDouble(Symbol(), SYMBOL_VOLUME_MAX);


   //--- APÓS CALCULAR O VALOR DE Lot, VERIFICA:
   if(Lot < MinVolume) {Lot = MinVolume;}
   else
   if(Lot > MaxVolume) {Lot = MaxVolume;}
 
Obrigado pela ajuda!
Razão: