MQL4 ve MQL5 ile ilgili herhangi bir acemi sorusu, algoritmalar ve kodlar hakkında yardım ve tartışma - sayfa 69

 
Alexey Viktorov :
Örneğin burada https://docs.mql4.com/en/basis/preprosessor/compilation
Teşekkür ederim!
 
trader781 :

ş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 BPosMass[];
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.

 
Vitaly Muzichenko :


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.
 
Vitalie Postolache :
Hayır. Var olmayan bir dizi dizinine erişim sırasında.
Peki, ne yazdım?
 
Vitaly Muzichenko :
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ır
 
trader781 :

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

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 ardından canınız ne isterse onu 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.
 
Artyom Trishkin :
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

struct myorder
{
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

 
trader781 :

Öyle bir lanet şeyimiz var ki

struct myorder
{
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?

 
Artyom Trishkin :

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;

Madem bir sürü siparişimiz var, neden doğru olanı alıp hemen çekemiyoruz? (gerekli) ve onlarla ne istersen yap? örneğin sipariş (i-4)