[AVISO FECHADO!] Qualquer pergunta de novato, para não desorganizar o fórum. Profissionais, não passem por aqui. Não posso ir a lugar algum sem você. - página 660

 
Craft:


Anatoly, muito obrigado, é uma pena que você não possa inserir um ícone aqui, como no Skype com um arco. Tudo é simples e elegante. Entendo, pela comunicação com outros programas de análise técnica, que deveria ser assim, mas ainda estou sem prática no trabalho com o mql. Obrigado pela dica sobre a marcação no método - eu vou descobrir.

Para minha última dica, como evitar a colocação de pedidos múltiplos em uma barra por este EA? Já recebi dicas das boas pessoas, mas elas não me ajudaram.

Eu tentei resolver seu problema e foi isso que consegui. Mas antes de mais nada.

Quem é o culpado e o que fazer? Ou de onde vêm as pernas...

Em seu Consultor Especialista, diferentes configurações do indicador CCI são usadas para abrir uma posição (e respectivamente, para fechar a anterior). Você tem diferentes configurações para compra e diferentes configurações para venda. Tanto quanto eu entendi, este é o truque. Por exemplo, nas tendências de alta, é mais lucrativo usar configurações menos sensíveis para comprar, para permitir que os lucros "cresçam" (ou seja, faz sentido manter a posição (ou seja, faz sentido manter uma posição em uma tendência por mais tempo). Enquanto a venda (up-trend) requer configurações mais sensíveis para permitir entradas/saídas rápidas, por exemplo, ao tentar pegar uma correção (e, portanto, permanecer no mercado com uma posição de contra-tendência por menos tempo). Tudo é muito lógico e a idéia faz sentido, mas há um ponto sutil sobre este sistema - o que fazer se dois sinais opostos ocorrem simultaneamente devido a diferenças nas configurações (na verdade, para o terminal são dois indicadores)?

Sobre as setas azuis...

O Expert Advisor em um bar recebe um sinal para comprar e vender ao mesmo tempo, e como escrevi acima, quando você abre uma posição, a posição oposta deve ser fechada. Neste caso, o sinal de compra é dado e o sinal de venda é fechado; se não houver venda até esse momento, o assessor abre a BUY. No próximo tick, é gerado o sinal oposto, para vender, e, portanto, apenas a compra aberta é fechada. Outra observação, você já notou que apenas a compra (muitas setas azuis) "vacila"? A implementação dos métodos de compra/venda, pelo que entendi, é tirada do tutorial, mas há uma característica, que após a conclusão da operação, saída do método de retorno pelo operador, ou seja, para um tick, pode haver apenas uma abertura/fechamento. Então, quando eu recebo um "sinal duplo", todas as ofertas são fechadas (o fechamento do bloco é descrito primeiro), depois bloqueie as ofertas de abertura, e nele a compra é descrita primeiro!!!, e depois da compra, saia do início(), para que o consultor não tenha tempo de chegar às vendas :))) e faça loops até obter uma ordem "normal" única.

Sobre os métodos de solução...

Há várias maneiras de resolver este problema.
1. O antiquado.
Para começar, você pode "matar" a idéia e simplesmente definir os mesmos parâmetros para compras e vendas e o problema desaparecerá por si só.

2. Complicado.
O algoritmo de determinação da tendência principal deve ser escrito no Expert Advisor, e, correspondentemente, diferentes "pesos" de negócios devem ser definidos. Portanto, quando sinais opostos chegam, a preferência deve ser dada àquele que tem um "peso" maior (ou seja, aquele que está em tendência).

3. Sem título.
Ao receber sinais multidirecionais...
Não faça nada.

if(Opn_B && Opn_S)return;

Esta é exatamente a opção no arquivo anexado abaixo.
Espero ter explicado tudo claramente.
Boa sorte :)))

Arquivos anexados:
11_3_1.mq4  13 kb
 

O posto da Volfram foi excluído para multiplicação em vários fios.

Volfram, você criou seu próprio fio especificamente para este fim. Você já foi respondido; isso não é suficiente?

P.S. Deixe-me contar-lhe um segredo, Volfram: a ausência de interesse evidente em sua idéia sugere implicitamente que ela não é digna de atenção. Por conseguinte, ninguém estava disposto a implementá-la "por uma taxa".

 
ToLik_SRGV:

2. Complicado.
Devemos integrar o algoritmo de determinação da tendência principal no Expert Advisor e dar diferentes "pesos" às negociações em conformidade. Portanto, quando sinais opostos chegam, a preferência deve ser dada àquele que tem um "peso" maior (ou seja, aquele que está em tendência).

3. Sem título.
Ao receber sinais dirigidos de maneira diferente ...
Não fazer nada.

