Como criar rapidamente um Consultor Especialista para o Campeonato de Negociações Automáticas 2010
Introdução
A fim de desenvolver um especialista para participar no Automated Trading Championship 2010 (Campeonato de Negociações Automáticas 2010), vamos usar um modelo de um conselheiro especialista do artigo O protótipo do robô de negócios. Até mesmo um programador MQL5 iniciante será capaz desta tarefa, porque para suas estratégias as classes básicas, funções e modelos já estão desenvolvidos. é suficiente escrever uma quantidade mínima de código para implementar sua ideia de negociação.
O que nós precisaremos preparar:- Seleção de estratégia
- Escrever um Consultor Especialista
- Testar
- Otimização no Testador de Estratégias
- Otimização da Estratégia
- Testes em diferentes intervalos
1. Seleção da Estratégia
Acredita-se que a negociação com tendências é mais lucrativa do que a negociação em uma faixa, e o salto dos níveis durante um dia ocorrem mais frequentemente do que a separação das bordas dos canais.
Com base nestas suposições, abriremos a posição em direção à tendência atual subitamente a partir dos limites do canal (Envelopes). Fecharemos a posição em um sinal para fechar a posição ou quando os níveis de Stop Loss ou Take Profit forem alcançados.
Como o sinal de negócio, usaremos o crescimento MACD ou diminuição no gráfico diário, e negociaremos subitamente a partir dos limites do canal no período de tempo horário.
Figura 1. Indicador MACD no gráfico diário EURUSD
Se o indicador MACD crescer em duas barras em sucessão, este é o sinal de Compra. Se ele diminuir em duas barras em sucessão, este é o sinal de Venda.
Figura 2. Salto de Preço dos Limites de Envelopes
2. Escrever um Expert Advisor
2,1. Módulos Inclusos
O expert usará a classe Expert Advisor a partir do módulo ExpertAdvisor.mqh.
#include
2,2. Variáveis de Entrada
input int SL = 50; // Stop Loss distance input int TP = 100; // Take Profit distance input int TS = 50; // Trailing Stop distance input int FastEMA = 15; // Fast EMA input int SlowEMA = 26; // Slow EMA input int MACD_SMA = 1; // MACD signal line input int EnvelPer = 20; // Envelopes period input double EnvelDev = 0.4; // Envelopes deviation input double Risk = 0.1; // Risk
2,3. Criar uma Classe Herdada de CExpertAdvisor
class CMyEA : public CExpertAdvisor { protected: double m_risk; // size of risk int m_sl; // Stop Loss int m_tp; // Take Profit int m_ts; // Trailing Stop int m_pFastEMA; // Fast EMA int m_pSlowEMA; // Slow EMA int m_pMACD_SMA; // MACD signal line int m_EnvelPer; // Envelopes period double m_EnvelDev; // Envelopes deviation int m_hmacd; // MACD indicator handle int m_henvel; // Envelopes indicator handle public: void CMyEA(); void ~CMyEA(); virtual bool Init(string smb,ENUM_TIMEFRAMES tf); // initialization virtual bool Main(); // main function virtual void OpenPosition(long dir); // open position on signal virtual void ClosePosition(long dir); // close position on signal virtual long CheckSignal(bool bEntry); // check signal }; //------------------------------------------------------------------2,4. Excluir indicadores
//------------------------------------------------------------------ void CMyEA::~CMyEA() { IndicatorRelease(m_hmacd); // delete MACD indicator IndicatorRelease(m_henvel); // delete Envelopes indicator } //------------------------------------------------------------------2,5. Inicializar Variáveis
//------------------------------------------------------------------ Init bool CMyEA::Init(string smb,ENUM_TIMEFRAMES tf) { if(!CExpertAdvisor::Init(0,smb,tf)) return(false); // initialize parent class // copy parameters m_risk=Risk; m_tp=TP; m_sl=SL; m_ts=TS; m_pFastEMA=FastEMA; m_pSlowEMA=SlowEMA; m_pMACD_SMA=MACD_SMA; m_EnvelPer = EnvelPer; m_EnvelDev = EnvelDev; m_hmacd=iMACD(m_smb,PERIOD_D1,m_pFastEMA,m_pSlowEMA,m_pMACD_SMA,PRICE_CLOSE); // create MACD indicator m_henvel=iEnvelopes(m_smb,PERIOD_H1,m_EnvelPer,0,MODE_SMA,PRICE_CLOSE,m_EnvelDev); // create Envelopes indicator if(m_hmacd==INVALID_HANDLE ||m_henvel==INVALID_HANDLE ) return(false); // if there is an error, then exit m_bInit=true; return(true); // trade allowed }
2,6. Função de Negociação
//------------------------------------------------------------------ CheckSignal long CMyEA::CheckSignal(bool bEntry) { double macd[4], // Array of MACD indicator values env1[3], // Array of Envelopes' upper border values env2[3]; // Array of Bollinger Bands' lower border values MqlRates rt[3]; // Array of price values of last 3 bars if(CopyRates(m_smb,m_tf,0,3,rt)!=3) // Copy price values of last 3 bars to array { Print("CopyRates ",m_smb," history is not loaded"); return(WRONG_VALUE); } // Copy indicator values to array if(CopyBuffer(m_hmacd,0,0,4,macd)<4 || CopyBuffer(m_henvel,0,0,2,env1)<2 ||CopyBuffer(m_henvel,1,0,2,env2)<2) { Print("CopyBuffer - no data"); return(WRONG_VALUE); } // Buy if MACD is growing and if there is a bounce from the Evelopes' lower border if(rt[1].open<env2[1] && rt[1].close>env2[1] && macd[1]<macd[2] && macd[2]<macd[3]) return(bEntry ? ORDER_TYPE_BUY:ORDER_TYPE_SELL); // condition for buy // Sell if MACD is dwindling and if there is a bounce from the Evelopes' upper border if(rt[1].open>env1[1] && rt[2].close<env1[1]&& macd[1]>macd[2] && macd[2]>macd[3]) return(bEntry ? ORDER_TYPE_SELL:ORDER_TYPE_BUY); // condition for sell return(WRONG_VALUE); // if there is no signal } CMyEA ea; // class instance </env1[</macd[</macd[</env2[
Então, após escrever o código, envie o especialista resultante para o Testador de Estratégias.
3. Testando
No testador de Estratégia para o período do "último ano" em EURUSD obtemos o seguinte gráfico:
Figura 3. Resultados do teste do sistema de negociações com os parâmetros iniciais
Os resultados não impressionam, então vamos começar a otimizar os níveis de Parar Perdas e Obter Lucros.
4. Otimização no Testador de Estratégias
Otimizaremos os parâmetros de Stop Loss e Take Profit no intervalo 10-500 com etapa 50.
Melhores resultados: Parar Perdas = 160, Obter Lucros = 310. Após a otimização do Parar Perdas e Obter Lucros recebemos 67% de negociações lucrativas contra as 36% anteriores e um lucro líquido de $1522.97. Assim, por simples manipulações, atualizamos nosso sistema para o ponto de equilíbrio e até obtemos algum lucro.
Figura 4. Resultados do teste do sistema de negociações com Parar Perdas e Obter Lucros otimizados
Em seguida vamos otimizar o período de envelopes e o desvio.
O período de envelopes muda de 10 para 40 com passo 4 e desvio - de 0.1 para 1 com passo 0.1.
Os melhores resultados de otimização são: Período de envelopes = 22, desvio de envelopes = 0.3. Até agora nós obtemos $14418.92 de lucro líquido e 79% de transações lucrativas.
Figura 5. Resultados do teste do sistema de negociações com períodos de envelopes e desvio otimizados
Se aumentarmos o risco para 0,8, teremos o lucro líquido de $77330.95.
Figura 6. Os Resultados do teste do sistema de negociações com risco otimizado
5. Otimização da Estratégia
A otimização da estratégia pode consistir dos seguintes passos:
- Mudança do indicador de tendência
- Selecionar outro envelope
- Selecionar outro cronograma
- Mudar condições de negócio
5,1. Mudança do Indicador de Tendência
Como podemos ver no artigo Diversas maneiras de encontrar uma tendência no MQL5, os melhores indicadores de tendências são as médias móveis e um "leque" de médias móveis.
Vamos substituir o indicador MACD com média móvel simples. O código do especialista pode ser encontrado no arquivo Macena.mq5 anexado.
5,2. Selecionar Outro Envelope
Além dos Envelopes você também pode selecionar outro envelope à nossa disposição. Por exemplo, Canal de Preço, Faixas de Bollinger ou envelope baseado em médias móveis.
Um exemplo de especialista, que usa MM e Faixas de Bollinger, pode ser encontrado no arquivo Maboll.mq5 anexado.
5,3. Selecionar Outro Prazo
Vamos mudar o prazo para mais ou menos. Como um maior espaço de tempo - tome H4, como o menor - M15, e então teste e otimize seu sistema.
Para fazer isto, substitua apenas uma linha no código:
m_henvel=iEnvelopes(m_smb,PERIOD_H1,m_EnvelPer,0,MODE_SMA,PRICE_CLOSE,m_EnvelDev); // create Envelopes indicator
No caso do espaço de tempo H4:
m_henvel=iEnvelopes(m_smb,PERIOD_H4,m_EnvelPer,0,MODE_SMA,PRICE_CLOSE,m_EnvelDev); // create Envelopes indicator
Para o espaço de tempo M15:
m_henvel=iEnvelopes(m_smb,PERIOD_M15,m_EnvelPer,0,MODE_SMA,PRICE_CLOSE,m_EnvelDev); // create Envelopes indicator
5,4. Mudança das Condições de Negociação
Como um experimento, vamos também alterar as condições de negociação.
- Faça possível o sistema se reverter. Compraremos subitamente a partir do limite inferior dos Envelopes, e venderemos subitamente a partir dos limites superiores dos Envelopes.
- Verifique o sistema sem seguir a tendência do dia. Isto é feito simplesmente por inserir o seguinte código no bloco de negociação:
//------------------------------------------------------------------ CheckSignal long CMyEA::CheckSignal(bool bEntry) { double env1[3], // Array of Envelopes' upper border values env2[3]; // Array of Bollinger Bands' lower border values MqlRates rt[3]; // Array of price values of last 3 bars if(CopyRates(m_smb,m_tf,0,3,rt)!=3) // Copy price values of last 3 bars to array { Print("CopyRates ",m_smb," history is not loaded"); return(WRONG_VALUE); } // Copy indicator values to array if(CopyBuffer(m_henvel,0,0,2,env1)<2 || CopyBuffer(m_henvel,1,0,2,env2)<2) { Print("CopyBuffer - no data"); return(WRONG_VALUE); } // Buy if there is a bounce from the Evelopes' lower border if(rt[1].open<env2[1] && rt[1].close>env2[1]) return(bEntry ? ORDER_TYPE_BUY:ORDER_TYPE_SELL); // condition for buy // Sell if there is a bounce from the Evelopes' upper border if(rt[1].open>env1[1] && rt[2].close<env1[1]) return(bEntry ? ORDER_TYPE_SELL:ORDER_TYPE_BUY); // condition for sell return(WRONG_VALUE); // if there is no signal } CMyEA ea; // class instance //------------------------------------------------------------------ OnInit </env1[</env2[
3. Fecharemos a posição curta quando o preço não for muito para baixo, mas virar e subir.
4. Fecharemos a posição longa quando o preço não for muito para cima, mas virar e descer.
Você pode inventar muitas outras formas de otimizar uma estratégia de transações, algumas delas são descritas na literatura correspondente.
Mais pesquisas dependem de você.
6. Testando em Diferentes Intervalos
Teste nosso Consultor Especialista em intervalos iguais de tempo com um deslocamento de um mês. Vamos usar "último ano" como um período de testes. Período de tempo - 3 meses.
Intervalo de testes |
Lucro, USD |
Transações lucrativas |
---|---|---|
1.01.2010 - 30.03.2010 |
7239,50 | 76,92% |
1.02.2010 - 30.04.2010 | -6577,50 | 0% |
1.03.2010 - 30.05.2010 | -8378,50 | 50% |
1.04.2010 - 30.06.2010 | -6608,00 | 0% |
1.05.2010 - 30.07.2010 | 41599,50 | 80% |
1.06.2010 - 30.08.2010 | 69835,50 | 85% |
Conclusão
Conclusão breve: com base neste modelo você pode rapidamente implementar sua ideia de negociação com o mínimo de tempo e esforço.
Otimização de parâmetros de sistema e critério de negociação também não cria problema algum.
Para criar um sistema de transações estável, é desejável otimizar todos os parâmetros em intervalos de tempo mais longos.
Lista de fontes utilizadas:- Artigo 20 Trade Signals in MQL5.
- Artigo The Prototype of Trade Robot.
- Artigo Several Ways of Detecting a Trend in MQL5.
- Artigo Expert Advisors Based on Popular Trading Systems and Alchemy of Trading Robot Optimization.
- Artigo Limitations and Verifications in Expert Advisors.
- Artigo Writing an Expert Advisor Using the MQL5 Object-Oriented Programming Approach.
- Artigo Functions for Money Management in an Expert Advisor.
Traduzido do russo pela MetaQuotes Ltd.
Artigo original: https://www.mql5.com/ru/articles/148
- Aplicativos de negociação gratuitos
- 8 000+ sinais para cópia
- Notícias econômicas para análise dos mercados financeiros
Você concorda com a política do site e com os termos de uso