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

 
Imminence:

Olá, tenho um problema de principiante...

Não consigo que o sistema compare o valor próximo da última barra com os altos e baixos de um determinado período, por exemplo

últimas 20 barras. O que é que estou a fazer mal?


Verifiquei-o com Alerta e por alguma razão desconhecida o testador mostra o valor máximo do cálculo do último tick, mas ele dá este valor

É o mesmo número de vezes que as carraças, por isso a ordem não abre.


A segunda questão é como fazer a minha EA esperar pela abertura do próximo bar (período de 30m)? Nos pontos de controlo testar tudo está bem, mas se eu usar carraças,

depois a EA abre no mesmo bar logo a seguir a ter fechado em stop loss.


Também, como posso fechar um negócio independente de um tick ou não? Por exemplo, durante um período de 30m quero fechar a encomenda 5 segundos antes do fim do bar (29.55, 59.55)

Com base em todos os dados nesse momento. Nesta fase, o problema é que se um tick não ocorrer em 5 segundos, portanto não

(Em teoria isto é uma treta, mas na realidade o próximo tique pode aparecer em alguns castiçais por alguma razão.

pode estar em algumas velas por alguma razão.


Obrigado de antemão!

1. Não vi nada sobre as últimas 20 barras no código.

2. Como determinar o primeiro tique de uma nova barra

3. como fechar uma encomenda sem verificar se foi uma carraça ou não?

Temos de evitar trabalhar com o OnTick e trabalhar com o OnTimer. Definir o temporizador com um intervalo de 1 segundo e verificar o tempo nele contido. O temporizador não depende de carraças.

/// Определяет начало нового бара
bool NewBar()
{
    static datetime lastbar = 0;
    datetime curbar = iTime(Symbol(), PERIOD_M30, 0);
    if(lastbar!=curbar)
    {
        lastbar=curbar;
        return (true);
    }
    return(false);
}
 
Leanid Aladzyeu:

o_oops não sabia que o terminal também picava onde estava o erro, a primeira vez que acertei num erro crítico.

Cuspiu nele.

Claro que vai cuspir, acede ao 3º elemento de uma matriz com dimensão 2 - mas[2]++

void Oher(int Mag,string Symb, int &mas[2])
..............
...........

case 1:mas[1]++; mas [2]++;break;// 1 продажа
 

Alexey Volchanskiy:
Так у тебя в комменте стоит управляющий символ "\n " - это символ перевода строки. Если его убрать, многострочия не будет.

É uma piada. Agora acrescenta um comentário no final da linha... e o texto corre para a direita. ;-)

 

Boa noite. Tentar escrever uma simples EA em tenkan e kinjun crossing. Aqui está o código:

nulo OnTick()

nulo OnTick()

{

TradeSignal_20();

}


int TradeSignal_20()

{

int sig=0;


if(h_ich==INVALID_HANDLE)

{

h_ich=iIchimoku(Símbolo(),Período(),IKHtenkansen,IKHkijunsen,IKHsenkouspanb);

return(0);

}

senão

{

if (CopyBuffer(h_ich,0,0,3,ich1_buffer)<2) return(0); // TENKANSEN_LINE

if (CopyBuffer(h_ich,1,0,3,ich2_buffer)<2) return(0); // KIJUNSEN_LINE

if (!ArraySetAsSeries(ich1_buffer,true)) return(0);

if (!ArraySetAsSeries(ich2_buffer,true)) return(0);

}

//--- verificar condição e valor definido para sig

if(ich1_buffer[1]>ich2_buffer[1]) sig=1;

senão se(ich1_buffer[1]<ich2_buffer[1]) sig=-1;

senão sig=0;

if (ich1_buffer[1]>ich2_buffer[1])

if (ich1_buffer[2]<ich2_buffer[2])

Alerta(Símbolo()+": compra");

if (ich1_buffer[1]<ich2_buffer[1])

if (ich1_buffer[2]>ich2_buffer[2])

Alerta(Símbolo()+": venda");

//--- devolver sinal comercial

devolução (sig);

}

//+------------------------------------------------------------------+

Como posso fazer com que o alerta seja chamado apenas uma vez e não constantemente?

 
Alexey Volchanskiy:

1. Não vi nada sobre as últimas 20 barras no código, dar detalhes.

2. Como determinar o primeiro tique de uma nova barra

3. como pode um comércio ser fechado, independentemente de ter sido assinalado ou não?

Tem de evitar trabalhar com OnTick e trabalhar com OnTimer, definir o temporizador com intervalo de 1 segundo e verificar o tempo nele contido. O temporizador não depende da chegada de carraças.

Aqui, como posso comparar o preço de fecho com o máximo das últimas 20 barras? E se o último preço for igual ou superior ao preço máximo das últimas 20 barras, então há um sinal para abrir.
  

double HIGHEST              = High[iHighest(Symbol(),0,MODE_HIGH,20,0)];


   
  if(Close[0] > SMMA && Close[0] > BB_UP && Close[0] >= HIGHEST)

  {
   TICKET = OrderSend(Symbol(),OP_BUY,LOT,Ask,0,Ask-StopLoss*Point,Ask+TakeProfit*Point,NULL,MAGIC,0,Blue);
   if(TICKET < 0)
      {
         Alert("Order Send failed, error # ", GetLastError() );
      } 
  }
 
first_may:

Boa noite. Tentar escrever uma simples EA em tenkan e kinjun crossing. Aqui está o código:

nulo OnTick()

nulo OnTick()

{

TradeSignal_20();

Como posso fazer com que o alerta seja chamado apenas uma vez e não o tempo todo?
Não pode premir o botão SRC?
 
Imminence:
Aqui, como posso comparar o preço de fecho com o máximo das últimas 20 barras? E se o último preço for igual ou superior ao máximo das últimas 20 barras, então há um sinal para abrir.
Vejamos o código
double HIGHEST              = High[iHighest(Symbol(),0,MODE_HIGH,20,0)];

  if(Close[0] > SMMA && Close[0] > BB_UP && Close[0] >= HIGHEST)

  {
***********

Penso que o problema está com a referência à barra zero, ou seja, a barra actual. Deve definir o início de um novo bar, dei-o na resposta anterior e efectuo todas as comparações apenas no primeiro tick de um novo bar. E alterar a indexação. Temos de garantir que o último bar fechado não se encontra no iHighest. E agora tem uma referência à barra actual a ser formada em cada tick, os resultados serão os mais estranhos.

double HIGHEST              = High[iHighest(Symbol(),0,MODE_HIGH,20,2)];

  if(Close[1] > SMMA && Close[1] > BB_UP && Close[1] >= HIGHEST)

  {
***********

 
Alexey Volchanskiy:
Vejamos o código de

Penso que o problema está com a referência à barra zero, ou seja, a barra actual. É preciso definir o início de uma nova barra, citei-a na resposta anterior e só no primeiro tick da nova barra é que se fazem todas as comparações. E alterar a indexação. Temos de assegurar que o último bar fechado não se encontra no iHighest. E agora tem uma referência à barra actual a ser formada em cada tick, os resultados serão os mais estranhos.

Obrigado, parece ter ajudado :) embora pudesse jurar que fiz exactamente a mesma coisa e não funcionou...

Aconselhou a OnTimer() mas por alguma razão não cooperará comigo. Estudei toda a ajuda e não encontrei quaisquer explicações ou exemplos claros, por isso fiquei perplexo.

Ou seja, este código trivial não é executado, embora esteja tudo especificado na referência... Ao pesquisar no Google este programa, deparei-me com o facto de dizerem que o OnTimer() não funciona no teste

modo. Embora este momento pareça ter sido eliminado com mql5. Ajuda para o compreender :) Obrigado!

int OnInit()
  {
//---
  bool  Timer = EventSetTimer(1);
  if(Timer != TRUE)
  Print(GetLastError()); 
//---
   return(INIT_SUCCEEDED);
  }

void OnDeinit(const int reason)
  {
  EventKillTimer();   
  }
  
void OnTimer()
{
Print("It works");
}  
  
 

Imminence:

Pesquisando no Google este programa que encontrei, dizem que o OnTimer() não funciona em modo de teste. Foi resolvido com mql5. Ajude-me a compreendê-lo). Obrigado!

Certo, em MT4 no testador o temporizador não funciona e não está documentado! Escrevi ao Servicedesk e eles disseram que nunca o fariam. Consegui sair disto chamando o OnTimer no OnTick. Tenho o temporizador definido para um segundo.

// Возвращает true, если работает под тестером
bool IsRunOnTester()
{
    if(MQLInfoInteger(MQL_TESTER) || MQLInfoInteger(MQL_VISUAL_MODE) || MQLInfoInteger(MQL_OPTIMIZATION))
        return true;
    return false;    
}

MqlDateTime     TimeCurrStruct;

void OnTick()
{
    if(IsRunOnTester())
    {
        static datetime dt1 = 0, dt2 = 0;
        static bool tfirst = true;
        if(tfirst)
        {
            tfirst = false;
            dt1 = dt2 = TimeCurrent();
            return;
        }
    
        dt2 = TimeCurrent();
        for(datetime TimeTesterCurrent = dt1+1; TimeTesterCurrent <= dt2; TimeTesterCurrent++)
        {
            TimeToStruct(TimeTesterCurrent, TimeCurrStruct);
            OnTimer();
        }    
        dt1 = dt2;
    }
}

Assim, se no testador os carrapatos vêm mais de 1 vez/segundo, os em excesso são saltados; se menos frequentemente, a série com um múltiplo de 1segundo é gerada. Este tempo reside na estrutura TimeCurrStruct, e a minha classe principal em qualquer modo só leva tempo a partir desta estrutura. Na minha opinião, esta é a única forma de lidar com este insecto. Aqui está uma função, removi coisas desnecessárias, só carne ))

void OnTimer()
{
    string msg;
    if(!IsRunOnTester())
    {
        TimeToStruct(TimeCurrent(), TimeCurrStruct);
        SmartDsp.ReceiveTick(TimeCurrStruct);    // основной метод робота, в него передается структура со временем
    }
    else
    {
        SmartDsp.ReceiveTick(TimeCurrStruct);    
    }
}




 
Alexey Volchanskiy:
Não pode premir o botão SRC?
Não é claro o que quer dizer com isso?