ordenando a matriz de 2 dimensões por segunda dimensão

 

Tenho 2 pedaços de dados que preciso colocar em uma matriz e depois ordená-los.

Primeiro dividi os pedidos em duas matrizes, a primeira matriz é para compras e a outra é para vendas. Quando o faço, estou coletando o OrderTicket para mais tarde poder executar o pedido. A segunda coisa que estou coletando é o valor do OrderClosePrice do pedido para que eu possa compará-lo com outra lista exatamente a mesma.

Portanto, o primeiro array que eu configuro:

duplo AryBuys[][2];
duplo ArySells[][2];

AryBuy[1][0] contém o bilhete, AryBuy[1][1] contém o preço.

Como ordenar a segunda dimensão para que tenhamos a matriz ordenada por preço decrescente?

Nota: com o ArraySort, você só pode ordenar a primeira dimensão. Aqui está um pensamento possível, eu poderia criar uma matriz temporária e fazer o preço a primeira dimensão na matriz temporária, classificá-la, depois canalizá-la de volta para a matriz e fazer o mesmo ao contrário quando mais tarde precisarei classificá-la por bilhete. Será que isso funcionaria?

 

Infelizmente, você não pode, mas poderia criar uma segunda matriz com os dados dos locais de troca de duas dimensões e classificar essa nova matriz pelo preço (a primeira dimensão). Você poderia então (se você ainda quisesse) copiar os dados de volta para a matriz original mais uma vez trocando os dados em cada dimensão. Agora sua matriz original contém os dados originais, mas eles são ordenados por valores de segunda dimensão.

é kludgy mas é a única maneira prática (que eu consegui descobrir) de ordenar seus dados por dimensões >1

 

Foi nisso que pensei em minhas anotações. Minha preocupação era que a primeira dimensão fosse ordenada, será que ela também reorganizaria a segunda dimensão dos dados quando a ordenação ocorresse? Acho que eu poderia fazer um teste para experimentar isto.

 
LEHayes wrote >>

Foi nisso que pensei em minhas anotações. Minha preocupação era que a primeira dimensão fosse ordenada, será que ela também reorganizaria a segunda dimensão dos dados quando a ordenação ocorresse? Acho que eu poderia fazer um teste para experimentar isto.


Sim, todos os elementos do mesmo índice de base são movidos com a ordenação da primeira dimensão. Assim como ordenar uma planilha contendo várias colunas de dados, somente em MQL você pode ordenar apenas pela primeira coluna.
 

Até o momento, consegui montar como discutido. Tenho certeza de que resolverei isso quando terminarmos a conversa, mas atualmente estou conseguindo:
2010.04.15 23:51:01,M1: posição inicial 1 incorreta para a função ArraySort
No início eu tentei desta forma:
ArraySort(AryBuy,WHOLE_ARRAY,0,MODE_DESCEND);
e recebi a mesma mensagem apenas o valor da posição era 0, depois mudei o início (valor da posição) para 1 para ver o que poderia acontecer e recebi o acima.

As arrays devem ter dados nelas neste ponto. Vou reiniciar o teste para ver se o problema persiste.

 
LEHayes:

.....
duplo AryBuys[][2];
duplo ArySells[][2];

AryBuy[1][0] contém o bilhete, AryBuy[1][1] contém o preço. ....

Corrija-me se eu estiver errado, mas você parece definir e abordar a matriz de forma incorreta. Citado a partir de referência variável:

int    a[50];       // A one-dimensional array of 50 integers.
double m[7][50];    // Two-dimensional array of seven arrays,
                    //each of them consisting of 50 integers

o último par de chaves é a primeira dimensão da matriz... assumindo que o tamanho indefinido da matriz é a primeira dimensão. Esta é a IMO correta:

double AryBuys[2][];
double ArySells[2][];

AryBuy[0][1] contains the ticket, AryBuy[1][1] contains the price. 
 
cameofx:
o último par de aparelhos é a primeira dimensão da matriz... assumindo que o tamanho indefinido da matriz é a primeira dimensão. Esta é a IMO correta:

Veja também o livro...
FYI, estou mais confortável nomeando o último par de aparelhos como 'primeira dimensão' porque a próxima dimensão é adicionada (embora localizada mais à esquerda) 'mais tarde'.
IMHO Considerando-o como 'tamanho de colunas' também 'cola' melhor do ponto de vista conceitual.

 
cameofx:

FYI, estou mais confortável nomeando o último par de aparelhos como 'primeira dimensão' porque a próxima dimensão é adicionada (embora localizada mais à esquerda) 'mais tarde'.

Independentemente do que você gostaria de chamar, a primeira dimensão em uma matriz 2D é o nome do vetor arr_name[0,1,...,n][0], então tecnicamente o primeiro colchete detém a primeira dimensão; este também é o vetor que será classificado por ArraySort(). A partir do livro:

Já que estamos no assunto de ArraySort() vou mencionar duas peculiaridades não documentadas que encontrei ao longo do tempo (e ficaria feliz se alguém me confirmasse ou corrigisse...?):

  1. Se alguns dos elementos da primeira dimensão forem idênticos, eles não necessariamente manterão sua ordem. Obviamente, isto deve ser documentado se for "by-design", caso contrário, eu consideraria isto como um "bug".
  2. OrderSort() não funciona com arrays 4D (erro de retorno 4053). Novamente, isto deve ser documentado, mas não é.
 
cameofx wrote >>

Corrija-me se eu estiver errado, mas você parece definir e abordar a matriz de forma incorreta. Citado a partir de referência variável:

o último par de chaves é a primeira dimensão da matriz... assumindo que o tamanho indefinido da matriz é a primeira dimensão. Esta é a IMO correta:



Eu olho para a indexação e o dimensionamento da matriz na planilha padrão...Linha-Coluna (mnemônica "Romano-Católica").

1D Array: MyArray[RowNumber-1]

2D Array: MyArray[RowNumber-1][ColumnNumber-1][ColumnNumber-1

3D Array: MyArray[RowNumber-1][ColumnNumber-1][Worksheet-1]

O conjunto de parênteses mais à esquerda é a primeira dimensão, tudo que você fizer que envolva manipulação de matriz da primeira dimensão será feito com o índice do conjunto de parênteses mais à esquerda. O redimensionamento da matriz (algo que pode ser feito apenas para a 1ª dimensão), por exemplo, altera apenas o valor do conjunto de colchetes mais à esquerda, não pode alterar o intervalo do índice da segunda, terceira ou quarta dimensão (segundo, terceiro ou quarto conjunto de colchetes mais à direita).

Todas as minhas linhas de dados na matriz são indexadas pelo primeiro conjunto de colchetes, o conjunto mais à esquerda, e esta é a "primeira dimensão" da matriz.

MyArray[0][ColumnNumber-1] -> primeira linha de dados

MyArray[1][ColumnNumber-1] -> segunda linha de dados

MyArray[2][ColumnNumber-1] -> terceira linha de dados

Na MQL só posso classificar pelos dados contidos na primeira coluna de dados...ou seja, os valores encontrados em MyArray[i][0]. Valores encontrados na mesma linha (mesmo "i" neste caso) mas colunas diferentes (o valor no segundo conjunto de parênteses) não podem ser usados para ordenação/classificação.

Aqui está um exemplo de ordenação 2D:

3 5
1 9
7 6

Então MyArray[0][0] = 3, e MyArray[0][1] = 5, e MyArray[2][1] = 6, etc.

Eu posso ordenar esta matriz:

ArraySort(MyArray,WHOLE_ARRAY,0,MODE_ASCEND) e o resultado será o seguinte:

1 9
3 5
7 6

A primeira coluna é ordenada, a segunda coluna de dados (ou seja, todos os dados com o mesmo índice de 1ª dimensão) se move junto com a ordenação/troca feita no ranking da primeira coluna.

Eu não posso ordenar/ classificar a segunda coluna de dados em MQL...o que significa que eu NÃO PODE obter o seguinte (não diretamente de qualquer forma):

3 5
7 6
1 9

(note que a segunda coluna está agora ordenada da menor para a maior)

Para chegar a uma matriz que tenha a segunda coluna (ou qualquer outra que não seja a primeira coluna) ordenada, devo trocar manualmente os dados entre colunas (mantendo o índice da primeira dimensão o mesmo, mas trocando o valor do índice da segunda dimensão) e então ordenar e então trocar os dados de volta.

MyNewArray:
5 3
9 1
6 7

Agora classifique por primeira coluna, ArraySort(MyNewArray,WHOLE_ARRAY,0,MODE_ASCEND) e o resultado será o seguinte:

5 3
6 7
9 1

E então copie os valores de volta para minha matriz original, mais uma vez transpondo o índice da segunda dimensão, mantendo o valor da primeira dimensão o mesmo:

3 5
7 6
1 9

Agora eu tenho minha matriz original, mas os dados estão ordenados pela segunda coluna.

 

Essa coisa de whoole virou um pesadelo, eu nem me lembro se eu tentei convencê-lo mais. A idéia que eu tinha era pegar a lista de negócios abertos, separar as compras das vendas em 2 matrizes, cada matriz continha o ticket# na primeira coluna, a segunda continha o valor do preço do negócio. Em geral, a idéia era combinar todos os grandes valores de preço de compra com todos os grandes valores de preço de venda e se o valor de compra mais alto excedesse o valor de venda mais alto, então fechar ambas as duas transações e repetir o processo.

Agora, o gancho final que me fez considerar recuar nesta idéia foi que depois de passar por este processo, eu queria deixar pelo menos 1 negociação de compra positiva e 1 negociação de venda positiva sobre a mesa para manter um sistema de negociação protegida. Isto está basicamente sendo projetado como uma ferramenta de gerenciamento de drawdown para uma estratégia de hedging. Portanto, eu quero manter o hedge, mas tirar os ganhos da mesa. Ocorreu-me que o uso de uma matriz algorythm poderia fornecer uma solução para isto.

Estou realmente cansado e cansado de tentar empurrar a liberação de cerca de 5 estratégias para fora da porta, de modo que isto se tornou um pouco de simpatia ao invés de neccessividade.

Estou disposto a fazer um acordo com qualquer pessoa que possa escrever esta função para mim. Darei a você sua escolha de produtos com uma licença de anos, de graça por me ajudar nisto e, também, darei a você uma cópia pessoal desta estratégia de hedging para uso ilimitado e gratuito por toda a vida. Estou demasiado sobrecarregado para fazer tudo isso e minha equipe de desenvolvimento está sobrecarregada com a liberação do que já está em nossas placas. Acho que o valor médio de sono em toda a equipe é de cerca de 4 a 6 horas por dia.

Portanto, se você estiver interessado em um pouco de troca e comércio, esta é a minha oferta.

Objetivo:
1. Separe as compras das vendas
2. Classificar cada um de acordo com o valor de preço mais alto para o mais baixo
3. Se a compra tem preços positivos mais altos e a venda tem preços positivos mais baixos, então queremos fechar o comércio de venda mais baixo com o comércio de compra mais alto, o comércio de compra deve exceder as despesas do comércio de venda. Se a venda tem preços positivos mais altos, então revertemos esta ação para fechar o comércio com o preço de compra mais baixo com o preço de venda mais alto. A idéia é que para cada perda, fechamos com uma vitória de preços mais altos para que os ganhos excedam as perdas com um ganho positivo médio.

exemplo:
comprar vender
$15 $- 12
$5 $ - 6
$ 1.5 $ -1
$ 1 $ - .5

Isto mostra um número equilibrado de negócios abertos em ambos os lados. Observe os $15 de compra e $12 de venda, estes podem ser fechados porque a compra positiva excede a venda negativa. Também podemos fechar os 5 e -6 porque há ganhos suficientes com os dois primeiros fechamentos que o saldo entre o fechamento dos 4 resultaria em um positivo. Podemos fazer o mesmo para o 1,5 e o -1, mas não queremos fechar o 1 e o -,5 porque queremos manter a situação coberta.

Na maioria das vezes, as negociações não serão equilibradas como iguais de ambos os lados. Esta foi a base do projeto para compensar o lado mais pesado com um lote maior e negociações adicionais em favor do lado vencedor, então é possível que você tenha apenas 1 venda, neste caso, você não faria nada. Caso não sejam equilibradas, mas haja pelo menos 2 negócios em cada lado, você precisa ter certeza de deixar um negócio de cada lado aberto. No caso de 1 comércio positivo superar mais de 1 comércio negativo, você pode fechá-los todos, exceto um comércio de cada lado que é o menor para cada outro.

Ele deve ser projetado para chamar uma função de fechamento que fechará uma ticketid específica, para que você não tenha que se preocupar com o fechamento, basta fazer a chamada para que as trocas sejam fechadas passando a ticketid. Você pode ter que reconstruir sua lista para que sua lista não compare as negociações fechadas, mas quaisquer novas negociações que possam ter ocorrido durante seu processamento.

Ah, sim, mais uma coisa...
Não deve ser muito ganancioso, você deve fornecer um usuário externo que dite a freqüência com que este recurso deve ser disparado, ele pode ser baseado em uma contagem de velas ou em uma base de hora ou minuto, mas não deve disparar cada carrapato ou mesmo cada vela nova. Como existe uma ferramenta adicional, ela será incorporada a ela que primeiro exigirá que a outra ferramenta atire para poder invocá-la. Assim, a outra ferramenta disparará, e a contagem regressiva começará para que sua ferramenta dispare.

 
Larry, tenho certeza que o código para CloseBy() aqui -> https://book.mql4.com/trading/orderclose (é cerca de 2/3 abaixo da página...) pode ser estendido para fazer o que você quiser (sem usar nenhum arrays)... Apenas pensado para sua mente.
Razão: