Assista a como baixar robôs de negociação gratuitos
Encontre-nos em Facebook!
Participe de nossa página de fãs
Script interessante?
Coloque um link para ele, e permita que outras pessoas também o avaliem
Você gostou do script?
Avalie seu funcionamento no terminal MetaTrader 5
Visualizações:
1700
Avaliação:
(23)
Publicado:
2017.02.01 08:51
Atualizado:
2018.02.15 17:31
Precisa de um robô ou indicador baseado nesse código? Solicite-o no Freelance Ir para Freelance

Exemplo para calcular o tamanho do lote, dependendo do risco na transação.

Como funciona:

Define-se a a porcentagem do risco da negociação (parâmetro % risk) e Stop-Loss (parâmetro StopLoss (in pips)). Dessa maneira, definem-se os parâmetros da possível perda do depósito.

Parâmetros de entrada Money Fixed Risk 

Para simular a negociação, é organizado este ciclo:

   static long count=-21;
   if(count%980==0) // we pass 980 tics
     {
      //--- getting lot size for open long position (CMoneyFixedRisk)

O valor inicial count=-21 é definido exclusivamente para "aquecer" o testador de estratégias. A seguir, calcula-se o montante remanescente a partir da divisão da variável count por 980 (número tomado simplesmente do limite). Ou seja, a cada 980 ticks é feita a entrada no ciclo de cálculo do lote, tendo em conta os riscos na negociação.

Ciclo de cálculo do lote dependendo do risco da transação (cálculo para a posição Buy):

Primeiro passo

      //--- getting lot size for open long position (CMoneyFixedRisk)
      double check_open_long_lot=m_money.CheckOpenLong(m_symbol.Ask(),m_symbol.Bid()-ExtStopLoss);
      Print("CheckOpenLong: ",DoubleToString(check_open_long_lot,2),
            ", Balance: ",    DoubleToString(m_account.Balance(),2),
            ", Equity: ",     DoubleToString(m_account.Equity(),2),
            ", FreeMargin: ", DoubleToString(m_account.FreeMargin(),2));
      if(check_open_long_lot==0.0)
         return;

na variável check_open_long_lot, usando o método CheckOpenLong da classe CMoneyFixedRisk, obtemos o tamanho calculado do lote para a posição Buy tendo em conta o StopLoss:

      double check_open_long_lot=m_money.CheckOpenLong(m_symbol.Ask(),m_symbol.Bid()-ExtStopLoss);

No diário de Expert Advisors são impressos estes parâmetros: tamanho calculado do lote dependendo do risco da transação, saldo da conta de negociação no momento do cálculo, montante na conta no momento de cálculo, tamanho da garantia reservada no momento do cálculo:

      Print("CheckOpenLong: ",DoubleToString(check_open_long_lot,2),
            ", Balance: ",    DoubleToString(m_account.Balance(),2),
            ", Equity: ",     DoubleToString(m_account.Equity(),2),
            ", FreeMargin: ", DoubleToString(m_account.FreeMargin(),2));

Se o calculo retornar o valor "0.0", saímos:

      if(check_open_long_lot==0.0)
         return;

Segundo passo

Na variável chek_volime_lot, usando o método CheckVolume da classe CTrade, obtemos o tamanho para a posição Buy, para a qual não temos fundos suficientes. Neste ponto, nós passamos os seguintes parâmetros: m_symbol.Name() — nome do símbolo, check_open_long_lot — volume da posição que queremos abrir (nós já calculamos este valor anteriormente): 

      //--- check volume before OrderSend to avoid "not enough money" error (CTrade)
      double chek_volime_lot=m_trade.CheckVolume(m_symbol.Name(),check_open_long_lot,m_symbol.Ask(),ORDER_TYPE_BUY);

Terceiro passo

Se o método CheckVolume não retornar "0.0", verificamos a condição: não temos os fundos suficientes para abrir a posição do lote calculado tendo em conta o risco.

      if(chek_volime_lot!=0.0)
         if(chek_volime_lot>=check_open_long_lot)
            m_trade.Buy(chek_volime_lot,NULL,m_symbol.Ask(),m_symbol.Bid()-ExtStopLoss,m_symbol.Bid()+ExtStopLoss);
      else
         Print("CMoneyFixedRisk lot = ",DoubleToString(check_open_long_lot,2),
               ", CTrade lot = ",DoubleToString(chek_volime_lot,2));

Se houver suficientes fundos, abriremos a posição, se não houver, então, no diário de EAs são impressos o tamanho calculado do lote tendo em conta o risco da transação (DoubleToString(check_open_long_lot,2)) e o tamanho do lote para o qual não há fundos suficientes (DoubleToString(chek_volime_lot,2)).

Exemplo (para verificar, no testador, selecione EURUSD, M1, período de teste de 2016.11.28, depósito $3 000):

Money Fixed Risk.png 

Foi aberta a posição Buy (impressão do Diário do testador) — o tamanho do lote tendo em conta o risco da transação foi de 2.23.

Money Fixed Risk (EURUSD,M1)    2016.11.28 00:03:24   CheckOpenLong: 2.23, Balance: 3000.00, Equity: 3000.00, FreeMargin: 3000.00
Trade   2016.11.28 00:03:37   instant buy 2.23 EURUSD at 1.06076 sl: 1.05942 tp: 1.06142 (1.06042 / 1.06076 / 1.06042)
Trades  2016.11.28 00:03:37   deal #2 buy 2.23 EURUSD at 1.06076 done (based on order #2)
Trade   2016.11.28 00:03:37   deal performed [#2 buy 2.23 EURUSD at 1.06076]
Trade   2016.11.28 00:03:37   order performed buy 2.23 at 1.06076 [#2 buy 2.23 EURUSD at 1.06076]
Money Fixed Risk (EURUSD,M1)    2016.11.28 00:03:37   CTrade::OrderSend: instant buy 2.23 EURUSD at 1.06076 sl: 1.05942 tp: 1.06142 [done at 1.06076]
Money Fixed Risk (EURUSD,M1)    2016.11.28 00:48:32   CheckOpenLong: 2.60, Balance: 3000.00, Equity: 2828.29, FreeMargin: 462.80
Money Fixed Risk (EURUSD,M1)    2016.11.28 00:48:32   CMoneyFixedRisk lot = 2.60, CTrade lot = 0.43

Trade   2016.11.28 00:53:15   stop loss triggered #2 buy 2.23 EURUSD 1.06076 sl: 1.05942 tp: 1.06142 [#3 sell 2.23 EURUSD at 1.05942]
Trades  2016.11.28 00:53:15   deal #3 sell 2.23 EURUSD at 1.05942 done (based on order #3)
Trade   2016.11.28 00:53:15   deal performed [#3 sell 2.23 EURUSD at 1.05942]
Trade   2016.11.28 00:53:15   order performed sell 2.23 at 1.05942 [#3 sell 2.23 EURUSD at 1.05942]
Tester  stopped by user
Tester  final balance 2701.18 USD

após a segunda entrada no ciclo, descobriu-se que não havia suficientes fundos para a abertura da segunda posição.

No final, a posição foi fechada pelo Stop-Loss com uma perda de 298.82:

Money Fixed Risk history

Isto quase corresponde ao risco 10% do depósito 3 000.

Traduzido do russo pela MetaQuotes Ltd.
Publicação original: https://www.mql5.com/ru/code/17199

Hercules A.T.C. 2006 Hercules A.T.C. 2006

Expert Advisor que opera nas rupturas da média móvel. São utilizados os indicadores: dois iMA (Moving Average, MA), iRSI(Relative Strength Index, RSI) e duas iEnvelopes (Envelopes).

The Puncher The Puncher

Negociação segundo os indicadores: iStochastic (Stochastic Oscillator) e iRSI (Relative Strength Index, RSI).

ShowImportantParams ShowImportantParams

Apresenta os parâmetros importantes de instrumento e conta.

BigBarSound BigBarSound

Expert Advisor que emite um sinal sonoro e um alerta ao ultrapassar um determinado tamanho de vela.