Executando mais de uma EA de cada vez - página 3

 
#property copyright "Copyright 2014, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"
#property strict

extern bool CheckOncePerBar=true;
extern double FixedLotSize=1;
extern double SystemStopLoss=150;
extern double TakeProfit=0;
extern int Slippage=5;
extern int MagicNumber=3574;

//Global Variables
int BuyTicket=0;
int SellTicket=0;
double InternalStopLoss=0;
double CalcDigits=0;
double CalcPoint=0;
bool MABuyFanning=false;
bool MASellFanning=false;
int SelectedOrder=0;
bool Closed=false;
int ErrorCode=0;
string ErrLog="a";
double BuyStopLoss=0;
double SellStopLoss=0;
bool NewBar=false;
double ThisBarOpen=0;
double SmallMA=0;
double MediumMA=0;
double LargeMA=0;
int Counter=0;



//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
CalcDigits = MarketInfo(Symbol(),MODE_DIGITS);//MODE_DIGITS is count of digits after decimal point
if(CalcDigits==0) CalcPoint=1;//Dow      
if(CalcDigits==1) CalcPoint=0.1;   
if(CalcDigits==2) CalcPoint=0.01;//Gold & Nymex
if(CalcDigits==3) CalcPoint=0.01;//Yen
if(CalcDigits==4) CalcPoint=0.0001;//Not used
if(CalcDigits==5) CalcPoint=0.0001;//Non-Yen forex
InternalStopLoss=SystemStopLoss*CalcPoint;
   
   return(INIT_SUCCEEDED);
  }
//-----------------------------------------------

void OnTick()
{

   if(CheckOncePerBar)
      {
      if(ThisBarOpen!=Open[0])
         {
         ThisBarOpen=Open[0];
         NewBar=true;
         }
      else NewBar=false;
      }
    else NewBar=true;

if(NewBar)
{


//Reset Moving Averages
SmallMA=iMA(NULL,0,8,0,1,0,0);
MediumMA=iMA(NULL,0,10,0,1,0,0);
LargeMA=iMA(NULL,0,50,0,1,0,0);


   if(SmallMA>MediumMA&&MediumMA>LargeMA) MABuyFanning=true;
   else MABuyFanning=false;
      
   if(SmallMA<MediumMA&&MediumMA<LargeMA) MASellFanning=true; 
   else MASellFanning=false;   



if(BuyTicket==0&&MABuyFanning)
 {
      RefreshRates();
      BuyStopLoss= Bid-InternalStopLoss;
   //   while(IsTradeContextBusy()) Sleep(10);
      BuyTicket=OrderSend(Symbol(),OP_BUY,FixedLotSize,Ask,Slippage,BuyStopLoss,0,"Buy Order",MagicNumber,0,Green);
          if(BuyTicket==-1)
            {
            ErrorCode=GetLastError();
            Alert("Symbol: ",Symbol(),"Error in buy routine: ",ErrorCode);
            ErrLog=StringConcatenate("Bid: ",MarketInfo(Symbol(),MODE_BID)," Ask: ",MarketInfo(Symbol(),MODE_ASK)," Lots: ",FixedLotSize," Stop Loss: ",BuyStopLoss);
            Print(ErrLog);
            //Buy ticket revert to 0 so it can try again in case of slow connection/timeout etc.
            BuyTicket=0;
            } 
 }   


if(SellTicket==0&&MASellFanning)
 {
      RefreshRates();
      SellStopLoss=Ask+InternalStopLoss;
    //  while(IsTradeContextBusy()) Sleep(10);
      SellTicket=OrderSend(Symbol(),OP_SELL,FixedLotSize,Bid,Slippage,SellStopLoss,0,"Sell Order",MagicNumber,0,Red);
          if(SellTicket==-1)
            {
            ErrorCode=GetLastError();
            Alert("Symbol: ",Symbol(),"Error in sell routine: ",ErrorCode);
            ErrLog=StringConcatenate("Bid: ",MarketInfo(Symbol(),MODE_BID)," Ask: ",MarketInfo(Symbol(),MODE_ASK)," Lots: ",FixedLotSize," Stop Loss: ",SellStopLoss);
            Print(ErrLog);
            SellTicket=0;
            } 
  }  

//Exits

         if(BuyTicket!=0)
            {
            if(SmallMA<MediumMA)
            {
            for(Counter=0; Counter<=OrdersTotal()-1;Counter++)
               {
               SelectedOrder=OrderSelect(Counter,SELECT_BY_POS);
               if(OrderMagicNumber()==MagicNumber&&OrderSymbol()==Symbol()&&OrderType()==OP_BUY)
                  {
                 // while(IsTradeContextBusy()) Sleep(10);
                  Closed=OrderClose(OrderTicket(),OrderLots(),MarketInfo(Symbol(),MODE_BID),Slippage,Red);
                  if(Closed) BuyTicket=0;
                  else Alert("Symbol: ",Symbol()," Ticket: ",BuyTicket," unable to close buy order(s): buy ma convergence close routine");                  
                  }
            Counter--;               
                }
            }
            }

         if(SellTicket!=0)
            {
            if(SmallMA>MediumMA)
            {
            for(Counter=0;Counter<=OrdersTotal()-1;Counter++)
               {
               SelectedOrder = OrderSelect(Counter,SELECT_BY_POS);
               if(OrderMagicNumber()==MagicNumber&&OrderSymbol()==Symbol()&&OrderType()==OP_SELL)
                  {
               //   while(IsTradeContextBusy()) Sleep(10);
                  Closed=OrderClose(OrderTicket(),OrderLots(),MarketInfo(Symbol(),MODE_ASK),Slippage,Red);
                  if(Closed) SellTicket=0;
                  else Alert("Symbol: ",Symbol()," Ticket: ",SellTicket," unable to close sell order(s): sell ma convergence close routine");                  
                  }
            Counter--;               
                }
            }
            }
}            
return;   
}
 

Você ainda tem o Counter...

Veja o comentário de GumRai https://www.mql5.com/en/forum/151167/page2#954622

 
Você acha que dois bares consecutivos poderiam ter o mesmo preço exato aberto?
   if(CheckOncePerBar){
      if(ThisBarOpen!=Open[0]){
         ThisBarOpen=Open[0];
         NewBar=true;
         }
      else NewBar=false;
      }
    else NewBar=true;

if(NewBar)
{
   : // doit
Use sempre o tempo
static datetime ThisBarTime = 0;
if(ThisBarTime != Time[0] || !CheckOncePerBar)
{
   ThisBarTime = Time[0];
   : // doit
Isto não lida com ciclos deinit/init. variável estática externa - fórum MQL4
 

Obrigado por seus cargos.

Usei Open ao invés de Time porque uma vez que o Open de um bar ocorre, ele é fixo para sempre e nunca mudará. Não está procurando por duas barras consecutivas - é a mesma barra e está perguntando se a abertura da barra atual durante a qual o carrapato acaba de ocorrer é a mesma que o valor de Aberto armazenado no ThisBarOpen. Além disso, eu teria pensado que Open seria mais simples do que Time porque é uma simples consulta de dados, enquanto o Time poderia ter que fazer referência a outra coisa e possivelmente fazer algum tipo de cálculo.

Re Counter--; eu não mudei isso porque outro EA não seria capaz de fechar uma ordem porque o código verifica que tanto o MagicNumber quanto o Symbol() são o mesmo primeiro.

Certamente, tomo o ponto sobre um corte de energia limpando o conteúdo do BuyTicket, mas isso não aconteceu durante meus testes e meu código ainda está funcionando muito lentamente. Portanto, também não consigo ver como isso pode ser a causa.

Minha principal pergunta no momento é por que levou tanto tempo para remover os EAs das janelas do terminal que tinha posições abertas e sem tempo algum para removê-los do terminal que não tinha posições abertas. Coincidência talvez - mas todas as quatro janelas?

 
Da última vez eu tive o mesmo problema e na verdade é como você codifica a ea. Talvez seja hora de sua ea precisa ser escrita do zero novamente. v2, por exemplo.
 

Não sei se isso é realmente relevante para seu problema, mas você limita sua negociação a 1 compra, 1 venda por EA, então por que fazer tudo isso?

  if(SellTicket!=0)
  {if(SmallMA>MediumMA)
   {for(Counter=0;Counter<=OrdersTotal()-1;Counter++)
    {SelectedOrder = OrderSelect(Counter,SELECT_BY_POS);
     if(OrderMagicNumber()==MagicNumber&&OrderSymbol()==Symbol()&&OrderType()==OP_SELL)
     {Closed=OrderClose(OrderTicket(),OrderLots(),MarketInfo(Symbol(),MODE_ASK),Slippage,Red);
      if(Closed) SellTicket=0;
      else Alert("Symbol: ",Symbol()," Ticket: ",SellTicket," unable to close sell order(s): sell ma convergence close routine");                  
     }
    Counter--;               
}}}} 

Você já tem aqui o número do seu bilhete:

SellTicket=OrderSend(Symbol(),OP_SELL,FixedLotSize,Bid,Slippage,SellStopLoss,0,"Sell Order",MagicNumber,0,Red);

se você fizer disso uma int estática você pode fechar seu pedido explicitamente por esse número de bilhete sem arrastá-lo através do pool de pedidos para ele.

Closed=OrderClose(SellTicket,OrderLots(),MarketInfo(Symbol(),MODE_ASK),Slippage,Red);
 
Sneck55:

Obrigado por seus cargos.


Re Counter--; eu não mudei isso porque outra EA não poderia fechar um pedido porque o código verifica que tanto o MagicNumber quanto o Symbol() são o mesmo primeiro.


Minha principal pergunta no momento é por que demorou tanto tempo para remover os EA das janelas do terminal que tinha posições abertas e sem tempo algum para removê-los do terminal que não tinha posições abertas. Coincidência talvez - mas todas as quatro janelas?


Você entende como funcionam os loops?

if(BuyTicket!=0)
            {
            if(SmallMA<MediumMA)
            {
            for(Counter=0; Counter<=OrdersTotal()-1;Counter++)
               {
               SelectedOrder=OrderSelect(Counter,SELECT_BY_POS);
               if(OrderMagicNumber()==MagicNumber&&OrderSymbol()==Symbol()&&OrderType()==OP_BUY)
                  {
                 // while(IsTradeContextBusy()) Sleep(10);
                  Closed=OrderClose(OrderTicket(),OrderLots(),MarketInfo(Symbol(),MODE_BID),Slippage,Red);
                  if(Closed) BuyTicket=0;
                  else Alert("Symbol: ",Symbol()," Ticket: ",BuyTicket," unable to close buy order(s): buy ma convergence close routine");                  
                  }
            Counter--;               
                }
            }
            }

Digamos que você tenha 3 ordens abertas

Na primeira passagem, counter==0, então a ordem com o índice 0 será selecionada

No final do loop você diminui o contador em 1, então counter== -1.

Antes que o laço execute novamente, o contador é aumentado em 1 como parte da função para a função. Portanto, contador ==0

Portanto, a próxima passagem pelo contador de laço==0 novamente!! e assim por diante e assim por diante.

Você está preso em um loop interminável que simplesmente continua verificando o índice de ordem 0

A única maneira de parar é se não houver ordens em aberto, porque então OrdensTotal - 1 será -1 e 0 não é <= -1

 
Muito obrigado GumRaj - você resolveu meu problema!! Agora funciona bem. Esta é a primeira vez que escrevo código em MQL4, portanto, é um processo de aprendizado para mim. Estava confuso sobre como o for loop funcionava.
 
Sneck55: GumRaj - você resolveu meu problema!! Agora funciona bem.
E como você resolveu isso? Se você não estiver em contagem regressiva, você ainda tem um problema (#3) - apenas escondido até que você tenha vários pedidos ou vários EAs.
 
Ela precisa diminuir se fechar uma ordem para corresponder ao que acontece na piscina, mas não se não fechar uma ordem. Se ele decreta sem fechar uma ordem, entra em um loop infinito.