Sua sugestão resolveu a discrepância do número total de negociações. Tentei chamar Stop() usando a definição VIRTUAL_CLOSEALL_BYEND na parte superior do código.
Também adicionei um teste IsNewBar para ter menos negociações.
// Lançamento de um TS em ambientes de negociação reais e virtuais//necessário para permitir que o testador negocie como uma estratégia real#include <MT4Orders.mqh> // https://www.mql5.com/ru/code/16006#define VIRTUAL_TESTER // Lançamento no ambiente de negociação virtual#define VIRTUAL_CLOSEALL_BYEND
#include <fxsaber\Virtual\Virtual.mqh> // Ambiente de negociação virtualinputdouble Lots = 1;
inputint Interval = 100; // Duração da posiçãoinputbool Example = true; // Qual código de exemplo escolherdatetime bartime;
//+------------------------------------------------------------------+//||//+------------------------------------------------------------------+bool och_NewBar(string _symbol, ENUM_TIMEFRAMES _timeframe, datetime& _lasttime)
{
if(::iTime(_symbol,_timeframe,0) != _lasttime)
{
_lasttime=::iTime(_symbol,_timeframe,0);
return (true);
}
elsereturn (false);
}
// TC reversívelvoid System()
{
if (!OrderSelect(OrdersTotal() - 1, SELECT_BY_POS))
OrderSend(_Symbol, OP_BUY, Lots, SymbolInfoDouble(_Symbol, SYMBOL_ASK), 100, 0, 0); // Se não houver posição - abrirelseif (TimeCurrent() - OrderOpenTime() > Interval) // Se a posição tiver durado mais do que o tempo especificado
{
// Posição invertida
OrderClose(OrderTicket(), OrderLots(), OrderClosePrice(), 100);
OrderSend(_Symbol, 1 - OrderType(), Lots, OrderClosePrice(), 100, 0, 0);
}
//PrintFormat("%s-Line#%d::HistoryOrders.Total() = %d", __FUNCTION__, __LINE__, OrdersHistoryTotal());
}
int handle = VIRTUAL::Create(); // Criado um identificador para um ambiente de negociação virtual. 0 - ambiente de negociação realvoidOnTick()
{
//static const int handle = VIRTUAL::Create(); // Criou um identificador para um ambiente de negociação virtual. 0 - ambiente de negociação realif (!och_NewBar(_Symbol, _Period, bartime)) return;
if (Example)
{
if (VIRTUAL::SelectByHandle()) // Escolha um ambiente de negociação real
System(); // Lançou o TS no ambiente de negociação selecionado (real)if (VIRTUAL::SelectByHandle(handle)) // Escolha de um ambiente de negociação virtual
{
VIRTUAL::NewTick(); // Adicionado um tick ao ambiente de negociação virtual
System(); // Lançou o TS no ambiente de negociação selecionado (virtual)
}
}
else// Uma gravação alternativa das mesmas ações.// Analisar todos os ambientes de negociação disponíveisfor (int i = 0; i <= VIRTUAL::Total(); i++)
if (VIRTUAL::SelectByIndex(i)) // Escolha do ambiente de negociação apropriado
{
VIRTUAL::NewTick(); // Adicionado um tique ao ambiente de negociação selecionado
System(); // Lançou o TS no ambiente de negociação selecionado
}
Comment(VIRTUAL::ToString()); // Trouxe para o gráfico o estado do ambiente de negociação virtual
}
voidOnDeinit(constint reason)
{
VIRTUAL::SelectByHandle();
PrintFormat("(%s-%s)::%s - Initial deposit=%.2f, Balance=%.2f, Equity=%.2f, Profit=%G, Trades=%d", _Symbol, EnumToString(_Period), "Real", 0,AccountBalance(), AccountEquity(), AccountProfit(), OrdersHistoryTotal());
VIRTUAL::SelectByHandle(handle);
VIRTUAL::Stop();
PrintFormat("(%s-%s)::%s - Initial deposit=%.2f, Balance=%.2f, Equity=%.2f, Profit=%G, Trades=%d", _Symbol, EnumToString(_Period), "Virtual", 0,AccountBalance(), AccountEquity(), AccountProfit(), OrdersHistoryTotal());
Comment("");
}
Mas, na minha opinião, o saldo deve ser (depósito inicial - lucro) e o lucro deve ser (depósito inicial - tradeloss + tradeprofit), como podemos ver nos resultados do backtester para o TS real.
Portanto, o saldo está correto, mas o lucro não pode ser (saldo - patrimônio líquido), conforme definido em Orders.mqh
Sua sugestão resolveu a discrepância do número total de negociações. Tentei chamar Stop() usando a definição VIRTUAL_CLOSEALL_BYEND na parte superior do código.
Também adicionei um teste IsNewBar para ter menos negociações.
Mas, na minha opinião, o saldo deve ser (depósito inicial - lucro) e o lucro deve ser (depósito inicial - tradeloss + tradeprofit), como podemos ver nos resultados do backtester para o TS real.
Portanto, o saldo está correto, mas o lucro não pode ser (saldo - patrimônio líquido), conforme definido em Orders.mqh
Também não entendo por que AccountInfoDouble(ACCOUNT_PROFIT) retorna 0 para o TS real.
Será que estou errado?
Portanto, não é uma maneira muito elegante de resolver o problema, mas ainda tenho que investigar o Virtual TS:
Mas, de acordo com minha opinião, o saldo deve ser (depósito inicial - lucro) e o lucro deve ser (depósito inicial - tradeloss + tradeprofit), como podemos ver nos resultados do backtester para o TS real.
Portanto, o saldo está correto, mas o lucro não pode ser (saldo - patrimônio líquido), conforme definido em Orders.mqh
Também não entendo por que AccountInfoDouble(ACCOUNT_PROFIT) retorna 0 para o TS real.
Será que estou errado?
ACCOUNT_PROFIT é igual à soma dos lucros de todas as posições abertas atuais.
Mais uma vez, obrigado por seu apoio e sua reatividade.
Atualizei um pouco o código novamente e tentei separar o uso do ambiente TS.
Entendi o resultado quando estamos usando um ambiente real ou virtual. Os resultados são os esperados.
Não entendo os resultados quando tentamos usar os dois ambientes ao mesmo tempo.
Seria possível extrair a lista de ordens como um arquivo CSV?
Com os melhores cumprimentos,
och
// Lançamento de um TS em ambientes de negociação reais e virtuais//necessário para permitir que o testador negocie como uma estratégia real#include <MT4Orders.mqh> // https://www.mql5.com/ru/code/16006#define VIRTUAL_TESTER // Lançamento no ambiente de negociação virtual//#define VIRTUAL_CLOSEALL_BYEND#include <fxsaber\Virtual\Virtual.mqh> // Ambiente de negociação virtualenum ENUM_TRADING_TYPE{
TRADING_TYPE_REAL, // Use o Real Environnement
TRADING_TYPE_VIRTUAL, // Use o ambiente virtual
TRADING_TYPE_BOTH // Use ambos
};
inputdouble Lots = 1;
inputint Interval = 100; // Duração da posição//input bool Example = true;// Qual código de exemplo escolherinput ENUM_TRADING_TYPE Trading_type = TRADING_TYPE_REAL; // Tipo de registrodatetime bartime;
//+------------------------------------------------------------------+//||//+------------------------------------------------------------------+bool och_NewBar(string _symbol, ENUM_TIMEFRAMES _timeframe, datetime& _lasttime)
{
if(::iTime(_symbol,_timeframe,0) != _lasttime)
{
_lasttime=::iTime(_symbol,_timeframe,0);
return (true);
}
elsereturn (false);
}
// TC reversívelvoid System()
{
if (!OrderSelect(OrdersTotal() - 1, SELECT_BY_POS))
OrderSend(_Symbol, OP_BUY, Lots, SymbolInfoDouble(_Symbol, SYMBOL_ASK), 100, 0, 0); // Se não houver posição - abrirelseif (TimeCurrent() - OrderOpenTime() > Interval) // Se a posição tiver durado mais do que o tempo especificado
{
// Posição invertida
OrderClose(OrderTicket(), OrderLots(), OrderClosePrice(), 100);
OrderSend(_Symbol, 1 - OrderType(), Lots, OrderClosePrice(), 100, 0, 0);
}
//PrintFormat("%s-Line#%d::HistoryOrders.Total() = %d", __FUNCTION__, __LINE__, OrdersHistoryTotal());
}
int handle = VIRTUAL::Create(); // Criado um identificador para um ambiente de negociação virtual. 0 - ambiente de negociação realvoidOnTick()
{
//static const int handle = VIRTUAL::Create(); // Criou um identificador para um ambiente de negociação virtual. 0 - ambiente de negociação realif (!och_NewBar(_Symbol, _Period, bartime)) return;
//se (Exemplo)
{
switch(Trading_type){
case TRADING_TYPE_REAL : if (VIRTUAL::SelectByHandle()) // Escolha um ambiente de negociação real
System(); // Lançou o TS no ambiente de negociação selecionado (real)break;
case TRADING_TYPE_VIRTUAL : if (VIRTUAL::SelectByHandle(handle)) // Escolha de um ambiente de negociação virtual
{
VIRTUAL::NewTick(); // Adicionado um tick ao ambiente de negociação virtual
System(); // Lançou o TS no ambiente de negociação selecionado (virtual)
}
break;
case TRADING_TYPE_BOTH : if (VIRTUAL::SelectByHandle()) // Escolha um ambiente de negociação real
System(); // Lançou o TS no ambiente de negociação selecionado (real)break;
if (VIRTUAL::SelectByHandle(handle)) // Escolha de um ambiente de negociação virtual
{
VIRTUAL::NewTick(); // Adicionado um tick ao ambiente de negociação virtual
System(); // Lançou o TS no ambiente de negociação selecionado (virtual)
}
break;
}
}
// else // Uma gravação alternativa das mesmas ações.// // Percorrendo todos os ambientes de negociação disponíveis// for (int i = 0; i <= VIRTUAL::Total(); i++)// se (VIRTUAL::SelectByIndex(i)) // Selecionou o ambiente de negociação apropriado// {// VIRTUAL::NewTick(); // Adicionado um tick ao ambiente de negociação selecionado//// System(); // Iniciou o TS no ambiente de negociação selecionado// }Comment(VIRTUAL::ToString()); // Trouxe para o gráfico o estado do ambiente de negociação virtual
}
voidOnDeinit(constint reason)
{
double deposit, profit;
//--- calcular números reais de TSif (Trading_type != TRADING_TYPE_VIRTUAL){
VIRTUAL::SelectByHandle();
OrderSelect(1, SELECT_BY_TICKET, MODE_HISTORY);
deposit = TesterStatistics(STAT_INITIAL_DEPOSIT);
profit = TesterStatistics(STAT_PROFIT);
PrintFormat("(%s-%s)::%s - Initial deposit=%.2f, Balance=%.2f, Equity=%.2f, Profit=%G, Trades=%d", _Symbol, EnumToString(_Period), "Real", deposit,AccountBalance(), AccountEquity(), profit, OrdersHistoryTotal());
}
if (Trading_type != TRADING_TYPE_REAL){
//--- computar números do Virtual TS
VIRTUAL::SelectByHandle(handle);
VIRTUAL::Stop();
deposit = TesterStatistics(STAT_INITIAL_DEPOSIT);
profit = TesterStatistics(STAT_PROFIT);
PrintFormat("(%s-%s)::%s - Initial deposit=%.2f, Balance=%.2f, Equity=%.2f, Profit=%G, Trades=%d", _Symbol, EnumToString(_Period), "Virtual", deposit,AccountBalance(), AccountEquity(), profit, OrdersHistoryTotal());
}
Comment("");
}
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.
fxsaber,
Obrigado por sua resposta rápida.
Sua sugestão resolveu a discrepância do número total de negociações. Tentei chamar Stop() usando a definição VIRTUAL_CLOSEALL_BYEND na parte superior do código.
Também adicionei um teste IsNewBar para ter menos negociações.
Mas, na minha opinião, o saldo deve ser (depósito inicial - lucro) e o lucro deve ser (depósito inicial - tradeloss + tradeprofit), como podemos ver nos resultados do backtester para o TS real.
Portanto, o saldo está correto, mas o lucro não pode ser (saldo - patrimônio líquido), conforme definido em Orders.mqh
Também não entendo por que AccountInfoDouble(ACCOUNT_PROFIT) retorna 0 para o TS real.
Será que estou errado?
fxsaber,
Obrigado por sua resposta rápida.
Sua sugestão resolveu a discrepância do número total de negociações. Tentei chamar Stop() usando a definição VIRTUAL_CLOSEALL_BYEND na parte superior do código.
Também adicionei um teste IsNewBar para ter menos negociações.
Mas, na minha opinião, o saldo deve ser (depósito inicial - lucro) e o lucro deve ser (depósito inicial - tradeloss + tradeprofit), como podemos ver nos resultados do backtester para o TS real.
Portanto, o saldo está correto, mas o lucro não pode ser (saldo - patrimônio líquido), conforme definido em Orders.mqh
Também não entendo por que AccountInfoDouble(ACCOUNT_PROFIT) retorna 0 para o TS real.
Será que estou errado?
Portanto, não é uma maneira muito elegante de resolver o problema, mas ainda tenho que investigar o Virtual TS:
Mas, de acordo com minha opinião, o saldo deve ser (depósito inicial - lucro) e o lucro deve ser (depósito inicial - tradeloss + tradeprofit), como podemos ver nos resultados do backtester para o TS real.
Portanto, o saldo está correto, mas o lucro não pode ser (saldo - patrimônio líquido), conforme definido em Orders.mqh
Também não entendo por que AccountInfoDouble(ACCOUNT_PROFIT) retorna 0 para o TS real.
Será que estou errado?
ACCOUNT_PROFIT é igual à soma dos lucros de todas as posições abertas atuais.
Portanto, não é uma maneira muito elegante de resolver o problema, mas ainda tenho que investigar o Virtual TS:
fxsaber,
Mais uma vez, obrigado por seu apoio e sua reatividade.
Atualizei um pouco o código novamente e tentei separar o uso do ambiente TS.
Entendi o resultado quando estamos usando um ambiente real ou virtual. Os resultados são os esperados.
Não entendo os resultados quando tentamos usar os dois ambientes ao mesmo tempo.
Seria possível extrair a lista de ordens como um arquivo CSV?
Com os melhores cumprimentos,
och
Não entendo os resultados quando tentamos usar os dois ambientes ao mesmo tempo.
A biblioteca tem muitos casos de uso. Você está vendo um exemplo de uma exibição geral.
Seria possível extrair a lista de ordens como um arquivo CSV?
No exemplo abaixo, você pode alterar o ambiente de negociação nos parâmetros de entrada: real ou virtual.
As linhas na parte inferior criam um relatório HTML. Se você ativar a DLL, esse relatório aparecerá automaticamente no navegador ao final do teste.
Virtual :
Autor: fxsaber
Olá, posso saber se a biblioteca funciona para o mt4?
Porque ao importar a biblioteca, estou tendo um erro de compilação, obrigado
Olá, posso saber se a biblioteca funciona para o mt4?
Porque ao importar a biblioteca, estou tendo um erro de compilação, obrigado
É um bug da MQL4! O tópico base está aqui.
Fórum sobre negociação, sistemas de negociação automatizados e teste de estratégias de negociação
MT5 e velocidade no desempenho de combate
fxsaber, 2021.03.01 12:19 pm.
A implementação desse fato no Virtual é capaz de acelerá-lo em um ambiente real.
Prezado fxsaber,
Obrigado por sua gentileza, essa ferramenta é muito útil.
A versão MT4 desse programa está disponível?