EA para cada par de moedas - que código abrir apenas uma vez por par de moedas? - página 3

 

Eu mudei o mecanismo de fechamento de:

for (int j = 0; j < OrdersTotal(); j ++) 
   {
      if (OrderSelect(j, SELECT_BY_POS, MODE_TRADES)) // If there is the next one        
          {                                          // Analyzing orders:        
              if (OrderSymbol()==Symbol())continue;       // Another security    

//--------------Exit criteria (Exit Buy)    

                    
                if (CloseBuy1_1 >= CloseBuy1_2) Order = SIGNAL_CLOSEBUY;      // Trigger for CloseBuy (more can be added)
                if (CloseSell1_1 <= CloseSell1_2) Order = SIGNAL_CLOSESELL;   // Trigger for Closesell (more can be added)
                         
                        if (Order == SIGNAL_CLOSEBUY) 
                         {
                         OrderClose()

para

for (int k = 0; k < OrdersTotal(); k ++) 
   {
      OrderSelect(k, SELECT_BY_POS, MODE_TRADES);
      if(OrderType() <= OP_SELL &&  OrderSymbol() == Symbol()) 
      {
        if(OrderType() == OP_BUY) 
         {   

//--------------Exit criteria (Exit Buy)    

                    
                if (CloseBuy1_1 >= CloseBuy1_2) Order = SIGNAL_CLOSEBUY;      // Trigger for CloseBuy (more can be added)
                if (CloseSell1_1 <= CloseSell1_2) Order = SIGNAL_CLOSESELL;   // Trigger for Closesell (more can be added)
                         
                        if (Order == SIGNAL_CLOSEBUY) 
                         {
                         OrderClose(....)

e agora tudo funciona como esperado. Ainda que não entenda por que isso acontece. Porque eu realmente não entendo as linhas adicionais no segundo código. Mas obrigado a todos vocês!

 
grey.unit:

Eu mudo o mecanismo de fechamento de:

para

e agora tudo funciona como esperado. Obrigado a todos vocês!

Provavelmente nem sempre funcionará . . ao fechar ordens abertas ou apagar ordens pendentes dentro de um loop você DEVE contar para baixo e não para cima . . você precisa mudar seu loop. E você precisa colocar o chack de volta para Symbol() . . . caso contrário o EA para EURUSD acabará potencialmente fechando ordens para GBPUSD . . . o que você precisava fazer era se livrar da continuação . . . ou fazer o == em !=
 
grey.unit:

Eu mudei o mecanismo de fechamento de:

para

e agora tudo funciona como esperado. Ainda que não entenda por que isso acontece. Porque eu realmente não entendo as linhas adicionais no segundo código. Mas obrigado a todos vocês!

Seu segundo código é correto, mas um pouco engraçado. Abra o MetaEditor, a janela do navegador (Ctrl + D), a aba do dicionário e selecione MQL4 Reference > Standard Constants > Trade operations.

 
RaptorUK:
Provavelmente nem sempre funcionará ... ao fechar ordens abertas ou apagar ordens pendentes dentro de um loop você DEVE contar para baixo e não para cima ... você precisa mudar seu loop. E você precisa colocar o chack de volta para Symbol() . . . caso contrário o EA para EURUSD acabará potencialmente fechando ordens para GBPUSD . . . o que você precisava fazer era se livrar do continue . . . ou fazer o == em !=

Só para que você esteja certo. O que você diz é que se eu modificar o primeiro código para:

for (int j = 0; j < OrdersTotal(); j --) 
   {
      if (OrderSelect(j, SELECT_BY_POS, MODE_TRADES)) // If there is the next one        
          {                                          // Analyzing orders:        
              if (OrderSymbol()==Symbol())       // Another security    
                 {

//--------------Exit criteria (Exit Buy)    

                    
                if (CloseBuy1_1 >= CloseBuy1_2) Order = SIGNAL_CLOSEBUY;      // Trigger for CloseBuy (more can be added)
                if (CloseSell1_1 <= CloseSell1_2) Order = SIGNAL_CLOSESELL;   // Trigger for Closesell (more can be added)
                         
                        if (Order == SIGNAL_CLOSEBUY) 
                         {
                         OrderClose(....)

então ele também deve funcionar?? Porque eu tentei isso e é só abrir novamente um pedido por par de moedas.

Ou se eu mudar o segundo código para (k++ para k--), também abre apenas uma operação por par de moedas.

for (int k = 0; k < OrdersTotal(); k --) 
   {
      OrderSelect(k, SELECT_BY_POS, MODE_TRADES);
      if(OrderType() <= OP_SELL &&  OrderSymbol() == Symbol()) 
      {
        if(OrderType() == OP_BUY) 
         {   
 
grey.unit:

Só para que você esteja certo. O que você diz é que se eu modificar o primeiro código para:

então ele também deve funcionar?? Porque eu tentei isso e é só abrir novamente um pedido por par de moedas.

Ou se eu mudar o segundo código para (k++ para k--), também abre apenas uma operação por par de moedas.

Estou falando do primeiro código, o loop que você está usando onde você fecha os pedidos ... deve diminuir . . caso contrário, você perderá as ordens. Vejo que você removeu a continuação e acrescentou { } chaves, muito bom :-)

Abrindo uma ordem por par de moedas ou uma ordem no total ?

 
RaptorUK:

Abrindo uma Ordem por par de moedas ou uma Ordem no total ?

Sim, no total, é claro. Ok, 2º código:


for (int j = 0; j < OrdersTotal(); j ++) 
   {
      if (OrderSelect(j, SELECT_BY_POS, MODE_TRADES)) // If there is the next one        
          {                                          // Analyzing orders:        
              if (OrderSymbol()==Symbol())continue;       // Another security    

Quando estamos falando sobre o loop, acho que você está falando sério:

for (int j = 0; j < OrdersTotal(); j ++)

Na verdade, eu o mudaria para algo assim:

for (int j = OrdersTotal()+1 ; j > OrdersTotal(); j --) 
   {

Esta linha abre apenas um pedido por par de moedas (como desejado!)

O laço está correto em relação a este problema agora? :

RaptorUK:

Provavelmente nem sempre funcionará . . ao fechar ordens abertas ou apagar ordens pendentes dentro de um loop você DEVE contar para baixo e não para cima . . você precisa mudar seu loop. E você precisa colocar de volta o chack para Symbol() . . caso contrário o EA para EURUSD acabará potencialmente fechando pedidos para GBPUSD . . o que você precisava fazer era se livrar do continue . . ou fazer o === em !=
 
grey.unit:

Sim, no total, é claro. Ok, 2º código:


Quando estamos falando sobre o loop, acho que você está falando sério:

Na verdade, eu o mudaria para algo assim:

Esta linha abre apenas um pedido por par de moedas (como desejado!)

O laço está correto em relação a este problema agora? :

Não, faça isto . . .

for (int j = OrdersTotal()-1 ; j >= 0 ; j --)   // start at OrdersTotal() -1 ,  finish when j = 0

A primeira posição de ordem é 0, então se você tiver 5 ordens as posições são 0, 1, 2, 3, 4 . . . então a última é OrderTotal() - 1 . . . então para contar para baixo você começa em OrderTotal()-1 e termina em 0

 
Ok, muito obrigado pela sua ajuda!
 
RaptorUK:

Não, faça isso . . .

A primeira posição de ordem é 0, portanto se você tiver 5 ordens as posições são 0, 1, 2, 3, 4 . . . então a última é OrderTotal() - 1 . . . então para contar para baixo você começa em OrderTotal()-1 e termina em 0

Portanto, deveria ser assim:

for (int j = OrdersTotal()-1 ; j = 0 ; j --) 

porque você escreveu isto:

for (int j = OrdersTotal()-1 ; j >= 0 ; j --) 

ou eu estou errado?

 
grey.unit:

Portanto, deveria ser assim:

porque você escreveu isto:

ou eu estou errado?

Você está completamente errado. Seu código nunca é executado!!! Use o RaptorUK's.
Razão: