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

 
Artyom Trishkin:

No OnInit() chamar a série cronológica do símbolo: iTime(Símbolo,Prazo,1);

Logo no início de OnTick(), pedir a barra de tempo necessária das séries de tempos necessárias através do iFunc() correspondente, ou se( iTime(Símbolo,Prazo,10)==0) retornar;

Neste caso, o Conselheiro Especialista não detectará um novo bar e esperará pelo próximo tick.

No OnInit() solicitámos os dados das séries cronológicas, activando assim a paginação de dados.

Em OnTick() verificamos se o histórico minimamente necessário está disponível para a EA e se ainda não estiver disponível, esperamos pelo próximo tick.

E até que todos os dados requeridos pelo Conselheiro Especialista sejam recebidos, este esperará pelo próximo tick.

Assim que todos os dados necessários forem bombeados e obtidos, o Conselheiro Especialista começará a trabalhar com a nova barra e com o histórico necessário.

Para manter os dados em série actualizados, não se esqueça de aceder aos mesmos pelo menos uma vez de dois em dois minutos. Faça um segundo temporizador durante cerca de um minuto e meio (90 segundos) e nele, basta aceder a qualquer série de tempos do símbolo desejado, por exemplo iTime(Símbolo,Prazo,1); sem verificar os dados recebidos - basta "mover" o histórico. Então, todos os dados sobre o símbolo estarão sempre actualizados.

Claro que tentarei verificar a nova barra usando todas as TFs mas não é síncrona, isto não é MT4. O problema não é com a barra, mas com o não desempenho dos indicadores que são chamados a partir do indicador, que por sua vez é chamado a partir do Conselheiro Especialista.

Trabalho com actas, por isso a história deve estar sempre actualizada.

E, todas estas verificações são feitas para o teste e apenas atrasarão o trabalho numa conta real, porque tudo funciona mais lentamente aí do que nas condições estacionárias do testador, repito que numa conta real o indicador funciona correctamente.

 

Até agora, resolvi o problema verificando a prontidão dos indicadores, que falharam, antes do início do código principal

//При появлении нового бара проверяем корректность расчета индикаторов
      if(isNewBar_Predv_Calc_Ind()==true)Predv_Calc_Ind=true;
      if(Predv_Calc_Ind==true)
      {
      double arr_DonUp=ZZ_Vibor(0,2,0);
      double arr_DonDown=ZZ_Vibor(0,3,0);
      double arr_DonUp_m2=ZZ_Vibor(1,2,0);
      double arr_DonDown_m2=ZZ_Vibor(1,3,0);
      double arr_DonUp_m5=ZZ_Vibor(2,2,0);
      double arr_DonDown_m5=ZZ_Vibor(2,3,0);
      double arr_DonUp_m15=ZZ_Vibor(3,2,0);
      double arr_DonDown_m15=ZZ_Vibor(3,3,0);
      if (arr_DonUp<1     || arr_DonDown<1    ||
          arr_DonUp_m2<1  || arr_DonDown_m2<1 ||
          arr_DonUp_m5<1  || arr_DonDown_m5<1 ||
          arr_DonUp_m15<1 || arr_DonDown_m15<1
         )return;
      else{Predv_Calc_Ind=false;}      
      }
//Операции выполняются только при появлении следующего бара   
   if(!isNewBar()) return;

Mas esta abordagem não é universal, porque é necessário listar todos os indicadores, existe outro método mais universal para fazer o ambiente de teste funcionar correctamente?

 
Artyom Trishkin:

Em OnTick() verificamos se o histórico minimamente necessário está disponível para o Consultor Especialista, e se ainda não estiver disponível - esperamos pelo próximo tick.

E até que todos os dados requeridos pela EA sejam obtidos, ela esperará pelo próximo tick.

Assim que todos os dados necessários forem bombeados e obtidos, o Conselheiro Especialista começará a trabalhar com a nova barra e com o histórico necessário.

Como se propõe verificar a disponibilidade do histórico, não compreendo...

 
fxsaber:

Acrescentar esta linha antes da função MQL4

e funcionará em MT5.

Isso é genial. Muito obrigado!

 
Olá, eu sou um jovem reformado que gostaria de fazer tais botões no MT5.

Pode dizer ao MT5 que pode implementar tais botões, talvez já tenha um, partilhar o código ...


O botão "Iniciar" e o botão "Fechar todas as encomendas". MT5, todos os pares, todos os prazos, 4/5 sinais. Lote inicial 0,01 incluindo cêntimos.
Prever escorregadelas e solicitações.

Funções para o botão "Start
Uma vez desembrulhado manualmente o Fibo, deverá abrir 1 a 11 encomendas de uma só vez em BAY ou VENDER ao preço actual.
Se seleccionou previamente nas definições quantas e quais as encomendas (1, 2, 5, 7 ou todas as 11) devem ser abertas na direcção da Fibo desdobrada.
Nas definições foi possível especificar o tamanho do lote manual para cada encomenda, ou aumentá-lo/diminuí-lo de forma dinâmica.

TP - Take Profit é definido em ordem ascendente de 1 a 11 ordens aos níveis de Fibo de 61,8; 78,6; 100,0;
161.8; 185.4; 200.0; 261.8; 285.0; 423.6; 561,8; 685.4

SL - Stop Loss em tamanho de - 2 spreads (calculados automaticamente) a partir da linha zero do fibo.

TS - Trailing Stop puxa todas as ordens atrás dele.
1. Trailing Stop move SL de todas as ordens para os 38,2 + 2 spreads se o preço tiver atingido o nível 61,8,
2. Trailing Stop move SL de todas as ordens restantes para o nível 50.0 + 2 spreads se o preço atingir o nível 100.0,
3. O SL de todas as encomendas restantes para 78,6+2 spreads se o preço atingir o nível 161,8,
4. SL de todas as ordens restantes para o nível de spread 100,0+2 quando o preço atingir o nível 261,8. 5.
5. SL de todas as ordens restantes para o nível de spread 200,0+2 quando o preço atingir o nível 423,6,
6. O trailing move SL de todas as ordens restantes para o nível de spread 423,6+2 se o preço tiver atingido 561,8;

Afunção do botão "Fechar todas as encomendas" é a de fechar à força todas as encomendas.
 

Olá, se os preços Ask and Bid da classe CSymbolInfo são mais ou menos claros, como obter por exemplo SessionInterest ou SessionBuyOrdersVolume ou SessionPriceLimitMin, dá zeros, não consigo entender porquê...

 
Александр Юрин:

Olá, se os preços Ask and Bid da classe CSymbolInfo são mais ou menos claros, como obter por exemplo SessionInterest ou SessionBuyOrdersVolume ou SessionPriceLimitMin, dá zeros, não consigo entender porquê...

Se o servidor comercial difundir esta informação, irá recebê-la.

Em regra, esta informação é transmitida pelos corretores para símbolos de acções (não confundir corretores e centros de negociação).

 
Vladimir Karputov:

Se um servidor comercial difundir esta informação, irá recebê-la.

Esta informação é geralmente difundida por Corretores para símbolos de troca (não confundir Corretores e centros de negociação).

Corretor Otkritie, o RTS Index Futures, presumo que deve transmitir pelo menos SessionPriceLimitMin e SessionPriceLimitMax (porque, tanto quanto sei, são os preços de abertura utilizados nas ordens de mercado). Será que a abertura não traduz... Prescrevo, por exemplo:

Print(m_symbol.Ask()," ",m_symbol.SessionBuyOrdersVolume()); - do seu EA

Recebo apenas preços de pedido no diário de bordo

Arquivos anexados:
y2a4cgbfjw.png  63 kb
 

Por favor, ajude a escrever uma peça de código que determine correctamente a data da última barra com qualquer mudança em qualquer TF, exacta para a TF actual.

int              N_bar=iBarShift(Symbol(),PERIOD_CURRENT,iTime(Symbol(),PERIOD_H1,0));//номер текущего бара
datetime         StopDt=iTime(Symbol(),PERIOD_CURRENT,N_bar+1);//только для минуток и то может быть не корректно!

Print("StopDt_Shift=",TimeToString(StopDt,TIME_DATE|TIME_MINUTES));

Este código funciona geralmente, mas apenas se a hora de início da barra actual coincidir com a barra real (arredondada ao minuto), uma vez que o meu gráfico actual é M1. E se não coincidir, então ocorrem diferentes percalços, dependendo das diferentes TFs. Por exemplo, preciso de saber a data de início do último bar M1 na última hora, se era 12 horas sem problemas, a hora será 12:59, mas se era 13 horas será 13:58 porque o bar horário abriu às 14:05 e não às 14:00 e a funçãoiBarShift devolveu o bar mais próximo às 14:00, ou seja, 13:59.

Acrescentado: fez isto, parece funcionar

datetime         StopDt=iTime(Symbol(),PERIOD_CURRENT,Bars(Symbol(),PERIOD_CURRENT,iTime(Symbol(),TF_iDeltaP,_Shift-1),iTime(Symbol(),PERIOD_CURRENT,0)));
 
Александр Юрин:

Broker Opening, RTS Index Futures, presumo que deve transmitir pelo menos SessionPriceLimitMin e SessionPriceLimitMax (segundo sei, são utilizados em ordens de mercado através de preços de abertura ). Será que a abertura não traduz... Prescrevo, por exemplo:

Print(m_symbol.Ask()," ",m_symbol.SessionBuyOrdersVolume()); - do seu EA

Recebo apenas preços de pedido no diário de bordo

O servidor é real ou é uma demonstração?