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

 

Değişkenleri global yapmayı denediniz mi?

 int izmb= 0 , izms= 0 ;

void OnTick ()
   {
   double LB= 0 ,LS= 0 ;
   int b= 0 ,s= 0 ;
   
   for ( int i= 0 ; i< OrdersTotal (); i++)
      {    
       if ( OrderSelect (i,SELECT_BY_POS,MODE_TRADES))
         { 
         if (OrderSymbol()== Symbol ())
            { 
             if (OrderType()==OP_BUY)             
               {  
               LB+=OrderLots();
               b++; 
               }                                         
             else if (OrderType()==OP_SELL)        
               {
               LS+=OrderLots();
               s++;
               } 
            }
         }     
      }
   if (izmb!=b || izms!=s)
      { 
      izmb=b;
      izms=s 
           // далее идут условия для открытия ордера.
      }
 
scomoroh :

Danışmanın girişini arama koşullarının her onay işaretiyle değil, yalnızca bir sonraki siparişin başka bir danışman tarafından veya manuel olarak açılması veya kapatılması durumunda (işlemciye fazladan yük olmaması için) kontrol edildiğine dair bir fikir vardı. Bu nedenle, her tik ile sipariş sayısının yazışmasını kontrol etmek gerekir.

Statik bir değişken - statik kullanmak mümkün mü? Program bu formda çalışacak mı?

Alternatif olarak, en basit ve en kolay koşul

OnTrade() , mt5 ile mt4 için bir analogdur

 void OnTrade ()
 {
  ... // сюда код, который будет работать только по изменению ситуации по счёту: открытие/закрытие позиций, установка/удаление ордеров
 }

static _OTotal = - 1 ;
static _HTotal = - 1 ;
int OT= OrdersTotal ();
int HT= OrdersHistoryTotal ();
   if (OT!=_OTotal || HT!=_HTotal) // если изменилось - выполняем
   {
     OnTrade (); // здесь дёргаем текущую ситуацию на счёте и заполняем структуры
     _OTotal= OrdersTotal (); // запомним текущее количество
     _HTotal= OrdersHistoryTotal (); // запомним количество в истории
   }
 
ANDREY :

Cevap için teşekkürler. Yazdığın her şeyi anladın. Ama benim sorunum açısından yazılanların anlamını anlamadım.

Kodumdaki yatay iki boyutlu bir dizi ile, 0 veya 1 dizininde 2 satır ve 0 ila 30 dizinlerinde sütunlar olduğunda kastediyorum.   [0]   [0],   [0]   [1],   [0]   [2], ... [0]   [30] İkinci boyut şu şekilde gösterilir:   [1]   [0],   [1]   [1],   [1]   [2], ... [1]   [otuz]  

Kodumdaki dikey iki boyutlu bir dizi ile, 0 ila 30 dizinlerinde 31 satır ve 0 ve 1 dizinlerinde 2 sütun olduğunda kastediyorum.   [0]   [0],   [1   [0],   [2]   [0], ... [30]   [0] İkinci boyut şu şekilde gösterilir:   [0]   [1],   [1]   [1],   [2]   [1], ... [30]   [1]  

Kodumu uygularsanız, dizi dikey olarak doldurulacaktır. ArraySort() işlevi diziyi olması gerektiği gibi sıralayacaktır .

SORU ArrayFill() işlevi neden çalışmıyor? Sonuçta, yirminci dakikada dizinin ilk boyutunu (31 eleman) aynı 0,5555 değerlerle doldurmasını istedim.
Yardım için teşekkürler.

MQL4, en fazla 4 boyutlu dizilerle çalışabilir. Bu nedenle arr[31][31] bir hatadır. Dizi, arr[][4] değerinden büyük olamaz. Aynı zamanda, ilk boyut MQL ile değil, ne ile sınırlıdır, kesin olarak bilmiyorum. Belki biri açıklar.

ArrayFill() işlevi çalışacaktır , ancak arr[3][2] dizisindeki öğe sayısının 6 olacağını anlamanız ve bu işleve ilk boyutun boyutuna göre 3 değil 6 yazmanız gerekir. .

 

4D boyut: dizi[][][][] veya dizi[,,,].

Aynı zamanda son üç ölçünün ölçüleri anons esnasında belirtilmeli ve rijit bir şekilde sabitlenmelidir. Ve ilki gelecekte atlanabilir ve değiştirilebilir:

 int arr[, 100 , 200 , 500 ];

iki boyutlu bir dizi örneğinde dizideki veriler aşağıdaki gibi düzenlenmiştir:

 int arr[ 2 , 5 ]={ 0 , 1 , 2 , 3 , 4 ,  - в нулевом элементе первого измерения 
               5 , 6 , 7 , 8 , 9 }; - в первом элементе первого измерения

Sıralama, tüm yatay sıralamayı birinci boyuta göre hareket ettirir,

ve ArrayFill() bir öğeden diğerine, örneğin 3'ten 8'e kadar doldurur.

İlk boyut boyunca bazı yatay değerleri doldurmak istiyorsanız, verinin nasıl yerleştirildiğini bilerek doldurmanın başlangıcını ve sonunu kendiniz kontrol etmelisiniz.

Örneğin, ilk boyutun sıfır öğesinin tüm cetveli:

 int value= 5 ;
int index= 0 ;
ArrayFill (arr, index* ArrayRange (arr, 1 ), ArrayRange (arr, 1 ), value); 

Sadece bir sıfır ise, o zaman şöyle:

 ArrayFill (arr, index* ArrayRange (arr, 1 ), 1 , value); 

Çok sayıda sıfır eleman varsa, o zaman bir döngü ve basit bir atama.


Mnogabukav, muhtemelen, net bir şekilde açıklamadı ... Baskıyı kullanın, döngüde olan her şeyi şu şekilde yazdırın ve farkındalık gelecektir. Bu yüzden daha hızlı öğrenin.

printf benim arkadaşım!

 
Alexey Viktorov :

MQL4, en fazla 4 boyutlu dizilerle çalışabilir. Bu nedenle arr[31][31] bir hatadır. Dizi, arr[][4] değerinden büyük olamaz. Aynı zamanda, ilk boyut MQL ile değil, ne ile sınırlıdır , kesin olarak bilmiyorum. Belki biri açıklar.


Ve ilk boyut (yani satır sayısı) kaç tane ile sınırlıdır? Çok boyutlu bir dizide MQL4'ün izin verdiği maksimum satır sayısı nedir?

 

Dört boyutun hepsinin bir sınırlaması olduğunu düşünüyorum: INT_MAX

Yapı hakkında.

iki boyutlu:

yapısında, öğelerin şu şekilde düzenlendiği tek boyutlu bir diziyi temsil eder: önce ilk satır, sonra ikinci, sonra üçüncü.

3 BOYUTLU:

3D olarak da. Bu, ilk sayfanın satırlarının birbiri ardına, ardından ikincisinin, ....

Neden tek boyutlu? Bilgisayarın belleğindeki dizi için arka arkaya birkaç hücre tahsis edildiğinden, her şey sırayla yazılır: satır 00 + satır 01 + satır 02 + satır 10 + satır 11 ....


Ve dördüncü bir boyut eklemek için başka bir olasılık daha var - üç boyutlu dizilerden oluşan yaprak paketleri.

Program sırasında sadece satır sayısını değiştirebilirsiniz. Tüm çizgiler, sütunlar, sayfalar ve paketler yapıyı anlamak için birer gelenektir. Aslında boyutlar bizim alanımızda değil, onlar sadece boyutlardır.

Alexei'nin dediği gibi:

Alexey Viktorov :

  sütun ...   yerleştirildi ... yatay, çünkü kanepede yatarken ona bakıyorum ... ... ...

 
Alexey Viktorov :

nota dikkat ettin mi

Dizi Doldurma

Çok boyutlu bir dizi, ArrayFill() işlevi tarafından işlendiğinde tek boyutlu olarak kabul edilir, örneğin dizi[2][4], dizi[8] olarak değerlendirilir, bu nedenle bu diziyle çalışırken dizini belirtmeye izin verilir. Böylece, dizi[2][4] için ArrayFill(array, 5, 2, 3.14) çağrılması, dizi[1][1] ve dizi[1][2] değerini 3.14 ile dolduracaktır.


ArrayFill() dışında her şeyi anladım.

1. Bir dizi tanımladığımda double LoY[31][31]; Esasen 31 satıra 31 sütun olan bir tablo oluşturuyorum. 2B (4B değil) bir dizi oluşturdum ancak henüz doldurmadım.

2. Kodun devamında, dizinin her bir öğesini Bid değeriyle dolduruyorum. 2 seçenekle doldurabilirim
a) LoY[31][0]=Teklif; - 31 satırı ve dizinin ilk sütununu Bid değerleri ile dolduruyorum. Ve ikinci boyut (dizin 1'deki sütun varsayılan olarak 0 ile doldurulur, çünkü onu ben doldurmam. Dolayısıyla, bu versiyonda, sahip olduğum ilk boyut 31 dolgulu öğeden ve ikincisi 1'den oluşuyor.

b) LoY[0][31]=Teklif - 31 sütunu ve dizinin ilk satırını değerlerle dolduruyorum   Teklif etmek   . Ve ikinci boyut (dizin 1'deki satır, varsayılan olarak 0 ile doldurulur, çünkü onu doldurmam. Böylece, bu versiyonda, ikinci boyut 31 dolgulu öğeden ve ikincisi 1'den oluşur.

ArraySort() , iki boyutlu bir diziyi yalnızca ilk boyuta göre sıralar. Bu nedenle, birinci boyutta 31 satır olan a) seçeneğini sıralayacak ve 1 satır sıralanamadığı için birinci boyutta sadece 1 satır bulunan b) seçeneğini sıralamayacaktır.
Şimdi   ArrayFill() İki boyutlu bir dizinin gerekli elemanlarına gerekli değerleri atamadan önce, iki boyutlu bir diziyi tek satıra çeker. Yani, LoY[31][31] dizimi 961 eleman boyutunda tek bir satıra çekmesi gerekecek. Bu çok uzun bir satırdır ve öğelerin çoğu gereksiz olacaktır.

Bu nedenle, LoY[31][2] (seçenek a)) veya LoY[2][31] (seçenek b)) dizisini yapacağız.

nasıl olduğu açık     ArrayFill()   b) seçeneğini 1 satıra çekecektir. İkinci satır, ilk satırın ilk ve son elemanından sonra LoY[0][31] ArrayFill() 'deki dizinin ilk satırına katılır.   devam etmek   LoY[0][32] ve bitiş   LoY[0][62] Ve ArrayFill() fonksiyonundaki dizi elemanlarının değerleri indeks sıfırdan 31'e kadar aşağıdaki sıraya göre gidecek dizi elemanları fiyat değerleri ile doldurulacak ve indeks 32'den sonuna kadar bunlar 0 ile doldurulacaktır.    

SORU. Ve ArrayFill() a) seçeneğini 1 satıra nasıl çekecek? Sonuçta, bu sürümde 28 satır var. Ve eğer bir satır ise, dizi elemanlarının değerleri hangi sırayla girecek? ArrayFill() onları tek boyutlu bir diziye dönüştürdükten sonra iki boyutlu dizimin öğelerini yazdırmak için Print()'i kullanabilir miyim? Bu işlevin kendisi herhangi bir değer döndürmez ve bu nedenle Print(), içine eklenirse onu yazdırmaz.

Yardım için teşekkürler.

 

Burada bir şey yaptım ... zaten bir utanç

devamında, dizinin her bir öğesini Bid değeriyle dolduruyorum. 2 seçenekle doldurabilirim
a) LoY[31][0]=Teklif; - 31 satırı ve dizinin ilk sütununu Bid değerleri ile dolduruyorum. Ve ikinci boyut (dizin 1'deki sütun varsayılan olarak 0 ile doldurulur, çünkü onu ben doldurmam. Dolayısıyla, bu versiyonda, sahip olduğum ilk boyut 31 dolgulu öğeden ve ikincisi 1'den oluşuyor.

b) LoY[0][31]=Teklif - 31 sütunu ve dizinin ilk satırını değerlerle dolduruyorum   Teklif etmek   . Ve ikinci boyut (dizin 1'deki satır, varsayılan olarak 0 ile doldurulur, çünkü onu doldurmam. Böylece, bu versiyonda, ikinci boyut 31 dolgulu öğeden ve ikincisi 1'den oluşur.

ArraySort() , iki boyutlu bir diziyi yalnızca ilk boyuta göre sıralar. Bu nedenle, birinci boyutta 31 satır olan a) seçeneğini sıralayacak ve 1 satır sıralanamadığı için birinci boyutta sadece 1 satır bulunan b) seçeneğini sıralamayacaktır.
Şimdi   ArrayFill() İki boyutlu bir dizinin gerekli elemanlarına gerekli değerleri atamadan önce, iki boyutlu bir diziyi tek satıra çeker. Yani, LoY[31][31] dizimi 961 eleman boyutunda tek bir satıra çekmesi gerekecek. Bu çok uzun bir satırdır ve öğelerin çoğu gereksiz olacaktır.

Bu nedenle, LoY[31][2] (seçenek a)) veya LoY[2][31] (seçenek b)) dizisini yapacağız.

nasıl olduğu açık     ArrayFill()   b) seçeneğini 1 satıra çekecektir. İkinci satır, ilk satırın ilk ve son elemanından sonra LoY[0][31] ArrayFill() 'deki dizinin ilk satırına katılır.   devam etmek   LoY[0][32] ve bitiş   LoY[0][62] Ve ArrayFill() fonksiyonundaki dizi elemanlarının değerleri indeks sıfırdan 31'e kadar aşağıdaki sıraya göre gidecek dizi elemanları fiyat değerleri ile doldurulacak ve indeks 32'den sonuna kadar bunlar 0 ile doldurulacaktır.    

SORU. Ve ArrayFill() a) seçeneğini 1 satıra nasıl çekecek? Sonuçta, bu sürümde 28 satır var. Ve eğer bir satır ise, dizi elemanlarının değerleri hangi sırayla girecek? ArrayFill() onları tek boyutlu bir diziye dönüştürdükten sonra iki boyutlu dizimin öğelerini yazdırmak için Print()'i kullanabilir miyim? Bu işlevin kendisi herhangi bir değer döndürmez ve bu nedenle Print(), içine eklenirse onu yazdırmaz.

Yardım için teşekkürler.

Seni anlamak zor. Belki bu açıklamaya yetmez. Soruyu LoY[5][3] dizisiyle, yani 5 satır ve 3 sütunla tekrarlayın.

ArrayFill, orijinal diziyi hiçbir şekilde dönüştürmez. Sadece dizinin işlenmesi, sanki oraya tek boyutlu bir dizi yerleştirilmiş gibi gerçekleşir . İşlev, diziyle gerekli işlemleri gerçekleştirdi ve boyutu bozmadan yuvarlandı.

Belgelere göre, ArrayFill(LoY, 3, 6, 12) işlevi LoY dizisini yalnızca 1 ve 2 dizinli satırları 12 değeriyle dolduracaktır.

LoY[1][0] 12 olacak.

LoY[1][1] 12 olacaktır.

LoY[1][2] 12 olacaktır.

LoY[2][0] 12 olacaktır.

LoY[2][1] 12 olacaktır.

LoY[2][2] 12 olacaktır.

Diğerleri dokunulmadan kalacaktır.

Küçük bir dizi ve anlaşılması kolay sayılarla denemeler yapın. Örneğin 12 ve 8 hangisinin daha fazla olduğunu kolayca fark edeceksiniz. Ve 1.123654 ve 1.123583 daha zor

 
Alexey Viktorov :

ArrayFill , orijinal diziyi hiçbir şekilde dönüştürmez . Sadece dizinin işlenmesi, sanki oraya tek boyutlu bir dizi yerleştirilmiş gibi gerçekleşir. İşlev, diziyle gerekli işlemleri gerçekleştirdi ve boyutu bozmadan yuvarlandı.


Bu, yanlış anlamamı büyük ölçüde azalttı ve anlayışımı artırdı. Şimdi yeni keşfedilen durumu dikkate alarak yazdığım her şeyi yeni bir şekilde analiz edeceğim ....

 
Alexey Viktorov :


Belgelere göre, ArrayFill(LoY, 3, 6, 12) işlevi LoY dizisini yalnızca 1 ve 2 dizinli satırları 12 değeriyle dolduracaktır.

LoY[1][0] 12 olacak.

LoY[1][1] 12 olacaktır.

LoY[1][2] 12 olacaktır.

LoY[2][0] 12 olacaktır.

LoY[2][1] 12 olacaktır.

LoY[2][2] 12 olacaktır.


SORU
Nasıl ve hangi değerler girilmelidir   ArrayFill(), aynı dizinin sarı öğelerini 12 değeriyle doldurmam gerekirse?

SEÇENEK N 1

SEÇENEK N 2


yardım için teşekkürler
Neden: