Quem quer uma estratégia? Muito e de graça) - página 61

 
Stellarator >> :

Meus amigos me chamaram para trapacear o carro...

>> bem...

E eles dizem crise ;)

 

Parece que temos que começar a comparar um a um até resolver todos os problemas.

Aqui comparei o Oscilador Acelerador FSB com o MT iAC(...):



Como fazer isso:

1. atualizar as taxas de câmbio da FSB com as taxas atuais utilizadas na MT. (A partir da MT Ctrl+S e salvar o arquivo xxxxxx.csv no diretório ./Data da FSB. Se seus dados estiverem em uma pasta diferente - use Market -> Data Directory da FSB para apontá-los).

2. fazer com que o script Indicator_Values.mq4 imprima o indicador desejado. (O roteiro está na página do fórum anterior).

3. estabeleça este indicador em FSB. (Certifique-se de usar os mesmos parâmetros.) Exportar o indicador FSB pela função Export -> Indicadores.

4. se você vir alguma diferença, por favor, informe-a.


Tenha uma boa sorte!


------------

Editar:

Favor usar a última FSB v2.8.3.5 Beta

 
Miroslav_Popov >> :

A fórmula clássica é: Momentum(n) = Fechar - Fechar(n)

Esta é a fórmula que a FSB utiliza.

MT usa: Momentum(n) = 100 * Fechar / Fechar(n)

Eu sei disso. Eu estava me referindo aos parâmetros indicadores. Período de alisamento. Método de alisamento. Nós não a definimos. Quais parâmetros são tomados por padrão: 0,0?

 

Olá zfs,


Você pode ver os parâmetros padrão na janela de diálogo Parâmetros de Indicadores. ( Predefinição da imprensa)



Note que o período de "suavização adicional" = 0. Isso significa que nenhum alisamento é aplicado.


O segundo lugar onde você pode ver os valores padrão está no código fonte:


        /// <summary>
        /// Sets the default parameters for the designated slot type
        /// </summary>
        public Momentum( SlotTypes slotType)
        {
            sIndicatorName  = "Momentum";
            parameters      = new IndicatorParam();
            component       = new IndicatorComp[] { };
            bSeparatedChart = true;
            bIsCalculated   = false;

            // The indicator name
            parameters. IndicatorName = sIndicatorName;

            // The slot type
            parameters. SlotType = slotType;

            // The ComboBox parameters
            parameters. ListParam[0]. Caption  = "Logic";
            parameters. ListParam[0]. ItemList = new string[]
            {
                "The Momentum rises",
                "The Momentum falls",
                "The Momentum is higher than the Level line",
                "The Momentum is lower than the Level line",
                "The Momentum crosses the Level line upward",
                "The Momentum crosses the Level line downward",
                "The Momentum changes its direction upward",
                "The Momentum changes its direction downward"
            };
            parameters. ListParam[0]. Index    = 0;
            parameters. ListParam[0]. Text     = parameters. ListParam[0]. ItemList[ parameters. ListParam[0]. Index];
            parameters. ListParam[0]. Enabled  = true;
            parameters. ListParam[0]. ToolTip  = "Logic of application of the indicator.";

            parameters. ListParam[1]. Caption  = "Smoothing method";
            parameters. ListParam[1]. ItemList = Enum. GetNames( typeof( MAMethod));
            parameters. ListParam[1]. Index    = 0;
            parameters. ListParam[1]. Text     = parameters. ListParam[1]. ItemList[ parameters. ListParam[1]. Index];
            parameters. ListParam[1]. Enabled  = true;
            parameters. ListParam[1]. ToolTip  = "The Moving Average method used for smoothing the Momentum value.";

            parameters. ListParam[2]. Caption  = "Base price";
            parameters. ListParam[2]. ItemList = Enum. GetNames( typeof( BasePrice));
            parameters. ListParam[2]. Index    = 3;
            parameters. ListParam[2]. Text     = parameters. ListParam[2]. ItemList[ parameters. ListParam[2]. Index];
            parameters. ListParam[2]. Enabled  = true;
            parameters. ListParam[2]. ToolTip  = "The price the Momentum is based on.";

            // The NumericUpDown parameters
            parameters. NumParam[0]. Caption = "Period";  <----- Parameter Name
            parameters. NumParam[0]. Value   = 10;        <----- Default Value
            parameters. NumParam[0]. Min     = 1;
            parameters. NumParam[0]. Max     = 200;
            parameters. NumParam[0]. Enabled = true;
            parameters. NumParam[0]. ToolTip = "The period of Momentum.";
 
            parameters. NumParam[1]. Caption = "Additional smoothing"; <----- Parameter Name 
            parameters. NumParam[1]. Value   = 0;        <----- Default Value
            parameters. NumParam[1]. Min     = 0;
            parameters. NumParam[1]. Max     = 200;
            parameters. NumParam[1]. Enabled = true;
            parameters. NumParam[1]. ToolTip = "The period of additional smoothing.";

            parameters. NumParam[2]. Caption = "Level";  <----- Parameter Name
            parameters. NumParam[2]. Value   = 0;        <----- Default Value
            parameters. NumParam[2]. Min     = -100;
            parameters. NumParam[2]. Max     = 100;
            parameters. NumParam[2].Point   = 4;
            parameters. NumParam[2]. Enabled = true;
            parameters. NumParam[2]. ToolTip = "A critical level (for the appropriate logic).";

            // The CheckBox parameters
            parameters. CheckParam[0]. Caption = "Use previous bar value";
            parameters. CheckParam[0]. Checked = Data. Strategy. PrepareUsePrevBarValueCheckBox( slotType);
            parameters. CheckParam[0]. Enabled = true;
            parameters. CheckParam[0]. ToolTip = "Use the indicator value from the previous bar.";
        }
 
Miroslav_Popov >> :

Olá zfs,

Em princípio, não duvidei de sua irrepreensibilidade. O problema é que, apesar de tudo isso, os valores finais dos indicadores não correspondem para mim. Ou não o fizeram? Infelizmente, não tenho tempo para verificá-lo agora.

 

Zfs,

Com a ajuda do Stellarator eu resolvi muitos problemas na FSB. Eu também alterei os parâmetros padrão da FSB para ser assim na MT. Espero que a maioria das diferenças já tenham sido corrigidas.


Por favor, não hesite em relatar quaisquer possíveis erros. Todos os comentários e críticas são bem apreciados.

 
Stellarator >> :

Eu tenho que dissuadir você! A nuança chave é o "limite de uma iteração da EA". Portanto, dentro destes limites, o indicador é calculado UMA VEZ (na primeira chamada)! Declaro isto com 100% de confiança. Todas as chamadas subseqüentes não começam() de forma alguma, mas apenas tomam os valores necessários dos amortecedores necessários. A condição é 100% quando os parâmetros de entrada permanecem inalterados (exceto para o buffer e o offset). A regra funciona quando os cálculos são realizados dentro de um único instrumento. Mas eu acho que o princípio se aplica mesmo quando o iCustom se refere a outras TFs e ferramentas.


Estou interessado em escrever um consultor especializado que se aplica ao indicador do valor do indicador no minuto atual na barra 0 240 vezes. Ou seja, acontece que a saída tem sempre o primeiro valor? Confirme, por favor, porque isto é novidade para mim.

 
zfs >> :

Pergunta fora de tópico, acabei de me envolver na escrita de um consultor especializado, que na 0ª barra 240 vezes acessa o indicador para o valor do indicador no minuto atual. Ou seja, acontece que a saída é sempre o primeiro valor? Confirme, por favor, porque isto é novidade para mim.

>> O Expert Advisor reinicia a cada novo tick e esta é uma iteração diferente, e portanto os valores do indicador serão diferentes.

 
rider >> :

O EA será reiniciado a cada novo tick, e esta é uma iteração diferente, e portanto os valores indicadores serão diferentes.

Se você usar corretamente o parâmetro "Use o valor de barra anterior", você não precisa do valor de barra atual do indicador.

Digamos que você nos MA(simples, 12, fechar) em um gráfico diário. Para calcular este MA corretamente, você precisa dos preços de fechamento de 12 barras.

Se agora são 3PM, o preço "fechado" atual não é o preço fechado real da barra. Vai ser trocado até as 12 horas. Portanto, o uso de MA para o bar atual não inclui o preço realmente próximo, mas um preço temporário. Ao mesmo tempo, o back test utiliza o preço real (já fixado) de fechamento das barras históricas. Esta prática trará diferenças entre o backtest e o comércio real.


Pior ainda:

Vejamos a regra lógica "Um FastMA vai acima de um SlowMA", onde ambos os MA se baseiam no preço Close.

Se durante o dia o mercado sobe rapidamente, o FastMa pode cruzar acima do SlowMA, o que fará subir um sinal de compra. Você vai comprar seguindo o sinal. Deixe que depois do negócio o mercado desça e feche tão baixo, que o FastMA se mova abaixo do Slow. Você vê o problema? Você já comprou antes do fechamento do bar. Se você voltar atrás nesta estratégia mais tarde, você verá que não existe tal sinal de compra para dentro deste bar. E o quê? Você vai culpar o retrocessor, mas o problema está na lógica estratégica errada.


O Forex Strategy Builder o protege de tais erros lógicos, ajustando automaticamente o parâmetro "Use previous bar value". A FSB nunca usa indicadores de mudança (ainda não fixados) para testes de retrocesso. E, nessa lógica, por que um EA tem que calcular um indicador para cada tick se a estratégia não o utiliza. Um cálculo por barra é suficiente:

- se o indicador utiliza Preço Aberto - o cálculo tem que ser na abertura do bar;

- se o indicador utilizar Fechar, Alto, Baixo ou qualquer combinação dos preços - o cálculo tem que ser feito no fechamento do bar.






 

Boa noite a todos!


