Problema de pedidos múltiplos - página 4

 
luisneves:

Olá Kronin,

Sua modificação está funcionando. Você limitou as ordens máximas, bur é isso possível para fechá-las todas, em vez disso ?

Eu tentei fazer isso com o seguinte código, mas parece não funcionar.

Melhores cumprimentos

Luis

Hmmm, não tenho certeza se entendi o que você quer dizer...
Você quer dizer, em vez de abrir a última ordem (ordem 7 se o MaxOrders estiver definido para 7) fechar todas as ordens?

Tenho certeza de que você não quer esperar até que o MaxOrders seja alcançado e depois fechar tudo imediatamente. A última ordem terminaria na maioria das vezes (ou o tempo todo) com uma perda.
Btw. Você já viu o PM sobre o controlador de propagação?

 
kronin:

Hmmm, não tenho certeza se entendi o que você quer dizer...
Você quer dizer, em vez de abrir a última ordem (ordem 7 se o MaxOrders estiver definido para 7) fechar todas as ordens?

Tenho certeza de que você não quer esperar até que o MaxOrders seja alcançado e depois fechar tudo imediatamente. A última ordem terminaria na maioria das vezes (ou o tempo todo) com uma perda.
Btw. Você já viu o PM sobre o controlador de propagação?


Olá Kronin,

Obrigado por sua pronta resposta.

Digamos que após um ciclo de ping pong de n ordens (MaxOrders) todas as ordens abertas devem ser fechadas, eu sei que isso não poderia fazer sentido, mas mesmo assim.

Estou tentando incluir o código para Reentrada da ordem caso ela falhe e tenho dúvidas se isso faz sentido porque já existe o código de IsContextBusy () Sleep (10). Até onde entendo, o significado é "se o servidor está ocupado ou outra ea na plataforma está tentando se comunicar, então espere 10 milissegundos e tente novamente" . Portanto, suponho que a EA manterá este comportamento até que um ticket seja recebido, estou certo?

Em relação à questão PM, nesse caso é melhor não fazer uso do Teste no fim de semana ou fazer isso com a plataforma offline....

Eu inseri a linha 5, mas acho que isso não é necessário porque a linha 1 você já fez isso, estou certo?

int LastClosedTicket=GetTicketFromHistory(Symbol(),MagicNumber); //1 
   if(LastClosedTicket>0)
    {                                                                 
      Print("LastClosedTicket=",LastClosedTicket);                   
      if(OrderSelect(LastClosedTicket,SELECT_BY_TICKET))
      {
      if(OrderSymbol()== Symbol() && OrderMagicNumber()== MagicNumber) //5           
       {            
         if(OrderType()==OP_BUY)
         {
         BuyAllowed=false;SellAllowed=true;
         } 
         else                   
         {
         BuyAllowed=true;SellAllowed=false;
         } 
        }   
      }
    }             
  return(0);   
  }
 
  //+---------------------------------------------------------------------------+

Outra questão,

No seguinte trecho de código as linhas em Bold where is sym e mn não devem ser substituídas por Symbol() e MagicNumber?

GetTicketFromHistory

int GetTicketFromHistory(string sym,int mn,int orderposinhistory=0)// <------------------------Should replace sym and mn with Symbol () and MagicNumber ?
 {
   bool debug=false;
   if(debug)Print("Orders in history: ", OrdersHistoryTotal());
   int ticket,count=1,i;
   datetime orderclosedates[];
   for(i=OrdersHistoryTotal()-1;i>=0;i--)
   {
      if(!OrderSelect(i,SELECT_BY_POS,MODE_HISTORY))continue;
      if(debug)Print("OrderSymbol: ",OrderSymbol(),"; OrderMagicNumber: ",OrderMagicNumber(),
                     " ;OrderType: ",OrderType(),"; OrderTicket: ",OrderTicket(),
                     "; OrderCloseTime: ",TimeToStr(OrderCloseTime()),";"); 
      if((OrderMagicNumber()  ==mn) // <---------------------------------------------------------Should replace  mn with  MagicNumber ?
         &&(OrderSymbol()     ==sym)// <---------------------------------------------------------Should replace sym with Symbol () ?
         &&(OrderType()==OP_BUY||OrderType()==OP_SELL))
         {                       
         ArrayResize(orderclosedates,count);
         orderclosedates[count-1]=OrderCloseTime();
         count++;

Aqui, no seguinte código, inseri filtros conforme seu conselho;

(//Phil:

//Cheque a quantidade total de pedidos. Eu adicionaria um filtro de mercado, mágico e símbolo...//<----------- Não tenho certeza do que você quer dizer com filtro de mercado..... (Phil: ordens de mercado, sem ordens pendentes)

//.... mas agora sou preguiçoso..... é algo para você fazer.

Isso é correto?

int start()
 {//0 
                                         
  OTLastTick = OTCurrentTick;                      
  OTCurrentTick = OrdersTotal();
     if(OrderSymbol() == Symbol()           //<--------filter for symbol and magic number, but for market (suppose market orders can't understand how....)
      && OrderMagicNumber() == MagicNumber) //<-|
     if(OTCurrentTick == 0 && OTLastTick > 0)
      {
      BuyTrigger = Ask + OpenDistance * pt;
      SellTrigger = Bid - OpenDistance * pt;
      }             
     if(OTCurrentTick >0 )Trail();                   
     if(OTLastTick >= 2                     //<------could you comment the meaning of this line ?                            
     &&OTCurrentTick < OTLastTick
     && OTCurrentTick > 0)
     {
      CloseAllOnSL();return;
     }      
     if(OTCurrentTick >= MaxOrders)return;                                                            
     if(OTCurrentTick > 0)OpenOppositeOrder();                        
     if(OTCurrentTick == 0)
     {
      BuyAllowed = true;
      SellAllowed = true;


Melhores cumprimentos

Luis

 

Não comento sobre o uso de funções. O RaptorUK já o fez alguns posts antes. Leia novamente e entenda porque você não precisa mudar nada no código dado. Melhor ainda, entenda porque você pode usá-lo como está em outros EAs.

OrdensTotal() devolve uma quantidade de ordens. Você provavelmente quer saber, as ordens pertencem ao seu EA ou à negociação manual ou as ordens são pendentes ou já estão no mercado. Eu criaria uma função (int) que devolve a quantidade de ordens que a EA criou.

if(OTLastTick >= 2 //<.....cPoderia comentar o significado desta linha ?
Se você tiver apenas uma ordem aberta (menos de 2), não faz sentido chamar CloseAllOnSL function..... a única ordem aberta obviamente não é interrompida.

 
kronin:

Não comento sobre o uso de funções. O RaptorUK já o fez alguns posts antes. Leia novamente e entenda porque você não precisa mudar nada no código dado. Melhor ainda, entenda porque você pode usá-lo como está em outros EAs.

OrdensTotal() devolve uma quantidade de ordens. Você provavelmente quer saber, as ordens pertencem ao seu EA ou à negociação manual ou as ordens são pendentes ou já estão no mercado. Eu criaria uma função (int) que devolve a quantidade de ordens que a EA criou.

if(OTLastTick >= 2 //<------cPoderia comentar o significado desta linha ?
Se você tiver apenas um pedido aberto (menos de 2), não faz sentido chamar CloseAllOnSL function....., o único pedido aberto obviamente não é interrompido.


Olá Kronin,

Obrigado por sua resposta aos meus problemas.

Darei a maior atenção ao seu código, assim como ao conselho dado anteriormente pelo RaptorUK.

Melhores cumprimentos

Luis

 

Olá Kronin,

Um problema surgiu e tem a ver com o uso de dois EA's. Se eu colocar dois EA's em gráficos diferentes e com números mágicos diferentes, eles não funcionam ao mesmo tempo. Eu recebo um erro como motivo 5, mas ao dar uma olhada no fórum não consigo encontrar informações que me coloquem na direção certa para lidar com esse problema.

Você tem alguma informação complementar?

Cumprimentos

Luis

 
luisneves:

Olá Kronin,

Um problema surgiu e tem a ver com o uso de dois EA's. Se eu colocar dois EA's em gráficos diferentes e com números mágicos diferentes, eles não funcionam ao mesmo tempo. Eu recebo um erro como razão não válida 5

https://docs.mql4.com/constants/uninit
 

Olá RaptorUK,

Obrigado por sua pronta resposta.

No link fornecido eu encontrei,

PARÂMETROS_DE_RAZÃO5Os parâmetros de entrada foram alterados pelo usuário.

Mas com essa informação não pode fazer nada (até onde eu sei). Não consigo entender quais parâmetros de entrada foram alterados. A ea é a mesma, basta alterar o número mágico para evitar conflitos entre as outras ea.

A propósito, quando você estiver aqui, poderia me dizer se no código a seguir é necessário introduzir um código para que as ordens sejam enviadas novamente enquanto o bilhete não tiver sido recebido o mesmo para fechar as ordens?

while(IsTradeContextBusy()) Sleep(10);
          RefreshRates();       
                       
     BuyTicket=OrderSend(Symbol(),OP_BUY,LotSize,Ask,RealSlippage,0,0,"Buy Order",MagicNumber,0,Green);
     if(BuyTicket > -1)

Com os melhores cumprimentos

Luis

 
luisneves:

Olá RaptorUK,

Obrigado por sua pronta resposta.

No link fornecido eu encontrei,

PARÂMETROS_DE_RAZÃO5Os parâmetros de entrada foram alterados pelo usuário.

Mas com essa informação não pode fazer nada (até onde eu sei). Não consigo entender quais parâmetros de entrada foram alterados. A ea é a mesma, basta alterar o número mágico para evitar conflitos entre as outras ea.

Se você alterou o número mágico . .

extern int    MagicNumber    = 08012013;

... e for um externo, então você mudou um parâmetro, a EA reinicia e dá razão 5

Se você quiser executar sua EA em vários pares, sugiro que faça duas coisas: primeiro, coloque sua EA funcionando corretamente em um par, teste-a completamente para saber que está funcionando; depois, em segundo lugar, introduza um Mutex para que suas negociações sejam tratadas quando a outra EA não estiver tentando fazer a mesma coisa.

 
RaptorUK:

Se você mudou o Número Mágico . . .

. e ele for externo, então você mudou um parâmetro, a EA reinicia e dá razão 5

Se você quiser executar sua EA em vários pares, sugiro que faça duas coisas: primeiro, coloque sua EA funcionando corretamente em um par, teste-a completamente para saber que está funcionando; depois, em segundo lugar, introduza um Mutex para que suas negociações sejam tratadas quando a outra EA não estiver tentando fazer a mesma coisa.


Olá RaptorUk,

Obrigado por sua resposta sobre o erro, suponho que tenha mudado de nome e número mágico e colocado o segundo ea no gráfico sem fechar a plataforma.

Em relação à outra questão sobre ordens de reentrada que têm a ver com uma falha no fechamento da ordem que retornou um erro como timeout. é por isso que eu não sei se o código como está entrará novamente no fechamento da ordem ou no envio da ordem.

Melhores cumprimentos

Luis

 
luisneves:


Olá RaptorUk,

Obrigado por sua resposta sobre o erro, suponho que tenham mudado de nome e número mágico e colocado o segundo ea na tabela sem fechar a plataforma.

Em relação à outra questão sobre ordens de reentrada que têm a ver com uma falha no fechamento da ordem que retornou um erro como timeout. é por isso que eu não sei se o código como está irá reentrar o fechamento da ordem ou envio da ordem.

Melhores cumprimentos

Luis

Leia os códigos de erro de execução e faça com que seu código esteja de acordo com as informações ali fornecidas, por exemplo . .

ERR_TRADE_TIMEOUT128Chegou-se a um limite de tempo para o comércio. Antes de tentar novamente(pelo menos em 1 minuto), é necessário ter certeza de que a operação comercial não foi realmente bem sucedida (uma nova posição não foi aberta, ou a ordem existente não foi modificada ou apagada, ou a posição existente não foi fechada).
Razão: