Problema de pedidos múltiplos

 

Olá a todos,

Eu tenho um problema com meu código. Quando um pedido (compra ou venda) abre outros vêm em uma fila.

O que eu estou tentando fazer é;

se a última ordem é uma venda, então abra uma ordem de compra quando o preço estiver acima da ordem Preço aberto mais alguns pips(ReturnDist).

se a última ordem é uma compra, então abra uma ordem de venda quando o preço estiver abaixo do Openprice menos alguns pips.

Alguém poderia dar uma ajuda aqui ?

Obrigado de antemão

Luis

Arquivos anexados:
 
luisneves:

Olá a todos,

Eu tenho um problema com meu código. Quando um pedido (compra ou venda) abre outros vêm em uma fila.

O que eu estou tentando fazer é;

se a última ordem é uma venda, então abra uma ordem de compra quando o preço estiver acima da ordem Preço aberto mais alguns pips(ReturnDist).

se a última ordem é uma compra, então abra uma ordem de venda quando o preço estiver abaixo do Openprice menos alguns pips.

Alguém poderia dar uma ajuda aqui ?

Obrigado de antemão

Luis

Qual é o seu plano para restringi-lo?

Você inicializa o OpenOpposite com 1.

int    Ticket,total,OpenOpposite=1,UseSlippage,i;

A cada tick, você chama OpenOppositeOrder()

   int start()
     {
      if (OrdersTotal()==0)GoToOpen();
       else GoToClose();      
      if(OpenOpposite>0)OpenOppositeOrder(); //<-- here 
      if(OrdersTotal()>0)OpPendingDel();
      
     }

Não consigo ver nenhuma outra referência ao OpenOpposite.

O for loop no OpenOppositeOrder não tem nenhuma restrição em relação ao que eu vi até agora... deveria?

Onde em seu código você acha que está o erro?

 

Olá Kronin,

Antes de tudo, obrigado por sua pronta resposta.

Desculpe pela bagunça, mas o que eu tentei fazer foi ter blocos de código de trabalho independentes.

Então, limpei a linha que você marcou e a parte superior que diz OpenOpposite vazio () e agora vem alguns erros como;

expressão no escopo global não permitida, etc.

Se eu não estiver tomando muito do seu tempo, você poderia me ajudar aqui?

Obrigado

Luis



 
luisneves:

Olá Kronin,

Antes de tudo, obrigado por sua pronta resposta.

Desculpe pela bagunça, mas o que eu tentei fazer foi ter blocos de código de trabalho independentes.

Então, limpei a linha que você marcou e a parte superior que diz OpenOpposite vazio () e agora vem alguns erros como;

expressão no escopo global não permitida, etc.

Se eu não estiver tomando muito do seu tempo, você poderia me ajudar aqui?

Obrigado

Luis

Eu não disse que você tem que limpar nada. Eu só queria saber, onde você tenta restringir a EA de abrir mais de um pedido.

Tente isto (ainda não testei):

Mude a função de início para (Talvez você tenha que filtrar apenas para ordens de mercado abertas -> dependendo de sua estratégia):

   int start()
     {
      if(OrdersTotal()==0){GoToOpen();OpenOpposite=0;} //<-- set OpenOpposite to 0 if no order is open (pending and market)
      else GoToClose();      
      if(OpenOpposite==0)OpenOppositeOrder();          //<-- only run OpenOpositeOrder, if OpenOpposite is 0.
      if(OrdersTotal()>0)OpPendingDel();      
     }

Adicione um contador OpenOppositeOrder() à função OpenOppositeOrder():

         if(OrderSymbol() == Symbol()&& OrderMagicNumber() == MagicNumber)
            {
            Op = OrderType();

            if(Op == OP_BUY  && Ask < (OrderOpenPrice()- ReturnDist*pt))
               {                
               Ticket = OrderSend(Symbol(), OP_SELL, mlots, SellPrice, UseSlippage, 0, 0, "Sell Order", MagicNumber, 0, Red);
               if(Ticket > 0) 
                  {
                  Print("Opposite Sell order placed # ", Ticket);
                  AddLimitsSell();
                  OpenOpposite++;
                  }
               else
                  {
                  Print("Order Send failed, error # ", GetLastError());
                  }
               }
               
            if(Op == OP_SELL && Bid > (OrderOpenPrice()+ ReturnDist*pt))
               {               
               Ticket = OrderSend(Symbol(), OP_BUY, mlots, BuyPrice, UseSlippage, 0, 0, "Buy Order", MagicNumber, 0, Green);
               if(Ticket > 0)
                  {
                  Print("Opposite Buy order placed # ", Ticket);
                  AddLimitsBuy();
                  OpenOpposite++;
                  }
               else
                  {  
                  Print("Order Send failed, error # ", GetLastError());
                  }   
               }
            }

Isto deve resolver o problema com várias ordens abertas em uma fila. Isso restringe a EA a abrir mais de uma ordem (oposta).

 
luisneves:

Olá a todos,

Eu tenho um problema com meu código. Quando um pedido (compra ou venda) abre outros vêm em uma fila.

Por que você precisa de uma segunda linha sobre o mesmo pedaço de código?

RaptorUK:

Olhando para seu código, acho muito difícil seguir o que você está tentando fazer, vejo muito poucos comentários para me ajudar, sua função inicial() não me mostra o que você está tentando fazer em cada tick, você não tem um layout consistente de indentação.


A partir deste tópico:https: //www.mql5.com/en/forum/142629 página 3

 
RaptorUK:

Olhando para seu código, acho muito difícil seguir o que você está tentando fazer, vejo muito poucos comentários para me ajudar, sua função inicial() não me mostra o que você está tentando fazer em cada tick, você não tem um layout consistente de indentação.

Concorde com isso. Não verifiquei mais nada, a não ser a questão das múltiplas ordens, porque o código não é fácil de ler. Parece que partes do código são copiadas e coladas de outro código, escrito por outra pessoa. É melhor escrever suas próprias funções com seu próprio estilo (consistente).

 
kronin:

Eu não disse que você tem que limpar nada. Eu só queria saber, onde você tenta restringir a EA de abrir mais de um pedido.

Tente isto (ainda não testei):

Mude a função de início para (Talvez você tenha que filtrar apenas para ordens de mercado abertas -> dependendo de sua estratégia):

Adicione um contador OpenOppositeOrder() à função OpenOppositeOrder():

Isto deve resolver o problema com várias ordens abertas em uma fila. Isso restringe a EA a abrir mais de uma ordem (oposta).


Oi kronin,

Obrigado por sua pronta resposta ao meu problema. O que estou tentando obter é uma condição para abrir ordens como esta;

Primeiro aberta por meio de um indicador é uma compra (poderia ser uma venda, é claro) e depois uma ordem de compra está aberta, se o preço saltar para um nível abaixo do preço aberto da ordem de compra, uma ordem de venda será aberta, mas se o preço subir novamente, nenhuma nova compra aberta deve acontecer. Aqui uma nova ordem de compra só deve acontecer quando o preço saltar de volta da ordem de venda. Tudo o mesmo se uma ordem de venda for a primeira a acontecer.
Tentei conseguir isso com o seguinte código anexado, mas não funciona. Aquio que está funcionando éa primeira ordem a abrir é uma compra, então e como esperado uma ordem de venda será aberta, mas a partir daqui nenhuma outra ordem será aberta...

Tenho estes dois blocos de código e parece que o primeiro está fazendo o que se espera fazer; abra uma ordem de compra ou venda se as condições definidas por indicador estiverem lá. Uma vez recebido um bilhete de ordem
, então uma modificação de ordem está em vigor para enviar limites de ordem.

Estou usando BuyTicket e SellTicket no código para evitar a abertura de várias ordens, mas parece que esse não é o método certo para ir...

// Buy Order Condition to Open

  if(Volume[0] > volume_previous + OpenDistance*pt && BuyTicket == 0)                       
          {//5  
          while(IsTradeContextBusy()) Sleep(10);
          RefreshRates();       
                       
     BuyTicket=OrderSend(Symbol(),OP_BUY,LotSize,Ask,RealSlippage,0,0,"Buy Order",MagicNumber,0,Green);
     if(BuyTicket > -1)
        {//6
         Print("Opposite Buy order placed # ",BuyTicket);
         AddLimitsBuy();        
         }//6
      else
         {//7 
         Print("Order Send failed, error # ", GetLastError());
         }//7 
         
      return(0);
      }//5
  //-----------------------------------------------------------------------------+      
  
  // Sell Order Condition to Open

  if(Volume[0] < volume_previous - OpenDistance*pt && SellTicket == 0)                   
     {//8                                 
          while(IsTradeContextBusy()) Sleep(10);
          RefreshRates();       
                                                
          SellTicket=OrderSend(Symbol(),OP_SELL,LotSize,Bid,RealSlippage,0,0,"Sell Order",MagicNumber,0,Red);
          if(SellTicket > -1)
                  {//9
        Print("Opposite Sell order placed # ", SellTicket);
        AddLimitsSell();       
        }//9
     else
        {//10
        Print("Order Send failed, error # ", GetLastError());
        }//10      
     return(0);
     }//8                       


O código a seguir identifica as ordens abertas e filtrá-las símbolo de compra, número mágico e tipo de ordem. Uma vez que detecta a última ordem aberta no pool e se a condição para abrir (considerando que a última ordem é uma compra) e confirma que um ticket de venda não está presente, então uma ordem de venda está aberta. O mesmo se a última ordem for uma venda. E aqui o código está funcionando.

Um problema vem quando uma condição para abrir uma terceira ordem vem e assim por diante. Aqui, entretanto, as condições para abrir estão lá e o código tem dado certo com a segunda aberta. Por que o código não funciona aqui?

int Op;  
   
   for(int Counter = OrdersTotal()-1; Counter >= 0; Counter--)
      {//14
      if(OrderSelect(Counter,SELECT_BY_POS,MODE_TRADES))  
         {//15
         if(OrderSymbol() == Symbol()&& OrderMagicNumber() == MagicNumber)
            {//16
            Op = OrderType();

            if(Op == OP_BUY && Bid < OrderOpenPrice() - (ReturnDist*pt) && SellTicket == 0)
               {//17               
               SellTicket = OrderSend(Symbol(), OP_SELL, MLots, Bid, RealSlippage, 0, 0, "Sell Order", MagicNumber, 0, Red);
               if(SellTicket > -1) 
                  {//18
                  Print("Opposite Sell order placed # ", SellTicket);
                  AddLimitsSell();
                  }//18
               else
                  {//19
                  Print("Order Send failed, error # ", GetLastError() );
                  }//19
                }//17
                           
            if(Op == OP_SELL && Ask > OrderOpenPrice() + (ReturnDist*pt)&& BuyTicket == 0)
               {//20             
               BuyTicket = OrderSend(Symbol(), OP_BUY, MLots, Ask, RealSlippage, 0, 0, "Buy Order", MagicNumber, 0, Green);
               if(BuyTicket > -1)
                  {//21
                  Print("Opposite Buy order placed # ", BuyTicket);
                  AddLimitsBuy();
                  }//21
               else
                  {//22  
                  Print("Order Send failed, error # ", GetLastError());
                  }//22   
               }//20
            }//16
         }//15    
      }//14

O código completo está anexado, caso você precise ver o que estou tentando explicar.

Por favor, preste atenção que ainda resolva algumas outras questões e algum código pode parecer estranho, este é o caso da maneira que eu uso para abrir pedidos porque ainda estou para aprender como abrir pedidos com base no Bid mais uma distância menos.

Agradeço muito se você pudesse me ajudar aqui.


Com os melhores cumprimentos
Luis

Arquivos anexados:
 
Você sabe o que Volume[0] lhe dá? Como adicionar um valor de Ponto a isso faz algum sentido?
 

Olá Raptor,

Você está certo!

Eu ainda estou aprendendo e tentando várias maneiras de conseguir o que preciso e algumas vezes surgem coisas estúpidas.

Eu tentei fazer uso de um objeto para colocá-lo no nível Bid e depois conseguir essa posição para abrir pedidos, parece melhor do que este. Uma das principais questões é a maneira de limitar novas aberturas enquanto a ordem aberta não é fechada.

Eu sei que tenho muito a aprender e tentar por erro é uma maneira que encontrei para entender melhor como isto funciona na prática. Enquanto estou fazendo o meu melhor para entender as informações do livro e da documentação, algumas vezes me sinto perdido e tento obter ajuda de outros. Aqui em Portugal é muito difícil obter aulas sobre este assunto e, portanto, todos dependem da boa vontade, paciência e assertividade dos outros para obter ajuda e aconselhamento. Quando essa ajuda chega, faço o meu melhor para entender, mas às vezes não consigo lidar com isso.

De qualquer forma, obrigado por me mostrar esse volume não é a maneira de obter esse tipo de indicador.

Melhores Cumprimentos

Luis

 
luisneves:

Olá Raptor,

Você está certo!

Eu ainda estou aprendendo e tentando várias maneiras de conseguir o que preciso e algumas vezes surgem coisas estúpidas.

Eu aprecio que você esteja tentando e tentando aprender também, talvez você deva primeiro tentar criar uma EA mais simples e trabalhar com isso até entender como fazer o que você precisa, tentar algumas coisas, adicionar algumas declarações impressas, ver o que acontece, desta forma você aprenderá e entenderá, então quando você aprender mais você pode adicionar mais à sua EA. Você precisa ter uma idéia clara do que você quer que seu EA faça antes de codificá-lo, muita funcionalidade de uma só vez não facilitará esse processo de pensamento claro.

Uma outra coisa que ajudará, tente dividir as tarefas em módulos que você pode reutilizar com outros EA, então você pode codificar esse módulo, como uma função definida pelo usuário, por conta própria como parte de um script ou simples EA para testá-lo e certificar-se de que ele funciona e é robusto . . . então você pode usar essa função com confiança em um EA sabendo que ele funciona.
 

Olá RaptorUK,

Obrigado por sua resposta sincera. Eu já tento quebrar tarefas e outros tipos de problemas começam a aparecer, é por isso que começo a juntar tudo (e outros problemas começam....)

Já tento fazer outro EAs e funcionou bem, mas agora, utilizando esta abordagem sem o uso de indicadores (os padrões), as coisas se complicam.

A coisa agora está completamente perdida. Eu pensei que a maneira como estou vendo o código funcionar, em teoria, carrapato por carrapato, que deveria funcionar e depois tentar obter limites para evitar múltiplas aberturas, traz as coisas pior.

Portanto, agora temos alguns blocos de código que estão funcionando bem, outros que precisam de alguma atenção para refinar o desempenho e outros (dois) que não funcionam, e aqui eu não sei como sair daqui... simples como isso e sou totalmente acusado de ajudar as pessoas que sabem como lidar com isso. Você é uma das pessoas que tem dedicado mais tempo aos meus problemas, mas mesmo assim eu ainda não resolvo alguns problemas. Se eu tivesse tempo para aprender todo o código mql e depois começar a escrever com base em muita teoria e experiência adquirida no passado, talvez eu não estivesse aqui.

Eu vi um EA (anexar) e então tentei entender como funciona em partes de código que deveriam me trazer o que estou procurando mas não tive sucesso nisso. O que eu vi foi que ele faz uso de um código para obter aberturas com base no preço mais e menos alguma distância. Aqui, quando eu tento fazer disto um problema com limites, nada... não pode simplesmente colocar isso funcionando... e depois não consigo ver porque as ordens alternativas não funcionam como em teoria (pelo menos da maneira que eu vejo isso). Pura vergonha.......

De qualquer forma, estas são apenas palavras de um cara limitado...

Melhores Cumprimentos

Luis

Arquivos anexados:
Razão: