Escrevi um EA. A pessoa a quem o escrevi, na primeira corrida, abre duas posições, uma após a outra. Não consigo reproduzir este problema comigo mesmo. Gostaria de lhe pedir ajuda.
Apenas a função CheckForOpen() é responsável pela abertura de posições:
enum opp_mode {
DoClose, // Close and reverse with initial lot
DoReverse, // Close and reverse (continue Martingale last lot)
DoHedge, // No closing reversal (Hedge mode)
};
// Trade & MM Sectioninput opp_mode Mode_opp = DoHedge; // Trading Mode//+------------------------------------------------------------------+//| Check for Open function |//+------------------------------------------------------------------+void CheckForOpen() {
if (!IsBarNew) return;
double lot=0;
positions=Positions();
if (Signal==OP_BUY) {
if (longs>0) return;
if (shorts==0) { // First Order PlacingPrint(" *** MSG *** "+msg);
PlaceMarketOrder(OP_BUY, Lot, _ask, _SL, _TP);
}
if (shorts>0) {
if (Mode_opp==DoClose) { // Closing by Opposite SignalPrint(" *** MSG *** "+msg);
Print(" *** Close mode SELL by opposite signal.");
ClosePositions(OP_SELL);
PlaceMarketOrder(OP_BUY, Lot, _ask, _SL, _TP);
}
if (Mode_opp==DoReverse) { // Reverse by Opposite SignalPrint("Reversing SELL by opposite signal.");
lot=GetMaxLot(ORDER_TYPE_SELL);
if (IsMartingale) lot=lot*LotMult;
ClosePositions(OP_SELL);
PlaceMarketOrder(OP_BUY, lot, _ask, _SL, _TP);
}
if (Mode_opp==DoHedge) { // Hedging by Opposite SignalPrint("Hedging SELL by opposite signal.");
MartinCounterB=50; MartinCounterS=50;
PlaceMarketOrder(OP_BUY, GetMaxLot(ORDER_TYPE_SELL)*LotMult, _ask, _SL, _TP);
}
}
}
if (Signal==OP_SELL) {
if (shorts>0) return;
if (longs==0) { // First Order PlacingPrint(" *** MSG *** "+msg);
PlaceMarketOrder(OP_SELL, Lot, _bid, _SL, _TP);
}
if (longs>0) {
if (Mode_opp==DoClose) { // Closing by Opposite SignalPrint(" *** MSG *** "+msg);
Print(" *** Close mode BUY by opposite signal.");
ClosePositions(OP_BUY);
PlaceMarketOrder(OP_SELL, Lot, _bid, _SL, _TP);
}
if (Mode_opp==DoReverse) { // Reverse by Opposite SignalPrint("Reversing BUY by opposite signal.");
lot=GetMaxLot(ORDER_TYPE_BUY);
if (IsMartingale) lot=lot*LotMult;
ClosePositions(OP_BUY);
PlaceMarketOrder(OP_SELL, lot, _bid, _SL, _TP);
}
if (Mode_opp==DoHedge) { // Hedging by Opposite SignalPrint("Hedging BUY by opposite signal.");
MartinCounterB=50; MartinCounterS=50;
PlaceMarketOrder(OP_SELL, GetMaxLot(ORDER_TYPE_BUY)*LotMult, _bid, _SL, _TP);
}
}
}
}
//+------------------------------------------------------------------+
A função que envia um pedido de abertura de uma posição do mercado. Adicionei uma repetição atrasada quando o servidor falha porque frequentemente recebo requotes/offquotes ao testar com a demo do MetaQuotes MT5.
//+------------------------------------------------------------------+//| Place Market Order function |//+------------------------------------------------------------------+bool PlaceMarketOrder(int oper, double lot, double oop, double sl, double tp) { // mn - Magic Numberdouble d_sl=0, d_tp=0;
MqlTick stTick;
if (SymbolInfoTick(_Symbol,stTick)==false) {
Print("SymbolInfoTick function returned FALSE. Error=", GetLastError());
}
Print("Placing market order. Type="+(string)oper+", OrderOpenPrice="+DoubleToString(oop,_Digits)+
", Bid="+DoubleToString(_bid,_Digits)+", Ask="+DoubleToString(_ask,_Digits));
if (MathAbs(lot-Lot)<1 e-5) {MartinCounterB=0; MartinCounterS=0;}
if (oper==OP_BUY) {
for (int i=0; i<5; i++) {
if (SymbolInfoTick(_Symbol,stTick)==false) {
Print("SymbolInfoTick function returned FALSE. Error=", GetLastError());
}
_ask=stTick.ask;
d_sl=ND(_ask-sl*pips); if (MathAbs(sl)<1 e-5) d_sl=ND(0.0);
d_tp=ND(_ask+tp*pips); if (MathAbs(tp)<1 e-5) d_tp=ND(0.0);
if (m_trade.Buy(NormalizeLot(lot),NULL,_ask,d_sl,d_tp,Comm)) {PlaySound("expert.wav"); return(true);}
else {PlaySound("disconnect.wav"); Sleep(5000);}
}
}
if (oper==OP_SELL) {
for (int i=0; i<5; i++) {
if (SymbolInfoTick(_Symbol,stTick)==false) {
Print("SymbolInfoTick function returned FALSE. Error=", GetLastError());
}
_bid=stTick.bid;
d_sl=ND(_bid+sl*pips); if (MathAbs(sl)<1 e-5) d_sl=ND(0.0);
d_tp=ND(_bid-tp*pips); if (MathAbs(tp)<1 e-5) d_tp=ND(0.0);
if (m_trade.Sell(NormalizeLot(lot),NULL,_bid,d_sl,d_tp,Comm)) {PlaySound("expert.wav"); return(true);}
else {PlaySound("disconnect.wav"); Sleep(5000);}
}
}
return(false);
}
//+------------------------------------------------------------------+
A função de controlar a abertura de um novo bar:
//+------------------------------------------------------------------+//| Global Variables |//+------------------------------------------------------------------+bool IsBarNew=false;
//+------------------------------------------------------------------+//| Bar refreshing function |//| true - new bar opened, false - not opened |//+------------------------------------------------------------------+bool IsNewBar() {
staticdatetime SavedTime=iTime(NULL,PERIOD_CURRENT,0);
datetime curTime =iTime(NULL,PERIOD_CURRENT,0);
if (curTime>SavedTime) {
SavedTime=curTime;
return(true);
}
elsereturn(false);
}
//+------------------------------------------------------------------+
A segunda posição abre imediatamente após a primeira, no mesmo segundo, os carrapatos diferem por um. Inicialmente pensei que havia uma segunda cópia da EA no segundo gráfico. Pedi para fechar todos eles e deixar um gráfico e executar a EA, mas de acordo com o cliente e a julgar pela captura de ecrã, essa não é a razão. As posições subsequentes são abertas uma de cada vez, não há mais duplicações. Não posso reproduzi-la, já envolvi os meus cérebros. Testei-o na minha demonstração MT5 ICMarkets hedge, bem como no encomendador. Captura de ecrã do doublet.
Escrevi um EA. A pessoa a quem o escrevi, na primeira corrida, abre duas posições, uma após a outra. Não consigo reproduzir este problema comigo mesmo. Gostaria de lhe pedir ajuda.
A função OnTick()
Apenas a função CheckForOpen() é responsável pela abertura de posições:
A função que envia um pedido de abertura de uma posição do mercado. Adicionei-lhe uma repetição atrasada quando o servidor falha porque muitas vezes recebi pedidos/ofertas de cotação durante os testes na demonstração de MetaQuotes MT5.
A função de controlar a abertura de um novo bar:
A segunda posição abre imediatamente após a primeira, no mesmo segundo, os carrapatos diferem por um. Inicialmente pensei que havia uma segunda cópia da EA no segundo gráfico. Pedi para fechar todos eles e deixar um gráfico e executar a EA, mas de acordo com o cliente e a julgar pela captura de ecrã, essa não é a razão. As posições subsequentes são abertas uma de cada vez, não há mais duplicações. Não o posso reproduzir, já envolvi o meu cérebro. Testei-o na minha demonstração MT5 ICMarkets hedge, bem como no encomendador. Captura de ecrã do doublet.
A EA inteira.
Utilizo esta função para controlar a nova barra - por vezes há erros ao copiar a data da barra.
//+------------------------------------------------------------------------------------------------------------------+//| Возвращает TRUE, если появился новый бар на текущем ТФ//+------------------------------------------------------------------------------------------------------------------+bool isNewBar()
{
datetime tm[];
staticdatetime prevBarTime=0;
if(CopyTime(_Symbol,0,0,1,tm)<0)
{
Print("%s CopyTime error = %d",__FUNCTION__,GetLastError());
}
else
{
if(prevBarTime!=tm[0])
{
prevBarTime=tm[0];
returntrue;
}
returnfalse;
}
returntrue;
}
Utilizo essa função para controlar um novo bar - há alturas em que há erros ao copiar a data do bar.
Obrigado. Vou tentar substituí-lo. Embora até agora a função que utilizei também tenha funcionado bem. Tenho uma ideia para imprimir o tempo de abertura do bar e o preço, então ver-se-ia claramente que o erro está neste caso em particular.
No entanto, estou confuso pelo facto de os duplos aparecerem apenas na abertura da primeira posição enquanto as posições subsequentes são abertas correctamente e a EA trabalha durante horas gerando dezenas delas. E a função de controlo de abertura de bares funciona sempre. E, de acordo com as condições, o Conselheiro Especialista abre a primeira posição quando não há nenhuma e a seguinte só abre quando o preço se tiver deslocado o suficiente após a primeira ter sido aberta.
Escrevi um EA. A pessoa a quem o escrevi, na primeira corrida, abre duas posições, uma após a outra. Não consigo reproduzir este problema comigo mesmo. Gostaria de lhe pedir ajuda.
A função OnTick()
Apenas a função CheckForOpen() é responsável pela abertura de posições:
A função que envia um pedido de abertura de uma posição do mercado. Adicionei-lhe uma repetição atrasada quando o servidor falha porque muitas vezes recebi pedidos/ofertas de cotação durante os testes na demonstração de MetaQuotes MT5.
A função de controlar a abertura de um novo bar:
A segunda posição abre imediatamente após a primeira, no mesmo segundo, os carrapatos diferem por um. Inicialmente pensei que havia uma segunda cópia da EA no segundo gráfico. Pedi para fechar todos eles e deixar um gráfico e executar a EA, mas de acordo com o cliente e a julgar pela captura de ecrã, essa não é a razão. As posições subsequentes são abertas uma de cada vez, não há mais duplicações. Não o posso reproduzir, já envolvi o meu cérebro. Testei-o na minha demonstração MT5 ICMarkets hedge, bem como no encomendador. Captura de ecrã do doublet.
E como verificar se ainda não foi aberta nenhuma posição neste bar?
Não, não existe tal verificação.
Existem tais verificações:
Se um novo bar tiver aberto, com o seu primeiro tique, uma posição pode ser aberta,
Se não houver posições, a primeira posição pode ser aberta.
Por outras palavras, por alguma razão, duas posições abrem ao mesmo tempo no primeiro tick de um novo bar. E apenas as primeiras posições são abertas. Além disso, um fenómeno deste tipo não é observado.
Se um novo bar tiver aberto, com o seu primeiro tique, uma posição pode ser aberta,
Se não houver posições, a primeira posição pode ser aberta.
Isto é, por alguma razão duas posições abertas ao mesmo tempo no primeiro tick de um novo bar. E apenas as primeiras posições são abertas. Além disso, este fenómeno não é observado.
Não tenho tempo para analisar o que se está a passar ali. Mas tente verificar o número de posições em aberto no novo bar. Se não houver nenhum - então aberto.
......
A EA funciona, mas quando tento abri-la no editor
......
não é um executável, é um ficheiro mq5...
este é o meu código...
Portanto, forme as suas frases correctamente.
Sobre o tema. Normalmente abro tais problemáticos no Notepad++. Ajuda. Mas nem sempre ))))
Portanto, forme as suas frases correctamente.
Sobre o tema. Normalmente abro tais problemáticos no Notepad++. Ajuda. Mas nem sempre ))))
Também decidi olhar através dele com o Notepad++ e era quase todo zeros, embora o ficheiro fosse do tamanho normal como deveria ser...
Escrevi um EA. A pessoa a quem o escrevi, na primeira corrida, abre duas posições, uma após a outra. Não consigo reproduzir este problema comigo mesmo. Gostaria de lhe pedir ajuda.
A função OnTick()
Apenas a função CheckForOpen() é responsável pela abertura de posições:
A função que envia um pedido de abertura de uma posição do mercado. Adicionei uma repetição atrasada quando o servidor falha porque frequentemente recebo requotes/offquotes ao testar com a demo do MetaQuotes MT5.
A função de controlar a abertura de um novo bar:
A segunda posição abre imediatamente após a primeira, no mesmo segundo, os carrapatos diferem por um. Inicialmente pensei que havia uma segunda cópia da EA no segundo gráfico. Pedi para fechar todos eles e deixar um gráfico e executar a EA, mas de acordo com o cliente e a julgar pela captura de ecrã, essa não é a razão. As posições subsequentes são abertas uma de cada vez, não há mais duplicações. Não posso reproduzi-la, já envolvi os meus cérebros. Testei-o na minha demonstração MT5 ICMarkets hedge, bem como no encomendador. Captura de ecrã do doublet.
A EA inteira.
Escrevi um EA. A pessoa a quem o escrevi, na primeira corrida, abre duas posições, uma após a outra. Não consigo reproduzir este problema comigo mesmo. Gostaria de lhe pedir ajuda.
A função OnTick()
Apenas a função CheckForOpen() é responsável pela abertura de posições:
A função que envia um pedido de abertura de uma posição do mercado. Adicionei-lhe uma repetição atrasada quando o servidor falha porque muitas vezes recebi pedidos/ofertas de cotação durante os testes na demonstração de MetaQuotes MT5.
A função de controlar a abertura de um novo bar:
A segunda posição abre imediatamente após a primeira, no mesmo segundo, os carrapatos diferem por um. Inicialmente pensei que havia uma segunda cópia da EA no segundo gráfico. Pedi para fechar todos eles e deixar um gráfico e executar a EA, mas de acordo com o cliente e a julgar pela captura de ecrã, essa não é a razão. As posições subsequentes são abertas uma de cada vez, não há mais duplicações. Não o posso reproduzir, já envolvi o meu cérebro. Testei-o na minha demonstração MT5 ICMarkets hedge, bem como no encomendador. Captura de ecrã do doublet.
A EA inteira.
Utilizo esta função para controlar a nova barra - por vezes há erros ao copiar a data da barra.
Utilizo essa função para controlar um novo bar - há alturas em que há erros ao copiar a data do bar.
Obrigado. Vou tentar substituí-lo. Embora até agora a função que utilizei também tenha funcionado bem. Tenho uma ideia para imprimir o tempo de abertura do bar e o preço, então ver-se-ia claramente que o erro está neste caso em particular.
No entanto, estou confuso pelo facto de os duplos aparecerem apenas na abertura da primeira posição enquanto as posições subsequentes são abertas correctamente e a EA trabalha durante horas gerando dezenas delas. E a função de controlo de abertura de bares funciona sempre. E, de acordo com as condições, o Conselheiro Especialista abre a primeira posição quando não há nenhuma e a seguinte só abre quando o preço se tiver deslocado o suficiente após a primeira ter sido aberta.
Escrevi um EA. A pessoa a quem o escrevi, na primeira corrida, abre duas posições, uma após a outra. Não consigo reproduzir este problema comigo mesmo. Gostaria de lhe pedir ajuda.
A função OnTick()
Apenas a função CheckForOpen() é responsável pela abertura de posições:
A função que envia um pedido de abertura de uma posição do mercado. Adicionei-lhe uma repetição atrasada quando o servidor falha porque muitas vezes recebi pedidos/ofertas de cotação durante os testes na demonstração de MetaQuotes MT5.
A função de controlar a abertura de um novo bar:
A segunda posição abre imediatamente após a primeira, no mesmo segundo, os carrapatos diferem por um. Inicialmente pensei que havia uma segunda cópia da EA no segundo gráfico. Pedi para fechar todos eles e deixar um gráfico e executar a EA, mas de acordo com o cliente e a julgar pela captura de ecrã, essa não é a razão. As posições subsequentes são abertas uma de cada vez, não há mais duplicações. Não o posso reproduzir, já envolvi o meu cérebro. Testei-o na minha demonstração MT5 ICMarkets hedge, bem como no encomendador. Captura de ecrã do doublet.
A EA inteira.
E como verificar se uma posição ainda não foi aberta neste bar?
E como verificar se ainda não foi aberta nenhuma posição neste bar?
Não, não existe tal verificação.
Existem tais verificações:
- Se um novo bar tiver aberto, com o seu primeiro tique, uma posição pode ser aberta,
- Se não houver posições, a primeira posição pode ser aberta.
Por outras palavras, por alguma razão, duas posições abrem ao mesmo tempo no primeiro tick de um novo bar. E apenas as primeiras posições são abertas. Além disso, um fenómeno deste tipo não é observado.Não, não existe tal verificação.
Existem tais verificações:
- Se um novo bar tiver aberto, com o seu primeiro tique, uma posição pode ser aberta,
- Se não houver posições, a primeira posição pode ser aberta.
Isto é, por alguma razão duas posições abertas ao mesmo tempo no primeiro tick de um novo bar. E apenas as primeiras posições são abertas. Além disso, este fenómeno não é observado.Não tenho tempo para analisar o que se está a passar ali. Mas tente verificar o número de posições em aberto no novo bar. Se não houver nenhum - então aberto.