Esta é exatamente a opção no arquivo anexo abaixo.
Espero ter explicado tudo claramente.
Boa sorte :)))

Permitam-me acrescentar também meu marco miliário... :)

Comecei também a partir de um livro didático. Você pode tornar mais simples: basta remover a compra fechada em um sinal de venda e vender fechada em um sinal de compra, ou seja, não usar a negociação de balanço, que foi implementada no tutorial de Sergey Kovalev... O rastreamento das posições não deve ser feito pelo bilhete, mas pelo mágico. No início eu o fiz e testei silenciosamente minhas idéias. Depois escrevi minhas próprias funções para o trabalho.

ZS. Eu não olhei o código, então eu poderia estar errado sobre esta EA...

 

Não consigo descobrir como encontrar os extremos de uma função

Eu tenho uma matriz de dados que armazena valores:

como encontrar as fraturas - extrema usando uma matriz de dados de 250 elementos e armazenar apenas os números dos elementos onde esses extremos estão localizados

 

Rapazes, tenho esta pergunta:

A função de detecção de tendências declara explicitamente que se a CA na primeira barra for maior que a CA na segunda barra (ou seja, aumentando), mas a tendência for para baixo (outros índices aparecem para baixo), então retorna zero nesse caso, ou seja, nenhuma tendência para baixo... Mas a EA teimosamente a ignora, qual pode ser a razão?


A função da inversão de tendências:

int Trend_BBOsMA (string sy, int tf)
{
   if (sy=="" || sy=="0") sy=Symbol();
double
   BB    =iCustom(sy,tf,"BB_MA",13,13,0,1),
   OsMA  =iOsMA  (sy,tf,9,21,5,PRICE_CLOSE,1),
   AC1   =iAC(sy,tf,1),
   AC2   =iAC(sy,tf,2),
   AC3   =iAC(sy,tf,3);
   
   if (BB>0 && OsMA>0 && AC1>AC2) return(1);
   if (BB<0 && OsMA<0 && AC1<AC2) return(-1);
   else return(0);
}

Verificação da abertura de ações (no início, verificação de tendências, às quais não reage: trH1 e trM15 ) - mais experiências com condições, não se importe, mas o código funciona...

//============================================================================================== 
   // Доливка 1
//==============================================================================================  
//------------------------- Покупка 1 ------------------------   
   if (AddPose1 &&
         trH1==1 &&                  // Если часовой и 
         trM15==1 &&                 // пятнадцатиминутный тренды восходящие
         Mom5_1>Mom5_2 &&              // найден разворот
         Mom5_2<=Mom5_3 &&             // Моментума
//         Mom5_2<=100.0 &&
//         DeM5_1<=0.6 &&                  // и Демаркер в зоне перепроданности
//         AC1>AC2 &&                    // Ускорение вверх ----------------------- ВОТ ЗДЕСЬ УБРАЛ
         SecondsAfterOpenLastPos(NULL, OP_BUY, 511)>=4*60
      )
         {
            Magic=511;          // Задаём магик... 
            Lots=GetSizeLot();
            divider=1;
//            if (trH1==10 || trM15==10) divider=2;
            Lots_New=NormalizeLot(Lots/divider, true, NULL);
            New_Comm="Buy_M5_Стратегия_1_Доливка1";   // Задаём комментарий для позиции
            OpenPosition(NULL, OP_BUY, Lots_New, 0, 0, Magic, New_Comm);
         }
//------------------------- Продажа 1 ------------------------   
   if (AddPose1 && 
         trH1==-1 &&                 // Если часовой и 
         trM15==-1 &&                // пятнадцатиминутный тренды нисходящие
         Mom5_1<Mom5_2 &&              // найден разворот
         Mom5_2>=Mom5_3 &&             // Моментума
//         Mom5_2>=100.0 &&
//         DeM5_1>=0.4 &&                  // и Демаркер в зоне перекупленности
//         AC1<AC2 &&                    // Ускорение вниз ------------------------ ВОТ ЗДЕСЬ УБРАЛ
         SecondsAfterOpenLastPos(NULL, OP_SELL, 511)>=4*60
      )
         {
            Magic=511;          // Задаём магик... 
            Lots=GetSizeLot();
            divider=1;
//            if (trH1==-10 || trM15==-10) divider=2;
            Lots_New=NormalizeLot(Lots/divider, true, NULL);
            New_Comm="Sell_M5_Стратегия_1_Доливка1";   // Задаём комментарий для позиции
            OpenPosition(NULL,OP_SELL,Lots_New,0,0,Magic,New_Comm);
         }
//==============================================================================================

Talvez alguém veja algo que eu não consiga ver? Obrigado.

 
A captura de tela não mostra o indicador BB_MA. E não há verificações de direção de tendência no código superior. A variável BB sempre conterá um valor. Tanto quanto sei, o indicador BB_MA é uma média móvel. Para determinar a direção média móvel deve-se ter 2 valores em castiçais diferentes, por exemplo, no primeiro e segundo castiçais e comparar estes valores entre si. Portanto, podemos dizer que o código superior desempenha sua tarefa apenas parcialmente.
 
IgorM:

Não consigo descobrir como encontrar os extremos de uma função

Eu tenho uma matriz de dados que armazena valores:

como encontrar as fraturas - extrema usando uma matriz de dados de 250 elementos e armazenar apenas os números dos elementos onde esses extremos estão localizados


Criamos um loop em que fazemos loop através dos valores da matriz. Comparamos o valor na célula anterior da matriz com o valor na célula atual. Se for maior, passamos para a próxima iteração do laço. Em resumo, continuamos o loop enquanto o valor em cada célula subseqüente do array for incrementado. Assim que o valor se torna menor que o anterior, armazenamos o número da célula anterior em uma matriz pré-declarada, porque ocorreu uma quebra de tendência - encontramos o pico. Agora a tendência está caindo. Agora fazemos a busca até que a próxima célula encontre um valor maior do que a anterior. Uma vez que isto acontece, o número da célula anterior é armazenado em uma matriz pré-definida, porque ocorreu uma inversão de tendência - encontramos o fundo da calha. Você pode colocar números em diferentes matrizes, para filtrar os picos dos canais. Em resumo, depois de passarmos por todos os valores da matriz, obtemos dados ordenados (procurando por números de células em uma/dois outras matrizes)
 
drknn:

Nós criamos um loop, no qual fazemos loop através dos valores da matriz. Comparamos o valor na célula anterior da matriz com o valor na célula atual. Se for maior, passamos para a próxima iteração do laço. Em resumo, continuamos o loop enquanto o valor em cada célula subseqüente do array for incrementado. Assim que o valor se torna menor que o anterior, armazenamos o número da célula anterior em uma matriz pré-declarada, porque ocorreu uma quebra de tendência - encontramos o pico. Agora a tendência está caindo. Agora fazemos a busca até que a próxima célula encontre um valor maior do que a anterior. Uma vez que isto acontece, o número da célula anterior é armazenado em uma matriz pré-definida, porque ocorreu uma inversão de tendência - encontramos o fundo da calha. Você pode colocar números em diferentes matrizes, para filtrar os picos dos canais. Em resumo, após passarmos por todos os valores da matriz, obteremos dados classificados (números de células em uma/dois outras matrizes)

yep, então temos que tentar até o primeiro pico, e depois ........ - Eu não consigo entender.
 
drknn:
A captura de tela não mostra o indicador BB_MA. E não há verificações de direção de tendência no código superior. A variável BB sempre conterá um valor. Tanto quanto entendi, o indicador BB_MA é uma média móvel. Para determinar a direção média móvel deve-se ter 2 valores em castiçais diferentes, por exemplo, no primeiro e segundo castiçais e comparar estes valores entre si. Portanto, podemos dizer que o código superior cumpre apenas parcialmente seu propósito.

Não, BB_MA é a abreviação de Bears&Bulls_MA. Ela soma os valores de touros e ursos e os exibe como um histograma, algo como McDuck ou algo semelhante. Sempre quando o histograma está acima de zero está com tendência para cima, quando está abaixo está com tendência para baixo...

Portanto, verificar a direção da tendência é:

if (BB>0 && OsMA>0 && AC1>AC2) return(1);

para UP e

if (BB<0 && OsMA<0 && AC1<AC2) return(-1);

para DOWN, bem e

 else return(0);

para Flat.

Isto é, a função retorna 1 se Bears&Bulls_MA estiver acima de zero, OsMA estiver acima de zero e o valor da primeira barra AC for maior que o valor da segunda barra AC,

e vice versa para a tendência de queda. Bem, para o plano, todas as outras diferenças nos gráficos (por enquanto..., mais tarde, quando eu o ordenar, vou conectar a verificação do movimento com aceleração/desaceleração e inversão).

As posições só devem serabertas quando há uma inequívoca "tendência para cima" ou "tendência para baixo"... Basicamente, tudo estava funcionando, até que adicionei AC para controlar a velocidade do movimento da moeda, de modo a excluir (parcialmente) posições de abertura no final do movimento, na exaustão ou correção da tendência.

Até agora, não está funcionando... e é AC.

 
IgorM:

sim, então temos que tentar até o primeiro pico e depois ........ - Eu não consigo entender.

Não - o laço deve ser feito por completo. Vou tentar inventar um roteiro. A idéia é realmente viável.
Razão: