[ARQUIVO!] Qualquer pergunta de novato, para não desorganizar o fórum. Profissionais, não passem por aqui. Em nenhum lugar sem você - 4. - página 501

 
Roman.:

"Quero fazer isso para não obter os mesmos dados em f-funções diferentes ". Na minha opinião, calcular as mesmas máscaras em 2 ou mais funções f não é razoável. É mais fácil de calcular uma vez e pronto. Por que desperdiçar recursos adicionais com isso?

Faça o que diz na documentação e não reinvente a roda.

O que este ciclo tem a ver com o que quer que seja?

 for(int i=1;i<=Bars;i++)
   {
      double i_maFast1 = iMA(Symbol(),i_TF,i_maFastPeriod,i_maFastShift,i_maFastMethod,0,i);      // Вычисляем быстрые скользящие..
      double i_maFast2 = iMA(Symbol(),i_TF,i_maFastPeriod,i_maFastShift,i_maFastMethod,0,i+1);    //..средние
      double i_maSlow1 = iMA(Symbol(),i_TF,i_maSlowPeriod,i_maSlowShift,i_maSlowMethod,0,i);      // Вычисляем медленные скользящие..
      double i_maSlow2 = iMA(Symbol(),i_TF,i_maSlowPeriod,i_maSlowShift,i_maSlowMethod,0,i+1);    //..средние
      double stochD1 = iStochastic(Symbol(),i_TF,i_stoch_D,i_stoch_K,i_stoch_slowing,0,0,1,i);     // Вычисляем значения сигнальной линии..
      double stochD2 = iStochastic(Symbol(),i_TF,i_stoch_D,i_stoch_K,i_stoch_slowing,0,0,1,i+1);   //..стохастика
      double stochK1 = iStochastic(Symbol(),i_TF,i_stoch_D,i_stoch_K,i_stoch_slowing,0,0,0,i);     // Вычисляем значения главной линии..
      double stochK2 = iStochastic(Symbol(),i_TF,i_stoch_D,i_stoch_K,i_stoch_slowing,0,0,0,i+1);   //..стохастика
   }

Passe pelas etapas você mesmo, o que acontece quando você sai e o que fazer com ele a seguir? É um absurdo.

Você o faz como no tutorial - todos os sinais comerciais nesta definição de critérios comerciais - em série (você pode envolvê-los em diferentes funções e depois trabalhar com eles ao verificar se esses critérios comerciais funcionam), depois as condições para seu trabalho.

Com relação ao ciclo, é porque vou verificar a interseção dos parâmetros indicadores. É tudo elementar aqui. Eu o li e está escrito do jeito que eu penso que está.

O livro didático em geral https://book.mql4.com/ru/build/conditions está todo amontoado. Eu tenho MACD e estocástico em uma função, eu não preciso dele.

Na verdade, todos os valores indicadores no link devem ser transferidos para as funções apropriadas. Por que não? Isto é lógico.

 
TarasBY:
O que você conta e o que você "desenha" - DUAS GRANDES DIFERENÇAS!!! :))

Já estou ficando um pouco confuso. Aqui estão 3 funções, cada uma das quais recebe um sinal específico para um indicador específico.

//+---------------------------------------------------------------------------------------+
//| Проверка пересечения скользящих средних                                               |
//+---------------------------------------------------------------------------------------+
int GetCrossingMa(double& i_maFast1, double& i_maFast2, double& i_maSlow1, double& i_maSlow2)
{
      if ((i_maFast2<i_maSlow2) && (i_maFast1>i_maSlow1))             // Если быстрая скользящая пересекла медленную снизу вверх..
      return(CROSSINGTOUP);                                           //.. значит, - пересечение вверх
                                                 
      if ((i_maFast2>i_maSlow2) && (i_maFast1<i_maSlow1))             // Если быстрая скользящая средняя пересекла медленную сверху вниз..
      return(CROSSINGTODOWN);                                         //..значит, - пересечение вниз
 
   return(CROSSINGWAIT);                                              // Ожидаем пересечения
}

//+---------------------------------------------------------------------------------------+
//| Получение сигнала от Стохастика                                                       |
//+---------------------------------------------------------------------------------------+
int GetStochSignal(double& stochD1, double& stochD2, double& stochK1, double& stochK2)
{
      if((stochD2<stochK2) && (stochD1>stochK1))                     // Если сигнальная линия пересекла главную снизу вверх..
      return(CROSSINGTOUP);                                          //..значит, - пересечение вверх
      if((stochD2>stochK2) && (stochD1<stochK1))                     // Если сигнальная линия пересекла главную сверху вниз..
      return(CROSSINGTODOWN);                                        // ..значит, - пересечение вниз
   return(CROSSINGWAIT);                                             // Ожидаем пересечения
}

//+---------------------------------------------------------------------------------------+
//| Получение сигнала от Моментума                                                        |
//+---------------------------------------------------------------------------------------+
void GetMomentumSignal()
{
   double momentum = iMomentum(Symbol(),i_TF,i_momPeriod,0,0);
}

Esta função recebe sinal geral de todos os índices e toma a decisão de COMPRAR ou VENDER.

//+---------------------------------------------------------------------------------------+
//| Получение общего сигнала для входа в рынок                                            |
//+---------------------------------------------------------------------------------------+
int GetSignal()
{
   for(int i=1;i<=Bars;i++)
   {
      double i_maFast1 = iMA(Symbol(),i_TF,i_maFastPeriod,i_maFastShift,i_maFastMethod,0,i);      // Вычисляем быстрые скользящие..
      double i_maFast2 = iMA(Symbol(),i_TF,i_maFastPeriod,i_maFastShift,i_maFastMethod,0,i+1);    //..средние
      double i_maSlow1 = iMA(Symbol(),i_TF,i_maSlowPeriod,i_maSlowShift,i_maSlowMethod,0,i);      // Вычисляем медленные скользящие..
      double i_maSlow2 = iMA(Symbol(),i_TF,i_maSlowPeriod,i_maSlowShift,i_maSlowMethod,0,i+1);    //..средние
      double stochD1 = iStochastic(Symbol(),i_TF,i_stoch_D,i_stoch_K,i_stoch_slowing,0,0,1,i);     // Вычисляем значения сигнальной линии..
      double stochD2 = iStochastic(Symbol(),i_TF,i_stoch_D,i_stoch_K,i_stoch_slowing,0,0,1,i+1);   //..стохастика
      double stochK1 = iStochastic(Symbol(),i_TF,i_stoch_D,i_stoch_K,i_stoch_slowing,0,0,0,i);     // Вычисляем значения главной линии..
      double stochK2 = iStochastic(Symbol(),i_TF,i_stoch_D,i_stoch_K,i_stoch_slowing,0,0,0,i+1);   //..стохастика
   }
      if( GetCrossingMa(i_maFast1, i_maFast2, i_maSlow1, i_maSlow2)==CROSSINGTOUP || i_maFast1>i_maSlow1 )
      return(SIGNAL_BUY);
}

Esta é a principal função que recebe o sinal geral; aqui obtemos os valores dos índices através do laço para passar por todas as barras, é claro. E então os valores obtidos são passados por referência às funções apropriadas onde estes valores são necessários, ou seja, às funções:

int GetCrossingMa(double& i_maFast1, double& i_maFast2, double& i_maSlow1, double& i_maSlow2)

int GetStochSignal(double& stochD1, double& stochD2, double& stochK1, double& stochK2)

nulo GetMomentumSignal() , em princípio, também pode ser colocado lá.

Assim, todos os cálculos dos índices estarão em uma função principal de obter o sinal. Tudo aqui é lógico.

 

Imediatamente após a anexação ao gráfico, o programa inicia a função init(). A função init() do Advisor anexado ou indicador personalizado começa imediatamente após o início do terminal do cliente e carregamento (diz respeito apenas aos advisors e não aos indicadores) dos dados históricos, após uma mudança de símbolo e/ou período gráfico, após a recompilação do programa no MetaEditor, após uma mudança dos parâmetros de entrada a partir da janela de configurações do EA ou indicador personalizado. O Expert Advisor também é inicializado após uma mudança de conta.

Você pode explicar como funciona? Em segundo plano, ou isto pode ser rastreado de alguma forma? Ou a função init no indicador, quando eu inicio o terminal depois de um longo tempo ocioso não vai começar de jeito nenhum?

 
fore-x:

Imediatamente após a anexação ao gráfico, o programa inicia a função init(). A função init() do Advisor anexado ou indicador personalizado começa imediatamente após o início do terminal do cliente e carregamento (diz respeito apenas aos advisors e não aos indicadores) dos dados históricos, após uma mudança de símbolo e/ou período gráfico, após a recompilação do programa no MetaEditor, após uma mudança dos parâmetros de entrada a partir da janela de configurações do EA ou indicador personalizado. O Expert Advisor também é inicializado após uma mudança de conta.

Você pode explicar como funciona? Em segundo plano, ou isto pode ser rastreado de alguma forma? Ou a função init no indicador no início do terminal não começará depois de um longo tempo ocioso?

A função init é destinada ao armazenamento de dados que não serão alterados durante toda a execução da EA. Estes podem ser alguns dados que serão calculados apenas uma vez depois que o programa for carregado e não for necessário mais um novo cálculo. É assim que eu entendo isto.

E se os valores das variáveis precisam ser recalculados, por exemplo, a cada chegada de uma nova barra, então não devemos declarar tais variáveis na função init, uma vez que elas não serão recalculadas lá.

Para facilitar a compreensão, isto é o que pode e deve ser declarado no init:

   Tick = MarketInfo(Symbol(), MODE_TICKSIZE);                         // минимальный тик    
   Spread = ND(MarketInfo(Symbol(), MODE_SPREAD)*Point);                 // текущий спрэд
   StopLevel = ND(MarketInfo(Symbol(), MODE_STOPLEVEL)*Point);  // текущий уровень стопов
   MinLot = MarketInfo(Symbol(), MODE_MINLOT);    // минимальный разрешенный объем сделки
   MaxLot = MarketInfo(Symbol(), MODE_MAXLOT);   // максимальный разрешенный объем сделки
   LotStep = MarketInfo(Symbol(), MODE_LOTSTEP);          // шаг приращения объема сделки

Esta é uma coleta de dados do mercado e estes dados não são alterados. Embora seja uma questão com Spread variable... se o spread não for fixo, é melhor colocá-lo em funções separadas.

 
hoz:

A função init é usada para armazenar dados que não serão alterados durante a vida útil da EA...

Você está respondendo off-topic, mais uma vez - a função init()é iniciada após ocarregamentodos dados históricos (isso só se aplica aos Expert Advisors, não aos indicadores) - como você entende isso (eu quero sentir isso)?


Pegar um peão em um passe - eu sei que existe tal regra, mas eu não sei como aplicá-la (é mais claro)?

 
Respondi acima conforme entendi. Eu realmente não entendi seu ponto de vista. Talvez alguém mais o faça.
 

Bom dia a todos. Por favor, ajudem-me, eu tenho uma combinação de castiçais e gostaria que eles trabalhassem em diferentes escalas de tempo. A título de exemplo

if(iHigh("EURUSD",PERÍODO_M5,1)>iLow("EURUSD",PERÍODO_M5,1)+8*kio*Point)

{

go_s=true;

}

Pensei que poderia ligar minha combinação usando iHigh, iLow, iOpen, etc. Mas quando testado no M5 mostra um resultado, mas em outros períodos de tempo, outro. Por favor, ajude o que estou fazendo de errado. Obrigado!

 
hoz:

...

O livro didático https://book.mql4.com/ru/build/conditions está pronto para ser usado. Ele tem MACD e estocástico em uma função, e não preciso dele dessa maneira.

E, de fato, todos os valores indicadores pelo link devem ser passados para as funções apropriadas. Por que não? Isto é lógico.

Assim, acontece que todos os cálculos dos índices estarão em uma função f principal de obter o sinal. Tudo isso faz sentido.

Desculpe, mas parece que você ainda está no início da cadeia alimentar, é exatamente onde "tudo é lógico". :-)

Faça-o como um LIVRO DE ESTUDOS e DOCI, e depois envolva-o em funções separadas e obtenha um critério comercial no resultado.

No tutorial - tudo é registrado de uma só vez no resultado, você pode registrar suas f-i-ções - separadamente, e o RESULTADOR é desenhado como no tutorial! Não é necessária a transferência de laço ou valor de parâmetro por referência aqui!

P.S. E em geral, em primeiro lugar, desmontar os códigos das exposições - todos no tutorial e alguns no kodobase - tudo se encaixa no lugar.

 
fore-x:

Imediatamente após a anexação ao gráfico, o programa inicia a função init(). A função init() do Advisor anexado ou indicador personalizadocomeça imediatamente após o início ecarregamento do terminal do cliente(diz respeito somente aos advisors e não aos indicadores)dos dados históricos, após uma mudança de símbolo e/ou período de gráfico, após recompilar o programa no MetaEditor, após uma mudança dos parâmetros de entrada da janela de configurações do EA ou indicador personalizado. O Expert Advisor também é inicializado após uma mudança de conta.

Você pode explicar como funciona? Em segundo plano, ou isto pode ser rastreado de alguma forma? Ou a função init no indicador, quando você inicia o terminal depois de um longo tempo ocioso, ele não começará de jeito nenhum?

Não tenho certeza do que você quer. Em sua descrição do init(), há alguns "pontos" não muito corretos destacados em vermelho. Por exemplo, o início do terminal do cliente é acompanhado pelo carregamento de dados históricos e é incorreto destacar a palavra "carregamento" - não é o processo que inicia a inicialização.

E nem tudo na vida pode ser tocado: no máximo - para contemplar. :)))) Você quer corrigir o processo de inicialização, ou seja, iniciar a função init() - imprimir uma linha de notificação dentro desta função.

 
hoz:

Estou ficando um pouco confuso agora. Aqui estão 3 funções, cada uma das quais recebe um sinal específico para um indicador específico.

Esta função recebe sinal geral de todos os índices e toma a decisão de COMPRAR ou VENDER.

Esta é a principal função que recebe o sinal geral; aqui obtemos os valores dos índices através do laço para passar por todas as barras, é claro... E então os valores obtidos são passados por referência às funções apropriadas onde estes valores são necessários, ou seja, às funções:

int GetCrossingMa(double& i_maFast1, double& i_maFast2, double& i_maSlow1, double& i_maSlow2)

int GetStochSignal(double& stochD1, double& stochD2, double& stochK1, double& stochK2)

nulo GetMomentumSignal() , em princípio, também pode ser colocado lá.

Assim, todos os cálculos dos índices estarão em uma função principal de obter o sinal. Neste caso, tudo é lógico...

Victor! Você tem lógica, mas não conhecimento suficiente. O primeiro, se você não desistir, o ajudará a ir além do livro didático, e para "ganhar" o segundo, você tem que começar com ele (do livro didático). Você não está pronto (ainda) para construir sua própria estrutura lógica de código, volte para a versão alfabética.
P.S. O que "chama a atenção" em seu código:

Na função GetSignal() para busca de cruzamento de duas linhas o para loop PODE ser usado, mas é melhor usar enquanto loop, embora esta seja a preferência pessoal. Para começar, você precisa mover um parêntese como em "Execução não pode ser perdoada" para fazer seu código executar o que você acabou de dizer. Por alguma razão, esta função (resultado) não tem resultados de duas funções: GetStochSignal() e GetMomentumSignal() - isto é ligeiramente inconseqüente.

nas funções GetCrossingMa() e GetStochSignal() não faz sentido passar parâmetros por referências, porque faria sentido, se estas variáveis dentro da função MUDAR seus valores.

A função GetMomentumSignal() void retorna NOTHING.

Embora eu admita que é "pior ver" de fora. :)))

Razão: