Aqui está a minha variante de resolver o problema da pesquisa de repetição:
//+------------------------------------------------------------------+//| FindRetryPrices.mq5 |//| Copyright 2016, Vasiliy Sokolov. |//| http://www.mql5.com |//+------------------------------------------------------------------+#property copyright"Copyright 2016, Vasiliy Sokolov."#property link"http://www.mql5.com"#property version"1.00"#include <Dictionary.mqh>
inputint RatesPeriod = 10; // Период за который ищутся повторенияinputint RoundPoints = 10; // Загрубление цены в прайсстепахclass CBar : public CObject
{
private:
MqlRates m_bar;
public:
CBar(MqlRates& bar){m_bar = bar;}
datetime Date(){return m_bar.time;}
doubleOpen(){return m_bar.open;}
doubleHigh(){return m_bar.high;}
doubleLow(){return m_bar.low;}
doubleClose(){return m_bar.close;}
};
//+------------------------------------------------------------------+//| Script program start function |//+------------------------------------------------------------------+voidOnStart()
{
// Нахождение повторяющихся баровMqlRates rates[];
int total = CopyRates(Symbol(), Period(), 0, RoundPoints, rates);
CDictionary* BarsCollections = new CDictionary(total);
for(int i = 0; i < total; i++)
{
double price = PriceToLevel(rates[i].high);
CBar* bar = new CBar(rates[i]);
if(!BarsCollections.ContainsKey(price))
BarsCollections.AddObject(price, new CList());
CList* equal_bars = BarsCollections.GetObjectByKey(price);
equal_bars.Add(bar);
}// Вывод повторов
FOREACH_DICT(BarsCollections)
{
CList* list = node;
if(list.Total() < 2)continue;
string retry_bars = "";
for(CBar* bar = list.GetFirstNode(); bar != NULL; bar = list.GetNextNode())
retry_bars += " [" + TimeToString(bar.Date()) + ", " + DoubleToString(bar.High(), Digits()) + "]";
printf("Обнаружено совпадение баров:" + retry_bars);
}
delete BarsCollections;
}
//+------------------------------------------------------------------+//| Округляет цену в соответствии с параметром RoundPoints |//+------------------------------------------------------------------+double PriceToLevel(double price)
{
double price_step = RoundPoints*Point();
double mn = MathFloor(price/price_step);
return mn * price_step;
}
//+------------------------------------------------------------------+
Para que o guião funcione, o ficheiro do Dicionário deve ser copiado para MQL5\Incluir
A pesquisa é realizada na passagem única para laço destacado em amarelo. A lista resultante não contém repetições (se A repete B e B repete A, um conjunto {A, B} será produzido em vez de dois {A, B} e {B, A}). ).
Aqui está a minha versão da solução para o problema da procura repetida:
Muito obrigado a todos!!!! Vou tentar descobrir tudo hoje. É importante não só copiar um pedaço de código para o Expert Advisor, mas também compreender porque é que está escrito desta forma, por isso talvez eu faça mais perguntas.
// строку int searchPeriod=(Search_Period<1)?1:Search_Period;// можно расписать так:inputint Search_Period=10; // Количество копируемых свечей ... эту строку вы видите в настройкахint searchPeriod; // Сюда будем записывать входной параметрif(Search_Period<1) searchPeriod=1; // Если во входном параметре ввели ноль или меньше нуля, то параметр будет равен нулюelse searchPeriod=Search_Period; // иначе примем входной параметр// соответственно и строку int delta=(Delta<0)?0:Delta;// можно расписать точно так же
Estou correcto ao assumir que isto é uma gralha? Deveria ser 0 em vez de 1.
int copy_bars=(int)fmin(Search_Period,Bars(Symbol(),Period())); // o número de velas a copiar
Neste caso, provavelmente já deveríamos usar uma variável: searchPeriod. certo?
------
Outra questão, o que faz esta linha? Descobri que cada elemento da estrutura é reposto a zero. E não compreendo o que estamos aqui a zerar se parecemos ter acabado de escrever estes dados e devemos utilizá-los mais.
ZeroMemory(dataCandle); // Zeragem de dados na estrutura
int copy_bars=(int)fmin(Search_Period,Bars(Symbol(),Period())); // o número de velas a copiar
Neste caso, provavelmente já deveríamos usar uma variável: searchPeriod. certo?
------
Outra questão, o que faz esta linha? Descobri que cada elemento da estrutura é reposto a zero. E não compreendo o que estamos aqui a zerar se parecemos ter acabado de escrever estes dados e devemos utilizá-los mais.
ZeroMemory(dataCandle); // limpar os dados na estrutura
Não, não é. É assim que o tem (literalmente): se o Search_Period definido pelo utilizador nas definições for inferior a um, então o SearchPeriod será igual a zero; caso contrário, o SearchPeriod será igual ao valor do Search_Period definido pelo utilizador nas definições. Isto não é correcto. Não precisamos de um intervalo de pesquisa que seja igual a zero. Assim, se este intervalo for definido pelo utilizador para 0 ou menos de zero (menos de um), então definiremos este intervalo igual ao mínimo - um.
"int copy_bars=(int)fmin(Search_Period,Bars(Symbol(),Period())); // número de candelabros a copiar aqui, em teoria, já deveríamos usar a variável: searchPeriod. certo? "
Sim, é verdade, é uma gralha.
"Outra questão, o que faz esta linha? Para que serve? Descobri que repõe cada elemento da estrutura a zero. E aqui não consigo compreender porquê e o que estamos a zerar se acabámos de escrever estes dados e devemos utilizá-los mais. ZeroMemory(dataCandle); // Zerando os dados na estrutura".
Fazemo-lo antes de preencher a estrutura com dados. Primeiro zeramo-lo, e depois enchemo-lo. Veja - zeramos antes do laço. E depois, no laço, preenchemos a estrutura com dados.
Para login e uso do site MQL5.com, você deve ativar o uso de cookies.
Ative esta opção no seu navegador, caso contrário você não poderá fazer login.
Você entrou na conta. A autenticação de dois fatores foi desativada. Configure-a novamente e escaneie um novo código QR ou continue com a autenticação de dois fatores desativada.
Aqui está a minha variante de resolver o problema da pesquisa de repetição:
Para que o guião funcione, o ficheiro do Dicionário deve ser copiado para MQL5\Incluir
A pesquisa é realizada na passagem única para laço destacado em amarelo. A lista resultante não contém repetições (se A repete B e B repete A, um conjunto {A, B} será produzido em vez de dois {A, B} e {B, A}). ).
A produção deste guião mostrou o seguinte:
A partir da referência:
Aqui está a minha versão da solução para o problema da procura repetida:
Por favor, ajude-me a encontrar uma função para calcular o LER padrão, os requisitos são simples:
1. Devolver valor RSI a uma determinada barra
2. Calcular o índice apenas para as barras (se necessário), que são solicitadas (desejável)
3. Ser capaz de calcular na TF especificada
4. Trabalha à custa do ponto 2 mais rápido do que o indicador
Quero integrar a função no Expert Advisor, se alguém tiver um pronto, por favor partilhe-o comigo.
Pergunto porque o indicador é muito comum e não é um mistério.
Por favor, ajude-me a encontrar uma função para calcular o LER padrão, os requisitos são simples:
1. Devolver valor RSI a uma determinada barra
2. Calcular o índice apenas para as barras (se necessário), que são solicitadas (desejável)
3. Ser capaz de calcular na TF especificada
4. Trabalha à custa do ponto 2 mais rápido do que o indicador
Quero integrar a função no Expert Advisor, se alguém tiver um pronto, por favor partilhe-o comigo.
Pergunto porque o indicador é muito comum e não é um mistério.
O que há de errado com o iRSI padrão? Não é suficientemente secreto?
Há as minhas alterações que terei de fazer à função...
Tome então uma já pronta e modifique-a de acordo com as suas exigências:
Tome então uma já pronta e modifique-a de acordo com as suas exigências:
Aqui está a minha variante de resolver o problema da procura de repetições:
Vasily, quando eu abro#include <Dictionary.mqh>, abre o mesmo que no corpo da EA. Deveria ser assim, ou deveria haver algum outro código dentro?
Porque no código, que eu vejo, não está claro como procura repetições ((
Estou correcto ao assumir que isto é uma gralha? Deveria ser 0 em vez de 1.
assim:int searchPeriod=(Search_Period<1)?0:Search_Period;
e ainda no guião executável:
int copy_bars=(int)fmin(Search_Period,Bars(Symbol(),Period())); // o número de velas a copiar
Neste caso, provavelmente já deveríamos usar uma variável: searchPeriod. certo?
------
Outra questão, o que faz esta linha? Descobri que cada elemento da estrutura é reposto a zero. E não compreendo o que estamos aqui a zerar se parecemos ter acabado de escrever estes dados e devemos utilizá-los mais.
ZeroMemory(dataCandle); // Zeragem de dados na estrutura
Estou correcto ao assumir que isto é uma gralha? Deveria ser 0 em vez de 1.
assim:int searchPeriod=(Search_Period<1)?0:Search_Period;
e ainda no guião executável:
int copy_bars=(int)fmin(Search_Period,Bars(Symbol(),Period())); // o número de velas a copiar
Neste caso, provavelmente já deveríamos usar uma variável: searchPeriod. certo?
------
Outra questão, o que faz esta linha? Descobri que cada elemento da estrutura é reposto a zero. E não compreendo o que estamos aqui a zerar se parecemos ter acabado de escrever estes dados e devemos utilizá-los mais.
ZeroMemory(dataCandle); // limpar os dados na estrutura
"assim":int searchPeriod=(Search_Period<1)?0:Search_Period;"
Não, não é. É assim que o tem (literalmente): se o Search_Period definido pelo utilizador nas definições for inferior a um, então o SearchPeriod será igual a zero; caso contrário, o SearchPeriod será igual ao valor do Search_Period definido pelo utilizador nas definições. Isto não é correcto. Não precisamos de um intervalo de pesquisa que seja igual a zero. Assim, se este intervalo for definido pelo utilizador para 0 ou menos de zero (menos de um), então definiremos este intervalo igual ao mínimo - um.
"int copy_bars=(int)fmin(Search_Period,Bars(Symbol(),Period())); // número de candelabros a copiar
aqui, em teoria, já deveríamos usar a variável: searchPeriod. certo? "
Sim, é verdade, é uma gralha.
"Outra questão, o que faz esta linha? Para que serve? Descobri que repõe cada elemento da estrutura a zero. E aqui não consigo compreender porquê e o que estamos a zerar se acabámos de escrever estes dados e devemos utilizá-los mais. ZeroMemory(dataCandle); // Zerando os dados na estrutura".
Fazemo-lo antes de preencher a estrutura com dados. Primeiro zeramo-lo, e depois enchemo-lo. Veja - zeramos antes do laço. E depois, no laço, preenchemos a estrutura com dados.