Nasıl kodlanır? - sayfa 299

 

MQL4'te özel zaman girişi

MQL4 ile kullanıcı tarafından tanımlanan bir çubuktan başlayıp grafiğin sonuna kadar yatay bir çizgi çizebilen bir kod yazılabilir mi?

İşte Metastock ile aynı kod

{Customer Inputs}

Dy:=Input("Day",1,31,1);

Mn:=Input("Month",1,12,1);

Yr:=Input("Year",2000,2012,2010);

{Time Calculation}

Time:=Dy=DayOfMonth() AND Mn=Month() AND Yr=Year();

{Formula}

Start:= ValueWhen(1,Time,CLOSE);

{Output}

Start;

Ve işte sonuç

Aynı şeyi MQL4 ile yapmayı umuyorum

 

Şu şekilde deneyin:

#property indicator_chart_window

extern string startFrom = "2012.07.06 00:00";

int init() { return(0); }

int deinit() { ObjectDelete("hLine"); return(0); }

int start()

{

string name = "hLine";

int barShift = iBarShift(NULL,0,StrToTime(startFrom));

ObjectCreate(name,OBJ_TREND,0,0,0,0,0);

ObjectSet(name,OBJPROP_PRICE1,Close);

ObjectSet(name,OBJPROP_PRICE2,Close);

ObjectSet(name,OBJPROP_TIME1,Time);

ObjectSet(name,OBJPROP_TIME2,Time[0]);

return (0);

}

Sadece kopyalayıp bir göstergeye yapıştırın (zaten çalışan bir göstergedir) ve grafiğe ekleyin.

kappari:
MQL4 ile kullanıcı tarafından tanımlanan bir çubuktan başlayıp grafiğin sonuna kadar yatay bir çizgi çizebilen bir kod yazılabilir mi?

İşte Metastock ile aynı kod

{Customer Inputs}

Dy:=Input("Day",1,31,1);

Mn:=Input("Month",1,12,1);

Yr:=Input("Year",2000,2012,2010);

{Time Calculation}

Time:=Dy=DayOfMonth() AND Mn=Month() AND Yr=Year();

{Formula}

Start:= ValueWhen(1,Time,CLOSE);

{Output}

Start;

Ve işte sonuç

Aynı şeyi MQL4 ile yapmayı umuyorum
 
mladen:
Şu şekilde deneyin:
#property indicator_chart_window

extern string startFrom = "2012.07.06 00:00";

int init() { return(0); }

int deinit() { ObjectDelete("hLine"); return(0); }

int start()

{

string name = "hLine";

int barShift = iBarShift(NULL,0,StrToTime(startFrom));

ObjectCreate(name,OBJ_TREND,0,0,0,0,0);

ObjectSet(name,OBJPROP_PRICE1,Close);

ObjectSet(name,OBJPROP_PRICE2,Close);

ObjectSet(name,OBJPROP_TIME1,Time);

ObjectSet(name,OBJPROP_TIME2,Time[0]);

return (0);

}
Sadece kopyalayıp bir göstergeye yapıştırın (zaten çalışan bir göstergedir) ve grafiğe ekleyin.

sen en iyisisin çok sağol mladen

 

Merhaba Mladen,

Buradaki fonksiyonların mantığı hakkında daha fazla bilgi verebilir misiniz? Hala tam olarak anlamıyorum. teşekkürler

teras

mladen:
Bu işlevi deneyin:
int countOpenedOrders(int type)

{

int openedOrders = 0;

for(int i=0; i < OrdersTotal(); i++)

{

if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES) == false) break;

if(OrderSymbol() != Symbol()) continue;

if(OrderMagicNumber() != MagicNumber) continue;

if(OrderType() == type) openedOrders++;

}

return(openedOrders);

}

[/PHP]

To count opened buy orders, call it like this :

int openedBuys = countOpened(OP_BUY);

to count opened sell orders, call it like this :

[PHP]int openedSells = countOpened(OP_SELL);
ve sonra kontrol edebilirsiniz:
eğer açılırsaBuys==0 açık satın al

eğer openSells==0 açık satış

 

tkuan77

Emirleri bir seferde 1 alış ve 1 satışla sınırlamak istediniz.

Yani herhangi bir pozisyon açmadan önce açılan emir sayacını ararsanız, kaç tane açık alış veya satışınız olduğunu kontrol edebilirsiniz.

Bir örnek :

int openedBuys = countOpened(OP_BUY); if (openedBuys==0) code for open a buy order

Açılırsa, ui 0 dışında bir şeyse, yeni bir satın alma emri açmazsınız. Aynı mantık satmak için de geçerlidir (bu, o gönderideki ikinci örnektir)

tkuan77:
Merhaba Mladen,

Buradaki fonksiyonların mantığı hakkında daha fazla bilgi verebilir misiniz? Hala tam olarak anlamıyorum. teşekkürler

teras
 

Merhaba Mladen,

Belki de kendimi yanlış tanıtmış olabilirim. Yapmaya çalıştığım şey, satın alma kriterlerim karşılandığında, bir satın almayı tetikleyecek ve başka bir satın alma kriteri tekrar karşılanırsa, başka bir alım veya satış kriterleri karşılanırsa satmayı tetikleyecektir. Ancak, herhangi bir zamanda sahip olacağım maksimum ticaret 2 olacaktır.

Yönteminizi daha önce denedim ve hala aynı anda 2 işlem açan sistemle karşılaşıyorum, bu yüzden EA'nın aynı anda 2 işlem açması sorunuyla Bars işleviyle sınırlamaya çalıştım.

Buradaki olası sebep ne olabilir? Benim mantığımla alakası var mı?

Saygılarımızla

teras

mladen:
tkuan77

Emirleri bir seferde 1 alış ve 1 satışla sınırlamak istediniz.

Yani herhangi bir pozisyon açmadan önce açılan emir sayacını ararsanız, kaç tane açık alış veya satışınız olduğunu kontrol edebilirsiniz.

Bir örnek :

int openedBuys = countOpened(OP_BUY); if (openedBuys==0) code for open a buy order
Açılırsa, ui 0 dışında bir şeyse, yeni bir satın alma emri açmazsınız. Aynı mantık satmak için de geçerlidir (bu, o gönderideki ikinci örnektir)
 

Mevcut bir çubukta bir tür siparişin daha önce açılmış olup olmadığını kontrol edebilirsiniz ve bu şekilde bir sonraki onayda yeni bir sipariş açılmasını önlemiş olursunuz. Evet ise (mevcut bir çubukta açılmış bir emir vardı), o zaman yeni bir emir açılmıyor. Hayır ise, yeni bir sipariş açabilirsiniz. İşte mevcut bir barda açılan yeniden düzenlenmiş türdeki siparişleri sayabilen bir fonksiyon

int countOpenedOnACurrentBar(int type)

{

int openedAtBar = 0;

datetime startTime = Time[0];

datetime endTime = Time[0]+Period()*60;

for(int i=0; i < OrdersTotal(); i++)

{

if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES) == false) break;

if(OrderMagicNumber() != MagicNumber) continue;

if(OrderSymbol() != Symbol()) continue;

if(OrderType() != type) continue;

if(OrderOpenTime()=endTime) continue;

openedAtBar++;

break;

}

return(openedAtBar);

}

tkuan77:
Merhaba Mladen,

Belki de kendimi yanlış tanıtmış olabilirim. Yapmaya çalıştığım şey, satın alma kriterlerim karşılandığında, bir alımı tetikleyecek ve başka bir satın alma kriteri tekrar karşılanırsa, başka bir alım veya satış kriterleri karşılanırsa satmayı tetikleyecektir. Ancak, herhangi bir zamanda sahip olacağım maksimum ticaret 2 olacaktır.

Yönteminizi daha önce denedim ve hala aynı anda 2 işlem açan sistemle karşılaşıyorum, bu yüzden EA'nın aynı anda 2 işlem açması sorunuyla Bars işleviyle sınırlamaya çalıştım.

Buradaki olası sebep ne olabilir? Benim mantığımla alakası var mı?

Saygılarımızla

teras
 
tkuan77:
Merhaba Mladen,

Belki de kendimi yanlış tanıtmış olabilirim. Yapmaya çalıştığım şey, satın alma kriterlerim karşılandığında, bir satın almayı tetikleyecek ve başka bir satın alma kriteri tekrar karşılanırsa, başka bir alım veya satış kriterleri karşılanırsa satmayı tetikleyecektir. Ancak, herhangi bir zamanda sahip olacağım maksimum ticaret 2 olacaktır.

Yönteminizi daha önce denedim ve hala aynı anda 2 işlem açan sistemle karşılaşıyorum, bu yüzden EA'nın aynı anda 2 işlem açması sorunuyla Bars işleviyle sınırlamaya çalıştım.

Buradaki olası sebep ne olabilir? Benim mantığımla alakası var mı?

Saygılarımızla

teras

bunun nedeni, ikinci ticaretin ilkinden nasıl farklı olmasını istediğinizi belirtmemiş olmanızdır. Farklılaşma x no şeklinde olabilir. çubuklar veya FirstBuyPrice'dan uzaktaki fiyat.

 

Yardımın için teşekkürler Mladen, ancak sadece seninle kontrol etmek istiyorum, kodu uzun/kısa işlevimden önce mi, arada mı yoksa başka bir yere mi koymalıyım? Çünkü hata vermeye devam ediyor gibi görünüyor ve bunun kaynağını bulamıyorum. Ve MagicNumber bir tamsayı mı?

teras

toplam = SiparişlerToplam();

if(toplam < 2)

{

int countOpenedOnACurrentBar(int tipi)

{

int openAtBar = 0;

tarihsaat startTime = Saat[0];

datetime endTime = Time[0]+Period()*60;

for(int i=0; i < OrdersTotal(); i++)

{

if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES) == false) break;

if(OrderMagicNumber() != MagicNumber) devam ediyor;

if(OrderSymbol() != Symbol()) devam ediyor;

if(OrderType() != type) devam et;

if(OrderOpenTime()=endTime) devam ediyor;

açıldıAtBar++;

kırmak;

}

dönüş(openedAtBar);

}

if(isCrossed == 1 && shortEma > mainshortEma && longEma > mainshortEma)

{

bilet=SiparişGönder(Symbol(),OP_BUY,Lots,Sor,1,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 && shortEma < mainshortEma && longEma < mainshortEma)

{

bilet=SiparişGönder(Symbol(),OP_SELL,Lots,Bid,1,Teklif+StopLoss*Puan,Teklif-AlKar*Puan,

"EA'm",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);

}

mladen:
Mevcut bir çubukta bir tür siparişin daha önce açılmış olup olmadığını kontrol edebilirsiniz ve bu şekilde bir sonraki onayda yeni bir sipariş açılmasını önlemiş olursunuz. Evet ise (mevcut bir çubukta açılmış bir emir vardı), o zaman yeni bir emir açılmıyor. Hayır ise, yeni bir sipariş açabilirsiniz. İşte mevcut bir barda açılan yeniden düzenlenmiş türdeki siparişleri sayabilen bir fonksiyon
int countOpenedOnACurrentBar(int type)

{

int openedAtBar = 0;

datetime startTime = Time[0];

datetime endTime = Time[0]+Period()*60;

for(int i=0; i < OrdersTotal(); i++)

{

if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES) == false) break;

if(OrderMagicNumber() != MagicNumber) continue;

if(OrderSymbol() != Symbol()) continue;

if(OrderType() != type) continue;

if(OrderOpenTime()=endTime) continue;

openedAtBar++;

break;

}

return(openedAtBar);

}

 

...

teras

Bu bir fonksiyondur . EA'nızın sonuna gönderin ve mevcut bir barda bir siparişin zaten açık olup olmadığını kontrol etmenin uygun olduğunu düşündüğünüz yere çağrılar yapın.

tkuan77:
Yardımın için teşekkürler Mladen, ancak sadece seninle kontrol etmek istiyorum, kodu uzun/kısa işlevimden önce mi, arada mı yoksa başka bir yere mi koymalıyım? Çünkü hata vermeye devam ediyor gibi görünüyor ve bunun kaynağını bulamıyorum. Ve MagicNumber bir tamsayı mı?

teras

toplam = SiparişlerToplam();

if(toplam < 2)

{

int countOpenedOnACurrentBar(int tipi)

{

int openAtBar = 0;

tarihsaat startTime = Saat[0];

datetime endTime = Time[0]+Period()*60;

for(int i=0; i < OrdersTotal(); i++)

{

if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES) == false) break;

if(OrderMagicNumber() != MagicNumber) devam ediyor;

if(OrderSymbol() != Symbol()) devam ediyor;

if(OrderType() != type) devam et;

if(OrderOpenTime()=endTime) devam ediyor;

açıldıAtBar++;

kırmak;

}

dönüş(openedAtBar);

}

if(isCrossed == 1 && shortEma > mainshortEma && longEma > mainshortEma)

{

bilet=SiparişGönder(Symbol(),OP_BUY,Lots,Sor,1,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 && shortEma < mainshortEma && longEma < mainshortEma)

{

bilet=SiparişGönder(Symbol(),OP_SELL,Lots,Bid,1,Teklif+StopLoss*Puan,Teklif-AlKar*Puan,

"EA'm",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);

}