Nasıl kodlanır? - sayfa 322

 

Merhaba,

ricam şimdilik bilgi amaçlıdır.

Geçmişi hesaplamadan çevrimdışı bir grafik oluşturan, ancak yalnızca canlı verileri kullanan bir göstergem varsa, onu strateji test şablonuna eklemek ve geçmişten gelen verilerle çevrimdışı bir grafik oluşturmak mümkün mü?

Teşekkür ederim.

 
mladen:
jayjon plajı,

TrendCurr değerini döngüde değiştirmeden tekrar tekrar test ediyorsunuz (böylece her zaman HİÇBİRİ döndürür)

iCustom()'u döngüye sokmayı deneyin ve ardından bu değeri test edin. Bunun gibi bir şey:

if (trendCurr>0)

{

for(int i=1; i<=lookback; i++)

{

int testValue = iCustom(NULL,StepMaTimeFrame,"StepMA_v7",Length,Kv,StepSize,MA_Mode,Advance,Percentage,UpDownShift,HighLow,ColorMode,5,StepMaBarToTest+i);

if (testValue<0) return(LONG);

}

return(NONE);

}

Sayın Bay. Bununla ilgili sadece iki sözüm var, ama tekrar etmekte fayda var...

Teşekkürler, teşekkürler ve teşekkürler!!!

Gerçekten de, kodunuz mükemmel çalıştı ve bahse girerim, sonunda gönderdiğiniz şeye rastlamadan önce diğer 'for' döngülerini, deneme yanılma vb. incelemek için 12 veya daha fazla saat daha kurtardınız.

Aslında trendCurr'u döngüde tekrar tekrar test etmek istediğimi düşündüm ama şimdi senin sayende hatayı görüyorum ve burada "i" kullanarak Stepbartotest'i "i" ile değiştirme çözümünüzün gerçekten mükemmel bir çözüm olduğunu görüyorum. aslında anahtar ama tamamen açık görünmüyor, en azından benim gibi bir acemi için bunu anlamadan önce biraz zaman geçmiş olabilir...

Kodunuz istendiği gibi çalışsa da, bloğumun tamamı çalışmıyor, bu döngünün LONG kriterleri içinde çalıştırılmasının çok ilginç bir istenmeyen sonucu var:

if(YirmiBirEMA > ElliFiveEMA)

{

if (trendCurr>0) // Step filtre akımını kontrol edin

{

if (Teklif > TwentyOneEMA)

{

for(int i=0; i<=geriye bakma; i++)

{

int testValue = iCustom(NULL,StepMaTimeFrame,"StepMA_v7",Length,Kv,StepSize,MA_Mode,Advance,Percentage,UpDownShift,HighLow,ColorMode,5,StepMaBarToTest+i);

if (testValue<0) döner(UZUN);

}

dönüş(YOK);

}

}

}

Şimdi olan şey, eğer'ler karşılandığında, döngü test edilir ve doğruysa satın alır, değilse hiçbir şey yapmazsa harika. Bununla birlikte, tüm kod bloğu bir "while" döngüsü gibi davranır, çünkü if(TwentyOneEMA > FiftyFiveEMA) doğru olduğu sürece, altındaki kodun geri kalanı DEVAM ETMEKTEDİR ve diğer koşulların tümü doğru olursa, enayi satın alır ! Burada kod yapımın bariz hatasını görüyorum... (EMA çaprazının YENİ olduğundan emin olmak için benzer bir for döngüsünün EMA'ları test edebileceğini düşünüyorum)

Bu mutlaka kötü bir şey değil (bazı analizlerin ima ettiği gibi), aslında bu bir sonraki hedefim gibi, farklı bir şekilde çok daha fazla test gerektiriyor ama şimdilik bu revizyonu bırakacağım bu botta yerinde ve bir kopya üzerinde sonraki revizyonları başlatın.

Geçmişe baktıktan sonra yapacağım şey, eğer geçmiş döngü yanlış çıkarsa, bir Adım sinyali için SONRAKİ 10 çubuğunu kontrol etmesini istedim ve eğer doğru olursa, takası yaptım (ben öyleydim). Bunun için bir süre döngüsü kullanmayı mı düşünüyorsunuz?). Yani bu zaten oluyor, ancak ileriye dönük NO 10 bar sınırı yok ve her şeyi doğru çalışacak şekilde nasıl yapılandırmam gerektiğinden emin değilim. (Sanırım Adım sinyalini kontrol edebilirim ve eğer doğruysa son 10 çubukta yeni MA çaprazını arayın, ancak bunun için tüm bloğu tekrarlamam gerekiyor ve daha iyi, daha verimli/zarif bir yol olması gerektiğini düşünüyorum)

Yardımınız için tekrar teşekkür ederim, bunun gelecekteki kodlamada ÇOK kullanışlı olacağına eminim.

 

Merhaba,

Ekli göstergeyi değiştirmeye çalışıyorum. Pratik olarak, hareketli bir everage fiyata dokunduğunda alarm verir ve dokunulduğu zaman çerçevesini değiştirir. Alarma saygı duyulan bir gecikme koydum ama bir alarmdan sonra zaman dilimini değiştirirsem görmezden geliyor.

Düzeltilebilir mi?

Teşekkürler medie_mobili.mq4

Dosyalar:
 

dasio

Göstergelerle bunu değiştiremezsiniz. Bunu yaptığınızda göstergeler global kapsamı ve statik değişkenleri varsayılan değerlere sıfırlıyor, bu nedenle zaman çerçevesini veya sembolü değiştirirken bazı değerleri tutamazsınız. Global değişkenleri ("GlobalVariable..." işlevleriyle yönetilenler) kullanabilirsiniz, ancak bu, kodunuzu çok karmaşık hale getirir (birden çok örnek, birden çok sembol, ...) ve bence bu çabaya değmez

dasio:
Merhaba,

Ekli göstergeyi değiştirmeye çalışıyorum. Pratik olarak, hareketli bir everage fiyata dokunduğunda alarm verir ve dokunulduğu zaman çerçevesini değiştirir. Alarma saygı duyulan bir gecikme koydum ama bir alarmdan sonra zaman dilimini değiştirirsem görmezden geliyor.

Düzeltilebilir mi?

Teşekkürler medie_mobili.mq4
 

...

Bir önceki gönderiye sadece bir ek: çok yaygın olarak bilinmeyen bir şey - EA'lar bu değişkenlere (küresel kapsam ve statik değişkenler) farklı davranıyorlar - zaman çerçevesi veya sembol değiştirildiğinde sıfırlanmıyorlar. İşte ilgilenenlere göstergelerde olduğu gibi EA'larda bu değerlerin nasıl sıfırlanmadığını gösterecek çok, çok basit bir EA

int counter = 0;

int init()

{

return(0);

}

int start()

{

static int counterStart = 0;

counterStart++;

counter++;

Comment("counter from start : "+counterStart," counter using global scope : "+counter);

return(0);

}

Bu bile bazı Eas'larda bazı hataların nedenidir (eğer EA, zaman çerçevesi veya sembol değiştirildiğinde değişkenin sıfırlanmayacağını hesaba katmazsa, EA çalışmasında bazı çok garip hatalar olabilir)

 
mladen:
dasio Koddan, kodun amacının ne olduğunu göremiyorum. Her neyse, göstergenin "temel" değeri olarak gerçek aralığı kullanmak isteyip istemediğinizi (kodunuzun ilk kısmıdır) veya kodunuzun ikinci bölümünü aşağıdaki gibi kullanmak istiyorsanız, seçebileceğiniz bir kod aşağıdadır. "temel" değer

Başka bir zaman teşekkür ederim mladen.

Bu koşula göre başka bir satır eklemek mümkün müdür?

Her zaman gün periyodunu temel alan > Ort[] olan Çalışmanın[] ortalamasına yatay bir çizgi = çizin mi?

Teşekkür ederim

 

Sinyal Değişikliği

Merhaba Mladen,

Bu koda satmayı durdur veya almayı durdur sinyali eklemek istiyorum..... örneğin stokastik sinyal hattı ana hattın üzerindeyse, satışı durdur vb. koda ekledim ama çalışmıyor...lütfen yardım

if(Dönem()==240)

{

statik tarihsaat lastAlerted=0;

double ist_main=iStochastic(NULL,240,8,3,3,MODE_SMA,0,MODE_MAIN,0);

double ist_signal=iStochastic(NULL,240,8,3,3,MODE_SMA,0,MODE_SIGNAL,0);

çift RSIP1=iRSI(NULL,240,14,PRICE_CLOSE,0);

double RSIP2=iRSI(NULL,240,70,PRICE_CLOSE,0);

double b4enCCI=iCCI(NULL,240,6,PRICE_TYPICAL,1);

double şimdiCCI=iCCI(NULL,240,6,PRICE_TYPICAL,0);

double b4trCCI=iCCI(NULL,240,14,PRICE_TYPICAL,1);

double şimditrCCI=iCCI(NULL,240,14,PRICE_TYPICAL,0);

// uyarılar

if((ist_main>ist_signal)&&(RSIP1>RSIP2)&&(nowenCCI >0&&nowenCCI>b4enCCI)&&(nowtrCCI>0&&nowtrCCI>b4trCCI)&&(lastAlerted!=Time[0]))

{

lastAlerted=Zaman[0]; Alert("Buy Arrow","\n"," Geçerli saat ",TimeToStr(CurTime()),"\n",Symbol());

}

if((ist_main<ist_signal)&&(RSIP1<RSIP2)&&(nowenCCI <0&&nowenCCI<b4enCCI)&&(nowtrCCI<0&&nowtrCCI<b4trCCI)&&(lastAlerted!=Time[0]))

{

lastAlerted=Zaman[0]; Alert("Oku Sat",\n","Geçerli saat ",TimeToStr(CurTime()),"\n",Symbol());

}

}

 

Bunun gibi bir şey deneyebilirsiniz:

if(Period()==240)

{

static datetime lastAlerted=0;

double ist_main=iStochastic(NULL,240,8,3,3,MODE_SMA,0,MOD E_MAIN,0);

double ist_signal=iStochastic(NULL,240,8,3,3,MODE_SMA,0,M ODE_SIGNAL,0);

double RSIP1=iRSI(NULL,240,14,PRICE_CLOSE,0);

double RSIP2=iRSI(NULL,240,70,PRICE_CLOSE,0);

double b4enCCI=iCCI(NULL,240,6,PRICE_TYPICAL,1);

double nowenCCI=iCCI(NULL,240,6,PRICE_TYPICAL,0);

double b4trCCI=iCCI(NULL,240,14,PRICE_TYPICAL,1);

double nowtrCCI=iCCI(NULL,240,14,PRICE_TYPICAL,0);

// alerts

alertType = "do nothing";

if((ist_main>ist_signal)&&(RSIP1>RSIP2)&&(nowenCCI >0&&nowenCCI>b4enCCI)&&(nowtrCCI>0&&nowtrCCI>b4trC CI)&&(lastAlerted!=Time[0]))

{

lastAlerted=Time[0]; Alert("Buy Arrow","\n","Current time is ",TimeToStr(CurTime()),"\n",Symbol()); alertType="buy";

}

if((ist_main<ist_signal)&&(RSIP1<RSIP2)&&(nowenCCI <0&&nowenCCI<b4enCCI)&&(nowtrCCI<0&&nowtrCCI<b4trC CI)&&(lastAlerted!=Time[0]))

{

lastAlerted=Time[0]; Alert("Sell Arrow","\n","Current time is ",TimeToStr(CurTime()),"\n",Symbol()); alertType="sell";

}

if (alertType=="do nothing")

{

lastAlerted=Time[0]; Alert("Stop previous action","\n","Current time is ",TimeToStr(CurTime()),"\n",Symbol());

}

}
Mastercash:
Merhaba Mladen,

Bu koda satmayı durdur veya almayı durdur sinyali eklemek istiyorum..... örneğin stokastik sinyal hattı ana hattın üzerindeyse, satışı durdur vb. koda ekledim ama çalışmıyor...lütfen yardım

if(Dönem()==240)

{

statik tarihsaat lastAlerted=0;

double ist_main=iStochastic(NULL,240,8,3,3,MODE_SMA,0,MODE_MAIN,0);

double ist_signal=iStochastic(NULL,240,8,3,3,MODE_SMA,0,MODE_SIGNAL,0);

çift RSIP1=iRSI(NULL,240,14,PRICE_CLOSE,0);

double RSIP2=iRSI(NULL,240,70,PRICE_CLOSE,0);

double b4enCCI=iCCI(NULL,240,6,PRICE_TYPICAL,1);

double şimdiCCI=iCCI(NULL,240,6,PRICE_TYPICAL,0);

double b4trCCI=iCCI(NULL,240,14,PRICE_TYPICAL,1);

double şimditrCCI=iCCI(NULL,240,14,PRICE_TYPICAL,0);

// uyarılar

if((ist_main>ist_signal)&&(RSIP1>RSIP2)&&(nowenCCI >0&&nowenCCI>b4enCCI)&&(nowtrCCI>0&&nowtrCCI>b4trCCI)&&(lastAlerted!=Time[0]))

{

lastAlerted=Zaman[0]; Alert("Buy Arrow","\n","Geçerli saat ",TimeToStr(CurTime()),"\n",Symbol());

}

if((ist_main<ist_signal)&&(RSIP1<RSIP2)&&(nowenCCI <0&&nowenCCI<b4enCCI)&&(nowtrCCI<0&&nowtrCCI<b4trCCI)&&(lastAlerted!=Time[0]))

{

lastAlerted=Zaman[0]; Alert("Oku Sat",\n","Geçerli saat ",TimeToStr(CurTime()),"\n",Symbol());

}

}
 

Valla ben yine takıldım. Kodumun yapılandırılma şekli nedeniyle EA'nın geleceğe bakmasını düzeltmeye çalışıyorum.

Sinyal kodum bir "if" ile başlıyor ve bu doğru olduğu sürece, aşağıdaki kodun geri kalanı gerektiği gibi yürütülmeye devam ediyor (bu, ilk for döngüsünü eklemeden önce bir sorun değildi ama şimdi öyle). Bunu düzeltmek için bir sürü farklı şey denedim ama hiçbir şey çalışmıyor Ayrıca kılavuzu da kontrol ettim ama orada hiçbir şey göze çarpmadı, belki aynı blokta iki "for" döngüsüne izin verilmiyor?

İşte en iyi çabam olduğunu düşündüğüm şey (sadece kısalık için UZUN gösteriyor), hata yok ama EA takas yapmıyor, bu yüzden muhtemelen döngüyü tekrar batırdım:

if (NumOrders == 0)

{

if(YirmiBirEMA > ElliFiveEMA+Ayırma)

{

if (trendCurr>0)

{

for(int i=0; i<=geriye bakma; i++)

int testValue1 = iMA(NULL,0,EMA1,0,MODE_EMA,PRICE_CLOSE,i);

int testValue2 = iMA(NULL,0,EMA2,0,MODE_EMA,PRICE_CLOSE,i);

if (testValue1 < testValue2-Separation2)

{

if (Teklif TwentyOneEMA) // haber filtresi

{

for(i=0; i<=geriye bakma; i++)

{

int testValue3 = iCustom(NULL,StepMaTimeFrame,"StepMA_v7",Length,Kv,StepSize,MA_Mode,Advance,Percentage,UpDownShift,HighLow,ColorMode,5,StepMaBarToTest+i);

if (testValue3 <0 && NumOrders < maxorders) return(UZUN);

}

dönüş(YOK);

}

}

}

}

}

==========

Not (testValue1 < testValue2-Separation2) devam ederse denedim; ancak bir hata olarak 'devam et' olarak işaretlendi 2 döngüye izin verilmiyorsa, bir sonraki döngü ekleme görevim yanlış yönlendirilebilir ...

 
jayjonbeach:
Valla ben yine takıldım. Kodumun yapılandırılma şekli nedeniyle EA'nın geleceğe bakmasını düzeltmeye çalışıyorum.

Sinyal kodum bir "if" ile başlıyor ve bu doğru olduğu sürece, aşağıdaki kodun geri kalanı gerektiği gibi yürütülmeye devam ediyor (bu, ilk for döngüsünü eklemeden önce bir sorun değildi ama şimdi öyle). Bunu düzeltmek için bir sürü farklı şey denedim ama hiçbir şey çalışmıyor Ayrıca kılavuzu da kontrol ettim ama orada hiçbir şey göze çarpmadı, belki aynı blokta iki "for" döngüsüne izin verilmiyor?

İşte en iyi çabam olduğunu düşündüğüm şey (sadece kısalık için UZUN gösteriyor), hata yok ama EA takas yapmıyor, bu yüzden muhtemelen döngüyü tekrar batırdım:

if (NumOrders == 0)

{

if(YirmiBirEMA > ElliFiveEMA+Ayırma)

{

if (trendCurr>0)

{

for(int i=0; i<=geriye bakma; i++)

int testValue1 = iMA(NULL,0,EMA1,0,MODE_EMA,PRICE_CLOSE,i);

int testValue2 = iMA(NULL,0,EMA2,0,MODE_EMA,PRICE_CLOSE,i);

if (testValue1 < testValue2-Separation2)

{

if (Teklif TwentyOneEMA) // haber filtresi

{

for(i=0; i<=geriye bakma; i++)

{

int testValue3 = iCustom(NULL,StepMaTimeFrame,"StepMA_v7",Length,Kv,StepSize,MA_Mode,Advance,Percentage,UpDownShift,HighLow,ColorMode,5,StepMaBarToTest+i);

if (testValue3 <0 && NumOrders < maxorders) return(UZUN);

}

dönüş(YOK);

}

}

}

}

}

==========

Not (testValue1 < testValue2-Separation2) devam ederse denedim; ancak bir hata olarak 'devam et' olarak işaretlendi 2 döngüye izin verilmiyorsa, bir sonraki döngü ekleme görevim yanlış yönlendirilebilir ...

Tamam, sanırım çözdüm, for döngüsünü bu şekilde yapılandırdım, çünkü işler bu ilk döngüden hemen sonra "bitmeyecek", 2. döngüden biraz farklı yapılandırılması gerekiyordu, en azından bu böyleydi. Sonuç Diğer bazı botlara bakmaya geldim. Hızlı test, aşağıdaki çalışmayı gösterir, yine de yapılacak daha fazla test

NumOrders = CalculateCurrentOrders();

if (NumOrders == 0)

{

if(YirmiBirEMA > ElliFiveEMA+Ayırma)

{

if (trendCurr>0)

{

for(int i=0; i<=geriye bakma; i++)

{

int testValue1 = iMA(NULL,0,EMA1,0,MODE_EMA,PRICE_CLOSE,i);

int testValue2 = iMA(NULL,0,EMA2,0,MODE_EMA,PRICE_CLOSE,i);

if (testValue1 <! testValue2-Separation2)

{

Print("Ticaret Yok");

kırmak;

}

(Teklif TwentyOneEMA) devam ederse; // haber filtresi

for(int j=0; j<=backback; j++)

{

int testValue3 = iCustom(NULL,StepMaTimeFrame,"StepMA_v7",Length,Kv,StepSize,MA_Mode,Advance,Percentage,UpDownShift,HighLow,ColorMode,5,StepMaBarToTest+j);

if (testValue3 <0 && NumOrders < maxorders) return(UZUN);

}

dönüş(YOK);

}

}

}

}