Perguntas de Iniciantes MQL5 MT5 MetaTrader 5 - página 1115

 
Descobri, é apenas um ficheiro partido, mas o executável está intacto, por isso funciona...
 
xxz:

......
A EA funciona, mas quando tento abri-la no editor

......

xxz:

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...

 
Comentários não relacionados com este tópico foram transferidos para "Perguntas dos principiantes do MQL4 MT4 MetaTrader 4".
 

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()

//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick() {
   
   GetData();
   CheckForOpen();
   CheckForCloseCP();
   CheckForCloseAll();

}
//+------------------------------------------------------------------+

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 Section
input 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 Placing
         Print("   *** MSG ***   "+msg);
         PlaceMarketOrder(OP_BUY, Lot, _ask, _SL, _TP);
      }
      if (shorts>0) {
         if (Mode_opp==DoClose) {      // Closing by Opposite Signal
            Print("   *** 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 Signal
            Print("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 Signal
            Print("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 Placing
         Print("   *** MSG ***   "+msg);
         PlaceMarketOrder(OP_SELL, Lot, _bid, _SL, _TP);
      }
      if (longs>0) {
         if (Mode_opp==DoClose) {      // Closing by Opposite Signal
            Print("   *** 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 Signal
            Print("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 Signal
            Print("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 Number

double 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() {

static datetime SavedTime=iTime(NULL,PERIOD_CURRENT,0);
       datetime curTime  =iTime(NULL,PERIOD_CURRENT,0);

   if (curTime>SavedTime) {
         SavedTime=curTime;
         return(true);
   }
   else return(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.


A EA inteira.

Arquivos anexados:
 
Grigori.S.B:

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[];
   static datetime 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];
         return true;
        }
      return false;
     }
   return true;
  }
 
Aleksey Vyazmikin:

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.

 
Grigori.S.B:

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?

 
Artyom Trishkin:

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.
 
Grigori.S.B:

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.