Fechamento de meio lote. - página 16

 
Ok, eu fiz um pequeno progresso. Mas tenho um problema. Se eu colocar uma ordem pela primeira vez em um determinado par, ela NÃO fechará metade da ordem A MENOS que eu tenha uma troca para comparar na história... Nesse caso, se a primeira negociação foi 1:1, ela não fechará a metade da posição, pois não tem nada a comparar no pool da história... Da mesma forma, não tenho certeza absoluta do que estou fazendo de errado, mas mesmo quando há uma troca na história para comparar com, (OrderOpenTime()), ela ainda está fechando-a continuamente pelo mesmo preço?

int start()
{
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
   
if(OrderSelect(OrderTicket(),SELECT_BY_TICKET, MODE_TRADES)==True)
{  
   OrderEntryTime            = OrderOpenTime();
   datetime OrderEntryClosed = OrderCloseTime(); 
    CurrentSymbol            = OrderSymbol();
     if(OrderType() <= OP_SELL && CurrentSymbol == Symbol())
         {   
         Print(" The Selected Order ", CurrentSymbol, " matches this pair: ", Symbol());
         Print(" The Open Time of this order was: ", TimeToStr(OrderEntryTime, TIME_MINUTES | TIME_DATE));  
         }
         
  if(OpenOrdersThisPair(Symbol())>0 && CurrentSymbol==Symbol())
     {
      // Need a for loop to compare historically closed trades that match with Symbol() and the "datetime OrderEntryTime = OrderOpenTime();" above.
     CheckHistoricalTrades(); 
     }
   }
}
}  
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////  

void CheckHistoricalTrades()
{
for(int Pos=OrdersHistoryTotal()-1; Pos >= 0; Pos--) 
    {
     if (OrderSelect(Pos, SELECT_BY_POS, MODE_HISTORY)  
        &&  OrderMagicNumber()  == MagicNumber            
        &&  CurrentSymbol       == Symbol()            
        &&  OrderType()         <= OP_SELL
        &&  OrderEntryTime    >  OrderOpenTime() && OrderType()==OP_BUY)
          {
          Print(" Last Order Open Time: ", TimeToStr(OrderOpenTime(), TIME_MINUTES | TIME_DATE), 
                  " Was not the same as current order: ", TimeToStr(OrderEntryTime, TIME_MINUTES | TIME_DATE));
          CloseHalfOrder();
          }
                if(OrderEntryTime > OrderOpenTime() && OrderType()==OP_SELL)
                  {
                  Print("Last Order Open Time: ", TimeToStr(OrderOpenTime(), TIME_MINUTES | TIME_DATE), 
                     " Was not the same as current order: ", TimeToStr(OrderEntryTime, TIME_MINUTES | TIME_DATE));
                  CloseHalfOrder1(); // This just closes half of the position at 1:1 - then if OrderStopLoss > OrderOpenPrice() = MoveToBreakEven() void kicks in. 
                  }
                      
     }
}  
Eu sei que o problema está me encarando bem, mas não consigo vê-lo...
 
Estas são as impressões da revista - algumas impressões não são mostradas acima - mas todas as impressões acima são.
2013.08.09 13:56:20     2010.02.25 09:16  Trend Fishing 3 Exits GBPJPY,H1: Last Order Open Time: 2010.02.04 09:22 Was not the same as current order: 2010.02.25 01:16 //>>> "Last Order Open time" here doesn't make sense?
2013.08.09 13:56:20     2010.02.25 09:16  Trend Fishing 3 Exits GBPJPY,H1: SELL First Target Closed: 0.03 OP_SELL First Closed - Open Time: 2010.02.05 15:07 //>>> This is the same as "The Last Order Open Time"?
2013.08.09 13:56:20     2010.02.25 09:16  Trend Fishing 3 Exits GBPJPY,H1: close #16 sell 0.03 GBPJPY at 138.270 sl: 138.240 tp: 135.082 at price 136.637  //>>> Therefore, it closed it here.
2013.08.09 13:56:20     2010.02.25 09:16  Trend Fishing 3 Exits GBPJPY,H1: Ask >= FirstTarget_Sell - Current Ask: 136.637 FirstTarget_Sell: 136.676     //>>> The ask is at the OrderClose() price.
2013.08.09 13:56:20     2010.02.25 09:16  Trend Fishing 3 Exits GBPJPY,H1: FirstTarget_Sell: 136.676
2013.08.09 13:56:20     2010.02.25 09:16  Trend Fishing 3 Exits GBPJPY,H1: Order Ticker Number = 10
2013.08.09 13:56:20     2010.02.25 09:16  Trend Fishing 3 Exits GBPJPY,H1: The Lots to close is: 0.030
2013.08.09 13:56:20     2010.02.25 09:16  Trend Fishing 3 Exits GBPJPY,H1: Last Order Open Time: 2010.02.05 15:07 Was not the same as current order: 2010.02.25 01:16
2013.08.09 13:56:20     2010.02.25 09:16  Trend Fishing 3 Exits GBPJPY,H1:  The Open Time of this order was: 2010.02.25 01:16
2013.08.09 13:56:20     2010.02.25 09:16  Trend Fishing 3 Exits GBPJPY,H1:  The Selected Order GBPJPY matches this pair: GBPJPY
 
DomGilberto:

O problema que eu tenho é que estou tentando fechar parcialmente o mesmo "OP_BUY" ou "OP_SELL" até 4 vezes a preços diferentes... Eu acho que a pergunta que eu deveria estar fazendo é, posso conseguir uma maneira, onde por mim tenho uma regra de que TODOS os fechamentos parciais (de qualquer lote e preço em UM determinado comércio) só fechará parcialmente UMA VEZ em seus parâmetros pré-definidos de "OrderClose()"...

Desta forma, estou olhando para fazer isso agora com a comparação do OrderOpenTime() funcionará essencialmente apenas uma vez, e restringirá qualquer outro tipo de função OrderClose() de acontecer em tudo... Quero encontrar uma maneira de aplicar uma regra a 4 funções OrderClose()... (se isso faz sentido?)

Sei que as pessoas estão sugerindo abrir 4 ordens, mas sem ir muito fundo, é menos eficiente para mim fazer isso dessa maneira.

Por que não ter simplesmente uma matriz bidimensional que armazena o número do ingresso e o número de fechamentos parciais disponíveis que restam para realizar.

Esboço/Pseudocódigo:

1. definir matriz bidimensional estática: cOrders[][2].

2. para cada novo pedido inserido: redimensionar a primeira dimensão do pedido para o tamanho+1, colocar o número do novo pedido em [x][0] e o número de fechamentos parciais disponíveis para realizar (neste caso, 4) em [x][1].

3. em qualquer intervalo de tempo (por exemplo, cada início()), faça um loop através da matriz, selecione cada pedido usando o número de bilhete armazenado, e determine se um fechamento parcial precisa ser realizado.

4. se for necessário executar um fechamento parcial (ver passo 3), fechar parcialmente a ordem usando OrderClose() e atualizar as ordens[x][0] para refletir o novo número do bilhete e reduzir as ordens[x][1] em 1.

5. Remova de cOrders quaisquer ordens que tenham sido fechadas ou que seu número de fechamentos parciais ainda a serem realizados seja 0.

O único problema é o que fazer quando a plataforma/computador é reiniciada. Você poderia armazenar essas informações em um arquivo e ler o arquivo no init() quando a plataforma for reiniciada.

 
Thirteen:

Por que não ter simplesmente uma matriz bidimensional que armazena o número do ingresso e o número de fechamentos parciais disponíveis que restam para realizar.

Esboço/Pseudocódigo:

1. definir matriz bidimensional estática: cOrders[][2].

2. para cada novo pedido inserido: redimensionar a primeira dimensão do pedido para o tamanho+1, colocar o número do novo pedido em [x][0] e o número de fechamentos parciais disponíveis para realizar (neste caso, 4) em [x][1].

3. em qualquer intervalo de tempo (por exemplo, cada início()), faça um loop através da matriz, selecione cada pedido usando o número de bilhete armazenado, e determine se um fechamento parcial precisa ser realizado.

4. Se for necessário executar um fechamento parcial (ver passo 3), fechar parcialmente a ordem usando OrderClose() e atualizar as ordens[x][0] para refletir o novo número do bilhete e reduzir as ordens[x][1] em 1.

5. Remova de cOrders quaisquer ordens que tenham sido fechadas ou que seu número de fechamentos parciais ainda a serem realizados seja 0.

O único problema é o que fazer quando a plataforma/computador é reiniciada. Você poderia armazenar essas informações em um arquivo e ler o arquivo no init() quando a plataforma for reiniciada.

Acho que a maneira mais fácil de fazer isso é com Números Mágicos . . usar partes do número para definir parâmetros diferentes, por exemplo: número de peças, número de pedido, dia, mês, número EA . . todas as peças teriam o mesmo Número Mágico e poderiam ser facilmente rastreadas na História. Presumo que a parte fechada e a parte aberta que restam têm ambas o mesmo Número Mágico . .
 
Sim, eu acho que sim. O número mágico é sempre o mesmo "1234"?

Não faço idéia de como usar partes do número mágico para definir parâmetros diferentes? Acho que usar OrderOpenTime() não será uma rota lógica... Não posso acreditar quanto tempo este fio está ficando longo. Lol.

Juro por Deus que vou fazer um fio sobre isto uma vez que eu (com muita ajuda de todos!) o tenha rachado.
 
RaptorUK:
Acho que a maneira mais fácil de fazer isto é com Números Mágicos . . usar partes do número para definir parâmetros diferentes, por exemplo: número de peças, número do pedido, dia, mês, número EA . . todas as peças teriam o mesmo Número Mágico e poderiam ser facilmente rastreadas na História. Presumo que a parte fechada e a parte aberta que restam têm ambas o mesmo Número Mágico . .

O uso do Número Mágico para codificar pedaços de informação é bastante possível, mas vejo algumas limitações possíveis. Primeiro, o Número Mágico é um int e, portanto, tem 10 dígitos onde o dígito mais esquerdo pode ser apenas 1 ou 2 (e se o dígito mais esquerdo for 2, o segundo dígito mais esquerdo deve ser 7 ou menos). Em segundo lugar, pode levar mais tempo por início() para rever todo o histórico para encontrar todas as partes de cada ordem apenas para determinar se a ordem atual precisa (ou pode ser) parcialmente fechada. Só não tenho certeza se esse tempo adicional seria trivial ou não.

 

Espere, eu não posso ter apenas vários números mágicos? Use um para o OrderSend() inicial, um para o OrderModify(), depois que metade da posição for fechada no primeiro alvo de 1:1, modificar a ordem para mudar o MagicNumber? Portanto, quando eu estiver procurando fechar pela primeira vez a metade a 1:1, ela só fechará 1:1, desde que o "OP_BUY" atualmente aberto corresponda ao número mágico que eu lhe dei pela primeira vez? Depois de ter fechado parcialmente, modificar e mudar esse número mágico?!

Lol? Isso não é realmente simples?!

ATUALIZAÇÃO: obviamente preciso parar de olhar para isso hoje - você não pode modificar um MagicNumber - mas gostaria que você pudesse, porra... (facepalm) - você poderia imaginar como tudo isso seria muito mais fácil...

 
DomGilberto:
Espere, eu não posso ter apenas vários números mágicos? Use um para o OrderSend() inicial, um para o OrderModify(), depois que metade da posição for fechada no primeiro alvo de 1:1, modificar a ordem para mudar o MagicNumber? Portanto, quando eu estiver procurando fechar pela primeira vez a metade a 1:1, ela só fechará 1:1, desde que o "OP_BUY" atualmente aberto corresponda ao número mágico que eu lhe dei pela primeira vez? Depois de ter fechado parcialmente, modificar e mudar esse número mágico?!

Lol? Isso não é realmente simples?!

Não. Primeiro, após o OrderSend() inicial, você não pode adicionar/modificar o Número Mágico usando OrderModify(). Segundo, quando você faz um fechamento parcial da ordem usando OrderClose(), a nova ordem (eu assumo) recebe o mesmo Número Mágico que a ordem antiga.

 
Thirteen:

Não. Primeiro, após o OrderSend() inicial, você não pode adicionar/modificar o Número Mágico usando OrderModify(). Segundo, quando você faz um fechamento parcial da ordem usando OrderClose(), a nova ordem (eu assumo) recebe o mesmo Número Mágico que a ordem antiga.


Sim. Percebi o quão retardado estou sendo. Dia longo!

Sim, após o primeiro fechamento parcial, ainda é atribuído à posição restante o mesmo número mágico com o qual começou.

Agora está realmente me frustrando... Se ao menos eu pudesse modificar o número mágico, seria muito fácil!? Tem que haver uma maneira lógica de fechar parcialmente uma posição ONCE - e fazê-lo várias vezes a qualquer preço pré-definido especificado no OrderClose() - Tem que haver uma atualização que nos permita modificar o MagicNumber()!
 

Você não está pensando de forma lógica.

1. Como modificar o número mágico o ajudaria mais do que conhecer o OrderOpenTime() ? Ele é exatamente a mesma coisa que um identificador para essa ordem.

2. Por que você está convertendo-o para o formato dia/hora/minuto com timetostr ? O OrderOpenTime() já está no formato timestamp que se parece com este: 1375356521 representa o tempo exato para o segundo quando o pedido foi aberto.

Se você pudesse mudar o número mágico, compararia o número mágico do pedido para ter certeza de que ele não tem o número mágico que significa que ele já estava parcialmente fechado corretamente ?

Se você pudesse fazer isso, por que não comparar o OrderOpenTime da ordem com o timestamp que você sabe que significa que é uma ordem que já estava parcialmente fechada ?

data/hora estática já encerrada;

se a ordem de fechamento da peça for bem sucedida

já fechado = OrderOpenTime();

quando o pedido atende aos critérios de fechamento de peças

if(OrderOpenTime() != já fechado )

Se você estiver administrando várias ordens abertas ao mesmo tempo, use uma matriz[] para manter cada carimbo de tempo de ordens fechadas de peças.

Razão: