MQL4 ve MQL5 ile ilgili herhangi bir acemi sorusu, algoritmalar ve kodlar hakkında yardım ve tartışma - sayfa 69
Alım-satım fırsatlarını kaçırıyorsunuz:
- Ücretsiz alım-satım uygulamaları
- İşlem kopyalama için 8.000'den fazla sinyal
- Finansal piyasaları keşfetmek için ekonomik haberler
Kayıt
Giriş yap
Gizlilik ve Veri Koruma Politikasını ve MQL5.com Kullanım Şartlarını kabul edersiniz
Hesabınız yoksa, lütfen kaydolun
Örneğin burada https://docs.mql4.com/en/basis/preprosessor/compilation
şu anki örnekte, herhangi bir lotla sonsuzsayıda sipariş koyabilmek istiyorum, böylece ötesine geçilmesin
tabi ki sınırları biliyoruz ve herkes farkında ama ben böyle istiyorum
Parantez içinde bir öğe belirtirseniz, o zaman son olacağı gerçeğinden yola çıkıyorum.
İşte bu saçmalığı aldığım şey. Kalabalığı sırayla görmesi bekleniyordu... Çok mu? böylece çok yerine sonucu sıraya ekliyorum (bir sürü şöyle böyle bir düzen * katsayısı)
ve oradan veri çıkarma sorunu
hayal ettiğim gibi olmak istiyorum
Dizim[0][0.01]
Dizim[1][0.01]
Dizim[2][0.02]
vb...
Peki, asıl soru nedir?
Lotlar içeren bir dizi yazdınız, ardından lot boyutuna göre sıraladınız, bu sayıları açarak sıralama olacaktır, çünkü sizin durumunuzda sonraki her pozisyon daha büyük bir lotla açılır.
double SPosMass[];
void OnTick ()
{
// Заполняем массивы
int b=- 1 ,s=- 1 ; // Объявим переменные с минусом
for ( int i= 0 ; i< OrdersTotal (); i++) {
if ( OrderSelect (i, SELECT_BY_POS , MODE_TRADES )) {
if ( OrderSymbol ()== Symbol () && ( OrderMagicNumber ()==Magic || Magic< 0 )) {
if ( OrderType ()== OP_BUY ) {
b++;
ArrayResize (BPosMass,b+ 1 );
BPosMass[b]= OrderLot();
}
if ( OrderType ()== OP_SELL ) {
s++;
ArrayResize (SPosMass,s+ 1 );
SPosMass[s]= OrderLot();
}
}}} // конец записи массив
// Читаем отсортированный массив с лотами
// Buy
if (b> 0 ) { // Если он не пустой и больше двух элементов - [0], иначе будет ошибка: "Выход за пределы массива"
ArraySort (BPosMass, WHOLE_ARRAY , 0 , MODE_ASCEND ); // Отсортируем по размеру лота
// Работа с полученными данными
Comment ( "Самый старый Buy лот: " , BPosMass[ 0 ],
"\nПоследний Buy лот: " , BPosMass[b],
"\nПредпоследний Buy лот: " , BPosMass[b- 1 ]
);
} // end Buy
// Sell
if (s> 0 ) { // Если он не пустой и больше двух элементов - [0], иначе будет ошибка: "Выход за пределы массива"
ArraySort (SPosMass, WHOLE_ARRAY , 0 , MODE_ASCEND ); // Отсортируем по размеру лота
// Работа с полученными данными
Comment ( "Самый старый Sell лот: " , SPosMass[ 0 ],
"\nПоследний Sell лот: " , SPosMass[s],
"\nПредпоследний Sell лот: " , SPosMass[s- 1 ]
);
} // end Sell
// Конец функции OnTick()
}
Ardından şu şekilde uygulayın: Toplamda kaç konum olduğunu sayın ve üçten azsa diziye erişmeyin, fazlaysa diziyi okuyun ve ondan veri alın.
Diziden çıkış, yazma sırasında değil, okuma sırasında gerçekleşir.
Diziden çıkış, yazma sırasında değil, okuma sırasında gerçekleşir.
Hayır. Var olmayan bir dizi dizinine erişim sırasında.
Peki, ne yazdım?
2017.01 . on üç 12 : 51 : 14.372 2017.01 . 05 16:30:00 martin GBPUSD , M5 : MyArray [CountSiparişler][ 0 ] 0.02
2017.01 . on üç 12 : 51 : 14.372 2017.01 . 05 16:25:00 martin GBPUSD,M5 : MyArray [ Sipariş Sayısı][ 0 ] 0.01
CountOrders sabittir ve parti değişir. Böyle olmamalı ama başka yolu yok.
ideal olarak MyArray[CountOrders][ OrderLots() ] girişi
sonucu vermek için MyArray[0][0.01] MyArray[1][0.01]
ama bu µl'de çalışmıyor
peki, ve sonra bir şekilde işlevden akışa çıkarılır2017.01 . on üç 12 : 51 : 14.372 2017.01 . 05 16:30:00 martin GBPUSD , M5 : MyArray [CountSiparişler][ 0 ] 0.02
2017.01 . on üç 12 : 51 : 14.372 2017.01 . 05 16:25:00 martin GBPUSD,M5 : MyArray [ Sipariş Sayısı][ 0 ] 0.01
CountOrders sabittir ve parti değişir. Böyle olmamalı ama başka yolu yok.
ideal olarak MyArray[CountOrders][ OrderLots() ] girişi
sonucu vermek için MyArray[0][0.01] MyArray[1][0.01]
ama bu µl'de çalışmıyor
Yapılar size yardımcı olacaktır. Gerekli alanları içeren bir yapı oluşturursunuz, bu tür yapıların bir dizisini bildirirsiniz , açılış saatine göre bir döngüde sipariş verileriyle doldurursunuz ve sonra istediğinizi ararsınız. Yapının alanlarını indekse göre kontrol eder ve ihtiyacınız olan değerle karşılaştırırsınız. İndeks sadece açılış saatine göre siparişin seri numarasını gösterecek ve yapı alanları bu özel sipariş için ihtiyacınız olan tüm verileri içerecektir.
Öyle bir lanet şeyimiz var ki
{
int Ticket;
double orderopenprice;
int ordertype;
double profit;
double stoploss;
double lot;
};
myorder orders[];
int i;
void CalcOrders()
{
for (i= OrdersTotal ()- 1 ; i>= 0 ; i--)
{
if (( OrderSelect (i, SELECT_BY_POS , MODE_TRADES )) && ( OrderSymbol ()== Symbol ())
&& ( OrderMagicNumber ()==Magic) && ( OrderType ()< 2 ))
orders[i].Ticket= OrderTicket ();
orders[i].lot= OrderLots ();
orders[i].orderopenprice= OrderOpenPrice ();
orders[i].ordertype= OrderType ();
orders[i].profit= OrderProfit ();
orders[i].stoploss= OrderStopLoss ();
}
}
Örneğin, siparişin 5. lotunu çıkarmak ve üçüncü lot ile karşılaştırmak istiyorum.
açık fiyatı toplayın ve pozisyon sayısına bölün
bunun için girişin kendisine komutlar şeklinde ihtiyacınız var
Öyle bir lanet şeyimiz var ki
{
int Ticket;
double orderopenprice;
int ordertype;
double profit;
double stoploss;
double lot;
};
myorder orders[];
int i;
void CalcOrders()
{
for (i= OrdersTotal ()- 1 ; i>= 0 ; i--)
{
if (( OrderSelect (i, SELECT_BY_POS , MODE_TRADES )) && ( OrderSymbol ()== Symbol ())
&& ( OrderMagicNumber ()==Magic) && ( OrderType ()< 2 ))
orders[i].Ticket= OrderTicket ();
orders[i].lot= OrderLots ();
orders[i].orderopenprice= OrderOpenPrice ();
orders[i].ordertype= OrderType ();
orders[i].profit= OrderProfit ();
orders[i].stoploss= OrderStopLoss ();
}
}
Örneğin, siparişin 5. lotunu çıkarmak ve üçüncü lot ile karşılaştırmak istiyorum.
açık fiyatı toplayın ve pozisyon sayısına bölün
bunun için girişin kendisine komutlar şeklinde ihtiyacınız var
Döngü indeksi i herhangi bir siparişe atıfta bulunduğundan ve sadece ihtiyacınız olanları değil, fonksiyonda dizinin boyutundan sorumlu olacak bir değişken (örneğin, n=0;) bildirmeniz gerekir. Döngü içinde, kontrolleri geçtikten sonra, bu değişkenin değerini artırın, dizinin boyutunu bu değişkenin değeri kadar artırın ve zaten n-1 dizinindeki yapı alanlarını doldurun: siparişler[n-1].xxx =XXX;
OrdersTotal() işleviyle siparişleri sıralarken neden -1 yazdıklarını söyleyin.
Örnek: for (i=OrdersTotal()-1 ;i>=0; i--)
neden sadece OrdersTotal() değil?
Bu fonksiyondaki emir sayısı 0'dan mı yoksa 1'den mi başlıyor? Yani, bir sipariş varsa, OrdersTotal() 0'a mı yoksa 1'e mi eşit?
Döngü indeksi i herhangi bir siparişe atıfta bulunduğundan ve sadece ihtiyacınız olanları değil, fonksiyonda dizinin boyutundan sorumlu olacak bir değişken (örneğin, n=0;) bildirmeniz gerekir. Döngü içinde, kontrolleri geçtikten sonra, bu değişkenin değerini artırın, dizinin boyutunu bu değişkenin değeri kadar artırın ve zaten n-1 dizinindeki yapı alanlarını doldurun: siparişler[n-1].xxx =XXX;