Kodlama yardımı - sayfa 39

 

Bu kod satırını yazdım.

int TriggerChart = PERIOD_H4;

int FastMACDPPeriod = 12;

int SlowMACDPPeriod = 26 ;

int SignalPeriod = 9;

MacdCurrent = iMACD(Symbol(), TriggerChart, FastMACDPperiod,SlowMACDPperiod,SignalPeriod, PRICE_CLOSE, MODE_MAIN, 1);

Bu değişkenler eklendiğinde, EA'nın TriggerChart'ın 'int zaman çerçevesi' olduğunu ve diğerlerinin int dönemleri için kullanıldığını belirleyip belirleyemeyeceğini merak ediyorum. Hepsinin bir arada olduğu yerde, örneğin TriggerChart ve FastMACDPeriod'a bakıp ikisinin de int zaman çerçevesi ile ilgili olduğunu düşünüyor olabilir mi ve kafası karışıyor olabilir mi? EA, hangi değişkenin iMACD'nin hangi bölümü için geçerli olduğunu hangi noktada tanır?

 

...

Kısacası : hayır kafa karıştıramaz (bilgisayarlar bu konuda iyidir düşünmezler ama aynı şeyleri tekrar tekrar yorumlamadan yaparlar) Sadece kodlayıcıların kafası zaman zaman karışır

Bir işlevi çağırdığınızda, parametreleri belirli bir sırayla kabul eder (örneğin: ilk parametre semboldür, ikinci zaman çerçevesidir, vb.) işlev : parametreler çağrı listesindeki yerlerine bağlı olarak kesinlikle kullanılırlar

crsnape@btinternet.com:
Bu kod satırını yazdım.

int TriggerChart = PERIOD_H4;

int FastMACDPPeriod = 12;

int SlowMACDPPeriod = 26 ;

int SignalPeriod = 9;

MacdCurrent = iMACD(Symbol(), TriggerChart, FastMACDPperiod,SlowMACDPperiod,SignalPeriod, PRICE_CLOSE, MODE_MAIN, 1);

Bu değişkenler eklendiğinde, EA'nın TriggerChart'ın 'int zaman çerçevesi' olduğunu ve diğerlerinin int dönemleri için kullanıldığını belirleyip belirleyemeyeceğini merak ediyorum. Hepsinin bir arada olduğu yerde, örneğin TriggerChart ve FastMACDPeriod'a bakıp ikisinin de int zaman çerçevesi ile ilgili olduğunu düşünüyor olabilir mi ve kafası karışıyor olabilir mi? EA, hangi değişkenin iMACD'nin hangi bölümü için geçerli olduğunu hangi noktada tanır?
 

Teşekkürler mladen. Mantıklı geliyor.

Bu kodla, int init() işlevinde BarsGV'yi 0 olarak bildirdim. Ancak, haklı olarak söylediğiniz gibi, bir hata alırsam yine de false döndürür. Sadece int init()'te 0 ilan etmek yerine onu 1'e sıfırlayabileceğimi düşündüm. Ne düşünüyorsun? 200SMA'm var ve Barlar 200'den azsa burada yine de bir hata alıyor.

Yani bunun yerine:

int init()

{

//---

GlobalVariableSet (BarsGV, 0);

//---

dönüş(0);

}

BU INT START() ALTINDADIR

if ((GlobalVariableGet (BarsGV) == 0) || (GlobalVariableGet (BarsGV) < Çubuklar))

{

GlobalVariableSet(HasOrderedGV, false);

GlobalVariableSet(BarlarGV, Barlar);

}

//--- Uzun pozisyon (SATIN AL) olasılığını kontrol edin

if (GlobalVariableGet (HasOrderedGV) == yanlış)

{

Bunu değiştir:

int init()

{

//---

GlobalVariableSet (BarsGV, 1);

//---

dönüş(0);

}

BU INT START() ALTINDADIR

if (GlobalVariableGet (BarsGV) == 0);

{

Print("Global Değişken BarsGV Hatası", GetLastError());

dönüş(0);

}

if (GlobalVariableGet (BarsGV) < Barlar)

{

GlobalVariableSet(HasOrderedGV, false);

GlobalVariableSet(BarlarGV, Barlar);

}

//--- Uzun pozisyon (SATIN AL) olasılığını kontrol edin

if (GlobalVariableGet (HasOrderedGV) == yanlış)

{

Ne düşünüyorsun?

 

...

Bunu şu şekilde değiştirin:

int BarsGV;

bool HasOrderedGV;

int init()

{

//---

BarsGV=0;

HasOrderedGV=false;

//---

return(0);

}

THIS IS UNDER INT START()

if (BarsGV < Bars)

{

HasOrderedGV=false;

BarsGV=Bars;

}

//--- Check for long position (BUY) possibility

if (HasOrderedGV == false)

{[/PHP]

That way you are going to avoid other EA interference and you will keep the variables to only one instance of Ea (they can not mix at all). Much better to do it that way (even from the speed of execution point of view). But you still risk of opening a new order on a same bar this way. The best way is to use a function to count orders opened at the current bar and then allow or disallow ner order opening

Here is a function that can do that (it will check currently opened as well as already closed orders if they have been opened on a current bar) :

bool uniqueOnBar(int MagicNumber)

{

datetime startTime = Time[0];

datetime endTime = startTime+60*Period();

for (int i=OrdersTotal()-1; i>=0; i--)

{

if (!OrderSelect(i,SELECT_BY_POS,MODE_TRADES)) continue;

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

if (OrderMagicNumber() != MagicNumber) continue;

if (OrderOpenTime()endTime) continue;

return(false);

}

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

{

if (!OrderSelect(i,SELECT_BY_POS,MODE_HISTORY)) continue;

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

if (OrderMagicNumber() != MagicNumber) continue;

if (OrderOpenTime()endTime) continue;

return(false);

}

return(true);

}

Checking would be very simple :

[PHP]if (uniqueOnBar(MagicNumber)) .... you can open an a new order

Bu şekilde herhangi bir değişkene değil, yalnızca siparişlere bağlı olursunuz ve bu, %100 güvenilir tek yoldur.

crsnape@btinternet.com:
Teşekkürler mladen. Mantıklı geliyor.

Bu kodla, int init() işlevinde BarsGV'yi 0 olarak ilan ettim. Ancak, haklı olarak söylediğiniz gibi, bir hata alırsam yine de false döndürür. Sadece int init()'te 0 ilan etmek yerine onu 1'e sıfırlayabileceğimi düşündüm. Ne düşünüyorsun? 200SMA'm var ve Barlar 200'den azsa burada yine de bir hata alıyor.

Yani bunun yerine:

int init()

{

//---

GlobalVariableSet (BarsGV, 0);

//---

dönüş(0);

}

BU INT START() ALTINDADIR

if ((GlobalVariableGet (BarsGV) == 0) || (GlobalVariableGet (BarsGV) < Çubuklar))

{

GlobalVariableSet(HasOrderedGV, false);

GlobalVariableSet(BarlarGV, Barlar);

}

//--- Uzun pozisyon (SATIN AL) olasılığını kontrol edin

if (GlobalVariableGet (HasOrderedGV) == yanlış)

{

Bunu değiştir:

int init()

{

//---

GlobalVariableSet (BarsGV, 1);

//---

dönüş(0);

}

BU INT START() ALTINDADIR

if (GlobalVariableGet (BarsGV) == 0);

{

Print("Global Değişken BarsGV Hatası", GetLastError());

dönüş(0);

}

if (GlobalVariableGet (BarsGV) < Barlar)

{

GlobalVariableSet(HasOrderedGV, false);

GlobalVariableSet(BarlarGV, Barlar);

}

//--- Uzun pozisyon (SATIN AL) olasılığını kontrol edin

if (GlobalVariableGet (HasOrderedGV) == yanlış)

{

Ne düşünüyorsun?
 

süperstar. Teşekkürler.

 

merhaba mladen,

Bu kısım:

tarihsaat EndTime = StartTime + 60 * Dönem();

Is Period() bu örnek, grafik zaman çerçevesidir . Öyleyse H4 (240) * 60 deyin, çünkü Bitiş Zamanı saniye cinsinden kaydedilir, yani 240 dakikayı, Dönem (240) dakikalarına karşılık gelecek şekilde saniyeye dönüştürmek?

Bunu doğru mu okuyorum?

Şu da yazılabilir mi:

tarihsaat EndTime = (Başlangıç Zamanı / 60) + Dönem();?

 

...

evet doğru okuyorsun

Diğer formdan itibaren: OrderOpenTime() standart bir tarih-saat biçiminde olduğundan bunu kullanamazsınız, bu da EndTime'da 1 Ocak 1970'den bu yana geçen saniye sayısına sahip olmanız gerektiği ve bunu yazma şeklinizin dakika içereceği anlamına gelir. - metatrader, bunların saniye olduğunu varsayar ve tüm yanlış sonuçları verirdi

crsnape@btinternet.com:
merhaba mladen,

Bu kısım:

tarihsaat EndTime = StartTime + 60 * Dönem();

Is Period() bu örnek, grafik zaman çerçevesidir. Öyleyse H4 (240) * 60 deyin, çünkü Bitiş Zamanı saniye cinsinden kaydedilir, yani 240 dakikayı, Dönem (240) dakikalarına karşılık gelecek şekilde saniyeye dönüştürmek?

Bunu doğru mu okuyorum?

Şu da yazılabilir mi:

tarihsaat EndTime = (Başlangıç Zamanı / 60) + Dönem();?
 

Merhaba mladen, buradaki for döngüsü son açılan veya bekleyen emri mi seçiyor?

bool UniqueOnBar (int MagicNumber)

{

tarihsaat Başlangıç Saati = Saat[0];

datetime EndTime = StartTime + 60 * Dönem (TriggerChart);

for (int i = OrdersTotal() - 1; i >= 0; i--)

{

(!OrderSelect (i, SELECT_BY_POS, MODE_TRADES)) devam ederse;

(OrderSymbol() != Symbol()) devam ederse;

(OrderMagicNumber() != MagicNumber) devam ederse;

(OrderOpenTime() endTime) devam ederse;

dönüş(yanlış);

}

Öyleyse ünlem işaretinin 'değil' olarak yorumlandığı yerde, bunun benim örneğim için doğru olmadığını düşünüyorum çünkü şunu istiyorum:

- En son açılan veya bekleyen siparişi seçmek için kaldırın ! OrderSelect'ten ayrılmak için?

- OrderSymbol() ile Symbol() aynı olacak

- OrderMagicNumber() öğesinin MagicNumber'a eşit olması, yani... şunu bırakır:

int TriggerChart = PERIOD_H4;

int SihirliSayı = 42;

bool UniqueOnBar (int MagicNumber)

{

tarihsaat Başlangıç Saati = Saat[0];

datetime EndTime = StartTime + 60 * Nokta ( TriggerChart );

for (int i = OrdersTotal() - 1; i >= 0; i--)

{

(OrderSelect (i, SELECT_BY_POS, MODE_TRADES)) devam ederse;

(OrderSymbol() == Symbol()) devam ederse;

(OrderMagicNumber() == MagicNumber) devam ederse;

(OrderOpenTime() endTime) devam ederse;

dönüş(yanlış);

}

 

Benim gözetimim, şimdi, ifadenin doğru döndüğü zaman, mevcut çubukta açılmış hiçbir siparişin alınmadığını anlıyorum.

 

...

Evet, öyle. Yani tru dönerse, yeni bir sipariş açabilirsiniz.

Ayrıca, hedef zaman çerçevesi geçerli çubuğunda bir sipariş açılmışsa, mevcut zaman çerçevesinden farklı bir zaman çerçevesini test etmek isterseniz, işlev şu şekilde değiştirilebilir:

bool UniqueOnBar (int MagicNumber, int timeFrame=0)

{

if (timeFrame==0) timeFrame=Period();

datetime StartTime = iTime(NULL,timeFrame,0);

datetime EndTime = StartTime + 60*timeFrame;

for (int i=OrdersTotal()-1; i>=0; i--)

{

if (OrderSelect(i,SELECT_BY_POS,MODE_TRADES)) continue;

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

if (OrderMagicNumber() == MagicNumber) continue;

if (OrderOpenTime() EndTime) continue;

return(false);

}

return(true);

}

[/PHP]

And then the call to it would be for your example 2 posts ago

[PHP]if (UniqueOnBar(MagicNumber,TriggerChart) ... open an order

Not: Örnekteki kapalı sipariş kontrolünü kaldırdınız. Kapalı emirleri de kontrol etmek isterseniz, fonksiyonun orijinal formunun ikinci bölümünü de kullanın.

crsnape@btinternet.com:
Benim gözetimim, şimdi, ifadenin doğru döndüğü zaman, mevcut çubukta açılmış hiçbir siparişin alınmadığını anlıyorum.
Neden: