Nasıl kodlanır? - sayfa 296

 

Gösterge seviyeleri çizgilerine renk, stil ve ağırlık eklemek mümkün müdür?

Merhaba,

Gösterge seviyeleri çizgilerine renk, stil ve ağırlık eklemenin mümkün olup olmadığını birisinin bana söyleyebileceğini merak ediyorum.

Başlangıç olarak, RSI seviyelerine hem stil hem de renk belirtmek istiyorum ve örneğin şu satıra daha fazla kod ekleyerek bunu yapıp yapamayacağımı merak ediyorum: #property Indicator_level1 70 ?

Mümkünse biri bana gösterebilirse çok minnettar olurum.

Teşekkürler,

Laurus

 

...

Evet yapabilirsin

Aşağıdaki özellikleri kullanın:

#property indicator_levelcolor

#property indicator_levelstyle

#property indicator_levelwidth

[/PHP]

If you use indicator_levelwidth greater than 1, only indicator_levelstyle that metatrader will allow is STYLE_SOLID (solid line). Also, you can specify only one color, style and width for all levels (if you need more than one color, style or width for levels, you either have to use buffers or objects - horizontal line, for example)

You can use the SetLevelStyle() function too for that purpose,with same limitations as described above

[PHP]

void SetLevelStyle( int draw_style, int line_width, color clr=CLR_NONE)

Laurus12:
Merhaba,

Gösterge seviyeleri çizgilerine renk, stil ve ağırlık eklemenin mümkün olup olmadığını birisinin bana söyleyebileceğini merak ediyorum.

Başlangıç olarak, RSI seviyelerine hem stil hem de renk belirtmek istiyorum ve örneğin şu satıra daha fazla kod ekleyerek bunu yapıp yapamayacağımı merak ediyorum: #property Indicator_level1 70 ?

Mümkünse biri bana gösterebilirse çok minnettar olurum.

Teşekkürler,

Laurus
 

Cevabınız için teşekkür ederim Mladen, yardımınız her zaman çok takdir edilmektedir.

Yazdıkların tam olarak korktuğum şeydi. İşlevler kısmına gelince, hala kafamın üzerinde.

Fotoğrafa bakarsanız nasıl olmasını istediğimi görürsünüz. Bir uzlaşma olarak normal yatay çizgiler kullandım, ancak göstergenin kendisiyle trend çizgileri çizdiğim için bu iyi bir çözüm değil.

Teşekkürler,

Laurus

Dosyalar:
 

...

Resminize bakıldığında, uygulayabileceğiniz tek çözüm (nesneleri kullanarak) gibi görünüyor. Çizim arabelleklerini kullanmak, çizim arabelleklerinizi boşaltır ve kullandığınız tüm değerleri o göstergede çizemezsiniz. Bazen meta tüccarlar için hala "ödeme yapıyoruz" 4 sadece 8 çizim arabelleğine sahip olma kararı

Laurus12:
Cevabınız için teşekkür ederim Mladen, yardımınız her zaman çok takdir edilmektedir.

Yazdıkların tam olarak korktuğum şeydi. İşlevler kısmına gelince, hala kafamın üzerinde.

Fotoğrafa bakarsanız nasıl olmasını istediğimi görürsünüz. Bir uzlaşma olarak normal yatay çizgiler kullandım, ancak göstergenin kendisiyle trend çizgileri çizdiğim için bu iyi bir çözüm değil.

Teşekkürler,

Laurus
 

Harici DLL garip sonuçlar veriyor

Merhaba!

Aşağıda, harici bir DLL'ye yapılan çağrının çok basit bir örneği verilmiştir. Günlük günlüğü, strateji test cihazı ile kullanıldığında 0'dan başlayarak artan sayılar göstermelidir.

Ancak sonuç oldukça garip. Günlük günlüğündeki ilk satır büyük bir sayı görüntüler (yani 18472) ve ardından bir kerede yaklaşık 10, bazen 100'ün üzerinde adım atlamaya başlayana kadar bir süre düzgün bir şekilde artar.

Birisi bana bunun nedenini ve nasıl düzeltileceğini açıklayabilir mi?

Teşekkürler!

// MyExpert.mql //

#import "MyDLL.dll"

int Test();

#import

void start(){

Print(Test());

}[/CODE]

// MyDLL.def //

LIBRARY MyDLL

EXPORTS

Test

[CODE]

// MyDLL.dll //

int i= 0;

int __stdcall Test() {

i++;

return i;

}
 

gösterge için ilginç kod sorunu

Merhaba millet,

MT4 programlamayı öğrenmeye çalışıyorum ve şu anda bana satın almamı veya iyi olmamı söyleyen bir PinBar algılama göstergesi geliştiriyorum. Alış veya satış için özel kurallar nedeniyle bu göstergeyi özellikle 4 saatlik grafik için geliştirdim. Algılama kuralı aşağıdaki gibidir:

Mum gövdesi <= mum uzunluğunun %35'i.

En az 1 fitil mum >= mum uzunluğunun %50'si.

Şimdiye kadar gösterge ile bu çubukları tespit etmekte sorun yaşamadım.

Ancak bir sonraki kural bana al veya sat diyor.

1 saatlik grafiği yakınlaştırıyorum ve 4 saatlik grafikte pinbar'ı oluşturan 4 çubuğa bakıyorum.

1 saatlik çubukta bu oluşumun ilk ve son çubuğunun kapanış değerini almak için iClose işlevini kullandım.

Ancak...şimdi programlandığı gibi, her zaman 1 saatlik grafiğin kendisindeki ilk ve son muma bakarım. Ve bu tamam değil. Grafiğin değil, formasyonun ilk ve son çubuğu olmalıdır.

İşte şimdi içinde yanlış iClose işlevleriyle sahip olduğum kod.

if ( (((100.0/CandleLength)*BodyLength)=50.0) || (((100.0/CandleLength)*LowerWick)>=50.0) ) && iClose(Symbol(),60,1) > iClose(Symbol(),60,4) )

{

Buy = Close;

SetLevel(true,i+1,Close);

}

Bu 4 saatlik mum üzerinde arka planda doğru 1 saatlik mumları belirleyemedim.

Bana sorunumun cevabını verebilecek biri var mı?

onu düzeltti:

tarihsaat H4BarTime;

int H1BarNumber;

H4BarTime = Zaman;

H1BarNumber = iBarShift(BOŞ, PERIOD_H1, H4BarTime);

tx çok!

Yakup

 
mladen:
Resminize bakıldığında, uygulayabileceğiniz tek çözüm (nesneleri kullanarak) gibi görünüyor. Çizim arabelleklerini kullanmak, çizim arabelleklerinizi boşaltır ve kullandığınız tüm değerleri o göstergede çizemezsiniz. Bazen meta tüccarlar için hala "ödeme yapıyoruz" 4 sadece 8 çizim arabelleğine sahip olma kararı

Geç cevabım için özür dilerim Mladen ve konuyu açıklığa kavuşturduğunuz için teşekkür ederim. Yazdıklarınıza gelince, en azından artık kesin olarak biliyorum.

Teşekkür ederim,

Laurus

 

Giriş Kriterleri ile Yardım

Merhaba millet,

MA kullanarak bir giriş kriteri oluşturmaya çalışıyorum. Giriş kriterlerim basit, Hızlı MA, mevcut mum yerine mum kapanışında Yavaş MA'yı yukarı doğru kestiğinde ve ayette uzun bir ticarete girmek istiyorum.

Şu anki durumum, Hızlı MA'nın Yavaş MA'yı yukarı doğru ve tersini geçtiğinde EA'm uzun bir ticareti tetikleyecek, ancak bu mum henüz kapanmadı ve mum kapandığında, son MA yukarı doğru geçmeyebilir, ben bu belirli ticareti tetiklememeliydi, ancak sistem onu tetikledi çünkü bir kez yukarı ve geri geçti. Bu kısa işlemler için aynıdır

Birkaç gündür bu konuda herhangi bir ilerleme olmadan devam ediyorum. Birisi bunu nasıl yapacağıma biraz ışık tutabilir mi? Teşekkürler.

//--- giriş parametreleri

harici çift TakeProfit=2700.0;

dış çift Lot = 0.1;

harici çift StopLoss=2500.0;

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

//| uzman başlatma işlevi |

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

int init()

{

//----

//----

dönüş(0);

}

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

//| uzman sıfırlama işlevi |

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

int tanım()

{

//----

//----

dönüş(0);

}

int Çapraz (çift satır1, çift satır2)

{

statik int son_yön = 0;

statik int akım_yön = 0;

if(line1>line2)geçerli_yön = 1; //yukarı

if(line1<line2)current_yön = 2; //aşağı

if(current_dirction != last_direction) //değiştirildi

{

last_direction = current_direction;

dönüş (son_yön);

}

başka

{

dönüş (0);

}

}

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

//| uzman başlatma işlevi |

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

int başlangıç()

{

//----

int cnt, bilet, toplam;

çift kısaEma, uzunEma;

if(Çubuklar<100)

{

Print("100'den küçük barlar");

dönüş(0);

}

if(Kâr Al<10)

{

Print("10'dan az Kar Al");

dönüş(0); // TakeProfit'i kontrol edin

}

shortEma = iMA(NULL,0,10,0,MODE_LWMA,PRICE_CLOSE,0);

longEma = iMA(NULL,0,20,0,MODE_LWMA,PRICE_CLOSE,0);

int isCrossed = Çapraz (shortEma,longEma);

toplam = SiparişlerToplam();

if(toplam < 1)

{

if(isCrossed == 1)

{

bilet=SiparişGönder(Symbol(),OP_BUY,Lots,Sor,3,Ask-StopLoss*Puan,Ask+TakeProfit*Puan,

"EA'm",12345,0,Yeşil);

if(bilet>0)

{

if(OrderSelect(bilet,SELECT_BY_TICKET,MODE_TRADES))

Print("Satın alma emri açıldı : ",OrderOpenPrice());

}

else Print("SATIN AL emri açılırken hata oluştu : ",GetLastError());

dönüş(0);

}

if(isCrossed == 2)

{

bilet=SiparişGönder(Symbol(),OP_SELL,Lots,Bid,3,Bid+StopLoss*Point,

Bid-TakeProfit*Point,"My EA",12345,0,Kırmızı);

if(bilet>0)

{

if(OrderSelect(bilet,SELECT_BY_TICKET,MODE_TRADES))

Print(" SAT emri açıldı : ",OrderOpenPrice());

}

else Print("SATIŞ emrini açarken hata: ",GetLastError());

dönüş(0);

}

dönüş(0);

}

dönüş(0);

}

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

Teşekkürler ve saygılar

teras

 

...

teras

Bu satırları değiştirmeyi deneyin:

shortEma = iMA(NULL,0,10,0,MODE_LWMA,PRICE_CLOSE,0);

longEma = iMA(NULL,0,20,0,MODE_LWMA,PRICE_CLOSE,0);

int isCrossed = Crossed (shortEma,longEma);[/PHP]

to something like this :

[PHP] int isCrossed = 0;

double shortEma1 = iMA(NULL,0,10,0,MODE_LWMA,PRICE_CLOSE,1);

double longEma1 = iMA(NULL,0,20,0,MODE_LWMA,PRICE_CLOSE,1);

double shortEma2 = iMA(NULL,0,10,0,MODE_LWMA,PRICE_CLOSE,2);

double longEma2 = iMA(NULL,0,20,0,MODE_LWMA,PRICE_CLOSE,2);

double diff1 = shortEma1-longEma1;

double diff2 = shortEma2-longEma2;

if ((diff1*diff2)<0)

{

if (shortEma1>longEma1)

isCrossed = 1;

else isCrossed = 2;

}

Bu şekilde çapraz işlevine bile ihtiyacınız olmaz ve kapalı bir çubukta çarpı olup olmadığını kontrol eder.

tkuan77:
Merhaba millet,

MA kullanarak bir giriş kriteri oluşturmaya çalışıyorum. Giriş kriterlerim basit, Hızlı MA, mevcut mum yerine mum kapanışında Yavaş MA'yı yukarı doğru kestiğinde ve ayette uzun bir ticarete girmek istiyorum.

Şu anki durumum, Hızlı MA'nın Yavaş MA'yı yukarı doğru ve tersini geçtiğinde EA'm uzun bir ticareti tetikleyecek, ancak bu mum henüz kapanmadı ve mum kapandığında, son MA yukarı doğru geçmeyebilir, ben bu belirli ticareti tetiklememeliydi, ancak sistem onu tetikledi çünkü bir kez yukarı ve geri geçti. Bu kısa işlemler için aynıdır

Birkaç gündür bu konuda herhangi bir ilerleme olmadan devam ediyorum. Birisi bunu nasıl yapacağıma biraz ışık tutabilir mi? Teşekkürler.

//--- giriş parametreleri

harici çift TakeProfit=2700.0;

dış çift Lot = 0.1;

harici çift StopLoss=2500.0;

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

//| uzman başlatma işlevi |

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

int init()

{

//----

//----

dönüş(0);

}

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

//| uzman sıfırlama işlevi |

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

int tanım()

{

//----

//----

dönüş(0);

}

int Çapraz (çift satır1, çift satır2)

{

statik int son_yön = 0;

statik int akım_yön = 0;

if(line1>line2)geçerli_yön = 1; //yukarı

if(line1<line2)current_yön = 2; //aşağı

if(current_dirction != last_direction) //değiştirildi

{

last_direction = current_direction;

dönüş (son_yön);

}

başka

{

dönüş (0);

}

}

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

//| uzman başlatma işlevi |

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

int başlangıç()

{

//----

int cnt, bilet, toplam;

çift kısaEma, uzunEma;

if(Çubuklar<100)

{

Print("100'den küçük barlar");

dönüş(0);

}

if(Kâr Al<10)

{

Print("10'dan az Kar Al");

dönüş(0); // TakeProfit'i kontrol edin

}

shortEma = iMA(NULL,0,10,0,MODE_LWMA,PRICE_CLOSE,0);

longEma = iMA(NULL,0,20,0,MODE_LWMA,PRICE_CLOSE,0);

int isCrossed = Çapraz (shortEma,longEma);

toplam = SiparişlerToplam();

if(toplam < 1)

{

if(isCrossed == 1)

{

bilet=SiparişGönder(Symbol(),OP_BUY,Lots,Sor,3,Ask-StopLoss*Puan,Ask+TakeProfit*Puan,

"EA'm",12345,0,Yeşil);

if(bilet>0)

{

if(OrderSelect(bilet,SELECT_BY_TICKET,MODE_TRADES))

Print("Satın alma emri açıldı : ",OrderOpenPrice());

}

else Print("SATIN AL emri açılırken hata oluştu : ",GetLastError());

dönüş(0);

}

if(isCrossed == 2)

{

bilet=SiparişGönder(Symbol(),OP_SELL,Lots,Bid,3,Bid+StopLoss*Point,

Bid-TakeProfit*Point,"My EA",12345,0,Kırmızı);

if(bilet>0)

{

if(OrderSelect(bilet,SELECT_BY_TICKET,MODE_TRADES))

Print("SAT emri açıldı : ",OrderOpenPrice());

}

else Print("SATIŞ emrini açarken hata: ",GetLastError());

dönüş(0);

}

dönüş(0);

}

dönüş(0);

}

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

Teşekkürler ve saygılar

teras
 
mladen:
teras

Bu satırları değiştirmeyi deneyin:

shortEma = iMA(NULL,0,10,0,MODE_LWMA,PRICE_CLOSE,0);

longEma = iMA(NULL,0,20,0,MODE_LWMA,PRICE_CLOSE,0);

int isCrossed = Crossed (shortEma,longEma);[/PHP]

to something like this :

[PHP] int isCrossed = 0;

double shortEma1 = iMA(NULL,0,10,0,MODE_LWMA,PRICE_CLOSE,1);

double longEma1 = iMA(NULL,0,20,0,MODE_LWMA,PRICE_CLOSE,1);

double shortEma2 = iMA(NULL,0,10,0,MODE_LWMA,PRICE_CLOSE,2);

double longEma2 = iMA(NULL,0,20,0,MODE_LWMA,PRICE_CLOSE,2);

double diff1 = shortEma1-longEma1;

double diff2 = shortEma2-longEma2;

if ((diff1*diff2)<0)

{

if (shortEma1>longEma1)

isCrossed = 1;

else isCrossed = 2;

}

Bu şekilde çapraz işlevine bile ihtiyacınız olmaz ve kapalı bir çubukta çarpı olup olmadığını kontrol eder.

Merhaba Mladen, bana söylediklerini denedim ve harikalar yarattı. Ancak, kodların arkasındaki mantığı tam olarak anlamıyorum. iMA'nın kaymasını neden 1 ve 2'ye ayarladınız ve neden şunu da kodluyorsunuz: (diff1*diff2)<0)? Üzgünüm ama şu anda hala öğrenme ifadesindeyim.

Teşekkürler ve saygılar

teras

Neden: