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

 

6.parece estar faltando:

TradePerformer( 4, Symb4, Trade4, StLoss4, TkProfit4, Lots4, Slippage4, UpSignal, DnSignal, UpStop, DnStop);

em Exp_TEMA.mq5 ?

 
ias:

6. parece estar faltando

no Exp_TEMA.mq5?

Sim! Devo ter trabalhado demais e superaquecido em um calor tão anormal!
 
Renat:

Por favor, crie um exemplo reproduzível. Ou seja, você precisa de um código pronto que possa ser compilado, colocado em um gráfico e obter resultados.

Sem isso, poucas pessoas entenderão do que estamos falando.

Pensei em cortar para não desanimar as pessoas por nada.

Aqui está a versão completa:

#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);
   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;

//--------------------------------------------------------------------
   //1 input rates_total = 9667 / prev_calculated = 0 / Bars = 9667
   //-- then rates_total = 9667 / prev_calculated = 9667 / Bars = 9667
   //-- in process then rates_total = 9668 / prev_calculated = 9667 / Bars = 9668
   //Print("rates_total: " + (string)rates_total);
   if (rates_total == prev_calculated) return (rates_total);//-- Ainda é o mesmo bar, então estamos fora...

   //-- Obter o número de barras não processadas (na primeira entrada é tudo, depois 1)
   //-- O número de barras de saída refere-se ao próprio gráfico, mas estaremos produzindo outro instrumento
   //-- o número de barras pode ser diferente, portanto, primeiro despejamos todos os dados no buffer --
   Counted_bars = rates_total-prev_calculated;
   
   // Imprimir("Counted_bars: " + Counted_bars);
   Print("rates_total: " + rates_total + "   /   prev_calculated: " + prev_calculated + "   /   Bars: " + Bars(Symbol(),0));
   //-- Alocar a memória de acordo com o número de compassos do instrumento principal --
   if (ArrayResize(ArrayBuffer, Counted_bars,0) == -1) return (rates_total);//-- Erro de alocação de memória --
   //--- inicializar os elementos da matriz com o valor EMPTY_VALUE ----
   ArrayInitialize(ArrayBuffer,EMPTY_VALUE);
         
   //-- Obtenha quantas barras esse instrumento realmente tem --
   copied = (int)SeriesInfoInteger(InstrumentName,0,SERIES_BARS_COUNT);
   
   if (copied > 0){
      copied=CopyClose(InstrumentName,0,0,copied,ArrayBuffer);//-- Gravar dados no buffer de memória --
      if (copied <= 0) return (rates_total);//-- erro
   } 
   else{

      return (rates_total);//-- erro 
   }
    
   if (Counted_bars > copied) Counted_bars = copied;//-- Pegue o valor mais baixo --

   Counted_bars--;//-- Desde a contagem a partir de 0 --
   //-- Os dados são carregados no buffer de memória, agora escreva-os no buffer da tela da direita para a esquerda --
   for (int i = Counted_bars; i > 0; 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.
}
 

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.

[Excluído]  
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.


Não tenho certeza da exatidão da implementação e do algoritmo em geral, mas, com base no código e no que consegui fazer com ele, presumo que sim:

A string

// Imprimir("Counted_bars: " + Counted_bars);
Print("rates_total: " + rates_total + "   /   prev_calculated: " + prev_calculated + "   /   Bars: " + Bars(Symbol(),0));

deve ter a seguinte aparência

// Imprimir("Counted_bars: " + Counted_bars);
Print("rates_total: " + rates_total + "   /   prev_calculated: " + prev_calculated + "   /   Bars: " + Bars(InstrumentName,Period()));


Talvez fosse mais correto alterar o período em todos os lugares como "0" para PERIOD_CURRENT.

Pelo menos tudo funcionou para mim após essas alterações.....

PS

Talvez não seja relevante, mas dessa forma o compilador IMPORTA muito menos

Print("rates_total: ",rates_total," / prev_calculated: ",prev_calculated," / Bars: ",Bars(InstrumentName, PERIOD_CURRENT));
 
Interesting:

Não tenho certeza da implementação e do algoritmo corretos em geral, mas, com base no código e no que consegui fazer com ele, presumo que seja isso:

A string

deve ter a seguinte aparência

PS

Talvez seja mais correto alterar o período em todos os lugares como "0" para PERIOD_CURRENT.

Pelo menos tudo funcionou para mim após essas alterações....

Alterei, mas ainda não funciona, o gráfico não corresponde à realidade.
 

É assim que aparece na minha tela:


Claramente errado.
[Excluído]  

Este foi o resultado para mim

Mas como não entrei na lógica do indutor e de sua implementação, não cabe a mim julgar a correção dos resultados.


PS

Eu ainda me livraria do símbolo no parâmetro e o transformaria no símbolo atual e no TF, e depois o usaria no Expert Advisor ou em outra ferramenta usando o iCustom() usual.

Além disso, eu realmente não entendo a lógica de trabalhar com buffers (quero dizer, a cauda da calculadora e assim por diante). Em minha opinião, há muito o que fazer....

Arquivos anexados:
proba.mq5  4 kb
 
Interesting:

Foi isso que eu recebi

Mas como não entrei na lógica do indutor e de sua implementação, não cabe a mim julgar a correção dos resultados.


PS

Eu ainda me livraria do símbolo no parâmetro e o criaria de acordo com o símbolo atual e o TF, e depois o usaria no Expert Advisor ou em qualquer outra ferramenta usando o iCustom() usual.


Obrigado pela orientação, vou tentar.
[Excluído]  

Interesting:

Além disso, eu realmente não entendo a lógica de trabalhar com buffers (quero dizer, a cauda da calculadora e assim por diante). Em minha opinião, há muito o que fazer....


Eu ainda prestaria atenção ao algoritmo de trabalho com buffers. Se eu entendi corretamente, um buffer é 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....