Discussão do artigo "Criando um Consultor Especialista, que negocia em um número de instrumentos" - página 4

 
Interesting:

Eu ainda prestaria atenção ao algoritmo de trabalho com buffers. Se eu entendi corretamente, um buffer será suficiente (ele só precisa ser calculado e desenhado corretamente no gráfico).

PS

E com a variante atual, tenho a impressão de que o indutor exibe dados "esquerdos" (o início do histórico) em vez de "direitos" (atuais)....

Ou eu não entendo nada da lógica desse indicador....


Se você emitir, por exemplo, EURUSD para EURUSD ou EURJPY para EURJPY, tudo funcionará bem.

Portanto, a direção da saída parece estar correta.

Tentei muitas variantes aqui e até gostei disso:

handle1=iMA(InstrumentName,PERIOD_CURRENT,ex_Period_MA_1,0,MODE_SMA, PRICE_CLOSE);

...

copied=CopyBuffer(handle1,0,0,0,0,Counted_bars,Buf_0);

Mesmo assim, nada é exibido.

Alguém tem um exemplo de exibição de duas ferramentas diferentes em uma tela, pelo menos de alguma forma?

 
gisip:

O que estou fazendo de errado, por que não consigo exibir o gráfico de outro instrumento normalmente?

Tudo funcionava na MQL4, aqui só funciona se você exibir o gráfico no mesmo instrumento, então não há erros.


Ele funciona em formato recortado. Adicione verificações e economia.

#property indicator_separate_window    // O indicador é desenhado em uma janela separada
#property indicator_buffers 1

#property indicator_plots   1
#property indicator_type1   DRAW_LINE
#property indicator_color1  Aqua

input string InstrumentName="EURJPY";

//-- Matriz de indicadores
double ScreenBuffer[];

//-- Buffer dinâmico --
double ArrayBuffer[];
//+------------------------------------------------------------------+
//||
//+------------------------------------------------------------------+
int OnInit() // Função especial init()
  {
//--------------------------------------------------------------------

   IndicatorSetString(INDICATOR_SHORTNAME,InstrumentName);
   SetIndexBuffer(0,ScreenBuffer,INDICATOR_DATA);
   ArraySetAsSeries(ArrayBuffer,true);
   ArraySetAsSeries(ScreenBuffer,true);
   return 0;                          // Sair
  }
//--------------------------------------------------------------------
int OnCalculate(const int rates_total,
                const int prev_calculated,
                const datetime &time[],
                const double &open[],
                const double &high[],
                const double &low[],
                const double &close[],
                const long &tick_volume[],
                const long &volume[],
                const int &spread[])
  {
   int Counted_bars;   // Número de barras a serem operadas 
   int copied;

//--------------------------------------------------------------------
   copied=(int)SeriesInfoInteger(InstrumentName,0,SERIES_BARS_COUNT);
   copied=CopyClose(InstrumentName,PERIOD_M1,0,copied,ArrayBuffer);//-- Gravar dados no buffer de memória --

   for(int i=0; i<copied; i++)
     {
      ScreenBuffer[i]=ArrayBuffer[i];
     }

//--------------------------------------------------------------------
   return(rates_total);
  }
//+------------------------------------------------------------------+
//||
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
   ObjectsDeleteAll(0,0,-1);             // todos os objetos do gráfico são excluídos.
  }
[Excluído]  
gisip:

Se você emitir, por exemplo, EURUSD para EURUSD ou EURJPY para EURJPY, tudo funcionará bem.

Portanto, a direção da saída está correta.

Tentei muitas variantes aqui e até gostei disso:

handle1=iMA(InstrumentName,PERIOD_CURRENT,ex_Period_MA_1,0,MODE_SMA, PRICE_CLOSE);

...

copied=CopyBuffer(handle1,0,0,0,0,Counted_bars,Buf_0);

Mesmo assim, nada é exibido.

Alguém tem um exemplo de exibição de duas ferramentas diferentes em uma tela, pelo menos de alguma forma?

Você tem um código-fonte para a MQL4?


Eu já sugeri uma alternativa, que é criar um índice para o instrumento atual e depurá-lo 100%. Depois disso, você pode chamá-lo facilmente com os parâmetros necessários no Expert Advisor ou em outro indicador.

Com essa implementação, você precisa alterar a lógica básica do indicador, porque os parâmetros passados para a calculadora não são exatamente corretos para outros instrumentos(o número de barras e outras coisas podem não corresponder)....

E, de modo geral, esse conceito não é muito "correto" (para dizer o mínimo).


PS

Em resumo, há duas opções aqui:

1. Realize tudo para o TF e o instrumento atuais e verifique sua operacionalidade. Depois disso, use iCustom();

2. Reescrever a lógica do indutor de modo que, na calculadora, ele receba absolutamente todos os dados sobre o instrumento especificado nos parâmetros (método caro e não muito correto).

Документация по MQL5: Доступ к таймсериям и индикаторам / Bars
Документация по MQL5: Доступ к таймсериям и индикаторам / Bars
  • www.mql5.com
Доступ к таймсериям и индикаторам / Bars - Документация по MQL5
 
gisip:
Alterei-o, mas ainda não funciona, o gráfico não é verdadeiro.

Faça isso em seu indicador

//+------------------------------------------------------------------+
//||
//+------------------------------------------------------------------+
int OnInit() // Função especial init()
  {
//--------------------------------------------------------------------

   IndicatorSetString(INDICATOR_SHORTNAME,InstrumentName);
   SetIndexBuffer(0,ScreenBuffer,INDICATOR_DATA);
   ArraySetAsSeries(ScreenBuffer,true);
   
   return 0;                          // Sair
  }

e leia a seção Direção de indexação em matrizes e séries temporais

[Excluído]  
DC2008:

O formulário recortado funciona. Adicione verificações e economia.

Essas duas coisas não são realmente necessárias aqui.

//1

//-- Buffer dinâmico --
double ArrayBuffer[];
...............
ArraySetAsSeries(ArrayBuffer,true);

//2

   for(int i=0; i<copied; i++)
     {
      ScreenBuffer[i]=ArrayBuffer[i];
     }
 
Interesting:

Essas são as duas coisas que você não precisa ter lá.

Na verdade, sim.
 

Sim, acho que funcionou!

Muito obrigado a todos!!!

Vou testar mais.

 

Necessidade de visualizar as negociações. O Expert Advisor é multimoeda. Digamos que ele fique pendurado no EURUSD e abra negociações em outros pares de moedas. Tenho uma diferença nos resultados, entendo que a culpa é minha, mas não consigo verificar (não consigo abrir um gráfico com negociações em AUDUSD quando o Expert Advisor está pendurado em EURUSD).

Se o Expert Advisor estiver ligado ao AUDUSD, eu o abro e vejo que funciona como programei, mas se estiver ligado ao EURUSD, os resultados são diferentes e não consigo entender por quê. A visualização das negociações seria muito útil.

Документация по MQL5: Операции с графиками / ChartOpen
Документация по MQL5: Операции с графиками / ChartOpen
  • www.mql5.com
Операции с графиками / ChartOpen - Документация по MQL5
 

7. ao testar Exp_TEMA.mq5, as expressões Told[] Tnew[1]obtêm os seguintes valores:
Told[] Expression could not be evaluated
Tnew[1] Invalid array range.
O que esses valores significam e como eles afetam o resultado do trabalho do Expert Advisor?

8 Por que o Exp_TEMA.mq5 abre negociações dentro de uma barra durante o teste?

9. isso levará à redução do código, redução do tempo de execução da negociação, redução da derrapagem, redução dos custos (comissões etc.), se, em vez de fechar uma posição e abrir uma posição na direção oposta, fizermos uma inversão, ou seja, abrirmos uma posição na direção oposta com o dobro do volume?

Negociações dentro da barra.

[Excluído]  
ias:

7.Ao testar Exp_TEMA.mq5, as expressões Told[] Tnew[1]obtêm os seguintes valores:
Told[] Expression could not be evaluated
Tnew[1] Invalid array range.
O que esses valores significam e como eles afetam o trabalho do Expert Advisor?

Quanto a Tnew[1] Invalid array range (Intervalo de matriz inválido ), parece ser uma ultrapassagem do intervalo. Não se esqueça de que a numeração dos itens da matriz começa em 0!