Nasıl kodlanır? - sayfa 304

 

...

1. Genel olarak. hayır, kontrol etmenin bir anlamı yok çünkü çoğunlukla "dengelemek" için hareketli bir ortalama için ihtiyacınız olandan çok daha fazla bara sahip olacaksınız. Bu eski bir hata değil, ama geçmişte kaç tane bar olduğunu gösteren basit bir kontrol.

2. Evet. Unutmayın ki iClose() (buna benzer iOpen(), iHigh() ve iLow()) fonksiyonlardır, Close[],Open,High[],Low[] ise çok, çok daha hızlı basit bir dizidir. değerlere erişim, bu nedenle, işlevin esnekliğine gerçekten ihtiyacınız varsa, erişim dizilerinin hızı ve basitliği üzerinde ağırlık vermeniz gerekir.

zzz:
Merhaba, programlamada yeniyim ama ticarette yeni değilim. Bir süredir hiçbir şey yayınlamadım ve şimdi EA'mı geliştirmeye başladığımdan beri birçok sorum var. İlk önce bir gösterge oluşturmakla başladım ve istediğimi yaptığında daha ileri gideceğim. Bulabildiğim tüm kılavuzları okudum, bu yüzden şimdi kodlamaya geçme zamanım geldi.

Üzgünüm, eğer yanlış bir konuysa - lütfen bu tür soruları nereye göndermem gerektiğini bana bildirin.

Şimdilik muhtemelen 2 temel sorum var, lütfen:

1. MA'ları kullanan birçok göstergede, grafikte kaç çubuk olduğunu kontrol eden çizgiler görüyorum. Öyleyse, eğer MA200'e ihtiyacım varsa ve grafikte sadece 100 bar varsa, o zaman iMA200 işe yarar mı? Bence evet - Kontrol ettim ve herhangi bir MA herhangi bir grafikte sorunsuz çizildi, bu yüzden bunun Metaquotes'un şimdi düzelttiği eski bir hata olduğunu düşünüyorum. Öyleyse, MA çizmek veya iMA işlevini kullanmak için grafikte kaç çubuk olduğunu kontrol etmenin bir anlamı var mı?

2. Kapat ve iClose arasındaki fark nedir? Anladığım kadarıyla, Kapat, yalnızca mevcut grafikteki çubukların kapanışını verebilir ve iClose, herhangi bir döviz çiftinin ve herhangi bir zaman diliminin herhangi bir kapanışını döndürebilir. Ve her iki durumda da, son bir kapalı çubuk elde etmek için [1] indeksini kullanmam gerekiyor. Doğru mu görüyorum?

Teşekkür ederim.
 

MT4 için DoubleStochastic, gerçek DoubleStochastic

Merhaba arkadaşlar - yeni MT4 kullanıcısı.

MT4 için DoubleStochastic göstergesini bulmakta zorlanıyorum. VTT platformunda en sevdiğim göstergeydi. Ve GERÇEK DoubleStochastic'i kastediyorum - orijinal DoubleStochastic'in tamamen farklı bir göstergesi olan Bressert Double Stochastic değil. Ekli dosyaya bakın - Double from VTT, Double from MT4'ten biraz farklı göstergeler verir:

VTT'2 DoubleStochastic'i MT4'e kodlamama yardım edebilecek biri var mı? İşte VTT kodu ve mantığı:

Hızlı %K = ((Bugünün Kapanışı - %K Döneminde En Düşük Düşük) / (%K Döneminde En Yüksek - %K Döneminde En Düşük Düşük)) * 100

Yavaşlama %K = Hızlı %K'nın N-dönem hareketli ortalaması

Çift %K = ((Bugünün Yavaşlaması %K - %K Dönemde En Düşük Düşük Yavaşlama %K) / (%K Dönemde En Yüksek Yüksek Yavaşlama %K - %K Dönemde En Düşük Düşük Yavaşlama %K)) * 100

Çift Yavaşlama %K = Çift %K'nın N-dönem hareketli ortalaması

%D = Çift Yavaşlatmanın 3 periyotlu basit hareketli ortalaması %K

ve kodun kendisi:

St:= Mov(((C-LLV(L,K))/(HHV(H,K)-LLV(L,K)))*100,Sl,Mt);

DSt:= Mov(((St-LLV(St,K))/(HHV(St,K)-LLV(St,K)))*100,Sl,Mt);

DStD:= Mov(DSt,D,MtD);

MT4 bilen var mı?

VTT'nin versiyonuna o kadar alıştım ki diğerini kullanamıyorum.

 

...

gmailer

Burada bir çift stokastik yayınlandı: https://www.mql5.com/en/forum/177239/page28 (stokastik'in tüm sürümlerini tek bir yerde tutmak için)

bence aradığın şey bu

gmailer:
Merhaba arkadaşlar - yeni MT4 kullanıcısı.

MT4 için DoubleStochastic göstergesini bulmakta zorlanıyorum. VTT platformunda en sevdiğim göstergeydi. Ve GERÇEK DoubleStochastic'i kastediyorum - orijinal DoubleStochastic'in tamamen farklı bir göstergesi olan Bressert Double Stochastic değil. Ekli dosyaya bakın - Double from VTT, Double from MT4'ten biraz farklı göstergeler verir:

VTT'2 DoubleStochastic'i MT4'e kodlamama yardım edebilecek biri var mı? İşte VTT kodu ve mantığı:

Hızlı %K = ((Bugünün Kapanışı - %K Döneminde En Düşük Düşük) / (%K Döneminde En Yüksek - %K Döneminde En Düşük Düşük)) * 100

Yavaşlama %K = Hızlı %K'nın N-dönem hareketli ortalaması

Çift %K = ((Bugünün Yavaşlaması %K - %K Dönemde En Düşük Düşük Yavaşlama %K) / (%K Dönemde En Yüksek Yüksek Yavaşlama %K - %K Dönemde En Düşük Düşük Yavaşlama %K)) * 100

Çift Yavaşlama %K = Çift %K'nın N-dönem hareketli ortalaması

%D = Çift Yavaşlatmanın 3 periyotlu basit hareketli ortalaması %K

ve kodun kendisi:

St:= Mov(((C-LLV(L,K))/(HHV(H,K)-LLV(L,K)))*100,Sl,Mt);

DSt:= Mov(((St-LLV(St,K))/(HHV(St,K)-LLV(St,K)))*100,Sl,Mt);

DStD:= Mov(DSt,D,MtD);

MT4 bilen var mı?

VTT'nin versiyonuna o kadar alıştım ki diğerini kullanamıyorum.
 

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

 

teşekkür ederim mladen. mantıklı.

 

Herkese selam,

Stokastik çizgim aşırı alım(80) veya aşırı satım(20) bölgesini geçtiğinde ticareti tetiklemenin bir yolunu bulmakta zorlanıyorum. Çizgim geçtiğinde bir ticareti tetikleyebilirim, ancak onu SADECE aşırı alım veya aşırı satım bölgesinde olduğunda bir ticareti tetikleyecek şekilde ayarlayamıyorum. Bunu nasıl yapabileceğime dair bir fikri olan var mı veya başvurabileceğim başka bir yer var mı?

Bazı değerleri 20.1 ve 80.1 olarak ayarlamakla ilgili bir şeyler söyleyen bazı sitelere rastladım, ancak daha fazlasını değil.

Lütfen biraz ışık tutmaya yardım edin. Teşekkürler.

Saygılarımızla

teras

 

...

Terrance,

İşte ihtiyacınız olan şeye örnek olarak kullanılabilecek bazı pratik kodlara sahip bir konu: https://www.mql5.com/en/forum/179114

tkuan77:
Herkese selam,

Stokastik çizgim aşırı alım(80) veya aşırı satım(20) bölgesini geçtiğinde ticareti tetiklemenin bir yolunu bulmakta zorlanıyorum. Çizgim geçtiğinde bir ticareti tetikleyebilirim, ancak onu SADECE aşırı alım veya aşırı satım bölgesinde olduğunda bir ticareti tetikleyecek şekilde ayarlayamıyorum. Bunu nasıl yapabileceğime dair bir fikri olan var mı veya başvurabileceğim başka bir yer var mı?

Bazı değerleri 20.1 ve 80.1 olarak ayarlamakla ilgili bir şeyler söyleyen bazı sitelere rastladım, ancak daha fazlasını değil.

Lütfen biraz ışık tutmaya yardım edin. Teşekkürler.

Saygılarımızla

teras
 

Merhaba, fonksiyonları düzelttim ve şimdi onlardan memnunum. İyi görünüyor. Ancak, geriye dönük test yaptığımda işlem sonuçları günlüğü yalnızca 1 satın alma siparişi içeriyor. GetLots işlevimle ilgili olabileceğini düşünüyorum ama birkaç kez bakmama rağmen %100 değilim - bir göz atıp doğru olmayan bir şey görürseniz bana haber verir misiniz? Teşekkürler.

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

double GetLotsLong (int LowRisk, int HighRisk, double SLDistanceLong, int LastOpenTicket, int LastTicket)

{

Yenileme Oranları();

çift MinLot, MaxLot, LotStep;

int Çok Sayısı = 2;

double LotsLong = 0;

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 (GetWinLossPreviousLong (LastOpenTicket, LastTicket, WinLossPreviousLong) == "W")

{

if (AccountBalance() > AccountFreeMargin())

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

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

}

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

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

dönüş (LotsLong);

if (GetWinLossPreviousLong (LastOpenTicket, LastTicket, WinLossPreviousLong) == "L")

{

if (AccountBalance() > AccountFreeMargin())

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

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

}

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

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

dönüş (LotsLong);

}

 

...

GetLots() gönderdiğim formda test edildi ve olması gerektiği gibi çalışıyor. Üzerinde herhangi bir değişikliğe gerek yok. Açılış emri anında parti büyüklüğünü belirleyecek bir fonksiyon olarak kullanın. Mantığın geri kalanını bunun dışında tutun (bu işlev yalnızca şunu yapmalıdır: riske, zararı durdurmaya ve cari hesap durumuna bağlı olarak sipariş boyutunu öğrenin)

Kodun geri kalanı olmadan size yardımcı olamam. Sanki küçücük bir delikten bakıp tüm dünyayı görebilirmişim gibi olurdu. İmkansız. Kodun geri kalanını gizli tutmak istiyorsanız, yardımcı olabileceğim tek şey, buraya gönderdiğiniz koddur ve tekrar edeceğim: Emin olun GetLots() orijinal biçiminde olması gerektiği gibi çalışır ve orijinal biçiminde kullanılmalıdır. biçim.

Değişken sonuçlarla kullanmak istiyorsanız, riski veya zararı durdurma beslemesini dinamik olarak değiştirin (GetLots() öncesi kodda riske veya zararı durdurmaya ("karar verin") ve sonra bu değiştirilmiş risk veya zararı durdurma ile çağırın - fonksiyon verilen girişler için doğru bir şekilde hesaplayacaktır) Fonksiyonun kodunu değiştirmeye gerek yok

crsnape@btinternet.com:
Merhaba, fonksiyonları düzelttim ve şimdi onlardan memnunum. İyi görünüyor. Ancak, geriye dönük test yaptığımda işlem sonuçları günlüğü yalnızca 1 satın alma siparişi içeriyor. GetLots işlevimle ilgili olabileceğini düşünüyorum ama birkaç kez bakmama rağmen %100 değilim - bir göz atıp doğru olmayan bir şey görürseniz bana haber verir misiniz? Teşekkürler.

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

double GetLotsLong (int LowRisk, int HighRisk, double SLDistanceLong, int LastOpenTicket, int LastTicket)

{

Yenileme Oranları();

çift MinLot, MaxLot, LotStep;

int ÇokRakam = 2;

double LotsLong = 0;

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 (GetWinLossPreviousLong (LastOpenTicket, LastTicket, WinLossPreviousLong) == "W")

{

if (AccountBalance() > AccountFreeMargin())

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

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

}

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

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

dönüş (LotsLong);

if (GetWinLossPreviousLong (LastOpenTicket, LastTicket, WinLossPreviousLong) == "L")

{

if (AccountBalance() > AccountFreeMargin())

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

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

}

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

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

dönüş (LotsLong);

}
 

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 :-)

Neden: