gspencer: Não sei nada sobre codificação ou trabalho com EAs no Meta Editor, mas gosto muito do seu conceito com o BestInterval. Seria muito difícil para você me instruir sobre como adicioná-lo aos EAs que tenho e que gostaria de testar?
// Exibir o gráfico de equilíbrio BestInterval no gráfico#property strict#property script_show_inputsinputint inAmountIntervals = 3; // Quantos intervalos de negociação de pior caso devem ser descartados#include <Graphics\Graphic.mqh> // https://www.mql5.com/pt/articles/2866void ToChart( constdouble &Y[] )
{
CGraphic graphic;
graphic.Create(0, __FUNCTION__, 0, 30, 30, 780, 380);
graphic.CurveAdd(Y, CURVE_LINES);
graphic.CurvePlotAll();
graphic.Update();
}
#include <MT4Orders.mqh> // Não é necessário se o MT4.#include <fxsaber\BestInterval\BestInterval.mqh> // Cálculo do melhor intervalo de negociaçãovoidOnStart()
{
BESTINTERVAL BestInterval; // Criado um objeto para calcular o melhor intervalo de negociação
BestInterval.Set(); // Publicou um histórico de lancesfor (int i = 0; i < inAmountIntervals; i++)
if (BestInterval.DeleteWorseInterval()) // Se algo foi jogado foraPrint(BestInterval.ToString()); // Vamos imprimir os dados comerciais obtidoselsebreak; // Caso contrário, estamos foradouble Profits[];
double Balance[];
constint Size = ArrayResize(Balance, BestInterval.GetProfits(Profits) + 1); // Obteve os lucros da transação BestInterval
Balance[0] = 0;
// Calcular a curva de equilíbriofor (int i = 1; i < Size; i++)
Balance[i] = Balance[i - 1] + Profits[i - 1];
ToChart(Balance); // Visualizado.
}
Se você inserir isso no final de qualquer EA da entrega padrão
// Transmitir cotações de cada passagem do Optimiser para o Terminal. Aplique o BestInterval a elas e visualize-as.#include <MT4Orders.mqh> // https://www.mql5.com/pt/code/16006#include <fxsaber\BestInterval\BestInterval.mqh> // https://www.mql5.com/pt/code/22710#include <TypeToBytes.mqh> // https://www.mql5.com/pt/code/16280#include <Graphics\Graphic.mqh> // https://www.mql5.com/pt/articles/2866inputint inAmountIntervals = 1; // Quantos intervalos de negociação de pior caso devem ser descartados// Gera o gráficovoid ToChart( constdouble &Y[] )
{
CGraphic graphic;
graphic.Create(0, __FUNCTION__, 0, 30, 30, 780, 380);
graphic.CurveAdd(Y, CURVE_LINES);
graphic.CurvePlotAll();
graphic.Update();
}
// Coleta o histórico comercialint GetDeals( DEAL_BASE &Deals[] )
{
constint Total = ArrayResize(Deals, OrdersHistoryTotal());
int Amount = 0;
for (int i = 0; i < Total; i++)
if (OrderSelect(i, SELECT_BY_POS, MODE_HISTORY) && (OrderType() <= OP_SELL))
{
Deals[Amount].OpenTime = OrderOpenTime();
Deals[Amount++].Profit = OrderProfit() + OrderCommission() + OrderSwap();
}
return(ArrayResize(Deals, Amount));
}
// A partir daqui (Agente), enviaremos dados para o TerminaldoubleOnTester()
{
DEAL_BASE Deals[];
if (MQLInfoInteger(MQL_OPTIMIZATION) && GetDeals(Deals)) // Se for otimização, histórico comercial coletado
{
CONTAINER<uchar> Container; // https://www.mql5.com/ru/forum/95447/page4#comment_5464205
Container[0] = Deals; // Coloque o histórico de lances em um contêinerFrameAdd(NULL, 0, 0, Container.Data); // Envio de dados do agente para o terminal
}
return(0);
}
// Aqui (Terminal) recebe dados dos agentesvoidOnTesterPass()
{
ulong Pass;
string Name;
long ID;
double Value;
CONTAINER<uchar> Container; // https://www.mql5.com/ru/forum/95447/page4#comment_5464205while (FrameNext(Pass, Name, ID, Value, Container.Data))
{
Print("Pass = " + (string)Pass); // Número de aprovação
DEAL_BASE Deals[];
// Dados recebidos do agente
Container[0].Get(Deals);
BESTINTERVAL BestInterval; // Criado um objeto para calcular o melhor intervalo de negociação
BestInterval.Set(Deals); // Publicou o histórico de lances transmitidosPrint(BestInterval.ToString() + "\n"); // Vamos imprimir os dados comerciais obtidosfor (int i = 0; i < inAmountIntervals; i++)
if (BestInterval.DeleteWorseInterval()) // Se algo foi jogado foraPrint(BestInterval.ToString() + "\n"); // Vamos imprimir os dados comerciais obtidoselsebreak; // Caso contrário, estamos foradouble Profits[];
double Balance[];
constint Size = ArrayResize(Balance, BestInterval.GetProfits(Profits) + 1); // Obteve os lucros da transação BestInterval
Balance[0] = 0;
// Calcular a curva de equilíbriofor (int i = 1; i < Size; i++)
Balance[i] = Balance[i - 1] + Profits[i - 1];
ToChart(Balance); // Visualizado.
}
}
verá algo parecido com isto no registro do Terminal (pelo exemplo das Médias Móveis padrão)
Eu descrevi algo mais generalizado em um blog em inglês(parte 1, parte 2). Fazer seções cruzadas somente em intervalos de tempo é uma abordagem altamente especializada. Na ideia, as seções cruzadas em outros parâmetros poderiam ser igualmente interessantes.
Eu descrevi algo mais generalizado no blog em inglêsabertura da posição. Dessa forma, todas as posições no histórico de negociação podem ser comparadas a esses valores de MA.
Em seguida, aplicamos o BestInterval a essas MAs. E, na saída, obtemos os intervalos de МАшки nos quais as posições devem ser abertas e em quais - não.
Obviamente, você pode usar qualquer função numérica em vez de uma MA. Como resultado, você pode encontrar filtros legais que superam o tempo.
#include <fxsaber\BestInterval\BestInterval.mqh>
voidOnStart()
{
BESTINTERVAL BestInterval;
// Valores correspondentes para todo o BestIntervalPrint(BestInterval.GetTotal()); // Número de posições fechadas.Print(BestInterval.GetTotalPlus()); // Número de posições fechadas lucrativas.Print(BestInterval.GetTotalMinus()); // Número de posições fechadas não lucrativas.Print(BestInterval.GetMean()); // Expectativa matemáticaPrint(BestInterval.GetProfit()); // LucroPrint(BestInterval.GetProfitFactor()); // Fator de lucroPrint(BestInterval.GetProfitPlus()); // Lucro de transações positivasPrint(BestInterval.GetProfitMinus()); // Perda de transações negativasPrint(BestInterval.GetRecoveryFactor()); // Fator de recuperaçãoPrint(BestInterval.GetMaxDrawDown()); // Redução máxima do saldo absolutoPrint(BestInterval.GetAmountDeleteIntervals()); // Número de intervalos ruins removidos
INTERVAL Intervals[];
constint Size = BestInterval.GetIntervals(Intervals); // Obter os intervalos que compõem o BestInterval// Para cada intervalo, imprimimos seus índicesfor (int i = 0; i < Size; i++)
{
Print(Intervals[i].Total); // Número de posições fechadas.Print(Intervals[i].TotalPlus); // Número de posições fechadas lucrativas.Print(Intervals[i].TotalMinus); // Número de posições fechadas não lucrativas.Print(Intervals[i].Mean); // Expectativa matemáticaPrint(Intervals[i].Profit); // LucroPrint(Intervals[i].ProfitFactor); // Fator de lucroPrint(Intervals[i].ProfitPlus); // Lucro de transações positivasPrint(Intervals[i].ProfitMinus); // Perda de transações negativasPrint(Intervals[i].RecoveryFactor); // Fator de recuperaçãoPrint(Intervals[i].MaxDrawDown); // Redução máxima do saldo absolutoPrint(Intervals[i].OpenTime); // Intervalo de tempo aberto.Print(Intervals[i].CloseTime); // Hora de fechamento do intervalo.
}
}
Fazer seções cruzadas somente por intervalos de tempo é uma abordagem altamente especializada. Na verdade, as seções cruzadas por outros parâmetros podem ser não menos interessantes.
Tenho pensado e pensado, mas não encontrei algo que possa ser filtrado de forma tão eficaz quanto o tempo.
Esse algo não deve fazer parte da estratégia e deve influenciar diretamente o comportamento do mercado.
Pilha? Outros feeds de dados?
E outra pergunta: há algum sentido em criar hipercubos? em teoria, individualmente, eles também devem ser bem filtrados.
Não sei nada sobre codificação ou trabalho com EAs no Meta Editor, mas gosto muito do seu conceito com o BestInterval. Seria muito difícil para você me instruir sobre como adicioná-lo aos EAs que tenho e que gostaria de testar?
Tente entender a discussão deste tópico.
verá algo parecido com isto no registro do Terminal (pelo exemplo das Médias Móveis padrão)
E o gráfico mostra o gráfico BestInterval-profit da passagem correspondente
Eu estava passando por lá. Eu li.
A descrição diz: "
"
Eu descrevi algo mais generalizado em um blog em inglês(parte 1, parte 2). Fazer seções cruzadas somente em intervalos de tempo é uma abordagem altamente especializada. Na ideia, as seções cruzadas em outros parâmetros poderiam ser igualmente interessantes.
Eu estava passando por lá. Eu li.
A descrição diz: "
"
Eu descrevi algo mais generalizado no blog em inglêsabertura da posição. Dessa forma, todas as posições no histórico de negociação podem ser comparadas a esses valores de MA.
Em seguida, aplicamos o BestInterval a essas MAs. E, na saída, obtemos os intervalos de МАшки nos quais as posições devem ser abertas e em quais - não.
Obviamente, você pode usar qualquer função numérica em vez de uma MA. Como resultado, você pode encontrar filtros legais que superam o tempo.
Infelizmente, a barreira do idioma me impede de entrar em seu trabalho. Sobre o interesse em outros filtros, é claro, eu concordo
Desde quando existe essa barreira? ;-) Já estava claro antes. Ou eu estraguei meu inglês?
Desde quando surgiu essa barreira? ;-) Costumava ser claro. Ou eu baguncei meu inglês?
Sempre havia uma barreira. Às vezes eu ia direto ao ponto, lendo o código-fonte.
Infelizmente, a barreira do idioma me impede de entrar em seu trabalho. Sobre o interesse em outros filtros, é claro, eu concordo
Deus é seu juiz.
Fazer seções cruzadas somente por intervalos de tempo é uma abordagem altamente especializada. Na verdade, as seções cruzadas por outros parâmetros podem ser não menos interessantes.
Tenho pensado e pensado, mas não encontrei algo que possa ser filtrado de forma tão eficaz quanto o tempo.
Esse algo não deve fazer parte da estratégia e deve influenciar diretamente o comportamento do mercado.
Pilha? Outros feeds de dados?
E outra pergunta: há algum sentido em criar hipercubos? em teoria, individualmente, eles também devem ser bem filtrados.