Estou tendo dificuldades em criar um EA a partir de um indicador personalizado, eu só quero obter os dados de um indicador que criar e
manipulá-los no robô de maneira simples.
Estou tentando algo como o código abaixo, mas parece não ser o caminho certo, eu tomei como base a chamada de um indicador iMA simples.
Segue um script que eu construí para listar todas as opções de um ativo escolhido e suas principais propriedades:
#define UNDERLYING_STOCK "PETR"// ativo para a qual se deseja a lista de opcoes negociadas intOnStart(void)
{
// Para cada ativo negociado no mercado ...for ( int i = 0 ; i < SymbolsTotal(false) ; i++ )
{
// Obtem o ticker do ativostring symbolName = SymbolName(i,false);
// Se os 4 primeiros caracteres do ticker corresponderem ao ativo subjacente desejado// e o ativo for uma opcao (valor do strike diferente de zero),// imprime informacoes da opcaoif ( StringSubstr(symbolName,0,4) == UNDERLYING_STOCK && SymbolInfoDouble(symbolName,SYMBOL_OPTION_STRIKE) > 0 )
{
PrintFormat
(
"%10s - %4s Vencimento: %s Strike: %5.2f Tipo: %s Descricao: <%s>" ,
symbolName ,
StringSubstr ( EnumToString ( (ENUM_SYMBOL_OPTION_RIGHT) SymbolInfoInteger ( symbolName , SYMBOL_OPTION_RIGHT ) ) , 20 ),
TimeToString ( SymbolInfoInteger ( symbolName , SYMBOL_EXPIRATION_TIME ), TIME_DATE ),
SymbolInfoDouble ( symbolName , SYMBOL_OPTION_STRIKE ),
StringSubstr ( EnumToString ( (ENUM_SYMBOL_OPTION_MODE) SymbolInfoInteger ( symbolName , SYMBOL_OPTION_MODE ) ) , 19 ),
SymbolInfoString ( symbolName , SYMBOL_DESCRIPTION )
);
}
}
return(0);
}
Na corretora Modalmais, que costuma preencher corretamente todas as propriedades das opções, o script imprime o resultado no
terminal assim (abaixo apenas um trecho da resposta, pois para a PETR4 são centenas de opções):
O problema é que nem todas as corretoras preenchem corretamente as propriedades das opções. Se for este o caso da sua corretora, vc
vai ter que ter algum "jogo de cintura" (obter o strike analisando a descrição, obter o vencimento com base na quinta letra do
ticker, etc.).
obs: se a sua corretora não preencher nem o strike, vc vai ter que mexer no código para eliminar o filtro que seleciona somente ativos
com strike maior que zero, senão não vai aparecer nada. Nesse caso, podem aparecer na lista outros tipos derivativos da ação que não
sejam opções e vc vai ter que ter mais "jogo de cintura" ainda pra filtrar (por exemplo: descartar os tickers cujo ultimo caracter
não for numérico.
3º - logo, a partir dos eventos de OnTick(), OnTrade(), OnChartEvent(), e inclusive OnBookEvent(), a
brincadeira começa. Inclusive são gerados eventos de botões.
4º - feito este preâmbulo, vamos aos fatos. A função que está incluída logo abaixo, contém as tradicionais variáveis do
tipo MqlTradeRequest e MqlTradeResult.
Ambas variáveis MqlTradeRequest eMqlTradeResult
são declaradas de foma local, ou seja, dentro da função. Se
realmente entendi sua explanação, e se estamos "falando a mesma língua", seria necessário então usar a função
ZeroMemory(), antes de "montar" a ordem de compra, para garantir que todas
as variáveis sejam inicializadas com valores "padrão". Se não entendi de forma correta, aponte-me o erro, por favor.
Está postado toda a função:
double CTradeFIIDialog::TradeBuyOnBID(void){
string_volume.Assign(m_edit_volume_cotas_negociar.Text()); // coleta o volume digitado pelo usuáriodouble volume_digitado = STD(string_volume.Str()); // converte o volume de String para doubledouble volume_livre_para_comprar = STD(m_edit_cotas_livres_para_comprar.Text());
if(volume_livre_para_comprar <= 0){
MessageBox("Não há COTAS LIVRES para lançar a ordem de COMPRA.", "Erro: Cotas Insuficientes",0);
// limpar os valores
string_volume.Clear(); // limpa os valores da variável global return -1; // retorna um valor padrão
}elseif(volume_digitado > volume_livre_para_comprar){
MessageBox("O volume de cotas digitado é maior que o volume "
+ "de cotas disponíveis para comprar.\n"
+ "Não é possível lançar a ordem de COMPRA."
, "Erro: Cotas Insuficientes",0);
// limpar os valores
string_volume.Clear(); // limpa os valores da variável global return -1; // retorna um valor padrão
}elseif(volume_digitado <= 0){
volume_digitado = volume_livre_para_comprar;
}
//--- declare and initialize the trade request and result of trade requestMqlTradeRequest request={0};
MqlTradeResult result={0};
//--- parameters of request
request.action = TRADE_ACTION_PENDING; // ordem pendente
request.symbol = Symbol(); // symbol (ticker)
request.volume = volume_digitado; // volume do tipo double
request.type = ORDER_TYPE_BUY_LIMIT; // ordem de compra do tipo limit
request.type_time = ORDER_TIME_DAY; // válido para o dia
request.price = SymbolInfoDouble(_Symbol,SYMBOL_BID); // price for opening
request.magic = MAGIC_NUMBER;
request.type_filling = ORDER_FILLING_RETURN;
request.comment = "Trade Buy On BID: BOTÃO COMPRA BID";
//limpar valor
string_volume.Clear();
m_edit_volume_cotas_negociar.Text("");
//--- send the requestif(OrderSend(request,result)){
PrintFormat("OrderSend Success! retcode=%u deal=%I64u order=%I64u",result.retcode,result.deal,result.order);
// ordem enviadareturn result.price;
}else{
PrintFormat("OrderSend error %d",GetLastError()); // if unable to send the request, output the error codeResetLastError();
// erro no envioreturn -1;
}
return -1;
} // end função double CTradeFIIDialog::TradeBuyOnBID(void)
Já nesta função, as variáveis MqlTradeRequest eMqlTradeResult também
são declaradas de forma local, dentro da função, porém como se trata de uma iteração, onde há uma busca por uma ordem em específico,
se faz necessário a utilização da função
ZeroMemory() para garantir que todas as variáveis sejam inicializadas com o
valor "padrão", antes da próxima iteração. Segue código abaixo:
Procurando solução para esse erro e lendo aqui sobre os pontos positivos e negativos, acabei encontrando um detalhe, nem vou chamar de erro
que pode gerar esse erro de divisão, isso foi no meu caso.
Eu tenho um loop for que soma o volume para fazer uma média, sei que tem como usar o indicador do próprio mt5, mas preferi fazer na mão.
Em um indicador configurado para timeframe de 5 minutos estava funcionando, e em outro que fiz com o mesmo código, mas com
resultados para 2 minutos ficou dando esse erro.
Até que notei uma única diferença entre ambos, onde eu usava direto o vetor Volume[] no de 5 minutos, e acabei resumindo instânciando
vol[i] = volume[i], e usando o vol[i] em todo o código.
Mas no loop isso começou a gerar o erro de divisão, então voltei para o modo antigo deixando assim:
3º - logo, a partir dos eventos de OnTick(), OnTrade(), OnChartEvent(), e inclusive OnBookEvent(), a
brincadeira começa. Inclusive são gerados eventos de botões.
4º - feito este preâmbulo, vamos aos fatos. A função que está incluída logo abaixo, contém as tradicionais variáveis do
tipo MqlTradeRequest e MqlTradeResult.
Ambas variáveis MqlTradeRequest eMqlTradeResult
são declaradas de foma local, ou seja, dentro da função. Se
realmente entendi sua explanação, e se estamos "falando a mesma língua", seria necessário então usar a função
ZeroMemory(), antes de "montar" a ordem de compra, para garantir que todas
as variáveis sejam inicializadas com valores "padrão". Se não entendi de forma correta, aponte-me o erro, por favor.
Está postado toda a função:
double CTradeFIIDialog::TradeBuyOnBID(void){
string_volume.Assign(m_edit_volume_cotas_negociar.Text()); // coleta o volume digitado pelo usuáriodouble volume_digitado = STD(string_volume.Str()); // converte o volume de String para doubledouble volume_livre_para_comprar = STD(m_edit_cotas_livres_para_comprar.Text());
if(volume_livre_para_comprar <= 0){
MessageBox("Não há COTAS LIVRES para lançar a ordem de COMPRA.", "Erro: Cotas Insuficientes",0);
// limpar os valores
string_volume.Clear(); // limpa os valores da variável global return -1; // retorna um valor padrão
}elseif(volume_digitado > volume_livre_para_comprar){
MessageBox("O volume de cotas digitado é maior que o volume "
+ "de cotas disponíveis para comprar.\n"
+ "Não é possível lançar a ordem de COMPRA."
, "Erro: Cotas Insuficientes",0);
// limpar os valores
string_volume.Clear(); // limpa os valores da variável global return -1; // retorna um valor padrão
}elseif(volume_digitado <= 0){
volume_digitado = volume_livre_para_comprar;
}
//--- declare and initialize the trade request and result of trade requestMqlTradeRequest request={0};
MqlTradeResult result={0};
//--- parameters of request
request.action = TRADE_ACTION_PENDING; // ordem pendente
request.symbol = Symbol(); // symbol (ticker)
request.volume = volume_digitado; // volume do tipo double
request.type = ORDER_TYPE_BUY_LIMIT; // ordem de compra do tipo limit
request.type_time = ORDER_TIME_DAY; // válido para o dia
request.price = SymbolInfoDouble(_Symbol,SYMBOL_BID); // price for opening
request.magic = MAGIC_NUMBER;
request.type_filling = ORDER_FILLING_RETURN;
request.comment = "Trade Buy On BID: BOTÃO COMPRA BID";
//limpar valor
string_volume.Clear();
m_edit_volume_cotas_negociar.Text("");
//--- send the requestif(OrderSend(request,result)){
PrintFormat("OrderSend Success! retcode=%u deal=%I64u order=%I64u",result.retcode,result.deal,result.order);
// ordem enviadareturn result.price;
}else{
PrintFormat("OrderSend error %d",GetLastError()); // if unable to send the request, output the error codeResetLastError();
// erro no envioreturn -1;
}
return -1;
} // end função double CTradeFIIDialog::TradeBuyOnBID(void)
Já nesta função, as variáveis MqlTradeRequest eMqlTradeResult também
são declaradas de forma local, dentro da função, porém como se trata de uma iteração, onde há uma busca por uma ordem em específico,
se faz necessário a utilização da função
ZeroMemory() para garantir que todas as variáveis sejam inicializadas com o
valor "padrão", antes da próxima iteração. Segue código abaixo:
Tô testando um EA que trabalha com dois ativos ao mesmo tempo. Lá nos input´s estes dois ativos estão configurados como symbols0 e
symbols1. O trecho do código abaixo mostra a abertura de uma posição quando já houver 2 compras abertas (count_buys==2) no
symbols0. O que devo incluir, de mais simples, para que só abra mais posições se o Profit deste símbolo (só deste) estiver menor que
zero ?
Algo do tipo: if(Use_Symbol0 && count_buys==2 && m_symbols0.Profit()
< 0) = Sei que não é bem assim, só coloquei para minha dúvida ficar mais clara. Profit só de um determinado símbolo
(ativo), que inclusive pode ter várias ordens abertas ao mesmo tempo.
Criei uma EA no meta editor usando o Expert Advisor (gerar), o problema é o
seguinte, eu determinei um stop loss e um gain, porem, no primeiro trade que a EA faz no dia ela adiciona o STOP loss e o GAIN mas depois
disso antes mesmo de chegar no loss ou no gain ela encerra a operação e inicia outra só que dessa vez ela não adiciona o stop loss nem o
stop gain e fica operando "aleatoriamente" sem utilizar as regras de stop.
Basicamente o seguinte: Minha EA não espera uma operação terminar para iniciar outra, e quando incia ela não adiciona stop loss nem o gain.
Nos backtests ela funciona perfeitamente, porem, quando colocada no
mercado em tempo real (demo) ela tem esse comportamento.
Existe alguma forma de contornar isso? Lembrando que não escrevi o código, é o
código padrão do expert advisor (gerar).
//+------------------------------------------------------------------+//| Include |//+------------------------------------------------------------------+#include <Expert\Expert.mqh>
//--- available signals#include <Expert\Signal\SignalMA.mqh>
#include <Expert\Signal\SignalMACD.mqh>
//--- available trailing#include <Expert\Trailing\TrailingNone.mqh>
//--- available money management#include <Expert\Money\MoneyFixedLot.mqh>
//+------------------------------------------------------------------+//| Inputs |//+------------------------------------------------------------------+//--- inputs for expertinputstring Expert_Title ="EA"; // Document nameulong Expert_MagicNumber =31589; // bool Expert_EveryTick =false; // //--- inputs for main signalinputint Signal_ThresholdOpen =10; // Signal threshold value to open [0...100]inputint Signal_ThresholdClose =10; // Signal threshold value to close [0...100]inputdouble Signal_PriceLevel =0.0; // Price level to execute a dealinputdouble Signal_StopLevel =50.0; // Stop Loss level (in points)inputdouble Signal_TakeLevel =50.0; // Take Profit level (in points)inputint Signal_Expiration =4; // Expiration of pending orders (in bars)inputint Signal_MA_PeriodMA =9; // Moving Average(9,0,MODE_SMA,...) Period of averaginginputint Signal_MA_Shift =0; // Moving Average(9,0,MODE_SMA,...) Time shiftinputENUM_MA_METHOD Signal_MA_Method =MODE_SMA; // Moving Average(9,0,MODE_SMA,...) Method of averaginginputENUM_APPLIED_PRICE Signal_MA_Applied =PRICE_CLOSE; // Moving Average(9,0,MODE_SMA,...) Prices seriesinputdouble Signal_MA_Weight =1.0; // Moving Average(9,0,MODE_SMA,...) Weight [0...1.0]inputint Signal_MACD_PeriodFast =12; // MACD(12,24,9,PRICE_CLOSE) Period of fast EMAinputint Signal_MACD_PeriodSlow =24; // MACD(12,24,9,PRICE_CLOSE) Period of slow EMAinputint Signal_MACD_PeriodSignal=9; // MACD(12,24,9,PRICE_CLOSE) Period of averaging of differenceinputENUM_APPLIED_PRICE Signal_MACD_Applied =PRICE_CLOSE; // MACD(12,24,9,PRICE_CLOSE) Prices seriesinputdouble Signal_MACD_Weight =1.0; // MACD(12,24,9,PRICE_CLOSE) Weight [0...1.0]//--- inputs for moneyinputdouble Money_FixLot_Percent =10.0; // Percentinputdouble Money_FixLot_Lots =5.0; // Fixed volume//+------------------------------------------------------------------+//| Global expert object |//+------------------------------------------------------------------+
CExpert ExtExpert;
//+------------------------------------------------------------------+//| Initialization function of the expert |//+------------------------------------------------------------------+intOnInit()
{
//--- Initializing expertif(!ExtExpert.Init(Symbol(),Period(),Expert_EveryTick,Expert_MagicNumber))
{
//--- failedprintf(__FUNCTION__+": error initializing expert");
ExtExpert.Deinit();
return(INIT_FAILED);
}
//--- Creating signal
CExpertSignal *signal=new CExpertSignal;
if(signal==NULL)
{
//--- failedprintf(__FUNCTION__+": error creating signal");
ExtExpert.Deinit();
return(INIT_FAILED);
}
//---
ExtExpert.InitSignal(signal);
signal.ThresholdOpen(Signal_ThresholdOpen);
signal.ThresholdClose(Signal_ThresholdClose);
signal.PriceLevel(Signal_PriceLevel);
signal.StopLevel(Signal_StopLevel);
signal.TakeLevel(Signal_TakeLevel);
signal.Expiration(Signal_Expiration);
//--- Creating filter CSignalMA
CSignalMA *filter0=new CSignalMA;
if(filter0==NULL)
{
//--- failedprintf(__FUNCTION__+": error creating filter0");
ExtExpert.Deinit();
return(INIT_FAILED);
}
signal.AddFilter(filter0);
//--- Set filter parameters
filter0.PeriodMA(Signal_MA_PeriodMA);
filter0.Shift(Signal_MA_Shift);
filter0.Method(Signal_MA_Method);
filter0.Applied(Signal_MA_Applied);
filter0.Weight(Signal_MA_Weight);
//--- Creating filter CSignalMACD
CSignalMACD *filter1=new CSignalMACD;
if(filter1==NULL)
{
//--- failedprintf(__FUNCTION__+": error creating filter1");
ExtExpert.Deinit();
return(INIT_FAILED);
}
signal.AddFilter(filter1);
//--- Set filter parameters
filter1.PeriodFast(Signal_MACD_PeriodFast);
filter1.PeriodSlow(Signal_MACD_PeriodSlow);
filter1.PeriodSignal(Signal_MACD_PeriodSignal);
filter1.Applied(Signal_MACD_Applied);
filter1.Weight(Signal_MACD_Weight);
//--- Creation of trailing object
CTrailingNone *trailing=new CTrailingNone;
if(trailing==NULL)
{
//--- failedprintf(__FUNCTION__+": error creating trailing");
ExtExpert.Deinit();
return(INIT_FAILED);
}
//--- Add trailing to expert (will be deleted automatically))if(!ExtExpert.InitTrailing(trailing))
{
//--- failedprintf(__FUNCTION__+": error initializing trailing");
ExtExpert.Deinit();
return(INIT_FAILED);
}
//--- Set trailing parameters//--- Creation of money object
CMoneyFixedLot *money=new CMoneyFixedLot;
if(money==NULL)
{
//--- failedprintf(__FUNCTION__+": error creating money");
ExtExpert.Deinit();
return(INIT_FAILED);
}
//--- Add money to expert (will be deleted automatically))if(!ExtExpert.InitMoney(money))
{
//--- failedprintf(__FUNCTION__+": error initializing money");
ExtExpert.Deinit();
return(INIT_FAILED);
}
//--- Set money parameters
money.Percent(Money_FixLot_Percent);
money.Lots(Money_FixLot_Lots);
//--- Check all trading objects parametersif(!ExtExpert.ValidationSettings())
{
//--- failed
ExtExpert.Deinit();
return(INIT_FAILED);
}
//--- Tuning of all necessary indicatorsif(!ExtExpert.InitIndicators())
{
//--- failedprintf(__FUNCTION__+": error initializing indicators");
ExtExpert.Deinit();
return(INIT_FAILED);
}
//--- okreturn(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+//| Deinitialization function of the expert |//+------------------------------------------------------------------+voidOnDeinit(constint reason)
{
ExtExpert.Deinit();
}
//+------------------------------------------------------------------+//| "Tick" event handler function |//+------------------------------------------------------------------+voidOnTick()
{
ExtExpert.OnTick();
}
//+------------------------------------------------------------------+//| "Trade" event handler function |//+------------------------------------------------------------------+voidOnTrade()
{
ExtExpert.OnTrade();
}
//+------------------------------------------------------------------+//| "Timer" event handler function |//+------------------------------------------------------------------+voidOnTimer()
{
ExtExpert.OnTimer();
}
//+------------------------------------------------------------------+
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.
Fórum de negociação, sistemas de negociação automatizados e testes de estratégias de negociação
EA a partir de indicador personalizado
wlysan, 2019.08.18 00:37
Olá, sou novato na programação com o mql5.
Estou tendo dificuldades em criar um EA a partir de um indicador personalizado, eu só quero obter os dados de um indicador que criar e manipulá-los no robô de maneira simples.
Estou tentando algo como o código abaixo, mas parece não ser o caminho certo, eu tomei como base a chamada de um indicador iMA simples.
void OnTick()
{
double stopATR_Array[];
int stopATR_Handle;
stopATR_Array = iCustom(_Symbol, _Period, "StopATR", 10, 1);
ArraySetAsSeries(stopATR_Array, true);
CopyBuffer(stopATR_Handle, 0, 0, 3, stopATR_Array);
}
Alguém poderia me dar o caminho das pedras? Eu encontrei vários códigos diferentes, porem alguns bem complexos e com muitos rodeios.
Fórum de negociação, sistemas de negociação automatizados e testes de estratégias de negociação
Como listar todas as opções em negociação de um ativo(symbol)?
Trader_Patinhas, 2018.07.01 23:34
Olá Thadeu,
Segue um script que eu construí para listar todas as opções de um ativo escolhido e suas principais propriedades:
Na corretora Modalmais, que costuma preencher corretamente todas as propriedades das opções, o script imprime o resultado no terminal assim (abaixo apenas um trecho da resposta, pois para a PETR4 são centenas de opções):
O problema é que nem todas as corretoras preenchem corretamente as propriedades das opções. Se for este o caso da sua corretora, vc vai ter que ter algum "jogo de cintura" (obter o strike analisando a descrição, obter o vencimento com base na quinta letra do ticker, etc.).
obs: se a sua corretora não preencher nem o strike, vc vai ter que mexer no código para eliminar o filtro que seleciona somente ativos com strike maior que zero, senão não vai aparecer nada. Nesse caso, podem aparecer na lista outros tipos derivativos da ação que não sejam opções e vc vai ter que ter mais "jogo de cintura" ainda pra filtrar (por exemplo: descartar os tickers cujo ultimo caracter não for numérico.
Espero ter ajudado.
Abraços
Fórum de negociação, sistemas de negociação automatizados e testes de estratégias de negociação
Dúvida sobre a função ZeroMemory()
Márcio Hermes, 2019.08.09 02:01
Com base no seu retorno, vou explanar como o EA está desenvolvido para fins de alinhar a nossa conversa.
1º - o desenvolvimento do código está em dois arquivos tradicionais(.mq5 e .mqh).
Observei que em vários exemplos aqui na comunidade, o pessoal gosta de deixar todo o código no próprio .mq5.
2º - no arquivo .mq5 é feito o #include e criado uma variável (ou um objeto) da classe incluída, como mostrado no exemplo de código abaixo:
3º - logo, a partir dos eventos de OnTick(), OnTrade(), OnChartEvent(), e inclusive OnBookEvent(), a brincadeira começa. Inclusive são gerados eventos de botões.
4º - feito este preâmbulo, vamos aos fatos. A função que está incluída logo abaixo, contém as tradicionais variáveis do tipo MqlTradeRequest e MqlTradeResult.
Ambas variáveis MqlTradeRequest e MqlTradeResult são declaradas de foma local, ou seja, dentro da função. Se realmente entendi sua explanação, e se estamos "falando a mesma língua", seria necessário então usar a função ZeroMemory(), antes de "montar" a ordem de compra, para garantir que todas as variáveis sejam inicializadas com valores "padrão". Se não entendi de forma correta, aponte-me o erro, por favor.
Está postado toda a função:
Já nesta função, as variáveis MqlTradeRequest e MqlTradeResult também são declaradas de forma local, dentro da função, porém como se trata de uma iteração, onde há uma busca por uma ordem em específico, se faz necessário a utilização da função ZeroMemory() para garantir que todas as variáveis sejam inicializadas com o valor "padrão", antes da próxima iteração. Segue código abaixo:
Grande abraço.
Fórum de negociação, sistemas de negociação automatizados e testes de estratégias de negociação
Zero Divide em dois indicadores em TF menores
prsc, 2019.08.22 17:45
Procurando solução para esse erro e lendo aqui sobre os pontos positivos e negativos, acabei encontrando um detalhe, nem vou chamar de erro que pode gerar esse erro de divisão, isso foi no meu caso.
Eu tenho um loop for que soma o volume para fazer uma média, sei que tem como usar o indicador do próprio mt5, mas preferi fazer na mão.
Em um indicador configurado para timeframe de 5 minutos estava funcionando, e em outro que fiz com o mesmo código, mas com resultados para 2 minutos ficou dando esse erro.
Até que notei uma única diferença entre ambos, onde eu usava direto o vetor Volume[] no de 5 minutos, e acabei resumindo instânciando vol[i] = volume[i], e usando o vol[i] em todo o código.
Mas no loop isso começou a gerar o erro de divisão, então voltei para o modo antigo deixando assim:
Então parou o erro, e testei voltando para "vol", e o erro volta a acontecer.
Se alguém puder explicar porque pode acontecer isso seria interessante.
Fórum de negociação, sistemas de negociação automatizados e testes de estratégias de negociação
Dúvida sobre a função ZeroMemory()
Márcio Hermes, 2019.08.09 02:01
Com base no seu retorno, vou explanar como o EA está desenvolvido para fins de alinhar a nossa conversa.
1º - o desenvolvimento do código está em dois arquivos tradicionais(.mq5 e .mqh).
Observei que em vários exemplos aqui na comunidade, o pessoal gosta de deixar todo o código no próprio .mq5.
2º - no arquivo .mq5 é feito o #include e criado uma variável (ou um objeto) da classe incluída, como mostrado no exemplo de código abaixo:
3º - logo, a partir dos eventos de OnTick(), OnTrade(), OnChartEvent(), e inclusive OnBookEvent(), a brincadeira começa. Inclusive são gerados eventos de botões.
4º - feito este preâmbulo, vamos aos fatos. A função que está incluída logo abaixo, contém as tradicionais variáveis do tipo MqlTradeRequest e MqlTradeResult.
Ambas variáveis MqlTradeRequest e MqlTradeResult são declaradas de foma local, ou seja, dentro da função. Se realmente entendi sua explanação, e se estamos "falando a mesma língua", seria necessário então usar a função ZeroMemory(), antes de "montar" a ordem de compra, para garantir que todas as variáveis sejam inicializadas com valores "padrão". Se não entendi de forma correta, aponte-me o erro, por favor.
Está postado toda a função:
Já nesta função, as variáveis MqlTradeRequest e MqlTradeResult também são declaradas de forma local, dentro da função, porém como se trata de uma iteração, onde há uma busca por uma ordem em específico, se faz necessário a utilização da função ZeroMemory() para garantir que todas as variáveis sejam inicializadas com o valor "padrão", antes da próxima iteração. Segue código abaixo:
Grande abraço.
Fórum de negociação, sistemas de negociação automatizados e testes de estratégias de negociação
Profit < 0 só de um ativo
sergiomt, 2019.08.24 18:35
Tô testando um EA que trabalha com dois ativos ao mesmo tempo. Lá nos input´s estes dois ativos estão configurados como symbols0 e symbols1. O trecho do código abaixo mostra a abertura de uma posição quando já houver 2 compras abertas (count_buys==2) no symbols0. O que devo incluir, de mais simples, para que só abra mais posições se o Profit deste símbolo (só deste) estiver menor que zero ?
Algo do tipo: if(Use_Symbol0 && count_buys==2 && m_symbols0.Profit() < 0) = Sei que não é bem assim, só coloquei para minha dúvida ficar mais clara. Profit só de um determinado símbolo (ativo), que inclusive pode ter várias ordens abertas ao mesmo tempo.
if(Use_Symbol0 && count_buys==2)
OpenPosition(m_symbols0.Name(),PosType,Symbol0_Lot);
GRATO
Fórum de negociação, sistemas de negociação automatizados e testes de estratégias de negociação
Minha EA encerra operações e incia novas antes do esperado sem adicionar stop loss ou gain
Leonardo Fernandez, 2019.08.14 23:15
Ola,
Criei uma EA no meta editor usando o Expert Advisor (gerar), o problema é o seguinte, eu determinei um stop loss e um gain, porem, no primeiro trade que a EA faz no dia ela adiciona o STOP loss e o GAIN mas depois disso antes mesmo de chegar no loss ou no gain ela encerra a operação e inicia outra só que dessa vez ela não adiciona o stop loss nem o stop gain e fica operando "aleatoriamente" sem utilizar as regras de stop.
Basicamente o seguinte: Minha EA não espera uma operação terminar para iniciar outra, e quando incia ela não adiciona stop loss nem o gain.
Nos backtests ela funciona perfeitamente, porem, quando colocada no mercado em tempo real (demo) ela tem esse comportamento.
Existe alguma forma de contornar isso? Lembrando que não escrevi o código, é o código padrão do expert advisor (gerar).
Fórum de negociação, sistemas de negociação automatizados e testes de estratégias de negociação
Novo indicador de volume para mini ínidce da B3
kuramaua brazil, 2019.08.20 17:43
Não estou conseguindo colocar estes dois indicadores na CODEBASE, o que devo fazer ?
https://www.mql5.com/pt/code/26421/
indicador 1:
indicador 2: Intra Volume para decisões rápidas.
Fórum de negociação, sistemas de negociação automatizados e testes de estratégias de negociação
ativa função do EA ao mudar de tick
Márcio Hermes, 2019.08.22 00:50
Se entendi sua necessidade:
- Insira este trecho no arquivo .mq5, caso o mesmo não exista.
- Se por acaso esta função já está inserida, é ela que monitora mudança de tick.
Bons negócios.
Fórum de negociação, sistemas de negociação automatizados e testes de estratégias de negociação
Limpar Array Estatico ou tirar o erro que tenho de array fora de range.
Maylon Sales, 2016.07.16 15:06
Bom dia .
Como faço para limpar o buffer de um array Estático ?
E porque quando executo o código a baixo da erro de array fora de range no UpFractal_1 ?
Para tirar esse erro eu defini o arrei como Estatico -> double UpFractal_1[10];
Porem agora preciso limpar o baffer do UpFractal_1 mas a função ArrayFree() Somente limpa os array Dinâmicos.
Por favor me ajudem.