2 boyutlu diziyi ikinci boyuta göre sıralama

 

Bir diziye koymam ve sonra sıralamam gereken 2 parça veri var.

İlk önce siparişleri iki diziye ayırdım, ilk dizi alımlar için, diğeri ise satışlar için. Bunu yaptığımda, OrderTicket'i daha sonra sipariş üzerinde bir yürütme gerçekleştirebilmek için topluyorum. Topladığım ikinci şey, siparişin OrderClosePrice değeridir, böylece onu tamamen aynı başka bir listeyle karşılaştırabilirim.

Yani kurduğum ilk dizi:

çift AryBuys[][2];
çift ArySells[][2];

AryBuy[1][0] bileti içerir, AryBuy[1][1] fiyatı içerir.

Diziyi azalan fiyata göre sıralamak için ikinci boyutu nasıl sıralarım?

Not: ArraySort ile yalnızca ilk boyutu sıralayabilirsiniz. İşte olası bir düşünce, bir geçici dizi oluşturabilir ve fiyatı geçici dizideki ilk boyut yapabilir, sıralayabilir, sonra diziye geri aktarabilir ve daha sonra bilete göre sıralamam gerektiğinde aynısını tersini yapabilirim. . Işe yarar mı?

 

maalesef yapamazsınız, ancak iki boyutlu yer değiştirme yerlerinden gelen verilerle ikinci bir dizi oluşturabilir ve bu yeni diziyi fiyata göre sıralayabilirsiniz (birinci boyut). Daha sonra (yine de istiyorsanız) verileri her boyuttaki verileri değiştirerek bir kez daha orijinal diziye kopyalayabilirsiniz. Şimdi orijinal diziniz orijinal verileri içerir, ancak ikinci boyut değerlerine göre sıralanır.

bu çok zor ama verilerinizi >1 boyutlarına göre sıralamanın tek pratik yolu (anlayabildiğim)

 

Notlarımda bunu düşündüm. Benim endişem, ilk boyutun sıralanacağıydı, sıralama gerçekleştiğinde verilerin ikinci boyutunu da yeniden düzenler miydi? Sanırım bunu denemek için bir test ayarlayabilirim.

 
LEHayes wrote >>

Notlarımda bunu düşündüm. Benim endişem, ilk boyutun sıralanacağıydı, sıralama gerçekleştiğinde verilerin ikinci boyutunu da yeniden düzenler miydi? Sanırım bunu denemek için bir test ayarlayabilirim.


Evet, aynı temel dizinin tüm öğeleri, birinci boyutun sıralamasıyla taşınır. Birden çok veri sütunu içeren bir elektronik tabloyu sıralamak gibi, yalnızca MQL'de yalnızca ilk sütuna göre sıralama yapabilirsiniz.
 

Şimdiye kadar, tartışıldığı gibi kurdum. Konuşmayı bitirene kadar bunu çözeceğime eminim, ama şu anda şunu alıyorum:
2010.04.15 23:51:01,M1: ArraySort işlevi için yanlış başlangıç konumu 1
İlk başta şöyle denedim:
ArraySort(AryBuy,WHOLE_ARRAY,0,MODE_DESCEND);
ve aynı mesajı aldım, sadece pozisyon değeri 0 idi, sonra ne olabileceğini görmek için başlangıcı (konum değeri) 1 olarak değiştirdim ve yukarıdakileri aldım.

Dizilerin bu noktada içlerinde veri olması gerekir. Sorunun devam edip etmediğini görmek için testi sıfırlayacağım.

 
LEHayes :

.....
çift AryBuys[][2];
çift ArySells[][2];

AryBuy[1][0] bileti içerir, AryBuy[1][1] fiyatı içerir. ....

Yanlışsam düzeltin ama diziyi yanlış tanımlıyor ve ele alıyorsunuz. Değişken referansından alıntı:

 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

son parantez çifti dizinin ilk boyutudur... dizinin tanımsız boyutunun ilk boyut olduğunu varsayarsak. Bu IMO doğru olanı:

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

AryBuy[ 0 ][ 1 ] contains the ticket, AryBuy[ 1 ][ 1 ] contains the price. 
 
cameofx :
son parantez çifti dizinin ilk boyutudur... dizinin tanımsız boyutunun ilk boyut olduğunu varsayarsak. Bu IMO doğru olanı:

Ayrıca kitap bakın...
Bilginize, son parantez çiftini 'birinci boyut' olarak adlandırmakta daha rahatım çünkü bir sonraki boyut (daha solda olmasına rağmen) 'daha sonra' eklenir.
IMHO Bunu 'sütunların boyutu' olarak kabul etmek, aynı zamanda konsept açısından daha iyi 'yapışır'.

 
cameofx :

Bilginize, son parantez çiftini 'birinci boyut' olarak adlandırmakta daha rahatım çünkü bir sonraki boyut (daha solda olmasına rağmen) 'daha sonra' eklenir.

Nasıl adlandırmak isterseniz isteyin, 2B dizideki ilk boyut dizi_adı[0,1,...,n][0] vektörüdür, yani teknik olarak ilk parantez birinci boyutu tutar; bu aynı zamanda ArraySort() tarafından sıralanacak vektördür. Kitaptan:

ArraySort() konusunda olduğumuz sürece, zaman içinde bulduğum 2 belgesiz özellikten bahsedeceğim (ve biri beni onaylarsa veya düzeltirse sevinirim...?):

  1. Birinci boyuttaki öğelerden bazıları aynıysa, sıralarını korumaları gerekmez. Açıkçası, bu 'tasarım gereği' ise belgelenmelidir, aksi takdirde bunun bir 'hata' olduğunu düşünürdüm.
  2. OrderSort(), 4B dizilerle çalışmaz (4053 hatası döndürür). Yine, bunun belgelenmesi gerekiyor ama değil.
 
cameofx wrote >>

Yanlışsam düzeltin ama diziyi yanlış tanımlıyor ve ele alıyorsunuz. Değişken referansından alıntı:

son parantez çifti dizinin ilk boyutudur... dizinin tanımsız boyutunun ilk boyut olduğunu varsayarsak. Bu IMO doğru olanı:



Standart elektronik tablo tarzında dizi indeksleme ve boyutlandırmaya bakıyorum... Satır-Sütun (anımsatıcı "Roma-Katolik").

1B Dizi: MyArray[RowNumber-1]

2B Dizi: MyArray[RowNumber-1][ColumnNumber-1]

3B Dizi: MyArray[RowNumber-1][ColumnNumber-1][Çalışma Sayfası-1]

En soldaki parantez seti ilk boyuttur, ilk boyutun dizi manipülasyonunu içeren yaptığınız her şey en soldaki parantez kümesinin indeksi ile yapılacaktır. Dizi yeniden boyutlandırma (yalnızca 1. boyuta yapılabilecek bir şey), örneğin yalnızca en soldaki parantez kümesinin değerini değiştirir, ikinci, üçüncü veya dördüncü boyutların (ikinci, üçüncü veya dördüncü) dizin aralığını değiştiremez en sağdaki parantez seti).

Dizideki tüm veri satırlarım, ilk parantez kümesi, en soldaki küme tarafından indekslenir ve bu, dizinin "ilk boyutu"dur.

MyArray[0][ColumnNumber-1] -> ilk veri satırı

MyArray[1][ColumnNumber-1] -> ikinci veri satırı

MyArray[2][ColumnNumber-1] -> üçüncü veri satırı

MQL'de yalnızca verinin ilk sütununda bulunan verilere göre sıralayabilirim... yani MyArray[i][0]'da bulunan değerlere göre. Aynı satırda (bu durumda aynı "i") ancak farklı sütunlarda (ikinci parantez kümesindeki değer) bulunan değerler sıralama/sıralama için kullanılamaz.

İşte örnek bir 2B dizi:

3 5
1 9
7 6

Yani MyArray[0][0] = 3 ve MyArray[0][1] = 5 ve MyArray[2][1] = 6, vb.

Bu diziyi sıralayabilirim:

ArraySort(MyArray,WHOLE_ARRAY,0,MODE_ASCEND) ve sonuç aşağıdaki gibi olacaktır:

1 9
3 5
7 6

İlk sütun sıralanır, ikinci veri sütunu (yani aynı 1. boyut indeksine sahip tüm veriler), ilk sütunun sıralamasında yapılan sıralama/kaydırma ile birlikte hareket eder.

MQL'de ikinci veri sütununu sıralayamıyorum/sıralayamıyorum... yani aşağıdakileri alamam (doğrudan değil):

3 5
7 6
1 9

(ikinci sütunun artık küçükten büyüğe sıralandığını unutmayın)

İkinci sütunu (veya ilk sütun dışındaki herhangi bir sütunu) sıralanmış bir diziye ulaşmak için, verileri sütunlar arasında manuel olarak değiştirmeliyim (ilk boyut indeksini aynı tutarak, ancak ikinci boyutun indeksinin değerini değiştirerek) ve sonra sıralayın ve ardından verileri geri değiştirin.

MyNewArray:
5 3
9 1
6 7

Şimdi ilk sütuna göre sıralayın, ArraySort(MyNewArray,WHOLE_ARRAY,0,MODE_ASCEND) ve sonuç şu olacaktır:

5 3
6 7
9 1

Ardından, ilk boyutun değerini aynı tutarken ikinci boyutun indeksini değiştirerek değerleri bir kez daha orijinal dizime kopyalayın:

3 5
7 6
1 9

Şimdi orijinal dizim var ama veriler ikinci sütuna göre sıralanıyor.

 

Bu her şey bir kabusa dönüştü, daha fazla ikna etmeye çalışıp çalışmadığımı bile hatırlamıyorum. Aklımdaki fikir, açık işlemlerin listesini almak, alımları satışlardan 2 diziye ayırmaktı, her dizi ilk sütunda bilet#'yi içeriyordu, ikincisi ticaretin fiyat değerini içeriyordu. Genel olarak fikir, tüm büyük fiyat alış değerlerini tüm büyük fiyat satış değerleriyle eşleştirmek ve en yüksek alış değeri en yüksek satış değerini aşarsa, o zaman bu iki işlemin her ikisini de kapatmak ve işlemi tekrarlamaktı.

Şimdi bu fikirden vazgeçmemi sağlayan son kanca, bu süreçten geçtikten sonra, hedge edilmiş bir ticaret sistemini devam ettirmek için masada en az 1 pozitif alış ve 1 pozitif satış ticaretini bırakmak istedim. Bu, temel olarak, bir riskten korunma stratejisi için bir düşüş yönetimi aracı olarak tasarlanmaktadır. Bu yüzden riskten korunmayı sürdürmek istiyorum, ancak masadan kazançları almak istiyorum. Bunun için bir dizi algoritması kullanmanın bir çözüm sağlayabileceği geldi.

Yaklaşık 5 stratejinin serbest bırakılmasını kapıdan dışarı atmaya çalışmaktan gerçekten yoruldum ve yıprandım, bu yüzden bu bir gereklilik yerine biraz hoş bir şey oldu.

Bu işlevi benim için yazabilecek herkesle anlaşma yapmaya hazırım. Bu konuda bana yardımcı olduğunuz için size ücretsiz olarak yıllık lisanslı ürün seçiminizi vereceğim, size bu riskten korunma stratejisinin kişisel bir kopyasını ücretsiz sınırsız ömür boyu kullanım için vereceğim. Hepsini yapamayacak kadar dalgınım ve geliştirme ekibim, halihazırda plakalarımızda olanı serbest bırakmakla ağır bir şekilde yükleniyor. Bence ekip genelinde ortalama uyku değeri günde yaklaşık 4 ila 6 saat.

Yani biraz takas ve ticaretle ilgilenirseniz, teklifim bu.

Amaç:
1. Alışları satışlardan ayırın
2. her birini en yüksek fiyat değerine göre en düşüğe sıralayın
3. Alım en yüksek pozitif fiyatlara sahipse ve satış en düşük pozitif fiyatlara sahipse, o zaman en düşük alım satım işlemini en yüksek alım satımı ile kapatmak istiyoruz, alım satımı satım işleminin masrafını aşmalıdır. Satışın daha yüksek pozitif fiyatları varsa, en düşük alış fiyatını en yüksek satış fiyatıyla kapatmak için bu eylemi tersine çeviririz. Buradaki fikir, her kayıp için, daha yüksek bir fiyat kazancıyla kapatmamızdır, böylece kazançlar, ortalama bir pozitif kazançla kayıpları geçer.

misal:
alış-satış
15 $ - 12
5 $ - 6
1,5 $ -1
$ 1 $ - .5

Bu, her iki tarafta da dengeli sayıda açık işlem olduğunu gösterir. 15$'lık alış ve -12$'lık satışlara dikkat edin, pozitif alış, negatif satışı aştığı için bunlar kapatılabilir. 5 ve -6'yı da kapatabiliriz çünkü ilk iki kapanıştan 4'ünü kapatma arasındaki dengenin olumlu sonuçlanmasına yetecek kadar kazanç var. Aynısını 1.5 ve -1 için de yapabiliriz, ancak 1 ve -.5'i kapatmak istemeyiz çünkü hedge edilmiş durumu korumak istiyoruz.

çoğu zaman, işlemler her iki tarafta da eşit olarak dengelenmeyecektir. Bu, en ağır tarafı daha yüksek lot büyüklüğü ve kazanan taraf lehine ek işlemlerle dengelemek için tasarımın temeliydi, bu nedenle yalnızca 1 satışınız olabilir, bu durumda hiçbir şey yapmazsınız. Dengeli değillerse ancak her iki tarafta da en az 2 işlem varsa, her iki tarafta bir işlemi açık bıraktığınızdan emin olmanız gerekir. 1 pozitif işlemin 1 negatif işlemden fazla olması durumunda, her iki tarafta birbirine en küçük olan bir işlem dışında hepsini kapatabilirsiniz.

Belirli bir bilet kimliğini kapatacak bir kapatma işlevini çağırmak üzere tasarlanmalıdır, böylece kapatma konusunda endişelenmenize gerek kalmaz, sadece çağrıyı yaparak işlemlerin bilet kimliğini geçerek kapatılmasını sağlayın. Listenizi, kapatılan işlemleri değil, işleminiz sırasında gerçekleşmiş olabilecek yeni işlemleri karşılaştıracak şekilde yeniden oluşturmanız gerekebilir.

Evet, bir şey daha...
Çok açgözlü olmamalı, bu özelliğin ne sıklıkta çalıştırılacağını belirleyen bir kullanıcı dış ortamı sağlamalısınız, mum sayısı veya saat veya dakika bazında olabilir, ancak her tik veya hatta her yeni mum ateşlememelidir. . Ek bir araç olduğu için, içine gömülecek ve ilk önce bunu çağırmak için diğer aracın ateşlenmesini gerektirecektir. Böylece diğer alet ateşlenecek ve aletinizin ateşlenmesi için geri sayım başlayacak.

 
Larry, burada CloseBy() kodunun -> https://book.mql4.com/trading/orderclose (sayfanın yaklaşık 2/3'ü kadar...) istediğini yapmak için genişletilebileceğinden oldukça eminim. (herhangi bir dizi kullanmadan)... Sadece sizin için düşündünüz.