Nasıl kodlanır? - sayfa 305

 
gmailer:
^ Teşekkürler - bu olabilir. Alt ve üst kısımlardaki o "yeşil ve pembe noktalardan" nasıl kurtulacağınızı biliyor musunuz?

Üzgünüm - aslında bu tür noktaların bulunduğu diğer Stoch'uma bakıyordum. İlk mesajıma cevap olarak önerilen tamamdı. Teşekkürler!

 

Belki sadece bir tavsiye:

Sorunsuz çalışan bir "brick" (bir işlev , bir pasaj, kodun bir parçası) varsa, onu değiştirmeyin. Fonksiyonlar iyidir çünkü girdilerini değiştirebilirsiniz ve girdilere göre çalışırlar. Ve fonksiyonları her türlü durumda test ettikten sonra, düzgün çalışıp çalışmadığını düşünmeniz gerekmez. Bu şekilde, hata ararken bakmanız gereken kodu daraltabilirsiniz (ve bu, geliştirme süresini son derece hızlandırabilir)

crsnape@btinternet.com:
Merhaba mladen Size tamamen katılıyorum, sağladığınız GetLots işlevi olması gerektiği gibi çalışıyor; Kodumun bir parçası olarak test ettim ve işe yaradı.

Bunda değişiklikler yaptım çünkü kazanmama veya kaybetmeme bağlı olarak risk peramterimi değiştirmek istiyorum. Ek para yönetimi kurallarını içeren mevcut kodu temel olarak (veya yine de denedim) detaylandırdım.

Dürüstçe söyleyebilirim ki kodum gizli değil; Eminim birçok kişi benim yapmaya çalıştığım şeyi kodda düşünmüş ve uygulamıştır; ama sanırım bir mahremiyet unsuru var çünkü kişisel olarak onu geliştirmek için çok zaman harcadım.

Kodumu gözden geçirmeye devam edeceğim, bir şeyleri sıfırdan öğrenmekten ve yapmaktan gurur duyduğum için açıkçası sorunları kendim denemek ve çözmek istiyorum.

Ama son paragrafınızı anlıyorum; Bir 'Risk' değişkeni kullanacağım ve bu riski bir fonksiyonun çıktısına göre değiştireceğim.

Her neyse, tekrar cevap verdiğiniz için teşekkürler, bu forum dürüst olmak gerekirse siz olmadan aynı olmazdı; Bana sayısız kez yardım ettin.

Şerefe :-)
 

Emin olmadığım bir şey, işlev parantezleri ve içinde ne olduğu.

Bir fonksiyon içine fonksiyon yazarsam, bu fonksiyon adını parantez içine almam gerekir mi?

Örneğin, LastOpenTicket() işlevim varsa ve bunlar GetLots adlı bir işlev içinde çağrılırsa, parantez içine GetLots (LastOpenTicket()) gibi LastOpenTicket()'i koymam gerekir mi?

Ayrıca () 'yi de oraya koymam gerekir mi? Peki ya LastOpenTicket'i (int numarası, int rakamı, int başka biri), bunların hepsini bu örnekte GetLots Bracket işlevine koyarsa, örneğin GetLots (int number, int digit, int otherone.. ve içindeki diğer değişkenler) fonksiyon vb?)

 

...

1. {} köşeli ayraç çiftini "başlangıç" ve "bitiş" olarak hayal edin.

2. Mql'de iç içe işlevler yazamazsınız (pascal buna izin verir, ancak mql yapmaz - iç içe işlevler, diğer işlevlerin gövdesi içinde bir işlev bildirir. Buraya bakın: İç içe işlev - Wikipedia, özgür ansiklopedi ). Kodunuzun herhangi bir bölümündeki herhangi bir işleve çağrı yapabilirsiniz.

3. Bir çağrının bu biçimini kullanabilirsiniz (örneğin GetLots (LastOpenTicket()) örneğindeki gibi doğrudan bir çağrı) veya LastOpenTicket()'in dönüşünü bir değişkene atayabilir ve sonra onu GetLots çağrısında bir argüman olarak kullanabilirsiniz. ()

crsnape@btinternet.com:
Emin olmadığım bir şey, işlev parantezleri ve içinde ne olduğu.

Bir fonksiyon içine fonksiyon yazarsam, bu fonksiyon adını parantez içine almam gerekir mi?

Örneğin, LastOpenTicket() işlevim varsa ve bunlar GetLots adlı bir işlev içinde çağrıldıysa, parantez içine GetLots (LastOpenTicket()) gibi LastOpenTicket()'i koymam gerekir mi?

Ayrıca () 'yi oraya da mı koymam gerekiyor? Peki ya LastOpenTicket'i (int numarası, int rakamı, int başka biri), bunların hepsini bu örnekte GetLots Bracket işlevine koyarsa, örneğin GetLots (int number, int digit, int otherone.. ve içindeki diğer değişkenler) fonksiyon vb?)
 

Bu ikisi arasındaki fark nedir? var mı?

double GetLots (int numarası, int çağrısı, int özel çağrısı, int sırası)

{

ve..

çift GetLot ()

{

int numarası;

int çağrı;

int özel çağrı;

int sırası;

?

 

...

Birincisi, argümanları kabul eden bir fonksiyondur.

İkincisi, argüman içermeyen bir işlevdir, bu nedenle "sayı", "çağrı", "özel çağrı" ve "sıra" değerlerini işlev gövdesinin dışında değiştiremezsiniz.

İşlevleri bildirmekle ilgili bazı daha yararlı bilgiler şu başlıkta bulunabilir: https://www.mql5.com/en/forum/173005

crsnape@btinternet.com:
Bu ikisi arasındaki fark nedir? var mı?

double GetLots (int numarası, int çağrısı, int özel çağrısı, int sırası)

{

ve..

çift GetLot ()

{

int numarası;

int çağrı;

int özel çağrı;

int sırası;

?
 

Son birkaç gündür işlevlerimle uğraşıyorum ve hala boş sonuçlar alıyorum. Saçımı resmen yoluyorum.

Önerdiğiniz gibi RiskSize'ı hesaplamak için işlevi değiştirdim (şimdi daha iyi bir sistem olduğunu kabul ediyorum) ve bunu GetLots işlevimde kullandım. Budur:

//--- Uzun pozisyonlar için lot hesaplama işlevi

çift GetLotsLong (çift SLDistanceLong)

{

Yenileme Oranları();

çift MinLot, MaxLot, LotStep;

double LotsLong = 0;

int ÇokBasamak = 2;

int Risk = GetRiskLong (RiskLong);

MinLots = NormalizeDouble(MarketInfo(Symbol(), MODE_MINLOT), 2); // LotStep'e uyum sağlamak için lotların normalleştirilmesi gerekiyor.

MaxLots = NormalizeDouble(MarketInfo(Symbol(), MODE_MAXLOT), 2); // Normalleştirme yuvarlamaz, ancak lotun LotStep'ten daha büyük olan herhangi bir bölümünü keser.

LotStep = NormalizeDouble(MarketInfo(Symbol(), MODE_LOTSTEP), 2); // Bu şekilde risk biraz daha küçüktür.

if (MarketInfo(Symbol(), MODE_DIGITS) == 3 || MarketInfo(Symbol(), MODE_DIGITS) == 5) SLDistanceLong *= 10.0;

if (LotAdım == 1.00) LotDigit = 0;

if (LotAdım == 0.10) LotDigit = 1;

if (LotAdım == 0.01) LotDigit = 2;

if (AccountBalance() > AccountFreeMargin())

LotsLong = NormalizeDouble(AccountFreeMargin() * (Risk / 100) / (SLDistanceLong * MarketInfo (Symbol(), MODE_TICKVALUE)), LotDigit);

else LotsLong = NormalizeDouble(AccountBalance() * (Risk / 100) / (SLDistanceLong * MarketInfo (Symbol(), MODE_TICKVALUE)), LotDigit);

LotsLong = NormalizeDouble(NormalizeDouble(LotsLong / LotStep, 0) * LotStep, LotDigit);

LotsLong = MathMax(MathMin(LotsLong, MaxLots), MinLots);

dönüş (LotsLong);

}

Ayrıca RiskLong'dan şikayet ediyor - değişken tanımlanmadı. Ancak bu, çağırdığı GetRiskLong işlevi altında tanımlanır.

Gönderdiğim kodla yardımcı olmak zorsa, size gönderebilir miyim?

 

...

Her şeyden önce, uzun ve kısa için ayrı lotlar yapmaya gerek yoktur. Her iki emir türü için de (size önceden verilmiş olan) bir fonksiyon kullanın (hem kısa hem de uzun için lot büyüklüğü hesaplaması tamamen aynı olmalıdır) Farklı bir hesaplama istiyorsanız sadece riski veya zararı durdurma mesafesini değiştirin

Aldığınız hata, işlevler içinde bildirilen değişkenlerin yalnızca işlevler içinde "görünür" olmasıdır. Söylediğiniz ad adında bir değişkene sahip işlevi çağırıyor olmanızın bir önemi yok: yalnızca çağrılan işlev için yereldir, kodun diğer bölümleri onun hakkında "bilmez" ve ona erişemez.

crsnape@btinternet.com:
Son birkaç gündür işlevlerimle uğraşıyorum ve hala boş sonuçlar alıyorum. Saçımı resmen yoluyorum.

Önerdiğiniz gibi RiskSize'ı hesaplamak için işlevi değiştirdim (şimdi daha iyi bir sistem olduğunu kabul ediyorum) ve bunu GetLots işlevimde kullandım. Budur:

//--- Uzun pozisyonlar için lot hesaplama işlevi

çift GetLotsLong (çift SLDistanceLong)

{

Yenileme Oranları();

çift MinLot, MaxLot, LotStep;

double LotsLong = 0;

int Çok Sayısı = 2;

int Risk = GetRiskLong (RiskLong);

MinLots = NormalizeDouble(MarketInfo(Symbol(), MODE_MINLOT), 2); // LotStep'e uyum sağlamak için lotların normalleştirilmesi gerekiyor.

MaxLots = NormalizeDouble(MarketInfo(Symbol(), MODE_MAXLOT), 2); // Normalleştirme yuvarlamaz, ancak lotun LotStep'ten daha büyük olan herhangi bir bölümünü keser.

LotStep = NormalizeDouble(MarketInfo(Symbol(), MODE_LOTSTEP), 2); // Bu şekilde risk biraz daha küçüktür.

if (MarketInfo(Symbol(), MODE_DIGITS) == 3 || MarketInfo(Symbol(), MODE_DIGITS) == 5) SLDistanceLong *= 10.0;

if (LotAdım == 1.00) LotDigit = 0;

if (LotAdım == 0.10) LotDigit = 1;

if (LotAdım == 0.01) LotDigit = 2;

if (AccountBalance() > AccountFreeMargin())

LotsLong = NormalizeDouble(AccountFreeMargin() * (Risk / 100) / (SLDistanceLong * MarketInfo (Symbol(), MODE_TICKVALUE)), LotDigit);

else LotsLong = NormalizeDouble(AccountBalance() * (Risk / 100) / (SLDistanceLong * MarketInfo (Symbol(), MODE_TICKVALUE)), LotDigit);

LotsLong = NormalizeDouble(NormalizeDouble(LotsLong / LotStep, 0) * LotStep, LotDigit);

LotsLong = MathMax(MathMin(LotsLong, MaxLots), MinLots);

dönüş (LotsLong);

}

Ayrıca RiskLong'dan şikayet ediyor - değişken tanımlanmadı. Ancak bu, çağırdığı GetRiskLong işlevi altında tanımlanır.

Gönderdiğim kodla yardımcı olmak zorsa, size gönderebilir miyim?
 
mladen:
Birincisi, argümanları kabul eden bir fonksiyondur.

İkincisi, argüman içermeyen bir işlevdir, bu nedenle "sayı", "çağrı", "özel çağrı" ve "sıra" değerlerini işlev gövdesinin dışında değiştiremezsiniz.

İşlevleri bildirmekle ilgili bazı daha yararlı bilgiler şu başlıkta bulunabilir: https://www.mql5.com/en/forum/173005

Bunun için teşekkürler. Yani GetLots adlı bir işlevden GetRisk adlı bir işlevi çağırıyorsam, değerler GetLots işlevinin dışında hesaplandığından GetRisk işlevinin değişkenlerini GetLots'un parantezlerine (...) koymam gerekir mi?

 

...

Şu yolu deneyeyim:

2 soru (hesabın mevcut $ durumunu bildiğimizi varsayarak):

soru 1: (bilmiyorum) pip stop loss ile riske (bilmiyorum) razıyım. Parti büyüklüğüm ne olmalı?

soru 2: 100 pip stop loss ile %1 risk almaya hazırım. Parti büyüklüğüm ne olmalı?

1. sorunun cevabının imkansız olduğu aşikar çünkü riske atmaya hazır olduğum risk yüzdesini ve kullanacağım zararı durdurmayı bilmiyorsunuz. Ama ikinci örnekte tüm bunları bildiğiniz için parti büyüklüğünü hesaplamanız mümkün. Şimdi bunlar argümanlar: rsik% ve stop loss'un değişebileceğini tahmin ettiğimiz için, bunları, fonksiyon her çağrıldığında fonksiyona "söylenecek" değişken argümanlar olarak parti büyüklüğü hesaplamasına sağlıyoruz.

Umarım bu, işlevlerdeki argümanların (parametrelerin) ne için olduğunu açıklar. Her fonksiyon aynı prensipte çalışır: hesaplamanın bir kısmının değişebileceğini tahmin ediyorsanız, bunu fonksiyona bir argüman olarak koyun.

İşte bazı kodlama işlevleri örneği: https://en.wikipedia.org/wiki/Function_%28computer_science%29

crsnape@btinternet.com:
Bunun için teşekkürler. Yani GetLots adlı bir işlevden GetRisk adlı bir işlevi çağırıyorsam, değerler GetLots işlevinin dışında hesaplandığından GetRisk işlevinin değişkenlerini GetLots'un parantezlerine (...) koymam gerekir mi?
Neden: