Discussão do artigo "O uso de bibliotecas de classe de negócio padrão MQL5 ao escrever um Expert Advisor"

 

Novo artigo O uso de bibliotecas de classe de negócio padrão MQL5 ao escrever um Expert Advisor foi publicado:

Este artigo explica como usar as principais funcionalidades das Classes de negócio da biblioteca padrão do MQL5 ao escrever Expert Advisors que implementam o fechamento e modificação de posição, posicionamento de ordem pendente e exclusão e verificação de Margem antes de posicionar um negócio. Também demonstramos como as classes de negócio podem ser usadas para obter detalhes de ordens e transações.

Autor: Samuel

 

Artigo muito útil para mim. Tudo fica muito mais fácil se você usar bibliotecas!

Pedido aos desenvolvedores: escrevam uma classe para trabalhar com High[i] , Low[i]. Open[i], Close[i]. Acho que essa classe será útil para todos! Eu mesmo resolvi esse problema, mas não tenho certeza de que esteja correto, pois os testes levam muito tempo....

 
Confira a seção Timeseries Class Group
 
#include <Indicators\Series.mqh>

double High[];
 CiHigh z;

Por que esse código gera um erro?

'1.mq5' 1.mq5 1 1

'Series.mqh' Series.mqh 1 1

'ArrayObj.mqh' ArrayObj.mqh 1 1

'Array.mqh' Array.mqh 1 1

'Object.mqh' Object.mqh 1 1

'StdLibErr.mqh' StdLibErr.mqh 1 1

'ArrayDouble.mqh' ArrayDouble.mqh 1 1

'CiHigh' - declaração sem tipo 1.mq5 12 2

1 erro(s), 0 aviso(s) 2 1

Em todos os exemplos, não é necessário declarar o tipo...

se não for difícil escrever como obter

Imprimir High[2], por exemplo.

 
dimeon:

Por que esse código gera um erro?


não é necessário declarar o tipo em todos os exemplos...

se não for difícil, por favor, escreva como obter

Imprimir High[2], por exemplo.

há um erro de impressão na documentação. Essa classe está localizada no arquivo TimeSeries.mqh.

Exemplo de uso (o script imprime as três últimas máximas do gráfico atual):

#include <Indicators\TimeSeries.mqh>
//+------------------------------------------------------------------+
//| Função de início do programa de script|
//+------------------------------------------------------------------+
void OnStart()
  {
//---
   double High[];
   CiHigh z;
   int count=3;
   if(z.Create(_Symbol,_Period)==true)
     {
      if(z.GetData(0,count,High)==count)
        {
         for(int i=0; i<count; i++) Print(i,"=",High[i]);
        }
      else
         Print("Failed to retrieve" (Falha ao recuperar),count," dados de séries temporais.");
     }
   else Print("Erro ao criar séries temporais.");
  }
//+------------------------------------------------------------------+
 
Quantum:

há um erro de impressão na documentação. Essa classe está no arquivo TimeSeries.mqh.

Exemplo de uso (o script gera as três últimas máximas do gráfico atual):

Muito obrigado! Eu estava quebrando a cabeça!
 

Entendo que cada um programa para si mesmo e para suas necessidades, mas fundamentalmente não gosto do grupo de classes de séries temporais, porque basicamente todas consistem em um método e parte descritiva mais do que funcionalidade, e geralmente é necessário ter todas as séries temporais para um determinado instrumento:

struct str_bars{
   datetime    time[];     // Matriz de série temporal contendo o horário de abertura de cada barra do gráfico atual
   double      open[];     // Matriz de série temporal contendo os preços de abertura de cada barra do gráfico atual.
   double      close[];    // Matriz de série temporal contendo os preços de fechamento de cada barra do gráfico atual.
   double      high[];     // Matriz de série temporal contendo os preços máximos de cada barra do gráfico atual.
   double      low[];      // Uma matriz de série temporal contendo os preços mínimos de cada barra do gráfico atual.
};
struct str_info{
   double   point;         // Tamanho atual do ponto do instrumento na moeda da cotação
   int      spread;        // Propagação atual
};
//____________________________________________________________________
class currency {
   public:
//---- данные      
      MqlTick TICK;        // dados de ticks
      str_bars  BAR;       // dados de séries temporais
      str_info INFO;       // informações sobre a ferramenta
      int error;
//---- методы      
      int create(string sym,ENUM_TIMEFRAMES period, int numbars);
      int refresh(void);
   private:
      string            symbol;
      ENUM_TIMEFRAMES   per;
      int               num;
      datetime          lastbar_time;
      int               tmpint1,tmpint2;
      int ch_load(void);
};
//____________________________________________________________________

Trabalho com minha classe somente na parte dos dados já preparados e, é claro, a própria classe recebe dados chamando o método refresh()

 
Artigo útil!
 

há uma imprecisão no artigo

double lot_price = myaccount.MarginCheck(_Symbol,otype,Lot); // preço do lote/número de margem necessária

deveria ser

   double lot_price=myaccount.MarginCheck(_Symbol,otype,Lot,price);  //--- preço do lote/número de margem necessária
[Excluído]  

Ótimo artigo. Muito obrigado ao autor. Eu também gostaria de escrever uma verificação do Stop_Level antes de colocar uma ordem e uma verificação do valor do spread. O fato é que, se o spread estiver flutuando, então, com valores altos, você não poderá entrar no mercado, pois não será lucrativo. Isso ajudará o Expert Advisor a não negociar durante as notícias. Eu também gostaria de verificar o desvio - o raciocínio é semelhante. E há também uma pergunta sobre a biblioteca: o que é uma função (que tipo de processo ela denota e descreve)?

FreezeLevel

Obtém a distância das operações comerciais de congelamento em pontos.

int FreezeLevel() const

em linguagem simples - por favor, explique se você souber.

E mais uma pergunta. Podemos descobrir os limites, por exemplo, Stop_Level no momento atual (digamos, 10 pontos). Colocamos uma ordem pendente com SL=10 pontos. Após, por exemplo, uma hora, o preço atinge o preço especificado na ordem, mas o Stop_Level nesse momento é igual a, por exemplo, 15 pips. O que acontecerá - a ordem pendente funcionará ou será rejeitada? Além disso, quando o preço atingir o preço especificado na ordem, mas o spread tiver mudado, isso significa que é possível entrar ou sair a um preço pior em relação ao preço esperado no momento da abertura da ordem, ou a ordem não funcionará?

 

O que estou fazendo de errado? Por que o lance não está sendo impresso?

Aqui está o registro do trabalho


2011.01.31 20:20:18 00(EURUSD,M1) EURUSD 0

Aqui está o código

#include <Trade\SymbolInfo.mqh>  //--- Classe CSymbolInfo
CSymbolInfo    my_symbol;        //--- Objeto da classe CSymbolInfo
//+------------------------------------------------------------------+
//| Função de inicialização de especialista|
//+------------------------------------------------------------------+
int OnInit()
  {   return(0);  }
//+------------------------------------------------------------------+
//| Função de desinicialização de especialista|
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {  }
//+------------------------------------------------------------------+
//| Função de tique de especialista|
//+------------------------------------------------------------------+
void OnTick()
  {
   my_symbol.Name(_Symbol);
   my_symbol.Refresh();
   Print(_Symbol," ",my_symbol.Bid());
  }
//+------------------------------------------------------------------+