80 Trading Strategies


MetaTrader 5 - Trading Systems 80-20 estratégia de negociação Introdução 80-20 é um nome de uma das estratégias de negociação (TS) descrita no livro Street Smarts: Estratégias de Negociação de Curto Prazo de Probabilidade Alta por Linda Raschke e Laurence Connors. Semelhante às estratégias discutidas no meu artigo anterior. Os autores atribuem-no ao palco quando o preço testar a faixa de limites. Também está focado em lucrar com falhas falsas e rolamentos das fronteiras. Mas desta vez, analisamos o movimento de preços em um intervalo de histórico significativamente menor envolvendo apenas o dia anterior. O tempo de vida de um sinal obtido também é relativamente curto, pois o sistema é destinado a negociação intradiária. O primeiro objetivo do artigo é descrever o desenvolvimento do módulo de sinal de estratégia comercial 80-20 usando linguagem MQL5. Então, vamos conectar este módulo à versão ligeiramente editada do robô básico comercial desenvolvido no artigo anterior da série. Além disso, vamos usar o mesmo módulo para o desenvolvimento de um indicador de negociação manual. Como já disse, o código fornecido na série de artigos destina-se principalmente a programadores novatos ligeiramente avançados. Portanto, além de seu objetivo principal, o código é projetado para ajudar a passar da programação processual para o orientado a objetos. O código não incluirá classes. Em vez disso, implementará totalmente estruturas mais fáceis de dominar. Ainda outro objetivo do artigo é desenvolver ferramentas que nos permitam verificar se a estratégia ainda é viável hoje, já que Raschke e Connors usaram o comportamento do mercado no final do século passado ao criá-lo. Alguns testes de EA com base nos dados de histórico atualizados são apresentados no final do artigo. 80-20 sistema comercial Os autores nomeiam George Taylors The Taylor Trading Technique. Bem como Steve Moores trabalha na análise informática dos mercados de futuros e na experiência de negociação de Derek Gipsons como base teórica para seu próprio trabalho. A essência da estratégia de negociação pode ser brevemente descrita da seguinte forma: se os preços de abertura e fechamento dos dias anteriores estiverem localizados nas áreas de alcance diário opostas, a probabilidade de uma reversão para a abertura dos dias anteriores é muito alta hoje. Nos dias anteriores, os preços Abrir e Fechar devem localizar perto das fronteiras do intervalo. A reversão deve começar o dia atual (não antes dos dias anteriores, a vela está fechada). As regras de estratégia para comprar são as seguintes: 1. Certifique-se de que o mercado se abriu nos 20 superiores e fechou no mínimo 20 do intervalo diário ontem. 2. Aguarde até hoje. Baixa quebra nos dias anteriores pelo menos por 5 tiques 3. Coloque um pedido de compra pendente na borda inferior do intervalo de ontem 4. Uma vez que a ordem pendente se desencadeia, defina o StopLoss inicial nos dias baixos 5. Use a parada final para proteger o lucro obtido As regras de venda de entrada são semelhantes, mas a barra de ontem deve Seja otimista, uma ordem de compra deve estar localizada no limite superior da barra, enquanto o StopLoss deve ser colocado no alto de hoje. Ainda outro detalhe importante é o tamanho de uma barra diária fechada. De acordo com Linda Raschke, deve ser grande o suficiente - mais do que o tamanho médio dos bares diários. No entanto, ela não especifica quantos dias do histórico devem ser levados em consideração ao calcular o intervalo diário médio. Também devemos ter em mente que o TS foi projetado exclusivamente para os exemplos de negociação intradiária mostrados nos gráficos do M15 do livro. O bloco de sinal e o indicador que faz um layout de acordo com a estratégia são descritos abaixo. Você também pode ver algumas capturas de tela com os resultados da operação do indicador. Eles ilustram claramente os padrões correspondentes às regras do sistema e aos níveis de negociação ligados aos padrões. A análise de padrões deve resultar na colocação de uma ordem pendente de compra. Os níveis de negociação apropriados são melhor vistos no cronograma M1: um padrão semelhante com a direção comercial oposta no prazo M5: seus níveis de negociação (M1 timeframe): módulo de sinal Permite adicionar o cálculo do nível Take Profit para ilustrar a adição de novas opções a um TS personalizado. Não existe tal nível na versão original, pois apenas uma parada final é usada para fechar uma posição. Permite tornar o Take Profit dependente do nível de breakout mínimo personalizado (TS8020ExtremumBreak), vamos multiplicá-lo pela relação personalizada TS8020TakeProfitRatio. Nós precisaremos dos seguintes elementos da função principal dos módulos de sinal feGetEntrySignal: status atual do sinal, níveis calculados de entrada e saída (Stop Loss and Take Profit), bem como fronteiras da faixa de ontem. Todos os níveis são recebidos através de links para as variáveis ​​passadas para a função, enquanto o status de retorno de sinais usa a lista de opções do artigo anterior: enum ENUMENTRYSIGNAL ENTRYBUY, // sinal de compra ENTRYSELL, // sinal de venda ENTRYNONE, // sem sinal ENTRYUNKNOWN // status não definido ENUMENTRYSIGNAL feGetEntrySignal (// D1 análise de padrão de duas velas data-hora tTime, // tempo atual duplo amplificador dEntryLevel, // nível de entrada (link para a variável) duplo amplificador dSL, // nível StopLoss (link para a variável ) Dobro do amplificador dTP // Nível TakeProfit (link para a variável) amp duplo dRangeHigh, // Alto dos padrões 1ª barra (link para a variável) duplo amplificador dRangeLow // Baixa dos padrões 1ª barra (link para o Variável)) Para detectar um sinal, precisamos analisar as duas últimas barras do período D1. Comece a partir do primeiro se não atender aos critérios do TS, não há necessidade de verificar a segunda barra. Existem dois critérios: 1. O tamanho da barra (diferença entre Alto e Baixo) deve exceder o valor médio nos últimos XX dias (definido pela configuração personalizada do TS8020D1AveragePeriod) 2. Os níveis de Barra Aberta e Fechar devem estar localizados no oposto 20 de O intervalo de barras Se estas condições forem atendidas, os preços altos e baixos devem ser economizados para uso posterior. Uma vez que os primeiros parâmetros da barra não mudam durante todo o dia, não há nenhum ponto em verificar-los em cada chamada de função. Permite armazená-los em variáveis ​​estáticas: // configurações personalizadas entrada uint TS8020D1AveragePeriod 20 // 80-20: Número de dias para calcular a entrada diária média de alcance uint TS8020ExtremumBreak 50 // 80-20: Fuga mínima do extremum de ontem (em pontos) Estático ENUMENTRISIGNAL sePossibleSignal ENTRYUNKNOWN // padrões primeira barra direção do sinal estático duplo // variáveis ​​para armazenar níveis calculados entre carrapatos sdEntryLevel 0, sdSL 0. sdTP 0, sdRangeHigh 0. sdRangeLow 0 // verifique os padrões primeira barra em D1: if (sePossibleSignal ENTRYUNKNOWN ) StLastD1Bar tCurrD1Bar // 1 st bar não altera este dia // intervalo diário médio duplo dAverageBarRange fdAverageBarRange (TS8020D1Preiodo de oferta, PERIODD1. TTime) se (maRates 0.high maRates 0.low lt dAverageBarRange) // 1 st bar não é grande o suficiente SePossibleSignal ENTRYNONE // significa que nenhum sinal hoje retorna (sePossibleSignal) double d20Percents 0.2 (maRates 0.high maRates 0.low) // 20 do intervalo de ontem se ((/ / Barra de baixa: maRates 0.open gt maRates 0.high d20Percents // barra aberta no superior 20 ampamp maRates 0.close lt maRates 0.low d20Percents // e fechado no 20 inferior) (// bullish: maRates 0. Fechar gt maRates 0.high d20Percents // barra fechada no superior 20 ampamp maRates 0.open lt maRates 0.low d20Percents // e aberto no 20 inferior)) // 1 st bar corresponde às condições // define a negociação de hoje Direção dos padrões 1ª barra: sePossibleSignal maRates 0.open gt maRates 0.close. ENTRYBUY. ENTRYSELL // nível de entrada no mercado: sdEntryLevel dEntryLevel sePossibleSignal ENTRYBUY. MaRates 0.low. MaRates 0.high // patterns 1 st bar range borders: sdRangeHigh dRangeHigh maRates 0.high sdRangeLow dRangeLow maRates 0.low else // 1 st bar abrir / fechar níveis não coincidem com condições sePossibleSignal ENTRYNONE // significa que nenhum sinal hoje retorna (sePossibleSignal ) Listagem da função para definir o intervalo de barras médio dentro do número especificado de barras no período de tempo especificado a partir da função de tempo especificado: double fdAverageBarRange (// Calcula o tamanho médio da barra int iBarsLimit, // quantas barras considerar ENUMTIMEFRAMES eTF PERIODCURRENT // barras intervalo de tempo datetime tTime WRONGVALUE // quando iniciar o cálculo) double dAverageRange 0 // variável para somar valores se (iBarsLimit lt 1) retornar (dAverageRange) MqlRates maRates // barra info array // obter informações da barra do histórico especificado Intervalo: se (tTime WRONGVALUE) tTime TimeCurrent () int iPriceBars CopyRates (símbolo. ETF, tTime, iBarsLimit, maRates) se (iPriceBars WRONGVALUE) se (LogLevel gt L OGLEVELNONE) PrintFormat (s: CopyRates: erro u. FUNÇÃO. LastError) return (dAverageRange) se (iPriceBars lt iBarsLimit) se (LogLevel gt LOGLEVELNONE) PrintFormat (s: CopyRates: copiado u barras de você. FUNCTION. IPriceBars, iBarsLimit) // soma de intervalos: int iBar iPriceBars enquanto (iBar-- Gt 0) dAverageRange maRatesiBar. high maRatesiBar. low // valor médio: return (dAverageRange / double (iPriceBars)) Existe apenas um critério para os padrões a segunda quebra da barra (atual) da borda da faixa de ontem não deve ser menor do que a Especificado nas configurações (TS8020ExtremumBreak). Assim que o nível for atingido, aparecerá um sinal para colocar uma ordem pendente: // verifique os padrões 2ª barra (atual) em D1: se (sePossibleSignal ENTRYBUY) sdSL dSL maRates 1.low // StopLoss para o Today's High if (TS8020TakeProfitRatio gt 0) sdTP dTP dEntryLevel Point TS8020ExtremumBreak TS8020TakeProfitRatio // TakeProfit retorno (// é a fuga para baixo claramente visto mamaras 1.close lt maRates 0.low Point TS8020ExtremumBreak ENTRYBUY. ENTRYNONE) se (sePossibleSignal ENTRYSELL) sdSL dSL maRates 1.high // StopLoss para o hoje baixo se (TS8020TakeProfitRatio gt 0) sdTP dTP dEntryLevel Point TS8020ExtremumBreak TS8020TakeProfitRatio // TakeProfit retorno (// é o breakward acima claramente visto maRates 1.close gt maRates 0.high Point TS8020ExtremumBreak ENTRYSELL. ENTRYNONE) Salve os dois Funções mencionadas acima (feGetEntrySignal e fdAverageBarRange) e as configurações personalizadas relacionadas à recepção de um sinal para o arquivo da biblioteca mqh. A listagem completa está anexada abaixo. Permite nomear o arquivo Signal80-20.mqh e colocá-lo no diretório apropriado da pasta de dados do terminal (MQL5IncludeExpertSignal). Indicador para negociação manual Assim como o EA, o indicador é usar o módulo de sinal descrito acima. O indicador deve informar um comerciante ao receber um sinal de colocação de pedido pendente e fornecer os níveis de ordem de níveis calculados, tomar lucros e níveis de perda de parada. Um usuário pode selecionar um método de notificação, uma janela pop-up padrão, um alerta de e-mail ou uma notificação de envio. É possível escolher tudo de uma vez ou qualquer combinação que você gosta. Outro indicador de objetivo é um layout de histórico comercial de acordo com 80-20 TS. O indicador é para destacar as barras diárias correspondentes aos critérios do sistema e os níveis de negociação calculados por lotes. As linhas de nível mostram como a situação evoluiu ao longo do tempo. Para mais clareza, faça o seguinte: quando o preço tocar a linha de sinal, o último é substituído por uma linha de pedido pendente. Quando a ordem pendente é ativada, sua linha é substituída pelas linhas Take Profit e Stop Loss. Essas linhas são interrompidas quando o preço toca um deles (a ordem é fechada). Este layout facilita a avaliação da eficiência das regras do sistema comercial e define o que pode ser melhorado. Comecemos por declarar os buffers e seus parâmetros de exibição. Primeiro, precisamos declarar os dois buffers com o preenchimento da área vertical (DRAWFILLING). O primeiro é destacar o intervalo de barras diárias completas do dia anterior, enquanto outro é para destacar a área interna apenas para separá-lo da parte superior e inferior 20 do intervalo usado no TS. Depois disso, declare os dois buffers para a linha de sinal multicolorida e a linha de pedido pendente (DRAWCOLORLINE). Sua cor depende da direção comercial. Existem outras duas linhas (Take Proft e Stop Loss) com a cor restante do mesmo (DRAWLINE) para usar as mesmas cores padrão atribuídas a eles no terminal. Todos os tipos de exibição selecionados, com exceção de uma linha simples, requerem dois buffers cada, portanto, o código parece da seguinte maneira: Indicador de propriedade Indicador de propriedades da janela Indicadores 10 Planos de indicadores de propriedades 6 Indicador de propriedades1 1 barra de propriedade de padrão indicatortype1 DRAWFILLING property indicatorcolor1 clrDeepPink. ClrDodgerBlue property indicatorwidth1 1 indicador de propriedade1abel2 1ª barra da propriedade de padrão indicatortype2 DRAWFILLING property indicatorcolor2 clrDeepPink. ClrDodgerBlue propriedade indicatorwidth2 1 property indicatorabelabel Propriedade do nível do sinal indicatortype3 DRAWCOLORLINE propriedade indicatorstyle3 STYLESOLID property indicatorcolor3 clrDeepPink. ClrDodgerBlue propriedade indicatorwidth3 2 propriedade indicatorlabel4 Nível de entrada propriedade indicatortype4 DRAWCOLORLINE propriedade indicatorstyle4 STYLEDASHDOT propriedade indicatorcolor4 clrDeepPink. ClrDodgerBlue propriedade indicatorwidth4 2 propriedade indicatorlabel5 Stop Loss propriedade indicatortype5 DRAWLINE propriedade indicatorstyle5 STYLEDASHDOTDOT propriedade indicatorcolor5 clrCrimson propriedade indicatorwidth5 1 propriedade indicatorlabel6 Take Profit propriedade indicatortype6 DRAWLINE propriedade indicatorstyle6 STYLEDASHDOTDOT propriedade indicatorcolor6 clrLime propriedade indicatorwidth6 1 Permite aos comerciantes a capacidade de desativar o preenchimento dos padrões diários Primeira barra, selecione as opções de notificação de sinal e limite a profundidade de layout do histórico. Todas as configurações do sistema comercial do módulo de sinal também estão incluídas aqui. Para fazer isso, precisamos enumerar preliminarmente as variáveis ​​usadas no módulo, mesmo que algumas delas sejam usadas apenas na EA e não são necessárias no indicador: incluir o sinal ltExpertSignalSignal80 - 20.mqhgt // 80-20 TS Entrada de módulo bool ShowOuter true // 1ª barra do padrão: Mostra a entrada de intervalo completo bool ShowInner true // 1ª barra do padrão: Mostra a entrada de área interna bool AlertPopup true // Alerta: Mostra uma entrada de janela pop-up Bool AlertEmail false // Alerta: Enviar uma string de entrada de e-mail AlertEmailSubj // Alerta: entrada de assunto de e-mail bool AlertPush true // Alerta: Enviar uma entrada de notificação de envio uint BarsLimit 2000 // Profundidade de layout de histórico (nas barras TF atuais) ENUMLOGLEVEL LogLevel LOGLEVELNONE // Modo de registro duplo buff1stBarOuter, buff1stBarOuterZero, // buffers para plotar a gama completa dos padrões 1 st bar buff1stBarInner, buff1stBarInnerZero, // buffers para traçar o interno 60 dos padrões 1 st bar buffSignal, buffSignalColor, // sinal BuffEntry BuffEntry, buffEntryColor, // buffEntry buffEntry, buffEntryColor // buffSL, buffSL, buffSL, // StopLoss e TakeProfit buffers de linhas gdExtremumBreak 0 // TS8020ExtremumBreak em preços de símbolos int giD1AveragePeriod 1. // valor correto para TS8020D1AveragePeriod giMinBars WRONGVALUE // número mínimo exigido de barras Para re-cálculo int OnInit () // verifique o parâmetro TS8020D1AveragePeriod inserido: giD1AveragePeriod int (fmin (1. TS8020D1AveragePeriod)) // pontos de conversão para preços de símbolos: gdExtremumBreak TS8020ExtremumBreak Point // número mínimo exigido de barras para o novo número de cálculo de Barras do TF atual dentro de um dia giMinBars int (86400 / PeriodSeconds ()) // buffers de indicadores objetivo: // 1 st bars retângulo de alcance completo SetIndexBuffer (0. buff1stBarOuter, INDICATORDATA) PlotIndexSetDouble (0. PLOTEMPTYVALUE. 0) SetIndexBuffer (1. buff1stBarOuterZero, INDICATORDATA) // 1ª barra do retângulo da área interna SetIndexBuffer (2. buff1stBarInner, INDICATORDATA) PlotIndexSetDouble (1. PLOTEMPTYVALUE.) SetIndexBuffer (3. buff1stBarInnerZero, INDICATORDATA) // linha de sinal SetIndexBuffer (4. BuffSignal, INDICATORDATA) PlotIndexSetDouble (2. PLOTEMPTYVALUE.) SetIndexBuffer (5. buffSignalColor, INDICATORCOLORINDEX) // linha de colocação de pedido pendente SetIndexBuffer (6. buffEntry, INDICATORDATA) PlotIndexSetDouble (3. PLOTEMPTYVALUE. 0) SetIndexBuffer (7. buffEntryColor, INDICATORCOLORINDEX) // linha SL SetIndexBuffer (8. buffSL, INDICATORDATA) PlotIndexSetDouble (4. PLOTEMPTYVALUE. 0) // linha TP SetIndexBuffer (9. buffTP, INDICATORDATA) PlotIndexSetDouble (5. PLOTEMPTYVALUE. 0) IndicatorSetInteger (INDICATORDIGITS. Digits) IndicatorSetString (INDICATORSHORTNAME. 80-20 TS) Coloque o código dos programas principais na função OnCalculate incorporada, organize o loop para iterar sobre o Barras de tempo atuais do passado para o futuro procurando-os para um sinal usando a função a partir do módulo de sinal. Declare e inicialize as variáveis ​​necessárias usando valores iniciais. Define a barra de loop mais antiga para o primeiro cálculo considerando um limite de profundidade de histórico definido pelo usuário (BarsLimit). Para chamadas subseqüentes, todas as barras do dia atual (em vez da última barra) são recalculadas, uma vez que o padrão de duas barras realmente pertence ao gráfico D1, independentemente do período de tempo atual. Além disso, devemos proteger contra os chamados phantoms: se não realizarmos um apagamento de buffers de indicadores forçados durante a reinicialização, as áreas preenchidas permanecem ainda mais na tela ao alternar prazos ou símbolos. A limpeza do buffer deve ser vinculada à primeira chamada de função OnCalculate após a inicialização do indicador. No entanto, a variável padrão pré-calculada não é suficiente para definir se a chamada é a primeira, uma vez que ela pode conter zero não apenas durante a primeira chamada de função, mas também ao alterar a soma de verificação. Permite passar algum tempo para resolver adequadamente este problema, criando a estrutura não afetada pela configuração da variável pré-calculada em zero. A estrutura é para armazenar e processar dados freqüentemente utilizados nos indicadores: - sinalizador do primeiro lançamento da função OnCalculate - o contador de barras calculadas que não está definido como zero ao alterar a soma de verificação - sinalizador de alteração da soma de verificação - sinalizador do início de Uma nova barra - hora de início da barra atual. A estrutura que combina todos esses dados deve ser declarada no nível global. Ele deve ser capaz de coletar ou apresentar dados de / para quaisquer funções integradas ou personalizadas. Vamos nomear esta estrutura Brownie. Pode ser colocado no final do código do indicador. Um único objeto de estrutura de tipo global chamado goBrownie também deve ser declarado: struct BROWNIE datetime tLastBarTime // hora da última barra processada int iPrewCalculado // número de barras calculadas bool bFirstRun // primeira bandeira de lançamento bool bHistoryUpdated // sinalizador de atualização do histórico Bool bIsNewBar // novo indicador de abertura de barra BROWNIE () // valores padrão: tLastBarTime 0 iPrewCalculado WRONGVALUE bFirstRun bIsNewBar true bHistoryUpdated false void fReset (bool bResetFirstRun true) // valores padrão: tLastBarTime 0 iPrewCalculado WRONGVALUE se (bResetFirstRun) bFirstRun true // set Para zero se houver permissão bIsNewBar true bHistoryUpdated falso void fUpdate (int iNewPrewCalculated WRONGVALUE) // sinalizador da função incorporada OnCalculate primeira chamada se (bFirstRun ampamp iPrewCalculated gt 0) bFirstRun false // nova data da barra tThisBarTime TimeCurrent () - TimeCurrent () PeriodSeconds () bIsNewBar tLastBarTime tThisBarTime // atualiza o tempo de barra atual i F (bIsNewBar) tLastBarTime tThisBarTime se (iNewPrewCalculated gt - 1) // há alguma alteração no histórico bHistoryUpdated iNewPrewCalculated 0 ampamp iPrewCalculated gt WRONGVALUE // use pré-calculado no caso de OnCalculate 1ª chamada se (iPrewCalculated WRONGVALUE) iPrewCalculado iNewPrewCalculated // ou se Não havia nenhuma atualização do histórico se (iNewPrewCalculated gt 0) iPrewCalculou iNewPrewCalculated BROWNIE goBrownie Permite informar o Brownie do evento de desinitiução do indicador: void OnDeinit (razão const int) goBrownie. fReset () // informar Brownie Se necessário, a quantidade de Os dados armazenados pelo Brownie podem ser expandidos se as funções ou classes personalizadas exigirem preços, volumes ou o valor atual do spread de barras (Open, High, Low, Close, tickvolume, volume, spread). É mais conveniente usar dados pré-fabricados da função OnCalculate e passá-los através de Brownie em vez de usar as funções de cópia da série temporal (CopyOpen, CopyHigh etc. ou CopyRates), isso economiza os recursos da CPU e elimina a necessidade de organizar o processamento de erros Dessas funções de linguagem. Voltamos à função principal do indicador. Declarar variáveis ​​e preparar as matrizes usando a estrutura goBrownie da seguinte maneira: goBrownie. fUpdate (prevcalculated) // feed data para Brownie int iPeriodBar 0. // contador auxiliar iCurrentTFBar ratestotal - int (BarsLimit) // índice de barras do loop TF atual Iniciar data estática stLastD1Bar 0 // hora da última barra processada do par de barras D1 (padrões 2 nd bar) static int si1stBarofDay 0 // índice dos dias atuais primeira barra se (goBrownie. bFirstRun) // limpar os buffers durante Re-inicialização: ArrayInitialize (buff1stBarInner, 0) ArrayInitialize (buff1stBarInnerZero, 0) ArrayInitialize (buff1stBarOuter, 0) ArrayInitialize (buff1stBarOuterZero, 0) ArrayInitialize (buffEntry, 0) ArrayInitialize (buffEntryColor, 0) ArrayInitialize (buffSignal, 0) ArrayInitialize (buffSignalColor, 0) ArrayInitialize (buffTP, 0) ArrayInitialize (buffSL, 0) stLastD1Bar 0 si1stBarofDay 0 else datetime tTime TimeCurrent () // profundidade mínima do re-cálculo - a partir do Dia anterior: iCurrentTFBar ratestotal - Bares (Símbolo. PERIODCURRENTE. TTime - tTime 86400. tTime) - 1 ENUMENTRYSIGNAL eSignal ENTRYUNKNOWN // sinal duplo dSL WRONGVALUE. // SL level dTP WRONGVALUE. // TP level dEntryLevel WRONGVALUE. // nível de entrada dRangeHigh WRONGVALUE. DRangeLow WRONGVALUE // bordas dos padrões 1 st bar range datetime tCurrD1Bar 0. // tempo atual da barra D1 (padrões 2 nd bar) tD1BarToFill 0 // D1 tempo da barra a ser preenchido (padrões 1 st bar) // certifique-se de que a inicial O índice da barra de cálculo está dentro do intervalo aceitável: iCurrentTFBar int (fmax (0. fmin (iCurrentTFBar, ratestotal - giMinBars))) enquanto (iCurrentTFBar lt o amplificador de ratestotal. IsStopped ()) // o loop do programa principal deve ser localizado aqui Check A presença de um sinal ao iterar sobre as barras de tempo atuais: eSignal feGetEntrySignal (Time iCurrentTFBar, dEntryLevel, dSL, dTP, dRangeHigh, dRangeLow) se (eSignal gt 1) continuar // nenhum sinal durante o dia em que a barra pertence Se existe Um sinal em um novo dia da primeira barra, o intervalo da barra diária anterior deve ser preenchido. O valor da variável tD1BarToFill do tipo datetime é usado como uma bandeira. Se for igual a WRONGVALUE, nenhum recheio é necessário nesta barra. A linha de sinal deve começar na mesma primeira barra, mas vamos estendê-la para a última barra do dia anterior para uma melhor percepção do layout. Uma vez que os cálculos de uma linha de sinal, bem como as cores de linha e preenchimento para barras de alta e baixa são diferentes, vamos fazer dois blocos semelhantes: tCurrD1Bar Time iCurrentTFBar Time iCurrentTFBar 86400 // início do dia em que a barra pertence se (stLastD1Bar lt tCurrD1Bar ) TD1BarToFill Time iCurrentTFBar 1 Time iCurrentTFBar 1 86400 si1stBarofDay iCurrentTFBar else tD1BarToFill WRONGVALUE // barra do dia anterior, sem preenchimento novo necessário stLastD1Bar tCurrD1Bar // lembrar se (tD1BarToFill WRONGVALUE) // Preencher os dias anteriores D1 bar: iPeriodBar iCurrentTFBar if (dEntryLevel lt dRangeHigh ) se (ShowOuter) enquanto (--iPeriodBar gt 0) if (Tempo iPeriodBar lt tD1BarToFill) quebrar buff1stBarOuterZeroiPeriodBar dRangeLow buff1stBarOuteriPeriodBar dRangeHigh se (ShowInner) iPeriodBar iCurrentTFBar enquanto (--iPeriodBar gt 0) if (Tempo iPeriodBar lt tD1BarToFill) quebrar buff1stBarInnerZeroiPeriodBar dRangeLow 0,2 (DRangeHigh dRangeLow) buff1stBarInneriPeriodBar dRangeH IGH 0,2 (dRangeHigh dRangeLow) // iniciar da linha de sinal a partir dos dias anteriores última barra buffSignaliCurrentTFBar buffSignaliCurrentTFBar 1 dRangeLow gdExtremumBreak buffSignalColoriCurrentTFBar buffSignalColoriCurrentTFBar 1 0 else if (ShowOuter) enquanto (--iPeriodBar gt 0) if (Tempo iPeriodBar lt tD1BarToFill) quebrar buff1stBarOuterZeroiPeriodBar dRangeHigh buff1stBarOuteriPeriodBar dRangeLow se (ShowInner) iPeriodBar iCurrentTFBar enquanto (--iPeriodBar gt 0) if (Tempo iPeriodBar lt tD1BarToFill) quebrar buff1stBarInnerZeroiPeriodBar dRangeHigh 0,2 (dRangeHigh dRangeLow) buff1stBarInneriPeriodBar dRangeLow 0,2 (dRangeHigh dRangeLow) // iniciar da linha de sinal a partir dos dias anteriores Ultimo bar buffSignaliCurrentTFBar buffSignaliCurrentTFBar 1 dRangeHigh gdExtremumBreak buffSignalColoriCurrentTFBar buffSignalColoriCurrentTFBar 1 1 mais continuar Todas as linhas de layout restantes devem ser plotadas dentro do loop de iteração de barras de intervalos de tempo atual. Como já mencionado, a linha de sinal deve terminar na barra onde o preço o tocou. A linha de pedido pendente deve começar na mesma barra e terminar na barra, na qual ocorre o contato com o preço. As linhas Take Benefit e Stop Loss devem começar na mesma barra. O layout do padrão é concluído na barra, na qual o preço toca um deles: // Linha de sinal até cruzada por uma barra: iPeriodBar iCurrentTFBar se (dEntryLevel lt dRangeHigh) enquanto (iPeriodBar lt ratestotal) if (Time iPeriodBar gt tCurrD1Bar 86399) quebrar buffSignaliPeriodBar dRangeLow gdExtremumBreak buffSignalColoriPeriodBar 0 if (dRangeLow gdExtremumBreak gt Baixa iPeriodBar) quebrar mais enquanto (ratestotal lt iPeriodBar) if (Tempo iPeriodBar gt tCurrD1Bar 86399) quebrar buffSignaliPeriodBar dRangeHigh gdExtremumBreak buffSignalColoriPeriodBar 1 if (dRangeHigh gdExtremumBreak lt alta iPeriodBar) quebrar // Entrada Linha até cruzada por uma barra: se (dEntryLevel lt dRangeHigh) enquanto (iPeriodBar lt ratestotal) se (Time iPeriodBar gt tCurrD1Bar 86399) quebre buffEntryiPeriodBar dRangeLow buffEntryColoriPeriodBar 0 se (dRangeLow lt High iPeriodBar) if (buffEntryiPeriodBar 1 0.) // start and Terminar em uma única barra, estender por 1 bar para o passado buffEntryiPeriodBar 1 dRangeLow buffEntryColoriPeriodBar 1 0 pause mais enquanto (iPeriodBar lt ratestotal) se (Time iPeriodBar gt tCurrD1Bar 86399) break buffEntryiPeriodBar dRangeHigh buffEntryColoriPeriodBar 1 se (dRangeHigh gt Low iPeriodBar) se (buffEntryiPeriodBar 1 0.) // iniciar e terminar em uma única barra, Estender por 1 bar para o passado buffEntryiPeriodBar 1 dRangeHigh buffEntryColoriPeriodBar 1 1 break // TP e SL linhas até um deles é atravessado por uma barra: se (dEntryLevel lt dRangeHigh) // SL é igual ao baixo desde o início de um dia : DSL Low ArrayMinimum (baixo. SetaBarofDay, iPeriodBar si1stBarofDay) enquanto (iPeriodBar lt ratestotal) se (Time iPeriodBar gt tCurrD1Bar 86399) romper buffSLiPeriodBar dSL buffTPiPeriodBar dTP se (dTP lt High iPeriodBar dSL gt Low iPeriodBar) se (buffSLiPeriodBar 1 0.) // iniciar e terminar em um único Barra, estenda por 1 barra para o passado buffSLiPeriodBar 1 dSL buffTPiPeriodBar 1 dTP break else // SL é igual ao Alto desde o início de um dia: dSL High ArrayMaximum (High. Si1stBarofDay, iPeriodBar si1stBarofDay) enquanto (iPeriodBar lt ratestotal) if (Time iPeriodBar gt tCurrD1Bar 86399) break buffSLiPeriodBar dSL buffTPiPeriodBar dTP se (dSL lt High iPeriodBar dTP gt Low iPeriodBar) se (buffSLiPeriodBar 1 0.) // iniciar e terminar em uma única barra, estender por 1 barra para o passado buffSLiPeriodBar 1 dSL BuffTPiPeriodBar 1 dTP break Permite colocar o código de chamada da função de notificação de sinal fDoAlert fora do loop. Na verdade, ele possui oportunidades ligeiramente maiores do que as envolvidas neste indicador, a função é capaz de trabalhar com arquivos de áudio, o que significa que esta opção pode ser adicionada às configurações personalizadas. O mesmo é verdade para a capacidade de selecionar arquivos separados para comprar e vender sinais. Lista de funções: void fDoAlert (// Função para enviar sinais e notificações string sMessage, // mensagem de alerta bool bAlert true. // mostrar uma janela pop-up bool bSound false. // reproduzir um arquivo de som bool bEmail falso. // enviar Um eMail bool bNotification false. // envie uma seqüência de notificação de envio sEmailSubject. // seqüência de assunto do eMail sSound alert. wav // arquivo de som) string estático ssPrevMessage houve silêncio // mensagem de alerta anterior data estática stPrevTime // previous alert time time TThisBarTime TimeCurrent () PeriodSeconds () PeriodSeconds () // tempo atual da barra se (ssPrevMessage sMessage stPrevTime tThisBarTime) // outro e / ou 1 desta barra // lembre-se: ssPrevMessage sMessage stPrevTime tThisBarTime // forma uma seqüência de mensagem: sMessage StringFormat (Ssss, TimeToString (TimeLocal (), TIMESECONDS), // símbolo da hora local. // símbolo StringSubstr (EnumToString (ENUMTIMEFRAMES (Período)), 7), // TF sMessage // mensagem) // activate notifica Sinal de indicação: se (bAlert) Alerta (sMessage) se (bEmail) SendMail (SEmailSubject Symbol). SMessage) se (bNotificação) SendNotification (sMessage) se (bSound) PlaySound (sSound) O código para verificar a necessidade de chamar a função e formar o texto para ele localizado no corpo do programa antes da conclusão do manipulador de eventos OnCalculate: // alert IPeriodBar ratestotal 1 // barra atual se (AlertPopup AlertEmail AlertPush 0) return (ratestotal) // tudo está desativado se (buffSignaliPeriodBar 0) retornar (ratestotal) // nada para pegar ainda (ou já) se (buffSignaliPeriodBar gt High iPeriodBar buffSignaliPeriodBar lt Low iPeriodBar) return (ratestotal) // sem linha de sinal tocando // texto da mensagem: string sMessage StringFormat (TS 80-20: ss necessário, TP: s, SL: s, buffSignalColoriPeriodBar gt 0. BuyStop. SellStop, DoubleToString (dEntryLevel, Digits), DoubleToString (dTP, Digits), DoubleToString (dSL, Digits)) // notificação: fDoAlert (sMessage, AlertPopup, false. AlertEmail, AlertPush, AlertEmailSubj) return (ratestotal) // completa operação OnCalculate O O código-fonte completo do indicador pode ser encontrado nos arquivos anexados (TS80-20.mq5). O layout de negociação de acordo com o sistema é melhor visto em gráficos de minutos. Observe que o indicador usa os dados da barra em vez das seqüências de tiques dentro das barras. Isso significa que se o preço cruzasse várias linhas de layout (por exemplo, Take Profit e Stop Loss) em uma única barra, você nem sempre pode definir qual delas foi cruzada primeiro. Outra incerteza decorre do fato de que as linhas de início e final não podem coincidir. Caso contrário, as linhas do buffer dos tipos DRAWLINE e DRAWCOLORLINE simplesmente serão invisíveis para um usuário. Esses recursos reduzem a precisão do layout, mas ainda permanecem bastante claros. Assessor especialista para testar a estratégia de negociação 80-20 A EA básica para testar estratégias do livro Street Smarts: Estratégias de negociação de curto prazo de alta probabilidade foi descrita em detalhes no primeiro artigo. Permite inserir duas mudanças significativas nela. First, the signal module is to be used in the indicator as well meaning it would be reasonable to set trading levels calculation in it. We have already done this above. Apart from the signal status, the feGetEntrySignal function returns order placement, Stop Loss and Take Profit levels. Therefore, lets remove the appropriate part of the code from the previous EA version adding the variables for accepting levels from the function and edit the function call itself. The listings of the old and new code blocks can be found in the attached file (strings 128-141). Another significant addition to the basic EA code is due to the fact that, unlike the previous two, this TS deals with a short-term trend. It assumes that the roll-back happens once a day and is unlikely to be repeated. This means that the robot has to make only one entry ignoring the existing signal all the rest of the time until the next day. The easiest way to implement that is to use a special flag static or global variable of bool type in the program memory. But if the EA operation is interrupted for some reason (the terminal is closed, the EA is removed from the chart, etc.), the flag value is lost as well. Thus, we should have the ability to check if todays signal was activated previously. To do this, we may analyze the history of trades for today or store the date of the last entry in the terminal global variables rather than in the program. Let us use the second option since it is much easier to implement. Provide users with the ability to manage one entry per day option and set an ID of each launched version of the robot it is needed to use global variables of the terminal level: input bool OneTrade false // One position per day input uint MagicNumber 2016 // EA magic number Lets add the variables necessary to implement one entry per day option to the programs global variables definition block. Initialize them in the OnInit function: string gsPrefix // identifier of (super)global variables bool gbPositionToday false , gbPendingToday false // Create a prefix of (super)global variable names: gsPrefix StringFormat ( SSB s u s. Symbol. MagicNumber, MQLInfoInteger ( MQLTESTER ). t . ) // Has the robot worked with market or pending orders today gbPositionToday int ( GlobalVariableGet (gsPrefix LastPositionDate )) TimeCurrent () TimeCurrent () 86400 gbPendingToday int ( GlobalVariableGet (gsPrefix LastPendingDate )) TimeCurrent () TimeCurrent () 86400 Here the robot reads the values of global variables and compares the written time with the day start time, thus defining if the todays signal has already been processed. Time is written to the variables in two places lets add the appropriate block to the pending order installation code (additions highlighted): if (iTry - 10 ) if (LogLevel gt LOGLEVELNONE) Print ( Pending order placing error ) // the distance from the current price is not enough :( if (LogLevel gt LOGLEVELERR) PrintFormat ( Pending order cannot be placed at the s level. Bid: s Ask: s StopLevel: s , DoubleToString (dEntryLevel, Digits ), DoubleToString (goTick. bid, Digits ), DoubleToString (goTick. ask, Digits ), DoubleToString (gdStopLevel, Digits ) ) else // to update the flag: GlobalVariableSet ( // in the terminal global variables gsPrefix LastPendingDate , TimeCurrent () TimeCurrent () 86400 ) gbPendingToday true // in the program global variables The second block is placed after the code defining a newly opened position: if ( PositionSelect ( Symbol )) if ( PositionGetDouble ( POSITIONSL ) 0 .) if (gbPositionToday) // update the flag: GlobalVariableSet ( // in the terminal global variables gsPrefix LastPositionDate , TimeCurrent () TimeCurrent () 86400 ) gbPositionToday true // in the program global variables . These are the only significant changes in the previous EA version code. The finalized source code of the new version is attached below. Strategy backtesting In order to illustrate the trading system viability, its authors use patterns detected on the charts from the end of the last century. Therefore, we need to check its relevance in todays market conditions. For testing, I took the most popular Forex pair EURUSD, the most volatile pair USDJPY and one of the metals XAUUSD. I increased the indents specified by Raschke and Connors 10 times, since four-digit quotes were used when the book was written, while I tested the EA on five-digit ones. Since there is no any guidance concerning the trailing parameters, I have selected the ones that seem to be most appropriate to daily timeframe and instrument volatility. The same applies to the Take Profit calculation algorithm added to the original rules the ratio for its calculation was chosen arbitrarily, without deep optimization. The balance chart when testing on the five-year EURUSD history with the original rules (no Take Profit): The same settings and Take Profit: The balance chart when testing the original rules on the five-year USDJPY history: The same settings and Take Profit: The balance chart when testing the original rules on the daily gold quotes for the last 4 years: The full data on the robot settings used in each test can be found in the attached archive containing the complete reports. Conclusion The rules programmed in the signal module match the 80-20 trading system description provided by Linda Raschke and Laurence Connors in their book Street Smarts: High Probability Short-Term Trading Strategies. However, we have extended the original rules a bit. The tools (the robot and the indicator) are to help traders draw their own conclusions concerning the TS relevance in todays market. In my humble opinion, the TS needs a serious upgrade. In this article, I have tried to make some detailed comments on developing the code of the signal module, as well as the appropriate robot and indicator. I hope, this will help those who decide to do the upgrade. Apart from modifying the rules, it is also possible to find trading instruments that fit better to the system, as well as signal detection and tracking parameters. Trader-Info - Forex Trading - Stock Market Trading - Forex Scalping Systems - Forex Automated Please pour over the 80 forex currency trading strategy items on the checklist below that the big dogs use. Você ficará feliz que você fez. Por favor, pegue o fato de que você só precisa de quatro ferramentas para negociar o forex com, usando minha abordagem ndash quotreading bars, quot MACD divergence, pivô points e trendline analysis. É isso aí. Nada mais simples e simples. Não deixe os naysayers você acreditar de outra forma. O mundo está cheio de Thomasesquot que são quarterback de poltronas everybodys, mas nunca fizeram centavos nesse negócio. Eles duendem as pás. Não utilizam elas. Se você tiver alguma dúvida ou consulta, não hesite em contactar-nos. Nossa obrigação GARANTIA Se você não está satisfeito com sua compra por uma razão ou outra, gostaríamos de garantir que você está totalmente coberto seja nossa garantia de devolução do dinheiro de 60 dias. Os materiais estão disponíveis para download como arquivos PDF, arquivos Word, arquivos EXE, eBooks e software. Caso não tenha sido satisfeito, você será reembolsado. Estamos obrigados por esta garantia. Você deve operar esses métodos seguindo nossas instruções por pelo menos 60 dias e uma prova disso deve estar disponível antes de podermos reembolsar seu pagamento inicial. No entanto, estamos confiantes de que você ficará satisfeito com o conteúdo de todos os nossos métodos. What are you waiting for Recieve this eBook immediately after paying FREE Digital Delivery Terms and Conditions Item is sold with 30 days Money Back Guarantee.

Comments

Popular Posts