Perguntas de um "boneco" - página 53

 
Não confundir a recriação incondicional e estúpida (por ignorância) de indicadores em cada carrapato com a criação inteligente (rara e necessária) de um indicador. No primeiro caso, obtém-se cem vezes mais travões e fugas de recursos, e no segundo, obtém-se um desempenho perfeito.
 
Renat:
Não confundir a recriação incondicional e estúpida (por ignorância) de indicadores em cada carrapato com a criação inteligente (rara e necessária) de um indicador. No primeiro caso, obtém-se cem vezes mais travões e fugas de recursos, e no segundo - trabalho perfeito.

Estou bem ciente de que Karlson cometeu um erro por ignorância, e também compreendo a natureza desse erro.

Mas sugerir um esquema razoável para resolver o seu problema. A pessoa precisa de utilizar o código escrito no indicador mas o(s) parâmetro(s) deste código são determinados dinamicamente antes de cada acesso aos dados do indicador?

Eu tenho uma solução, ela contém dll, mas você quer usar mql puro, por isso, por favor ofereça uma solução mql.

HZ Eu já mencionei OnCalculate() e cálculos em eventos, mas é possível passar três parâmetros através de evento. Na minha solução, um longo dll dar-lhe-á o endereço de uma matriz com parâmetros e o indicador receberá dados neste endereço.

Se tiver solução mql, basta apontar o dedo.

 
Urain:

Estou bem ciente de que Karlson cometeu um erro por ignorância, e também compreendo a natureza desse erro.

Mas sugerir um esquema razoável para resolver o seu problema. A pessoa precisa de utilizar o código escrito no indicador, mas o(s) parâmetro(s) deste código são dinamicamente definidos antes de cada referência aos dados do indicador?

Quantos indicadores diferentes devem ser criados na realidade? Provavelmente não mais do que 10, caso contrário será um desperdício de recursos sem sentido.

Uma vez que não há alterações de parâmetros, pode criar uma colecção de indicadores, e o necessário será adicionado quando necessário. Se houver menos de 10 indicadores e estes tiverem um significado claro (inicial, confirmação, correcção, etc.), é possível criar variáveis nomeadas de pegas com parâmetros necessários.

 
Urain:

Mas sugerir um esquema razoável para resolver o seu problema. A pessoa precisa de utilizar o código escrito no indicador, mas o(s) parâmetro(s) deste código são determinados dinamicamente antes de cada referência aos dados do indicador?

Pensei um pouco. Se os parâmetros do código são determinados dinamicamente antes de cada acesso aos dados indicadores, porque não incluir o procedimento de determinação destes parâmetros no código indicador? Por outras palavras, todos os cálculos devem ser implementados no indicador.

Ou há situações, quando tal abordagem é, em princípio, impossível?

 
Pode dizer-me porque é que num indicador tão simples a barra de zero (primeiro da direita) não é calculada em todo o lado, excepto no gráfico semanal?

#include <MovingAverages.mqh>
#property indicator_chart_window
#property indicator_buffers 1
#property indicator_plots   1
#property indicator_color1 LightBlue
#property indicator_type1   DRAW_LINE
#property indicator_width1 2

input int PERIOD = 80;
input ENUM_MA_METHOD  method = MODE_SMA;
input ENUM_APPLIED_PRICE PRICE = PRICE_CLOSE;
double Uptrend[];
double ExtRsiArray_TF2[];
double mabuf[];
int handleMA,handleMA2;

int OnInit()
  {
   SetIndexBuffer(0, Uptrend);
   PlotIndexSetDouble(0,PLOT_EMPTY_VALUE,0);  
   ArraySetAsSeries(Uptrend,true);
   handleMA=iMA(NULL, 0, PERIOD, 0, method, PRICE);
   handleMA2=iMA(NULL, 0, PERIOD/2, 0, method, PRICE);
   return(0);
  }
  
double WMA(int ai_0,int a_period_4) {
int some;
if(a_period_4==PERIOD)
 if(CopyBuffer(handleMA,0,ai_0,1,ExtRsiArray_TF2)<=0)
  {Alert("Error",GetLastError());
   return(0);
  }
some=PERIOD/2;
if(a_period_4==some)
 if(CopyBuffer(handleMA2,0,ai_0,1,ExtRsiArray_TF2)<=0)
  {Alert("Error",GetLastError());
   return(0);
  }
return (ExtRsiArray_TF2[0]);
}

int OnCalculate (const int rates_total,      
                 const int prev_calculated, 
                 const int begin,          
                 const double& price[] 
   )
  { ArraySetAsSeries(price,true);
    int counted_bars = prev_calculated; 
    if(counted_bars < 0) return(-1); 
    int x = 0; 
    int p = MathSqrt(PERIOD);              
    int e = rates_total - counted_bars + PERIOD + 1; 
    double vect[], trend[]; 
    if(e > rates_total) e = rates_total;    
    ArrayResize(vect, e); 
    ArraySetAsSeries(vect, true);
    ArrayResize(trend, e); 
    ArraySetAsSeries(trend, true);
    ArrayResize(mabuf, e); 
    ArraySetAsSeries(mabuf, true);
    for(x = 0; x < e; x++)        vect[x] = 2*WMA(x, PERIOD/2) - WMA(x, PERIOD);
    if(method==MODE_SMA)
    SimpleMAOnBuffer(e,prev_calculated,PERIOD+1,p,vect,mabuf);

    for(x = 0; x < e-PERIOD; x++) Uptrend[x] = mabuf[x];
    return(rates_total);                
  }
 
Yedelkin:

Há algum tempo que ando a pensar. Se o(s) parâmetro(s) de código são determinados dinamicamente antes de cada acesso aos dados indicadores, porque não incluímos o procedimento de determinação destes parâmetros no código indicador? Por outras palavras, todos os cálculos devem ser implementados no indicador.

Ou há situações, quando tal abordagem é, em princípio, impossível?

Há situações em que os parâmetros são calculados por outro indicador e devolvidos ao Expert Advisor, e o Expert Advisor decide qual o modelo a utilizar com base na neurónica. Não sabemos antecipadamente que conjunto de parâmetros será aplicado.

 
Expert:
Pode dizer-me por favor porque é que num indicador tão simples a barra zero (primeiro da direita) não é calculada em todo o lado excepto no gráfico semanal?


Oops) Coloco aqui:SimpleMAOnBuffer(e,prev_calculated,PERIOD+1,p,vect,mabuf); em vez de e - taxas_total e tudo funciona)
 
Expert:
Oops) substituiu aqui:SimpleMAOnBuffer(e,prev_calculated,PERIOD+1,p,vect,mabuf); em vez de e - taxas_total e tudo funcionou)

Corrigir bugs homem com alcunha Expert? deve estar no tema humor.
 

Estou a tentar construir um Consultor Especialista Multimoedas. Até agora, decidi sobre o esquema proposto por Nikolay Kositsin no seu artigo"Criar um Consultor Especialista que negoceia com símbolos diferentes". Enfrentei o problema de que os resultados são diferentes ao executar um teste usando símbolos diferentes mas os mesmos parâmetros. Percorri o fórum e descobri que muitos chegaram à conclusão de que este problema pode ser resolvido utilizando a função OnTimer(). Andrey Khatimlansky aconselhou-o aqui:

Отвяжитесь от тиков конкретного инструмента (OnTick) - это же мультивалютник! Работайте по таймеру или ловите момент образования бара на всех рабочих инструментах, это будет надежнее.

Tentei apanhar o momento da formação da barra em todos os instrumentos, mas não consegui alcançar o resultado desejado.

Por exemplo:

Na função que se destina a detectar uma nova barra, especifico explicitamente o instrumento e o período de tempo.

bool isNewBar(string Symbol_, ENUM_TIMEFRAMES Timeframe)
{
 // В статической переменной будем помнить время открытия последнего бара
 static datetime last_time = 0;
 // Текущее время
 datetime lastbar_time = (ENUM_SERIES_INFO_INTEGER)SeriesInfoInteger(Symbol_,Timeframe,SERIES_LASTBAR_DATE);

 // Если это первый вызов функции
 if(last_time == 0)
   {
    // Установим время и выйдем 
    last_time = lastbar_time;
    return(false);
   }

 // Если время отличается
 if(last_time != lastbar_time)
   {
    // Запомним время и вернем true
    last_time = lastbar_time;
    return(true);
   }
 // Дошли до этого места - значит бар не новый, вернем false
 return(false);
}

Na função OnTick(), o esquema sugerido por Nikolay Kositsin.

Por exemplo:

void OnTick()
{ 
 // Объявление массивов переменных для торговых сигналов  
 static bool UpSignal[2], DnSignal[2];

 // Получение торговых сигналов
 TradeSignalCounter(0, остальные параметры);
 TradeSignalCounter(1, остальные параметры);

 // Совершение торговых операций
 TradePerformer(0, остальные параметры);
 TradePerformer(1, остальные параметры);
}


A função isNewBar(Symbol,Timeframe) é chamada na função em que o comércio é executado, ou seja, TradePerformer(parameters).

Por exemplo:

bool TradePerformer(параметры)
{

...

 if(isNewBar(Symbol_,Timeframe))
   {
    Trailing_Stop(параметры);
   
    Open_Source_Position(параметры);
   }
 return(true);
}


Ou seja, uma nova barra é verificada para cada símbolo separadamente. Se não houver uma nova barra, verificamos o símbolo seguinte. E assim acontece com cada carrapato. Mas esta variante não funciona.

Aconselhar como implementar correctamente a verificação de um novo bar num Expert Advisor multimoedas no esquema em questão.
 
Urain:
Deve estar no fio do humor para corrigir erros cometidos por alguém chamado Expert?
Neste fórum pode e deve corrigir erros no código de Perito, independentemente da raça ou do período de tempo :)