Estou sem computador durante o fim de semana :(. E hoje eu não tinha nada para fazer por causa do trabalho, então... de alguma forma...

Tinha tempo para pensar, no entanto. E (espera-se) decidiu estrategicamente (em termos de estrutura de indicadores).

Em geral, a estrutura interna dos indicadores a partir de agora será semelhante (descreverei isso mais tarde, talvez amanhã). O que "se cola" ao exterior (parâmetros) - o mais próximo possível da FSB. Isto é, seu número, valores (e seus limites) e a funcionalidade definida por eles - bem... quase um para um :). As micro nuances permanecem, mas nós o decidiremos à medida que formos avançando.


Muito brevemente por enquanto (vou para a cama agora, não estarei aqui amanhã ou no dia seguinte, provavelmente, tenho muitas coisas para fazer no trabalho) (pelo exemplo de "nossa adorável" LER :D):

1. Parâmetros:

// -------- Indicator parameters
extern int     slotType = SLOT_TYPE_OPENFILTER; // SLOT_TYPE_LC
extern int     indLogic = INDICATOR_RISES;      // INDICATOR_RISES <= indLogic <= INDICATOR_CHANGES_DIR_DOWNWARD
extern int     maMethod = MA_METHOD_SMOOTHED;   // MA_METHOD_SIMPLE <= maMethod <= MA_METHOD_SMOOTHED
extern int     basePrice= BASE_PRICE_CLOSE;     // BASE_PRICE_OPEN <= basePrice <= BASE_PRICE_WEIGHTED
extern int     iPeriod  = 14;                   // 1 <= iPeriod <= 200
extern int     dLevel   = 30;                   // 0 <= dLevel <= 100
extern bool    iPrvs    = True;                 // True / False




Acho que está mais ou menos claro da imagem como ela é. A única coisa que pode causar dificuldade: slotType, seus respectivos valores (que talvez difiram do FSB, mas neste caso não é um ponto crucial):

// Slot Types
#define  SLOT_TYPE_OPEN                   0  // Point of the Position
#define  SLOT_TYPE_CLOSE                  1  // Point of the Position
#define  SLOT_TYPE_OPENFILTER             2  // Logic Condition
#define  SLOT_TYPE_CLOSEFILTER            3  // Logic Condition

O resto é simples. Os valores numéricos são definidos como estão. Os valores em ComboBoxes são numerados a partir de 0 (como em arrays).

Osvalores numéricos dos métodos de suavização e constantes de preços são DIFERENTES da MT (tenho pensado há muito tempo, mas decidi quebrar estereótipos em nome da compatibilidade com a FSB :) ). Tudo isso, de fato, é feito para que no futuro os Conselheiros Especialistas (ou o que os próprios usuários escreverão) possam "contorcer" os indicadores facilmente e sem forçar :) (o que eles viram na FSB é o que eles fixaram ("o que eu vejo é o que eu canto")). Grosseiramente:

duplo dRSI = iCustom(NULL, 0, "-FSB- RSI", 2, 0, 3, 3, 3, 14, 30, 1, 0, 0, 0);

por exemplo, acima.


2. Valores devolvidos:

Os dois primeiros buffers indicadores em cada indicador são reservados para preços de posição aberta (longo/curto respectivamente), ou para condições lógicas (1,0 - sim / qualquer outro valor - não). Além disso, temos os próprios valores indicadores (caso eles sejam interessantes para alguém):


O conteúdo dos dois primeiros buffers é determinado pela lógica do indicador(slotType e indLogic) (ou seja, mais uma vez - há preços ou 1 / 0 (recomendo verificar com "1", pois outros valores podem não ser apenas zero (em geral - pois o indicador não tem valor pode ter VALOR VAZIO_VALOR)).


Todos os indicadores foram otimizados levando em conta o IndicatorCounted() (esta é a principal mudança do código original, em geral) (Miroslav está certo, no caso geral - você deve recalcular os valores dos indicadores uma vez por barra (novamente - no caso geral... ;)). Mas para uma exibição visual correta, e em geral (bom tom)... Em geral, não deve diminuir muito o ritmo.


Para renderizar objetos gráficos coloridos e similares ("especialmente dotados" :)) são utilizados objetos gráficos indicadores (não para ocupar buffers extras). Eu mesmo o testei e funciona bem (quando visualmente exibido, é mais lento que os amortecedores indicadores, mas não muito crítico, e quando o iCustom é chamado, as funções gráficas não são chamadas, então "excessos" não afetarão a velocidade).


É tudo por agora, tenho algumas perguntas para Miroslav, mas já estou exausto :), vou tentar fazê-las amanhã (mas vou, como disse antes - com pressa)...


p.s. Antes de mover os arquivos do arquivo - exclua os arquivos fsb*.mq4 na pasta Experts\Indicators\. O resto só precisa ser sobregravado sobre o antigo. De agora em diante, as convenções de nomenclatura de arquivos não mudarão (todos os indicadores terão o prefixo "-FSB- " ).

Arquivos anexados:
experts_1.rar  148 kb