Assista a como baixar robôs de negociação gratuitos
Encontre-nos em Twitter!
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
Experts

Money Fixed Margin - expert para MetaTrader 5

Visualizações:
1191
Avaliação:
(27)
Publicado:
2017.02.13 13:55
Atualizado:
2018.02.22 13:44
Precisa de um robô ou indicador baseado nesse código? Solicite-o no Freelance Ir para Freelance

Exemplo para calcular o tamanho do lote com uma margem fixa. Isto é, se for especificado 10%, é aberta uma posição cuja margem é 10% da margem livre.

Parâmetros de entrada:

  • StopLoss (in pips) — nível StopLoss
  • % risk — tamanho da margem para a posição, como uma porcentagem da margem livre

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 (CMoneyFixedMargin)

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 (CMoneyFixedMargin)
      double sl=0.0;
      double check_open_long_lot=0.0;
      //--- variant #1: StopLoss=0.0
      sl=0.0;
      check_open_long_lot=m_money.CheckOpenLong(m_symbol.Ask(),sl);
      Print("sl=0.0",
            ", 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));
      //--- variant #2: StopLoss!=0.0
      sl=m_symbol.Bid()-ExtStopLoss;
      check_open_long_lot=m_money.CheckOpenLong(m_symbol.Ask(),sl);
      Print("sl=",DoubleToString(sl,m_symbol.Digits()),
            ", 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 CMoneyFixedMargin, 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 dos 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: 

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 de abertura de uma posição Buy, com uma margem livre de risco de 10%:

Money Fixed Margin open.png

Ao mesmo tempo, foi impresso no diário:

Money Fixed Margin (EURUSD,M1)  2016.11.28 00:03:24   sl=0.0, CheckOpenLong: 0.28, Balance: 3000.00, Equity: 3000.00, FreeMargin: 3000.00
Money Fixed Margin (EURUSD,M1)  2016.11.28 00:03:24   sl=1.05792, CheckOpenLong: 0.28, Balance: 3000.00, Equity: 3000.00, FreeMargin: 3000.00
Trade   2016.11.28 00:03:31   instant buy 0.28 EURUSD at 1.06076 sl: 1.05792 tp: 1.06292 (1.06042 / 1.06076 / 1.06042)
Trades  2016.11.28 00:03:31   deal #2 buy 0.28 EURUSD at 1.06076 done (based on order #2)
Trade   2016.11.28 00:03:31   deal performed [#2 buy 0.28 EURUSD at 1.06076]
Trade   2016.11.28 00:03:31   order performed buy 0.28 at 1.06076 [#2 buy 0.28 EURUSD at 1.06076]
Money Fixed Margin (EURUSD,M1)  2016.11.28 00:03:31   CTrade::OrderSend: instant buy 0.28 EURUSD at 1.06076 sl: 1.05792 tp: 1.06292 [done at 1.06076]

Observe que, ao calcular o lote dependendo do rico da margem livre, o StopLoss é irrelevante.

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

RSI EA RSI EA

RSI EA - negociação segundo os níveis de sobrevenda/sobrecompra, de acordo com o indicador iRSI (Relative Strength Index, RSI).

MA Reverse MA Reverse

Negociação segundo a Moving Average. Verificando se há fundos suficientes.

Buy sell volume Buy sell volume

Volumes Buy e sell.

Corr velocity Corr velocity

Indicador Velocity "corrigido" (Momentum suavizado).