Nasıl kodlanır? - sayfa 271

 

Bu EA için iCustom işleviyle ilgili Yardıma ihtiyacınız var, özel bir gösterge arayabilir.

Herkese selam,

Bu (Entry.mq4) indi'yi bu (swb grid 4.1.0.3_EA) EA'ya eklemek istiyorum.

iCustom işlevi böylece ben ve biz bu göstergeyi EA stratejisinde kullanabiliriz.

EA zaten 3 MT4 göstergesi Bollinger Bands , Stokastik ve RSI kullanıyor ve

DOĞRU veya YANLIŞ'ı seçerek bunlardan birini veya tümünü seçebilirsiniz.

ve bu 4. indi(Entry.mq4) EA'ya eklemek istiyorum.

Herhangi biri bana yardım edebilirse çok minnettar olurum.

teşekkür ederim.

EA ve indi ekli körük.

Dosyalar:
 

Bu diziyi anlamak için Noob MQL4 yardımı gerekli

Merhaba, kodlayıcılar

Biri beni diziler konusunda biraz eğitmek ister mi?

Ya da belki bu diziyle ilgili olduğu için bu döngüyü anlamakta daha fazla sorun yaşıyorum.

int i=Barlar;

#property copyright "Unfinished POS by Agent86"

çift v1[];

çift v2[];

çift val1;

çift val2;

int başlangıç()

{

while(i>=0)

{

val1=iFractals(NULL, 0, MODE_UPPER,i);

eğer (val1 > 0)

{

v1=Yüksek;

}

başka

{

v1=v1;

}

val2=iFractals(NULL, 0, MODE_LOWER,i);

eğer (val2 > 0)

{

v2=Düşük;

}

başka v2=v2;

ben--;

}

dönüş(0);

}

Bu temel bir fraktal ve yine de dizideki herhangi bir öğeye atıfta bulunamıyorum.

Bir şekilde i++ ve Print (v1); veya 0 veya EMPTY_VALUE öncesindeki değeri yazdırın.

Bununla doğru yönde gidiyorsam bile.

Bir sıkıntım var.

Yazdır (v1): her zaman == 0 ve 0 yazdırır

Anlıyorum çünkü aslında -1'e dönüyor ki bu == 0

Neler olup bittiğini görebilmek için Print ifadelerini nasıl ve nereye koyabilirim?

Çok sayıda veya yöntem denedim ve v1 öğelerine başvurabilmem için döngüyü denemek ve değiştirmek için i=0'ı yeniden başlattım, ancak tüm girişimler başarısız oldu.

Temel olarak, bir ABCD şeması tipi EA'da gelecekteki olası kullanım için önceki fraktalları görüntülemek veya onları A yüksek, B düşük vb. olarak işaretlemek istiyorum.

Şimdilik, esas olarak v1'i yazdırmak istiyorum, böylece ne yaptığını görebiliyorum.

Belki A_high ve/veya B_low gibi bir Önceki Fraktal veya buna benzer bir şema seçmek için bir şeyler tasarlayabilirim.

Bu konuda yanlış yolda mıyım?

Tavsiye lütfen

teşekkürler

 

Bunun yerine A FOR döngüsüyle giderdim. Eğer i--'yi eklemeyi unutursanız, döngüler kilitlenmelere yol açabilir. Çubukların tam sayısını bildiğiniz için kullanımı daha kolaydır, ayrıca i asla < 0 olmayacaktır. Karışıklığı önlemeye yardımcı olur.

For (int i=Bars-1;i>0;i--) {

// kod

}

Tüm dizi değerlerini 0'a ayarlamayı deneyin, ardından geri dönün ve gösterge değerleri atayın. Ayrıca, gösterge değerinizi atadıktan hemen sonra bir print() deneyin. Gerçekten bir şey döndürüp döndürmediğine bakın.

En iyi bahsiniz, benim tahminime göre, diziye aslında bir boyut atamak. 1000 pozisyon diyelim. Bu kadar çok şeye ihtiyacınız olmayacak, ayrıca yaptığınız hesaplamaları azaltacaktır. O zaman tek yapmanız gereken son 999 çubuktan 0'a geçmek ve değerleri atamak. MT4'ün dizi başlatmalarla ilgili sorunları olduğunu hatırlıyor gibiyim.

 

Dizi Soruları

Trader5050-Deployed:
Bunun yerine A FOR döngüsüyle giderdim. İ--'yi eklemeyi unutursanız, döngüler kilitlenmelere yol açabilir. Çubukların tam sayısını bildiğiniz için kullanımı daha kolaydır, ayrıca i asla < 0 olmayacaktır. Karışıklığı önlemeye yardımcı olur.

For (int i=Bars-1;i>0;i--) {

// kod

}

Tüm dizi değerlerini 0'a ayarlamayı deneyin, ardından geri dönün ve gösterge değerleri atayın. Ayrıca, gösterge değerinizi atadıktan hemen sonra bir print() deneyin. Gerçekten bir şey döndürüp döndürmediğine bakın.

En iyi bahsiniz, benim tahminime göre, diziye aslında bir boyut atamak. 1000 pozisyon diyelim. Bu kadar çok şeye ihtiyacınız olmayacak, ayrıca yaptığınız hesaplamaları azaltacaktır. O zaman tek yapmanız gereken son 999 çubuktan 0'a geçmek ve değerleri atamak. MT4'ün dizi başlatmalarla ilgili sorunları olduğunu hatırlıyor gibiyim.

Tamam, teşekkürler deneyeceğim.

while deyimleri iyi çalışıyor olsa da, yazdırmak/görüntülemek istediğim dizi öğelerini vb. almama yardımcı olmuyor.

Dedikleriniz üzerinde çalışacağım ve bazı testler yapacağım ve geri göndereceğim.

teşekkürler

 
Trader5050-Deployed:
Bunun yerine A FOR döngüsüyle giderdim. Eğer i--'yi eklemeyi unutursanız, döngüler kilitlenmelere yol açabilir. Çubukların tam sayısını bildiğiniz için kullanımı daha kolaydır, ayrıca i asla < 0 olmayacaktır. Karışıklığı önlemeye yardımcı olur.

For (int i=Bars-1;i>0;i--) {

// kod

}

Tüm dizi değerlerini 0'a ayarlamayı deneyin, ardından geri dönün ve gösterge değerleri atayın. Ayrıca, gösterge değerinizi atadıktan hemen sonra bir print() deneyin. Gerçekten bir şey döndürüp döndürmediğine bakın.

En iyi bahsiniz, benim tahminime göre, diziye aslında bir boyut atamak. 1000 pozisyon diyelim. Bu kadar çok şeye ihtiyacınız olmayacak, ayrıca yaptığınız hesaplamaları azaltacaktır. O zaman tek yapmanız gereken son 999 çubuktan 0'a geçmek ve değerleri atamak. MT4'ün dizi başlatmalarla ilgili sorunları olduğunu hatırlıyor gibiyim.

Yine de diziyi tüm 0 girişleriyle birlikte yazdırın

Yabancı

 

Arjantin86,

Kodunuzda birkaç hata var:

- kullandığınız diziler henüz dizi değiller (kodda yaptığınız gibi dizi boyutunu belirtmezseniz, bu dinamik bir dizidir ve dizi boyutu çalışma zamanında yönetilmelidir), yani 0 boyutunda dizilere sahip olursunuz (her zaman 0'a sahip olmanın ilk nedeni budur - bu, ölümcül hatayı önleyen ve sonuç olarak 0 döndüren yordam işleme metatrader hatasıdır - C/C++'da çökmeye neden olur)

- dizinin "dizi benzeri" olduğunu belirtmezseniz ("benzeri dizilerde" 0. öğe sonuncudur, normal dizilerde 0. öğe ilktir), bu nedenle i+1 ifadesi bir dizinin sonraki öğesidir. bu durumda önceki değil. Dizileri "seri benzeri" şekilde kullanabilirsiniz, ancak çalışma zamanında çalışması için birkaç şey daha yapmanız gerekir ve o zaman bile çubuk numaraları değiştiğinde tarama kodu alırsınız, yani dizileri kendi yerel - "C benzeri" modunda kullanmak daha iyidir

- ayrıca yeni bir onay işaretiyle en azından 3. çubuktan başladığınızdan emin olun (bu, mevcut bir çubukta değil, yeni bir fraktalın görüneceği yerdir)


İşte bu sorunlar olmadan yapmaya çalıştığınız şey
#property indicator_chart_window

double v1[];

double v2[];

int start()

{

int i,a,limit,counted_bars=IndicatorCounted();

if(counted_bars<0) return(-1);

if(counted_bars>0) counted_bars--;

limit = MathMin(Bars-counted_bars,Bars-1);

if (ArraySize(v1)!=Bars) ArrayResize(v1,Bars);

if (ArraySize(v2)!=Bars) ArrayResize(v2,Bars);

//

//

//

//

//

for (i=limit, a=Bars-i-1; i>=0; i--,a++)

{

v1[a]=v1[a-1]; if (iFractals(NULL,0,MODE_UPPER,i) > 0) v1[a]=High;

v2[a]=v2[a-1]; if (iFractals(NULL,0,MODE_LOWER,i) > 0) v2[a]=Low;

}

Comment("current upper frctal : "+DoubleToStr(v1,Digits)+"\n"+

"current lower frctal : "+DoubleToStr(v2,Digits));

return(0);

}
 

MQ4'ten bir dll işlevine erişim: değişken argüman listeleri

merhaba,

Bunun mümkün olup olmadığını herkes bilir: a: değişken argüman listelerini argüman olarak kullanan bir dll fonksiyonunu içe aktarmak

örneğin vprintf - C++ Referansı

int vprintf ( const char * biçimi, va_list argümanı);

eğer öyleyse nasıl yapacak?

teşekkürler

MJ

 

Dönüş değeri olmayan işlev nasıl çağırılır

Merhaba Erkekler ve Kızlar.

Programımın bir noktasında bir fonksiyon çağırmak istiyorum.

Ancak işlevin dönüş değeri yoktur (void). Peki işlevi nasıl çağırırım,

bu yüzden fonksiyonun içindeki kodu tam olarak onu çağırdığım yerde yürütür,

sanki o yerin kendisinde yazılmış gibi mi?

Aşağıda bazı örnek kodlar yaptım .. bazı parametreleri kontrol ettiğim yerde ve Tamam ise, işlevi yürütmek istiyorum ...

Umarım birisi bana bu konuda yardımcı olabilir, şimdiden tx, Jonkie76

//+------------------------------------------- -------------------+

//| uzman başlatma işlevi |

//+------------------------------------------- -------------------+

int başlangıç()

{

//----

if (Fiyat >= PRICE_CLOSE)

çağrı işlevi; // Bu noktada fonksiyonu çağırmak istiyorum. Bunu nasıl yapabilirim?

başka

Alert("Hiçbir şey yapmayın"); //

//----

dönüş(0);

}

//+------------------------------------------- -------------------+

//============================================== ===================+

//FONKSİYONLAR

//============================================== ===================+

//----------------------- SİPARİŞ FONKSİYONUNU KAPAT ---------------------- +

geçersiz subCloseOrder()

{

int

ben,

toplam = 0,

bilet = 0,

hata = 0,

c = 0;

toplam = SiparişlerToplam();

for(i=toplam-1;i>=0;i--)

{

OrderSelect(i, SELECT_BY_POS, MODE_TRADES);

if(OrderSymbol()==Symbol() &&

OrderMagicNumber()==Büyü)

{

geçiş(SiparişTürü())

{

durum OP_BUY :

for(c=0;c<NumberOfTries;c++)

{

bilet=OrderClose(OrderTicket(),OrderLots(),Teklif,Kayma,Violet);

err=GetLastError();

if(hata==0)

{

if(bilet>0) ara;

}

başka

{

if(err==0 || hata==4 || hata==136 || hata==137 || hata==138 || hata==146) //Meşgul hataları

{

Uyku(5000);

devam etmek;

}

başka //normal hata

{

if(bilet>0) ara;

}

}

}

kırmak;

}

}

}

}

 

Çok basit. Sadece bir şey döndüreceği için onu çağırmanız gerekiyor, sadece herhangi bir sonucu kaydetmenize gerek yok çünkü void türünde hiçbir sonuç yok. (hiçbir şey döndürmez) Bunun gibi:

int start()

{

//----

if (Price >= PRICE_CLOSE)

subCloseOrder(); // At this point I'd like to call the function.How do I do that?

else

Alert("Do nothing"); //

//----

return(0);

}

 

Bunun yerine "boşluk" kullanın. Bunun gibi :

void someFunction(someParameters)

{

...

//

//

// no need to place return at the end, but if you want then use "just" return, like this

//

//

return;

}

Void, bir işlevden değer döndürmeyeceği anlamına gelir ve bu şekilde etkin bir şekilde bir işlev değil, bir prosedür haline gelir.

Jonkie76:
Merhaba Erkekler ve Kızlar.

Programımın bir noktasında bir fonksiyon çağırmak istiyorum.

Ancak işlevin dönüş değeri yoktur (void). Peki işlevi nasıl çağırırım,

bu yüzden fonksiyonun içindeki kodu tam olarak onu çağırdığım yerde yürütür,

sanki o yerin kendisinde yazılmış gibi mi?

Aşağıda bazı örnek kodlar yaptım .. bazı parametreleri kontrol ettiğim yerde ve Tamam ise, işlevi yürütmek istiyorum ...

Umarım birisi bana bu konuda yardımcı olabilir, şimdiden tx, Jonkie76

//+------------------------------------------- -------------------+

//| uzman başlatma işlevi |

//+------------------------------------------- -------------------+

int başlangıç()

{

//----

if (Fiyat >= PRICE_CLOSE)

çağrı işlevi; // Bu noktada fonksiyonu çağırmak istiyorum. Bunu nasıl yapabilirim?

başka

Alert("Hiçbir şey yapmayın"); //

//----

dönüş(0);

}

//+------------------------------------------- -------------------+

//============================================== ===================+

//FONKSİYONLAR

//============================================== ===================+

//----------------------- SİPARİŞ FONKSİYONUNU KAPAT ---------------------- +

geçersiz subCloseOrder()

{

int

ben,

toplam = 0,

bilet = 0,

hata = 0,

c = 0;

toplam = SiparişlerToplam();

for(i=toplam-1;i>=0;i--)

{

OrderSelect(i, SELECT_BY_POS, MODE_TRADES);

if(OrderSymbol()==Symbol() &&

OrderMagicNumber()==Büyü)

{

geçiş(SiparişTürü())

{

durum OP_BUY :

for(c=0;c<NumberOfTries;c++)

{

bilet=OrderClose(OrderTicket(),OrderLots(),Teklif,Kayma,Violet);

err=GetLastError();

if(hata==0)

{

if(bilet>0) ara;

}

başka

{

if(err==0 || hata==4 || hata==136 || hata==137 || hata==138 || hata==146) //Meşgul hataları

{

Uyku(5000);

devam etmek;

}

başka //normal hata

{

if(bilet>0) ara;

}

}

}

kırmak;

}

}

}

}
Neden: