Abrir ordem oposta - página 3

 
RaptorUK:

Pode ser se tiver um número mágico diferente doMagicNumber ou se for para um símbolo diferente do símbolo em que a EA está rodando ou se for um OP_SELLLIMIT ou OP_BUYLIMIT . . também, você precisa verificar os valores de retorno de suas chamadas OrderDelete() .

Por que você precisa ligar para RefreshRates() ? eu não quero dizer se livrar deles, mas você pode explicar porque você está ligando para RefreshRates() onde você está ?


O que são valores de retorno de função ? Como posso utilizá-los ?


Olá RaptorUK.

Até onde sei, o MagicNumber é o mesmo e são OP_SELLSTOP e OP_BUYSTOP.

OrderDelete() calls , receio não entender o que você quer dizer....

RefreshRates() Eu só coloquei lá depois que o problema com ele fechou.

Agora estou em Lisboa (Portugal).

Luis

 
luisneves:


Olá RaptorUK.

Até onde sei, o MagicNumber é o mesmo e são OP_SELLSTOP e OP_BUYSTOP.

OrderDelete() calls , receio não entender o que você quer dizer....

Quando você chama OrderDelete() (usando a função OrderDelete()) ele retorna um valor, ele retorna um valor bool, se o valor for verdadeiro a OrderDelete() funcionou, se for falso a OrderDelete() falhou . . então verifique o valor de retorno e se for falso informe o erro ao log usando Print() ou use Comment( ) ou Alert() para que você saiba que tem um problema e possa investigá-lo.

Com base em seu código eu faria estas mudanças . . . se fosse meu código eu faria mudanças adicionais para imprimir mais informações no caso de um erro, Bid, Ask, FreezeLevel, StopLevel, etc.

void CloseAll()
   {
   int OrdType, GLError;
   
   RefreshRates();
                    
   for(int OrderPos = OrdersTotal()-1; OrderPos >= 0; OrderPos--)
      if( OrderSelect(OrderPos, SELECT_BY_POS, MODE_TRADES)
         && OrderMagicNumber() == MagicNumber 
         && OrderSymbol() == Symbol())
         {
         OrdType = OrderType();
         if(OrdType == OP_BUY || OrdType==OP_SELL)
            {
            if(!OrderClose(OrderTicket(), OrderLots(), OrderClosePrice(), UseSlippage, Yellow))
               GLError = GetLastError();
            }

         if(OrdType == OP_SELLSTOP || OrdType == OP_BUYSTOP || OrdType == OP_BUYLIMIT || OrdType == OP_SELLLIMIT)
            {
            if(!OrderDelete(OrderTicket())
               GLError = GetLastError();
            }

         if(GLError > 0) Print("Error Closing/Deleting Order, error # ", GLError, " for ticket: ", OrderTicket());         
         }
   } 
 
RaptorUK:

Quando você chama OrderDelete() (usando a função OrderDelete()) ele retorna um valor, ele retorna um valor bool, se o valor for verdadeiro a OrderDelete() funcionou, se for falso a OrderDelete() falhou . . então verifique o valor de retorno e se for falso informe o erro ao log usando Print() ou use Comment() ou Alert() para que você saiba que tem um problema e possa investigá-lo.

Com base em seu código eu faria estas mudanças . . . se fosse meu código eu faria mudanças adicionais para imprimir mais informações no caso de um erro, Bid, Ask, FreezeLevel, StopLevel, etc.


Olá RaptorUK,

A razão pela qual a ordem pendente não foi eliminada tem a ver com o lucro que foi para baixo neste caso 5 pips. Quando eu coloquei em 10 pips o pedido foi excluído. Minha confusão vem do fato de que se eu tivesse uma rotina para colocar o stoploss, abrir o preço e tirar lucro da zona de congelamento, por que isto não tem trabalho. Ok, mas agora está funcionando.

A propósito, quero fechar a ordem oposta uma vez que a outra tenha sido acionada. Para isso coloquei este código extra, mas (você pode começar a rir...) mas nada....

Alguma ajuda aqui?

 while(IsTradeContextBusy()) Sleep(10);
                   RefreshRates();
         Ticket=OrderSend(Symbol(),OP_BUYSTOP,LotSize,BuyLevel,UseSlippage,BuyStopLoss,BuyTakeProfit,"Buy Stop Order",MagicNumber,0,Green);
         if(Ticket>0)
         
          int o=OrderType();
          if (o==OP_BUY)
          OrderDelete(OrderTicket());        
           {
            if(OrderSelect(Ticket,SELECT_BY_TICKET,MODE_TRADES)) Print("BUY Stop Order Opened : ",OrderOpenPrice());
           }
         //else Print("Error opening BUY Stop Order : ",GetLastError());
 
luisneves:


Olá RaptorUK,

A razão pela qual a ordem pendente não foi eliminada tem a ver com o lucro que foi para baixo neste caso 5 pips. Quando eu coloquei em 10 pips a ordem de exclusão. Minha confusão vem do fato de que se eu tivesse uma rotina para colocar o stoploss, abrir o preço e tirar lucro da zona de congelamento, por que isto não tem trabalho. Ok, mas agora está funcionando.

A propósito, quero fechar a ordem oposta uma vez que a outra tenha sido acionada. Para isso coloquei este código extra, mas (você pode começar a rir...) mas nada....

Alguma ajuda aqui?


1. Ah, é por isso que você precisa verificar os valores de retorno e imprimir os códigos de erro, etc. Você precisa garantir que qualquer ação comercial em qualquer ordem esteja de acordo com as informações aqui:Requisitos e limitações na realização de negócios

2. Yu tem que esperar que a Ordem mude de OP_BUYSTOP para OP_BUY, pode levar algum tempo, então você precisa continuar verificando . . uma vez que tenha se tornado um OP_BUY, então você pode fechar a Ordem oposta e para fazer isso você terá que encontrar a Ordem correta para fechar. você deve ler minha recente conversa comWhooDoo22 que a conversa cobre um tópico similar.

 

Olá RaptorUk,

Eu tenho seguido o link que você forneceu, mas o tema, ainda assim, interessante, é longo e com tantas opiniões divergentes que eu me solto nelas.

Portanto, introduzi um código para fechar o oposto pendente e novamente nada e não consigo ver nada na revista que dê uma ajuda sempre..... o que estou perdendo aqui ......

obrigado por qualquer light.....

Luis

//Sell Pending Stop Loss & Take Profit Calculation     
     
   if(StopLoss>0)SellStopLoss=PendingSellPrice+(StopLoss*pt);
   if(TakeProfit>0)SellTakeProfit=PendingSellPrice-(TakeProfit*pt);
   
//Place Sell Pending Order
        
         while(IsTradeContextBusy()) Sleep(10);
                   RefreshRates();       
         Ticket=OrderSend(Symbol(),OP_SELLSTOP,LotSize,SellLevel,UseSlippage,SellStopLoss,SellTakeProfit,"Sell Stop Order",MagicNumber,0,Red);
         if(Ticket>0)OppositePendindDel();          
           {
            if(OrderSelect(Ticket,SELECT_BY_TICKET,MODE_TRADES)) Print("SELL Stop Order Opened : ",OrderOpenPrice());
           }
        //else Print("Error opening SELL Stop Order : ",GetLastError());
         } 
//+---------------------------------------------------------------------------+
int OppositePendindDel()
{
 int c,d,GLError;
 int e=OrdersTotal();
 
 for(c=e-1;c>=0;c--)
 {  
   OrderSelect(c,SELECT_BY_POS,MODE_TRADES);
   if(OrderType()==OP_BUY||OrderType()==OP_SELL)
   {
    for(d=e-1;d>=0;d--)
    {
     OrderSelect(d,SELECT_BY_POS,MODE_TRADES);
     
      if(OrderType()==OP_SELLSTOP)
     {
      if(!OrderDelete(OrderTicket()))
            GLError = GetLastError();
      
      return(1);
      }
      if(OrderType()==OP_BUYSTOP)
      {
       if(!OrderDelete(OrderTicket()))
             GLError = GetLastError();
       }
       if(GLError > 0) Print("Error Closing/Deleting Order, error # ", GLError, " for ticket: ", OrderTicket());
       return(1);
       }
      }
     }
    }
 
luisneves:

Olá RaptorUk,

Eu tenho seguido o link que você forneceu, mas o tema, ainda assim, interessante, é longo e com tantas opiniões divergentes que eu me solto nelas.

Portanto, introduzi um código para fechar o oposto pendente e novamente nada e não consigo ver nada na revista que dê uma ajuda sempre..... o que estou perdendo aqui ......

RaptorUK:

Você tem que esperar que a Ordem mude de OP_BUYSTOP para OP_BUY, pode levar algum tempo,então você precisa continuar verificando... uma vez que ela se transformou em OP_BUY, então você pode fechar a Ordem oposta e para fazer isso você terá que encontrar a Ordem correta para fechar.

 
RaptorUK:



Olá RaptorUK ,

Ok, agora parece que está apagando aordem pendente oposta depois que uma pendente é acionada, mas agora algumas ordens vêm em duplas, ou seja, a ea coloca uma venda e compra ao mesmo tempo e o tamanho do lote é o mesmo para as duas ordens quando deve colocar uma ordem por vez. Eu comecei a ficar louco.....

Qualquer ajuda aqui, por favor!!!!

Arquivos anexados:
 
luisneves:


Olá RaptorUK ,

Ok, agora parece que está apagando a ordem pendente oposta depois que uma pendente é acionada, mas agora algumas ordens vêm em duplas, ou seja, a ea coloca uma venda e compra ao mesmo tempo e o tamanho do lote é o mesmo para as duas ordens quando deve colocar uma ordem por vez. Eu comecei a ficar louco.....

Qualquer ajuda aqui, por favor!!!!

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.

Qual é a função GoToClose() destinada a fazer ? Se você fizer alguns comentários no início da função descrevendo o que ela deve fazer, então eu poderia ver se ela está realmente fazendo o que ela deve fazer, atualmente o que ela faz é chamada deCloseAll(); se qualquer comércio que corresponda ao seu Symbol & Magic Number estiver em lucro por qualquer quantia, ou se você tiver mais de 7 negócios para qualquer símbolo e qualquer Magic Number. CloseAll() somente fecha negócios paraseu Símbolo e Número Mágico, então se você tivesse 7 negócios para um Símbolo ou Número Mágico diferente, GoToClose() continuaria chamando CloseAll() e nada mais aconteceria.


Se você colocasse uma troca manual em sua conta Demo e depois executasse sua EA, ela não faria nada... ela veria a troca mas não a ignoraria, ela a contaria e como resultado não colocaria uma troca própria, nem fecharia esta troca aberta. O que sua EA deveria fazer nesta situação? e se houvesse uma troca colocada por outra EA com um Número Mágico diferente?

Você precisa obter uma imagem clara do que está tentando fazer, comente sua função start() para que o fluxo e o processo sejam claros, comente cada função para que fique claro o que cada uma deve fazer. Quando você tiver feito isto, você pode muito bem entender onde está seu problema...

 
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.

Qual é a função GoToClose() destinada a fazer ? Se você fez alguns comentários no início da função descrevendo o que ela deve fazer então eu poderia ver se ela está realmente fazendo o que deve fazer, atualmente o que ela faz é chamada deCloseAll(); se qualquer comércio que corresponda ao seu Symbol & Magic Number estiver em lucro por qualquer quantia, ou se você tiver mais de 7 negócios para qualquer símbolo e qualquer Magic Number. CloseAll() somente fecha negócios paraseu Símbolo e Número Mágico, então se você tivesse 7 negócios para um Símbolo ou Número Mágico diferente, GoToClose() continuaria chamando CloseAll() e nada mais aconteceria.


Se você colocasse uma troca manual em sua conta Demo e depois executasse sua EA, ela não faria nada... ela veria a troca mas não a ignoraria, ela a contaria e como resultado não colocaria uma troca própria, nem fecharia esta troca aberta. O que sua EA deveria fazer nesta situação? e se houvesse uma troca colocada por outra EA com um Número Mágico diferente?

Você precisa obter uma imagem clara do que está tentando fazer, comente sua função start() para que o fluxo e o processo sejam claros, comente cada função para que fique claro o que cada uma deve fazer. Quando você tiver feito isto, você pode bem entender onde está seu problema...


Olá RaptorUK,

Desculpe pela bagunça. Até este momento, parece que a EA está fazendo o que se espera dele, exceto esta questão;

A EA deve abrir uma ordem oposta cada vez que a ordem anterior não toma o TakeProfit com um incremento de tamanho e com a mesma quantidade de TakeProfit e ele o faz.A questão é que deve colocar apenas uma ordem por vez e colocar mais de uma. Dando uma olhada no relatório, você pode ver que o pedido 6 e 7 são ambos uma venda e o pedido 7 deve ser uma compra.

Agora eu coloquei o código por função. A razão pela qual eu tenho todas essas chamadas vazias é que eu quero ter um bloco independente que funcione completamente e aqui eu sei que estou com problemas para organizar isto O Go to Open e go to Close é apenas uma maneira de dizer que se nós não tivermos ordens abertas os primeiros vão para abrir se não o go to close ( é uma confusão que eu preciso trabalhar nisto....) Estou usando o símbolo e o número mágico para garantir que a ea apenas lide com as próprias ordens.

A estratégia principal é (e os blocos são por esta ordem);

1- Duas ordens pendentes estão acima e abaixo do preço. Uma vez que o preço aciona uma delas, o oposto das pendentes é eliminado. Isto está funcionando.

2- Se o preço escolhe o TakeProfit então a ordem é fechada e a EA volta a colocar duas ordens pendentes e o processo começa novamente. Isto está funcionando

2- se o preço não escolher o TakeProfit e saltar de volta uma vez que o valor do TakeProfit for menor (para ordens de compra), então uma ordem de venda oposta deverá abrir com o mesmo valor do TakeProfit e com um tamanho muito maior do que o primeiro. Isto está funcionando, exceto que coloca mais de uma ordem e pelo Relatório pode-se ver que as ordens 6 e 7 são ambas ordens de Venda e devem ser apenas uma a 7 deve ser uma Compra.

3- Uma vez que a última ordem tenha lucro, todas as ordens abertas devem ser fechadas. E o processo começa a ganhar. Isto está funcionando.

4- Neste ping-pong deve-se esperar que no máximo 7 vezes uma ordem escolha o TakeProfit se não for assim, estas ordens são fechadas.

Por exemplo, se quisermos para TakeProfit 2 pips então esperamos que o preço atinja 3 pips e então uma destas funções (break even ou profit trailing stop mínimo) coloca uma linha de parada no nível de 2 pips. Se o preço subir (para Buy), então a linha stop irá com ele e, uma vez que o preço ricochetear 1 pip, a ordem fecha e porque tem um lucro, todas as ordens abertas são fechadas. Aqui eu não tenho certeza se isto pode funcionar corretamente.

Obrigado

Luis

Arquivos anexados:
 
luisneves:


Olá RaptorUK,

Desculpe pela bagunça. Até este momento, parece que a EA está fazendo o que se espera dele, exceto esta questão;

A EA deve abrir uma ordem oposta cada vez que a ordem anterior não toma o TakeProfit com um incremento de tamanho e com a mesma quantidade de TakeProfit e o faz. A questão é que deve colocar apenas uma ordem por vez e colocar mais de uma. Dando uma olhada no relatório, você pode ver que o pedido 6 e 7 são ambos uma venda e o pedido 7 deve ser uma compra.

Agora eu coloquei o código por função. A razão pela qual eu tenho todas essas chamadas vazias é que eu quero ter um bloco independente que funcione completamente e aqui eu sei que estou com problemas para organizar isto O Go to Open e go to Close é apenas uma maneira de dizer que se nós não tivermos ordens abertas os primeiros vão para abrir se não o go to close ( é uma confusão que eu preciso trabalhar nisto....) Estou usando o símbolo e o número mágico para garantir que a ea apenas lide com as próprias ordens.

A estratégia principal é (e os blocos são por esta ordem);

1- Duas ordens pendentes estão acima e abaixo do preço. Uma vez que o preço aciona uma delas, o oposto das pendentes é eliminado. Isto está funcionando.

2- Se o preço escolhe o TakeProfit então a ordem é fechada e a EA volta a colocar duas ordens pendentes e o processo começa novamente. Isto está funcionando

2- se o preço não escolher o TakeProfit e saltar de volta uma vez que o valor do TakeProfit for menor (para ordens de compra), então uma ordem de venda oposta deverá abrir com o mesmo valor do TakeProfit e com um tamanho muito maior do que o primeiro. Isto está funcionando, exceto que coloca mais de uma ordem e pelo Relatório pode-se ver que as ordens 6 e 7 são ambas ordens de Venda e devem ser apenas uma a 7 deve ser uma Compra.

3- Uma vez que a última ordem tenha lucro, todas as ordens abertas devem ser fechadas. E o processo começa a ganhar. Isto está funcionando.

4- Neste ping-pong deve-se esperar que no máximo 7 vezes uma ordem escolha o TakeProfit se não for assim, estas ordens são fechadas.

Por exemplo, se quisermos para TakeProfit 2 pips então esperamos que o preço atinja 3 pips e então uma destas funções (break even ou profit trailing stop mínimo) coloca uma linha de parada no nível de 2 pips. Se o preço subir (para Buy), então a linha stop irá com ele e, uma vez que o preço ricochetear 1 pip, a ordem fecha e porque tem um lucro, todas as ordens abertas são fechadas. Aqui eu não tenho certeza se isto pode funcionar corretamente.

Obrigado

Luis

Ok, pense que encontrou o que está errado com a abertura de vários pedidos. Tive queincluí-las em código (Negrito Italic);

Open Opposite Order
 
   double  MartingaleBuyPrice = Ask+StopLevel;
   if(MartingaleBuyPrice<UpperStopLevel)MartingaleBuyPrice=UpperStopLevel+MinStop*pt;
   
   double MartingaleSellPrice= Bid-StopLevel;
   if(MartingaleSellPrice>LowerStopLevel)MartingaleSellPrice=LowerStopLevel-MinStop*pt;
   
   int Op;  
   
   for(int Counter = OrdersTotal()-1; Counter >= 0; Counter--)
      {
      if(OrderSelect(Counter,SELECT_BY_POS,MODE_TRADES))  
         {
         if(OrderSymbol() == Symbol()&& OrderMagicNumber() == MagicNumber)
            {
            Op = OrderType();

            if(Op == OP_BUY && ((OrderOpenPrice()-OrderClosePrice())/pt)> ReturnDist && SellTicket==0)
               {                
               Sell Ticket = OrderSend(Symbol(), OP_SELL, mlots, MartingaleSellPrice, UseSlippage, 0, 0, "Sell Order", MagicNumber, 0, Red);
               if(Sell Ticket > 0) 
                  {
                  Print("Opposite Sell order placed # ", SellTicket);
                  AddLimitsSell();
                  }
               else
                  {
                  Print("Order Send failed, error # ", GetLastError() );
                  }
               }
               
            if(Op == OP_SELL && (OrderClosePrice()-OrderOpenPrice()/pt)> ReturnDist && BuyTicket==0)
               {               
               Buy Ticket = OrderSend(Symbol(), OP_BUY, mlots, MartingaleBuyPrice, UseSlippage, 0, 0, "Buy Order", MagicNumber, 0, Green);
               if(Buy Ticket > 0)
                  {
                  Print("Opposite Buy order placed # ", BuyTicket);
                  AddLimitsBuy();
                  }
               else
                  {  
                  Print("Order Send failed, error # ", GetLastError());
                  }   
               }
            }
         }
      }
   }
//+------------------------------------------------------------------+  
void AddLimitsBuy()
                  {
                  OrderSelect(Buy Ticket,SELECT_BY_TICKET);
                  OpenPrice = OrderOpenPrice();
                  StopLevel = MarketInfo(Symbol(),MODE_STOPLEVEL)*Point;
                                       RefreshRates();  
                                      UpperStopLevel = Ask + StopLevel;
                                      LowerStopLevel = Bid - StopLevel;
                                      
                                      
                                      if(StopLoss > 0) BuyStopLoss   = OpenPrice - (StopLoss * pt);
                  if(TakeProfit > 0)BuyTakeProfit = OpenPrice + (TakeProfit * pt);
                                      
                                      if(BuyStopLoss > 0 && BuyStopLoss > LowerStopLevel) 
                                              {                                 
                                                    BuyStopLoss = LowerStopLevel - MinStop*pt;
                                              }
                                      
                                      if(BuyTakeProfit > 0 && BuyTakeProfit < UpperStopLevel) 
                                              {
                                                     BuyTakeProfit = UpperStopLevel + MinStop*pt;
                                              }

                                      if(IsTradeContextBusy())Sleep(10);        

                  if(BuyStopLoss > 0 || BuyTakeProfit > 0) 
                     {          
                      OrderModify(Ticket,OP_BUY,BuyStopLoss,BuyTakeProfit,0);                            
                     }
                    } 
//+------------------------------------------------------------------+
void AddLimitsSell()
                  {
                  OrderSelect(Sell Ticket,SELECT_BY_TICKET);                 
                  OpenPrice = OrderOpenPrice();
                  StopLevel = MarketInfo(Symbol(),MODE_STOPLEVEL)*Point;
                                      RefreshRates();   
                                      UpperStopLevel = Ask + StopLevel;
                                      LowerStopLevel = Bid - StopLevel;
                                      
                                      
                                      if(StopLoss > 0) SellStopLoss = OpenPrice + (StopLoss*pt);
                                      if(TakeProfit > 0) SellTakeProfit = OpenPrice - (TakeProfit*pt);
                                    
                                      if(SellStopLoss > 0 && SellStopLoss < UpperStopLevel) 
                                              {                                 
                                                    SellStopLoss = UpperStopLevel + MinStop*pt;
                                              }
                                      if(SellTakeProfit> 0 && SellTakeProfit > LowerStopLevel) 
                                              {
                                                    SellTakeProfit = LowerStopLevel - MinStop*pt;
                                              }
                                            
                                      if(IsTradeContextBusy()) Sleep(10);       

                  if(SellStopLoss > 0 || SellTakeProfit > 0) 
                    {           
                      OrderModify(Ticket,OP_SELL,SellStopLoss,SellTakeProfit,0);
                    }                    
                   }  


Arquivo de relatório de falta
Razão: