Prezados,
Alguém ajuda ? Um trecho do código de um EA que estou testando apenas experimentalmente em conta Demo funciona bem no mini-índice. Quando o preço InpValor é superado pelo preço do WIN o EA encerra venda e abre imediatamente compra, e vice-versa para abrir venda. Só tem 1 posição, ou compra ou venda. Funciona bem. Porém no mini-dólar não ocorre alternância de posições. No caso abaixo ele só abre compras (Buy). Não importa se o Ask ou Bid está acima ou abaixo do InpValor, só abre compra. Se eu trocar sell por buy após o bool, aí ele só abre venda. Não alterna. Já no mini índice funciona alternando perfeitamente.
O que fazer para alternar ? OBS: O valor ali mostrado como 3870.500 é que já tentei de todas as formas possíveis.
input double InpLots = 5; // Lote
input double InpValor = 3870.500; // Limite para comprar ou vendar
input ulong m_magic=0123456; //
//---
ulong m_slippage=10; // slippage
double ExtTakeProfit=0.0;
double ExtValor=0.0;
double m_adjusted_point; // point value adjusted for 3 or 5 points
//--- tuning for 3 or 5 digits
int digits_adjust=1;
if(m_symbol.Digits()==3 || m_symbol.Digits()==5)
digits_adjust=10;
m_adjusted_point=m_symbol.Point()*digits_adjust;
ExtTakeProfit=InpTakeProfit*m_adjusted_point;
ExtValor=InpValor*m_adjusted_point;
//---
bool buy=(m_symbol.Ask()>ExtValor); //&& m_last_date_IN < time_0);
bool sell=(m_symbol.Bid()<ExtValor); //&& m_last_date_IN < time_0);
if(IsPositionExists())
{
if(buy)
{
ClosePositions(POSITION_TYPE_SELL);
return;
}
if(sell)
{
ClosePositions(POSITION_TYPE_BUY);
return;
}
}
else
{
if(!RefreshRates())
return;
if(buy)
{
OpenBuy(0.0,0.0);
return;
}
if(sell)
{
OpenSell(0.0,0.0);
return;
}
}
}
Prezado,
Esse código está incompleto. Para entender o que está acontecendo será necessário olhar dentro dessas funções OpenBuy, OpenSell, ClosePositions, etc.
Prezado,
Esse código está incompleto. Para entender o que está acontecendo será necessário olhar dentro dessas funções OpenBuy, OpenSell, ClosePositions, etc.
Incompleto é pouco! Ele limpou várias linhas do código e postou o que ele achava que seria suficiente para entendermos, francamente é muita pretensão.
Sérgio, nos próximas postagens se quiser minha ajuda, faça por merecer, assim não dá cara, paciência tem limite.
Passar bem!
Patinhas, grato pela tentativa em ajudar e indicar sobre a necessidade de postar o código completo. Realmente achei que só esta parte serviria para chegar na questão.
Rogério G Torres, um favor, se tiver decência (veja no Google) nunca mais escreva nas minhas postagens...passar bem também.
Atenderei com prazer.
Passar bem.
Com a cotação do mini dólar a 3866.000 se eu coloco o Limitador InpValor em 9999999 aí sim ele abre venda (entende que este número é maior que a cotação atual) e se eu coloco 8888888 aí ele abre compra (entende que este valor é menor que a cotação atual).
Mas no código tem esta parte que talvez deveria 'cuidar' disso
//--- tuning for 3 or 5 digits
int digits_adjust=1;
if(m_symbol.Digits()==3 || m_symbol.Digits()==5)
digits_adjust=10;
m_adjusted_point=m_symbol.Point()*digits_adjust;
ExtTakeProfit=InpTakeProfit*m_adjusted_point;
ExtValor=InpValor*m_adjusted_point;
Aprendendo...e ainda pesquisando.
O que eu percebi é que:
Se só funciona bem no mini índice (dólar e ações não), é porque o mini índice não tem ponto decimal na sua cotação (já dólar e ações tem)
Talvez seja por isso
A idéia deste EA para estudos é que se a cotação atual está acima do InpValor o EA tem que imediatamente abrir compra (fechar venda se houver), e se a cotação estiver abaixo do InpValor deve 'virar a mão' e imediatamente abrir venda.
Aprendendo...e pesquisando (e vice-versa).
@sergiomt
Infelizmente não há como ajudar com base nessas poucas informações que vc posta. Somente vendo o código completo da parte que deveria "virar a mão" é que seria possível opinar.
Valeu Patinhas,
No mini-índice está funcionando 100%
A parte que vira a mão, ao meu ver, é a condição de Sell e Buy e o fato de fechar Sell para poder Buy ocorrer, e vice-versa (ambas descritas no trecho que colei)
Creio que o problema deva estar na normalização do preço pois o WIN não tem ponto decimal, já WDO e ações tem
Opinião de leigo que sou
Não é bool mas sim double. Ao meu ver o IsPositionExists monitora se há ordem aberta, se houver Buy fecha Sell, e vice-versa. Depois abre Buy ou abre Sell se o InpValor for maior ou menor que o preço corrente do ativo. Pelo menos tá funcionando 100% no WIN provando que a lógica está certa. Só não funciona no WDO nem em ações.
//--- tuning for 3 or 5 digits
int digits_adjust=1;
if(m_symbol.Digits()==3 || m_symbol.Digits()==5)
digits_adjust=10;
m_adjusted_point=m_symbol.Point()*digits_adjust;
ExtStopLoss = InpStopLoss * m_adjusted_point;
ExtTakeProfit = InpTakeProfit * m_adjusted_point;
ExtTrailingStop = InpTrailingStop * m_adjusted_point;
ExtTrailingStep = InpTrailingStep * m_adjusted_point;
ExtBreakeven = InpBreakeven * m_adjusted_point;
ExtBreakevenProfit = InpBreakevenProfit * m_adjusted_point;
ExtValor = InpValor * m_adjusted_point;
//---
double BUY=(m_position.PriceCurrent()>ExtValor);
double SELL=(m_position.PriceCurrent()<ExtValor);
if(IsPositionExists())
{
if(BUY)
{
ClosePositions(POSITION_TYPE_SELL);
return;
}
if(SELL)
{
ClosePositions(POSITION_TYPE_BUY);
return;
}
}
else
{
if(!RefreshRates())
return;
if(BUY)
{
double sl=(InpStopLoss==0)?0.0:m_symbol.Ask()-ExtStopLoss;
double tp=(InpTakeProfit==0)?0.0:m_symbol.Ask()+ExtTakeProfit;
OpenBuy(sl,tp);
return;
}
if(SELL)
{
double sl=(InpStopLoss==0)?0.0:m_symbol.Bid()+ExtStopLoss;
double tp=(InpTakeProfit==0)?0.0:m_symbol.Bid()-ExtTakeProfit;
OpenSell(sl,tp);
return;
Quando eu coloco nos settings do EA o valor de InpLots em 9999999.999999999
Ou seja sete dígitos noves depois . e mais quantos dígitos forem, o EA insiste em só abrir Buy
Se eu mudo o InpLots para 10000000 (oito digitos) aí ele abre Sell
Ou seja, só 8 dígitos é que ele entende ser maior que o valor que eu coloco no InpLots (no caso 3870)
Menos de 8 dígitos ele entende que são todos valores menores que InpLots e por isso só abre Buy
Não deve ser um problema de lógica, se fosse daria erro também no WIN (funciona 100%). Falta alguma normalização de dígitos para aceitar cotações com ponto decimal...eu acho.
- Aplicativos de negociação gratuitos
- 8 000+ sinais para cópia
- Notícias econômicas para análise dos mercados financeiros
Você concorda com a política do site e com os termos de uso
Prezados,
Alguém ajuda ? Um trecho do código de um EA que estou testando apenas experimentalmente em conta Demo funciona bem no mini-índice. Quando o preço InpValor é superado pelo preço do WIN o EA encerra venda e abre imediatamente compra, e vice-versa para abrir venda. Só tem 1 posição, ou compra ou venda. Funciona bem. Porém no mini-dólar não ocorre alternância de posições. No caso abaixo ele só abre compras (Buy). Não importa se o Ask ou Bid está acima ou abaixo do InpValor, só abre compra. Se eu trocar sell por buy após o bool, aí ele só abre venda. Não alterna. Já no mini índice funciona alternando perfeitamente.
O que fazer para alternar ? OBS: O valor ali mostrado como 3870.500 é que já tentei de todas as formas possíveis.
input double InpLots = 5; // Lote
input double InpValor = 3870.500; // Limite para comprar ou vendar
input ulong m_magic=0123456; //
//---
ulong m_slippage=10; // slippage
double ExtTakeProfit=0.0;
double ExtValor=0.0;
double m_adjusted_point; // point value adjusted for 3 or 5 points
//--- tuning for 3 or 5 digits
int digits_adjust=1;
if(m_symbol.Digits()==3 || m_symbol.Digits()==5)
digits_adjust=10;
m_adjusted_point=m_symbol.Point()*digits_adjust;
ExtTakeProfit=InpTakeProfit*m_adjusted_point;
ExtValor=InpValor*m_adjusted_point;
//---
bool buy=(m_symbol.Ask()>ExtValor); //&& m_last_date_IN < time_0);
bool sell=(m_symbol.Bid()<ExtValor); //&& m_last_date_IN < time_0);
if(IsPositionExists())
{
if(buy)
{
ClosePositions(POSITION_TYPE_SELL);
return;
}
if(sell)
{
ClosePositions(POSITION_TYPE_BUY);
return;
}
}
else
{
if(!RefreshRates())
return;
if(buy)
{
OpenBuy(0.0,0.0);
return;
}
if(sell)
{
OpenSell(0.0,0.0);
return;
}
}
}