Perguntas de Iniciantes MQL5 MT5 MetaTrader 5 - página 926

 
Seric29:
Que operador pode ser utilizado, a partir do qual podem ser devolvidos 2 resultados? Utilizo a declaração se para encontrar esta condição, mas não posso devolver múltiplos resultados, caso em que tenho de escrever a mesma condição 2 vezes, por isso estou a escrever com esta pergunta.

Não é muito claro que condições são verificadas, mas talvez a troca funcione para si. E em TRUE atribuir os valores de que necessita.

 
Existe uma função de troca de valores de duas variáveis?
 
pivomoe:
Existe uma função de troca de valores de duas variáveis?

Fórum sobre comércio, sistemas automatizados de comércio e teste de estratégias comerciais

Características da linguagem mql5, subtilezas e truques

fxsaber, 2018.08.26 19:02

A parte inglesa do fórum mostrou
// Обмен значениями между двумя числовыми переменными
#define  SWAP(A, B) { A += B; B = A - B; A -= B; }

 
Artyom Trishkin:

Obrigado. Terei de me familiarizar com estas definições.

 
Olá! Porque é que a função Bars() tem valores diferentes quando chamada do indicador e do perito e COMO FAZER A CONFERÊNCIA?
 
Tango_X:
Olá! Porque é que a função Bars() tem valores diferentes quando chamada do indicador e do Expert Advisor e COMO FAZER A CONFERÊNCIA?

Mostrar código da EA e indicador.

 
Alexey Viktorov:

Mostrar código da EA e indicador.

Basta chamar a função Barras(_Símbolo,_Periodo)

 
Tango_X:

Basta chamar a função Barras(_Símbolo,_Periodo)

Tenho de pedir uma impressão do resultado separadamente?

Não tenho qualquer diferença. Embora no testador esta variante não esteja excluída devido à disponibilidade da história sobre a qual sei pouco, apenas vagas recordações do que li há algum tempo atrás. Afinal de contas, revela-se o número total de barras disponíveis. Mas se perguntar de vez em quando, não pode haver qualquer diferença.

 
Alexey Viktorov:
A declaração se não devolve qualquer valor.

Há duas opções para atribuir valores a certas variáveis numa função separada:

1. As variáveis devem ser visíveis em todas as partes do programa. Ou seja, devem ser declarados ao nível da variável global (no início do código).

2. Passar variáveis declaradas localmente para a função do utilizador por referência. Ou seja, colocar & antes do nome da variável

Significa que, se uma condição for verdadeira, devem ser realizadas duas acções idênticas, por exemplo

        if
        (Bar_Op[qt+2]>=Bar_Lo[qt+1]&&Bar_Cl[qt+2]<=Bar_Hi[qt+1]&& 
        Bar_Cl[qt+2]>=Bar_Lo[qt+1]&&Bar_Op[qt+2]<=Bar_Hi[qt+1]&&
        Bar_Op[qt+3]>=Bar_Lo[qt+1]&&Bar_Cl[qt+3]<=Bar_Hi[qt+1]&&
        Bar_Cl[qt+3]>=Bar_Lo[qt+1]&&Bar_Op[qt+3]<=Bar_Hi[qt+1]&&
        Bar_Op[qt+4]>=Bar_Lo[qt+1]&&Bar_Cl[qt+4]<=Bar_Hi[qt+1]&&
        Bar_Cl[qt+4]>=Bar_Lo[qt+1]&&Bar_Op[qt+4]<=Bar_Hi[qt+1])
         {
          int iHgCL=iHighest(_Symbol,PERIOD_D1,MODE_CLOSE,4,qt+1); int iHgOP=iHighest(_Symbol,PERIOD_D1,MODE_OPEN,4,qt+1);
         Price_UrNij = Bar_Cl[iHgCL]>Bar_Op[iHgOP] ? Bar_Cl[iHgCL]:Bar_Op[iHgOP];//провести нижний уровень
         int iLwCL=iLowest(_Symbol,PERIOD_D1,MODE_CLOSE,3,qt+1); int iLwOP=iLowest(_Symbol,PERIOD_D1,MODE_OPEN,3,qt+1);
         Price_UrVerh = Bar_Cl[iLwCL]<Bar_Op[iLwOP] ? Bar_Cl[iLwCL]:Bar_Op[iLwOP];//провести верхний уровень я перепутал записи местами и условие перевёрнуто задом на перёд но для примера вопроса пойдёт

         string Line_TR="Ln_TRUr"+DoubleToString(qt,0);
         vs_Line_TR( Line_TR, iTime(_Symbol,PERIOD_D1,qt+2),  Price_UrNij, iTime(_Symbol,PERIOD_D1,qt), Price_UrNij, clrGreen, DRAW_LINE, 2, false, false);
}

Variáveis que declarei e nada é feito excepto esta acçãoPrice_UrNij = Bar_Cl[iHgCL]>Bar_Op[iHgOP] ? Bar_Cl[iHgCL]:Bar_Op[iHgOP]; ou esta acçãoPrice_UrVerh = Bar_Cl[iLwCL]<Bar_Op[iLwOP] ? Bar_Cl[iLwCL]:Bar_Op[iLwOP]; como fazê-lo executar 2 acções idênticas para executar tanto o nível superior como o inferior por condição. Alguém me pode dizer como escrevê-lo mais curto?

 
Konstantin Nikitin:

Não é muito claro que condições são verificadas, mas talvez a troca funcione para si. E em VERDADEIRO atribuir os valores que deseja.

 if
        (Bar_Op[qt+2]>=Bar_Lo[qt+1]&&Bar_Cl[qt+2]<=Bar_Hi[qt+1]&& 
        Bar_Cl[qt+2]>=Bar_Lo[qt+1]&&Bar_Op[qt+2]<=Bar_Hi[qt+1]&&
        Bar_Op[qt+3]>=Bar_Lo[qt+1]&&Bar_Cl[qt+3]<=Bar_Hi[qt+1]&&
        Bar_Cl[qt+3]>=Bar_Lo[qt+1]&&Bar_Op[qt+3]<=Bar_Hi[qt+1]&&
        Bar_Op[qt+4]>=Bar_Lo[qt+1]&&Bar_Cl[qt+4]<=Bar_Hi[qt+1]&&
        Bar_Cl[qt+4]>=Bar_Lo[qt+1]&&Bar_Op[qt+4]<=Bar_Hi[qt+1])
         {
          int iHgCL=iHighest(_Symbol,PERIOD_D1,MODE_CLOSE,4,qt+1); int iHgOP=iHighest(_Symbol,PERIOD_D1,MODE_OPEN,4,qt+1);
         Price_UrNij = Bar_Cl[iHgCL]>Bar_Op[iHgOP] ? Bar_Cl[iHgCL]:Bar_Op[iHgOP];//провести нижний уровень
         int iLwCL=iLowest(_Symbol,PERIOD_D1,MODE_CLOSE,3,qt+1); int iLwOP=iLowest(_Symbol,PERIOD_D1,MODE_OPEN,3,qt+1);
         Price_UrVerh = Bar_Cl[iLwCL]<Bar_Op[iLwOP] ? Bar_Cl[iLwCL]:Bar_Op[iLwOP];//провести верхний уровень я перепутал записи местами и условие перевёрнуто задом на перёд но для примера вопроса пойдёт

         string Line_TR="Ln_TRUr"+DoubleToString(qt,0);
         vs_Line_TR( Line_TR, iTime(_Symbol,PERIOD_D1,qt+2),  Price_UrNij, iTime(_Symbol,PERIOD_D1,qt), Price_UrNij, clrGreen, DRAW_LINE, 2, false, false);

Tem de executarPrice_UrNij = Bar_Cl[iHgCL]>Bar_Op[iHgOP] ? Bar_Cl[iHgCL]:Bar_Op[iHgOP]; ePrice_UrVerh = Bar_Cl[iLwCL]<Bar_Op[iLwOP] ? Bar_Cl[iLwCL]:Bar_Op[iLwOP];.

Razão: