Döngü Operatörü 'için' soruları - sayfa 4

 

Simon,

Tamam, sadece iyi bir önlem almak için durdurma seviyesini EA'ya eklemeyi deneyeyim.

Ah-ha! USDJPY için Donma Seviyesi 0 ve Durdurma seviyesi 30'dur.

Aracının 5 basamaklı olması nedeniyle 30'un 3'ü temsil ettiğini varsayıyorum. MODE_SPREAD kullanmayı denedim ve 20 tane aldım. Açıkçası USDJPY'deki spread 20 değil ;) 2.0. 2 pipin 20 puana eşit olduğu da söylenebilir.

Teşekkür ederim.

 

Sana bir ipucu. . . .

 

Simon,

Bu bir kez daha bir seçim sırası sorunu gibi görünüyor.

OrderClose() işlevi bir siparişi kapatmaya çalışıyor (USDJPY siparişini değil). EURUSD grafiğindeki emri kapatmaya çalışıyor.

OrderPrint() işlevi daha önce yürütülmeden önce seçilmiştir ve amacına açıkça benzemektedir.

Geçersiz fiyatı çevreleyen kırmızı renk YANLIŞ'ı göstermelidir.

USDJPY'yi çevreleyen yeşil renk SAĞ olduğunu göstermelidir.

Bu nedenle, eğer her şey doğruysa, kırmızı daireye odaklanmalı ve OrderClose() işlevinin yürütülmesinden önce sırayı seçmeliyim.

Teşekkür ederim.

 
WhooDoo22 :


Teklif Et ve Sor nedir?

Sor, geçerli simge için bilinen en son satıcının fiyatıdır (fiyat sor).

Teklif, geçerli sembolün bilinen en son alıcı fiyatıdır (teklif fiyatı, teklif fiyatı).

Kapatmanın neden başarısız olduğunu zaten biliyorsunuz. . . . sadece bir dakika için dikkatlice düşünün.


Kodunuza bakın, siparişi kapatmak için hangi fiyatı kullanıyorsunuz?

 

Simon,

Talep/Teklif, geçerli sembol için bilinen en son satıcı/alıcı fiyatıdır.

EA'nın siparişi kapatmak istediği fiyat EURUSD sembol fiyatıdır.

EA, siparişini kapatmak için neden USDJPY grafiğine yerleştirilmeye bağımlı? OrderSelect() işlevinin bilet numarasını seçmesi amaçlanmıştır ve bilet numarası bir kez seçildikten sonra EA,

Görünüşe göre, EA, bu konudaki siparişleri kapatmak için USDJPY sembol tablosunda olmalıdır.


Az önce söylediğim her şeyi kazıyın.

Çözüm bu. Hata üçüncü parametrededir. Sembolü belirtmeyi ve ardından ask/bid değişkenini parametresine yerleştirmeyi düşünüyorum (OrderClose() işlevinin konum 3. parametresi). Bu, düşüncedeki tüm belirsizlikleri ortadan kaldırmalıdır.

Teşekkür ederim.

 
WhooDoo22 : .

Çözüm bu. Hata üçüncü parametrenin içindedir. Sembolü belirtmeyi ve ardından ask/bid değişkenini parametresine yerleştirmeyi düşünüyorum (OrderClose() işlevinin konum 3. parametresi). Bu, düşüncedeki tüm belirsizlikleri ortadan kaldırmalıdır.

Teşekkür ederim.

Teklif ve Talep , Önceden Tanımlanmış Değişkenlerdir ve YALNIZCA EA'nın açık olduğu mevcut grafikle ilgilidir. EA'nın üzerinde bulunduğu grafikten farklı bir Bid veya Ask sembolü istiyorsanız, Bid ve Ask önceden tanımlanmış değişkenlerini kullanamazsınız. Yine de MarketInfo() kullanabilirsiniz ;-)
 

Simon,

Hata, OrderClose() işlevinin üçüncü parametresindedir çünkü ;) Ask/Bid, geçerli simge için bilinen en son satıcı/alıcı fiyatıdır. "Geçerli sembol için" , EA'nın yerleştirildiği mevcut grafik anlamına geliyorsa, bu biraz kafa karıştırıcı olabilir. MQL4'ün bir süredir var olduğunu ve kendine özgü çizim ve temsil yöntemlerine sahip olduğunu hatırlamalıyım.

Çözüm, Ask/Bid önceden tanımlanmış değişkenlerini aşağıdaki gibi bir alternatifle değiştirmektir.

 // solution 1.

MarketInfo( "USDJPY" ,MODE_BID);

// solution 2.

MarketInfo( "USDJPY" ,MODE_ASK);

Buna ne dersin?


Bu EA'nın USDJPY siparişinin bilgilerini yazdırabilen ve yerleştirildiği tablodan bağımsız olarak kapatabilen bir sürümünü ekledim. USDJPY SL ve TP siparişini değiştirip değiştirmediğini henüz doğrulamadım, ancak doğrulama üzerine onaylayacağım. EA, cadının çözülmesi zor olmaması gereken son bir hata üretir. Şu anda bunun üzerinde çalışıyorum. İşte hata okumanın bir anlık görüntüsü:

geçersiz bilet hatası

Teşekkür ederim.

Dosyalar:
 
WhooDoo22 :

Simon,

Hata, OrderClose() işlevinin üçüncü parametresindedir çünkü ;) Ask/Bid, geçerli simge için bilinen en son satıcı/alıcı fiyatıdır. "Geçerli sembol için" , EA'nın yerleştirildiği mevcut grafik anlamına geliyorsa, bu biraz kafa karıştırıcı olabilir. MQL4'ün bir süredir var olduğunu ve kendine özgü çizim ve temsil yöntemlerine sahip olduğunu hatırlamalıyım.

Çözüm, Ask/Bid önceden tanımlanmış değişkenlerini aşağıdaki gibi bir alternatifle değiştirmektir.

Buna ne dersin?


Bu EA'nın USDJPY siparişinin bilgilerini yazdırabilen ve yerleştirildiği tablodan bağımsız olarak kapatabilen bir sürümünü ekledim. USDJPY SL ve TP siparişini değiştirip değiştirmediğini henüz doğrulamadım, ancak doğrulama üzerine onaylayacağım. EA, cadının çözülmesi zor olmaması gereken son bir hata üretir. Şu anda bunun üzerinde çalışıyorum. İşte hata okumanın bir anlık görüntüsü:


Teşekkür ederim.

Ve şimdi kodunuzun sınırlarını görüyorsunuz. . . artık bir USDJPY emriniz yok, bu yüzden while'ınız emri 0 pozisyonunda buluyor ve bu USDJPY değil, sonra bir sonrakini 1'de buluyor ve USDJPY değil, o zaman pozisyon 2'ye bakıyor ve OrderSelect() başarısız oluyor, bu süre sona eriyor ancak kodun geri kalanı yürütülür, bu başarısız bir OrderModify(), başarısız bir OrderPrint(), başarısız bir OrderType() ve başarısız OrderClose() verir. . . bu GetLastError() orada kendi başına ne yapıyor?
 

Simon,

Döngü 'while' operatörü şu şekilde gerçekleştirilir: Eğer ifade doğruysa, operatör, ifade yanlış olana kadar yürütülür. Eğer ifade yanlış ise kontrol sonraki operatöre verilecektir.

Aşağıdaki SRC kutusundaki kodun amacı aşağıdakileri yapmaktır:

'i' değişkeni ( OrderSelect() işlevi içinde bulunur) USDJPY bilet pozisyon numarası DEĞİLDİR VE sipariş sembolü USDJPY DEĞİLDİR, 'i' değişkeni, 'i' değişkeni USDJPY bilet pozisyon numarası VE sipariş sembolü USDJPY olana kadar artırılır. 'while' döngüsü yanlış olduğunda, kontrol daha sonra aşağıdaki kod satırına iletilir.

Görsel yardım için 'while' başlığını ve gövdesini sağladım.

 while ( OrderSelect (i,SELECT_BY_POS,MODE_TRADES)== true && OrderSymbol()!= "USDJPY" )

i++;

Şu anda döviz çiftinde bir bilet bulunmasa bile 'while' döngüsünün USDJPY döviz çiftindeki bir bileti nasıl bulduğunu anladığınıza inanıyorum ama ;) Korkarım anlamıyorum.

Bir USDJPY tablosunda yerleştirilecek bir sipariş yoksa, 'while' döngüsü USDJPY tablosunda bir bileti nasıl bulabilir?

0 konumunda sırayı bulmak için bir şeyler yazdığına inanıyorum. Bunu açıklayabilir misin ya da çalışma için bir bağlantı sağlayabilir misin?

Teşekkür ederim.

 
WhooDoo22 :


Şu anda döviz çiftinde bir bilet bulunmasa bile 'while' döngüsünün USDJPY döviz çiftindeki bir bileti nasıl bulduğunu anladığınıza inanıyorum ama ;) Korkarım anlamıyorum.

Bir USDJPY tablosunda yerleştirilecek bir sipariş yoksa, 'while' döngüsü USDJPY tablosunda bir bileti nasıl bulabilir?

0 konumunda sırayı bulmak için bir şeyler yazdığına inanıyorum. Bunu açıklayabilir misin ya da çalışma için bir bağlantı sağlayabilir misin?

Kendi başınıza kod yazmak istiyorsanız 3 kişinin, hatta 4 kişinin görevini yerine getirmeniz gerekiyor. Gereksinim belgesini hazırlayan kişi, yazılım mühendisi ve test mühendisi. Sözdizimini geriye doğru bilmek ve kod yazabilmek yeterli değildir. . . çözmeye çalıştığınız sorunu ve onu nasıl çözeceğinizi anlamanız ve aynı zamanda gereksinimi karşıladığından emin olmak için kodu nasıl test edeceğinizi de bilmeniz gerekir.

Temel düzeyde bu, kodunuzu satır satır gözden geçirmek ve yapmak istediğinizi yaptığından emin olmak anlamına gelir, genellikle bu, her değişken için minimum değerlerinden tipik değerlerden maksimum değere giden bir dizi değerle olur.


Bunu while döngüsü ile yapalım. . .

Bir int değişkenini, değerini ayarlamadan bildirdiğinizde, 0 başlangıç değerine sahiptir, bu nedenle i bildirdiğinizde (neden daha açıklayıcı bir değişken adı kullanmıyorsunuz?) 0 değerine sahiptir, bu nedenle ilk kez bu süre boyunca i döngüsü 0'dır, bu nedenle OrderSelect() 0 konumundaki siparişi seçmeye çalışır, bu işe yararsa OrderSymbol() çağrınız 0 konumundaki Sipariş için doğru sembol adını döndürür ve "USDJPY" değilse, o zaman ifade ( OrderSymbol() != "USDJPY" ), OrderSelect() true ise ve sembol kontrolü true , true ve true = true ve sonraki kod satırı ( bu while döngüsü içindeyse ) gerçek bir değerle sonuçlanır. Idam edildi.

Şimdi i 1 , OrderSelect() konum 1'deki sırayı seçer, böylece true değeriyle sonuçlanır, sembol kontrolü USDJPY'nin bir sembolünü bulmaz, bu nedenle true , tekrar true ve true = true döndürür, böylece i++ yeniden yürütülür

Şimdi i 2 ,
OrderSelect() , 2. pozisyonda Sırayı seçmeye çalışır ancak başarısız olur . . . 0 ve 1 konumlarında yalnızca 2 Açık Emir vardır, bu nedenle OrderSelect() false döndürür, OrderSymbol() ne yapar? geçerli bir Sipariş seçili değil. . . ancak garip bir nedenle true dönse bile, OrderSelect() zaten false , false ve true = false döndürdü. . . while döngüsü sona erdi ve ben 2'ye ayarlandı

Şimdi, i değerinin 2 olduğunu göz önünde bulundurarak kodun geri kalanını çalışın. . .