Quaisquer perguntas de recém-chegados sobre MQL4 e MQL5, ajuda e discussão sobre algoritmos e códigos - página 854

 
yiduwi:

Ajuda, como posso descobrir a primeira coordenada da linha de tendência?

long  ObjectGetInteger( 
   long     chart_id,         // идентификатор графика 
   string   object_name,      // имя объекта 
   int      prop_id,          // идентификатор свойства 
   int      prop_modifier=0   // модификатор свойства, если требуется 
   );
 

Por que não posso fazer o seguinte? Declaro uma variável e um array globalmente e quero atribuir o valor da variável ao array imediatamente.

int yo=6;
int masss[4]={0,0,yo,0};

E o mesmo problema com funções, se você atribuir uma variável a um argumento, ele falha

void Fulr(int ty=yo){}
 
Seric29:

Por que não posso fazer o seguinte? Declaro uma variável e um array globalmente e quero atribuir o valor da variável ao array imediatamente.

E o mesmo problema com funções, se você atribuir uma variável a um argumento, ele falha

Документация по MQL5: Основы языка
Документация по MQL5: Основы языка
  • www.mql5.com
Язык MetaQuotes Language 5 (MQL5) является объектно-ориентированным языком программирования высокого уровня и предназначен для написания автоматических торговых стратегий, пользовательских технических индикаторов для анализа разнообразных финансовых рынков. Он позволяет не только писать разнообразные экспертные системы, предназначенные для...
 
Alekseu Fedotov:

Obrigado.

 
Artyom Trishkin:

Aparentemente, é impossível dizer normalmente. Em C++ você pode fazer isso, acho que é porque o mql4 funciona através de um descritor, ou seja, não tem acesso direto à memória, porque cada valor tem um endereço e se você acessar esse endereço você pode descobrir o que está lá, ele torna o mql4 excessivamente estático e limita muitas possibilidades, especialmente trabalhando com arrays.

 

É possível fazer dois temporizadores na EA? Por algum motivo, pensei que OnTimer() fosse chamado em uma linha separada. Mas eu tentei adicionar um loop infinito no OnInit() e ajustar o timer antes dele, apenas o loop funcionava, OnTimer() não era chamado.

Preciso de duas ações independentes para executar constantemente no timer. Cada um com seu próprio intervalo. Como isso pode ser implementado, você sabe?

 
leonerd:

É possível fazer dois temporizadores na EA? Por algum motivo, pensei que OnTimer() fosse chamado em uma linha separada. Mas eu tentei adicionar loop infinito no OnInit() e definir temporizador antes dele, apenas loop funcionou, OnTimer() não foi chamado.

Preciso de duas ações independentes para executar constantemente em um cronômetro. Cada um com seu próprio intervalo. Como isso pode ser implementado, você sabe?

Por exemplo: contar até cem e executar o primeiro código, contar até 150 e executar o segundo código. Mas, de uma boa maneira, você deve fazer de si mesmo uma classe multitemporal.
 
Artyom Trishkin:

Nesta linha eu quero começar a ajudar aqueles que realmente querem entender e aprender programação na nova MQL4 e querem mudar facilmente para a MQL5 - as linguagens são muito semelhantes.

Este blog será um bom lugar para discutir problemas, algoritmos de sua solução e quaisquer outras questões relativas à programação MT de uma forma ou de outra.

Espero que outros membros experientes do nosso fórum se juntem à discussão e que a filial seja interessante para todos.

Boa tarde. Estou escrevendo um consultor especialista em testes para auto-estudo e experiência prática. Agora ele pode receber um sinal do indicador e tem a função de abrir posições de COMPRA e VENDA ( Open_BUY_SELL() ). Eu fiz esta função a partir de alguns scripts publicados na CodeBase.

PERGUNTA - posso pedir a uma pessoa bem informada neste tópico para verificar se este código tem algum incômodo? ???

Tenho dúvidas e medos especiais nestes lugares:

    m_trade         = new CTrade();
    m_symbol        = new CSymbolInfo();   
    m_position_info = new CPositionInfo();   
    m_account       = new CAccountInfo();
    
    m_symbol.Name(Symbol());
    m_symbol.RefreshRates();

É apropriado escrever isto dentro de uma função? Vale a pena mudá-lo para o OnInit()? Fiz a função a partir de dois roteiros, arquivos presos ao poste

CEngine        engine;
CTrade         trade;
CPositionInfo  apos;
CSymbolInfo    asymbol;

CTrade         *m_trade;
CSymbolInfo    *m_symbol;
CPositionInfo  *m_position_info; 
CAccountInfo   *m_account;

Este lugar também é confuso, se bem entendi - objetos das mesmas classes se duplicam. Acabo de deixar algumas declarações de trabalho com o indicador e outras de refazer os roteiros em uma função.


Ainda não conectei a função com o sinal, quero entender e limpar o código primeiro. Entendo que cometi um erro em algum lugar, mas ainda me falta o conhecimento e a experiência para entender exatamente onde e como corrigi-lo.

Favor apoiar.

 

Arquivos anexados - EA, dois scripts e indicador.

O compilador não vai jurar, sem erros a procurar, apenas algumas considerações estratégicas/tácticas, sobre se é correto fazê-lo, e se não for, como deveria ter sido feito.

Por favor.

Arquivos anexados:
 
Artyom Trishkin:
Mas de uma boa maneira - o multitimer de classe precisa ser feito.

não se pode complicar tarefas simples! ... disse Me, que embrulhou ociosamente a nova função de definição de barras em uma classe ))))

ao ponto:

leonerd:

É possível fazer dois temporizadores em um EA? Por alguma razão, eu pensei que OnTimer() era chamado em uma linha separada. Mas eu tentei adicionar um loop infinito no OnInit() e ajustar o timer antes dele, apenas o loop funcionava, OnTimer() não era chamado.

Preciso de duas ações independentes para executar constantemente em um cronômetro. Cada um com seu próprio intervalo. Como isto pode ser implementado, você sabe?


#property strict
//--- input parameters
input int      Timer1=13;
input int      Timer2=21;
static int timer1=0,timer2=0;
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
   EventSetTimer(1);
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
   EventKillTimer();
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
//---

  }
//+------------------------------------------------------------------+
//| Timer function                                                   |
//+------------------------------------------------------------------+
void OnTimer()
  {
   if((timer1++)>Timer1) { timer1 = 0; Print("Timer №1"); }
   if((timer2++)>Timer2) { timer2 = 0; Print("Timer №2"); }
  }
//+------------------------------------------------------------------+