Nasıl kodlanır? - sayfa 284

 

Tümünü Kapat Zaman Filtresi için bir çözüm sıraladım

Dış Değişkenler

extern string timefilter="Time Filter";

extern int gmtshift=1; // gmt offset of the broker

extern bool generalfilter=false; // enable time filter

extern int starthour=7; // start hour to trade after this hour

extern int startminutes=0; // minutes of the start hour

extern int endhour=21; // stop to trade after this hour

extern int endminutes=0; // minutes of the start hour

extern bool tradesunday=true; // trade on sunday

extern bool fridayfilter=false; // enable special time filter on friday

extern int fridayhour=21; // stop to trade after this hour

extern int fridayminutes=0; // minutes of the friday hour

[/CODE]

int nstarthour,nendhour,nfridayhour;

string istarthour,istartminutes,iendhour,iendminutes,ifridayhour,ifridayminutes;

datetime tstart,tend,tfriday;[/CODE]

Place Code in Start,

[CODE] if(generalfilter){

nstarthour=starthour+(gmtshift);if(nstarthour>23)nstarthour=nstarthour-24;

if(nstarthour<10)istarthour="0"+nstarthour;

if(nstarthour>9)istarthour=nstarthour;

if(startminutes<10)istartminutes="0"+startminutes;

if(startminutes>9)istartminutes=startminutes;

tstart=StrToTime(istarthour+":"+istartminutes);

nendhour=endhour+(gmtshift);if(nendhour>23)nendhour=nendhour-24;

if(endhour<10)iendhour="0"+nendhour;

if(endhour>9)iendhour=nendhour;

if(endminutes<10)iendminutes="0"+endminutes;

if(endminutes>9)iendminutes=endminutes;

tend=StrToTime(iendhour+":"+iendminutes);

}

if(fridayfilter){

nfridayhour=fridayhour+(gmtshift);if(nfridayhour>23)nfridayhour=nfridayhour-24;

if(nfridayhour<10)ifridayhour="0"+nfridayhour;

if(nfridayhour>9)ifridayhour=nfridayhour;

if(fridayminutes<10)ifridayminutes="0"+fridayminutes;

if(fridayminutes>9)ifridayminutes=fridayminutes;

tfriday=StrToTime(ifridayhour+":"+ifridayminutes);

}

if((generalfilter && (nstarthour<nendhour && TimeCurrent()tend) || (nstarthour>nendhour && TimeCurrent()tend))

|| (tradesunday==false && DayOfWeek()==0) || (fridayfilter && DayOfWeek()==5 && TimeCurrent()>tfriday))

{

CloseAll();

Comment("Non-trading Hours All Positions Closed");

return(0);

}

and the CloseAll function.

[CODE]

void CloseAll(){

int total = OrdersTotal();

for(int i=total-1;i>=0;i--){

OrderSelect(i, SELECT_BY_POS);

int type = OrderType();

bool result = false;

switch(type){

//Close opened long positions

case OP_BUY : result = OrderClose( OrderTicket(), OrderLots(), MarketInfo(OrderSymbol(), MODE_BID), 5, Lime); break;

//Close opened short positions

case OP_SELL : result = OrderClose( OrderTicket(), OrderLots(), MarketInfo(OrderSymbol(), MODE_ASK), 5, LightGreen );

} if(result == false){

Alert("Order " , OrderTicket() , " failed to close. Error:" , GetLastError() );

Sleep(3000);

}

}

return(0);

}

ipuçları ve püf noktaları için teşekkürler Kalenzo

 

Kaybı durdurmak

günaydın

İşlem başına maksimum dd ve yüzde onay değerine dayalı bir SL hesaplamak için bir deney deniyorum.

double lotSize = NormalizeDouble(Kellylot(),2);

double Pip = Point;

if(Digits==3 || Digits==5) Pip = 10*Point;

double Bal = AccountBalance(); // $1000

double TV = MarketInfo(Symbol(), MODE_TICKVALUE); // $1

double Risk = 2; // 2%

double MaxDD = 10; // 10%

double RiskCapital = Bal*MaxDD/100; // Total Exposure 10% of $1000 = $100

double RPT = Bal*Risk/100; // 2% of $1000 = $20

double stopLoss = NormalizeDouble(RPT/TV*lotSize/Pip,Digits); //$20/1*0.01/10 = 0.02000

double Positions = MathAbs(RiskCapital/RPT); // Maximum 5 positions 100 / 20

Buradaki fikir, çifte ve çiftlere bağlı olarak bireysel onay değeri ve lot boyutuna bağlı olarak %2 sl'nin ayarlanabilmesidir.

Bence doğru ama mümkünse birinin kontrol etmesini istiyorum.

 
Beno:
günaydın

İşlem başına maksimum dd ve yüzde onay değerine dayalı bir SL hesaplamak için bir deney deniyorum.

double lotSize = NormalizeDouble(Kellylot(),2);

double Pip = Point;

if(Digits==3 || Digits==5) Pip = 10*Point;

double Bal = AccountBalance(); // $1000

double TV = MarketInfo(Symbol(), MODE_TICKVALUE); // $1

double Risk = 2; // 2%

double MaxDD = 10; // 10%

double RiskCapital = Bal*MaxDD/100; // Total Exposure 10% of $1000 = $100

double RPT = Bal*Risk/100; // 2% of $1000 = $20

double stopLoss = NormalizeDouble(RPT/TV*lotSize/Pip,Digits); //$20/1*0.01/10 = 0.02000

double Positions = MathAbs(RiskCapital/RPT); // Maximum 5 positions 100 / 20

Buradaki fikir, çifte ve çiftlere bağlı olarak bireysel onay değeri ve lot boyutuna bağlı olarak %2 sl'nin ayarlanabilmesidir.

Bence doğru ama mümkünse birinin kontrol etmesini istiyorum.

İyi iş Beno,

Olta vermek balık vermekten her zaman daha iyidir. Yorumlarınızla yardımcı olabildiğim için çok mutluyum.

Stoploss'a gelince, fikir iyidir, ancak bunu tersten de düşünmeye çalışın:

ilk set durdurma kaybı

ikinci olarak ticaret boyutunu ayarla

Bu şekilde sistem giriş/çıkışlarını piyasa koşullarına uydurursunuz ve hesabınızdan %X'ten fazla risk almazsınız ancak çıkış, risk yüzdesi yerine sistem mantığına bağlı olacaktır.

 
Kalenzo:
İyi iş Beno,

Olta vermek balık vermekten her zaman daha iyidir. Yorumlarınızla yardımcı olabildiğim için çok mutluyum.

Stoploss'a gelince, fikir iyidir, ancak bunu tersten de düşünmeye çalışın:

ilk set durdurma kaybı

ikinci olarak ticaret boyutunu ayarla

Bu şekilde sistem giriş/çıkışlarını piyasa koşullarına uydurursunuz ve hesabınızdan %X'ten fazla risk almazsınız ancak çıkış, risk yüzdesi yerine sistem mantığına bağlı olacaktır.

Gidday Kalenzo

SATIŞ emrini açarken hata alıyorum: EA demo ve canlı hesaptayken geçersiz duraklar ve hiçbir işlem açılmıyor. ancak test cihazında iyi çalışıyor ve hata mesajı yok.

EURUSD,Günlük: 1'i değiştir 1.43348 sl'de 0.01 EURUSD satın al: 1.43895 tp: 0.00000 tamam

SL 0.00547 puan farkı

kontrol ettim

MODE_FREEZEEVEL 0.0000

MODE_STOPLEVEL 0.0000

double lotSize = NormalizeDouble(Kellylot(),2);

double Bal = AccountFreeMargin();

double TV = MarketInfo(Symbol(), MODE_TICKVALUE);

double Risk = 0.3;

double MaxDD = 10;

double RiskCapital = Bal*MaxDD/100;

double RPT = Bal*Risk/100;

double stopLoss = NormalizeDouble((RPT/TV)*lotSize/pips2dbl,Digits);

double Positions = MathAbs(RiskCapital/RPT);

double SL;

//---- sell conditions

if(sellsig && ttime!=Time[0]){

double bid = NormalizeDouble(Bid, Digits);

SL = NormalizeDouble(Bid + stopLoss * pips2dbl, Digits);

res=OrderSend(symbol,OP_SELL,lotSize,bid,slippage * pips2dbl,SL,0,"Pivot_Sell",SpecificMagic,0,Red);

if( res<0 )

{

Print("Error opening SELL order : ",ErrorDescription(GetLastError()));

Print("Bid=" + DoubleToStr(bid,Digits) + " : SL=" + DoubleToStr(SL,Digits));

res=0;

}

else //now enter in the SL and TP via OrderModify to make compatible with ECN broker

{

if (OrderSelect(res, SELECT_BY_TICKET))

{

if (!OrderModify(res, Bid, SL, 0, 0, Red))

Print("Error modifying order");

}

}

ttime=Time[0];

return;

}

//---- buy conditions

if(buysig && ttime!=Time[0]) {

double ask = NormalizeDouble(Ask, Digits);

SL = NormalizeDouble(Ask - stopLoss * pips2dbl, Digits);

res=OrderSend(symbol,OP_BUY,lotSize,ask,slippage * pips2dbl,SL,0,"Pivot Buy",SpecificMagic,0,Blue);

if( res<0 )

{

Print("Error opening BUY order : ",ErrorDescription(GetLastError()));

Print("Ask=" + DoubleToStr(ask,Digits) + " : SL=" + DoubleToStr(SL,Digits));

res=0;

}

else //now enter in the SL and TP via OrderModify to make compatible with ECN broker

{

if (OrderSelect(res, SELECT_BY_TICKET))

{

if (!OrderModify(res, Ask, SL, 0, 0, Blue))

Print("Error modifying order");

}

}

ttime=Time[0];

return;

}

}

Buna daha önce hiç rastlamadım.

Şerefe

Beno

 

Kilitle/Kilitle Aç işlevi

mq4'te mandallama/açma işlevini kodlamanın bir yolu var mı? Bir koşula dayalı olarak biraz doğru kilitlersiniz ve bu değeri başka bir koşul tarafından çözülene kadar saklar.

cmfxtrader

 
Beno:
Gidday Kalenzo

SAT emri açarken hata alıyorum: EA demo ve canlı hesaptayken geçersiz duraklar ve hiçbir işlem açılmıyor. ancak test cihazında iyi çalışıyor ve hata mesajı yok.

EURUSD,Günlük: 1'i değiştir 1.43348 sl'de 0.01 EURUSD satın al: 1.43895 tp: 0.00000 tamam

SL 0.00547 puan farkı

kontrol ettim

MODE_FREEZEEVEL 0.0000

MODE_STOPLEVEL 0.0000

double lotSize = NormalizeDouble(Kellylot(),2);

double Bal = AccountFreeMargin();

double TV = MarketInfo(Symbol(), MODE_TICKVALUE);

double Risk = 0.3;

double MaxDD = 10;

double RiskCapital = Bal*MaxDD/100;

double RPT = Bal*Risk/100;

double stopLoss = NormalizeDouble((RPT/TV)*lotSize/pips2dbl,Digits);

double Positions = MathAbs(RiskCapital/RPT);

double SL;

//---- sell conditions

if(sellsig && ttime!=Time[0]){

double bid = NormalizeDouble(Bid, Digits);

SL = NormalizeDouble(Bid + stopLoss * pips2dbl, Digits);

res=OrderSend(symbol,OP_SELL,lotSize,bid,slippage * pips2dbl,SL,0,"Pivot_Sell",SpecificMagic,0,Red);

if( res<0 )

{

Print("Error opening SELL order : ",ErrorDescription(GetLastError()));

Print("Bid=" + DoubleToStr(bid,Digits) + " : SL=" + DoubleToStr(SL,Digits));

res=0;

}

else //now enter in the SL and TP via OrderModify to make compatible with ECN broker

{

if (OrderSelect(res, SELECT_BY_TICKET))

{

if (!OrderModify(res, Bid, SL, 0, 0, Red))

Print("Error modifying order");

}

}

ttime=Time[0];

return;

}

//---- buy conditions

if(buysig && ttime!=Time[0]) {

double ask = NormalizeDouble(Ask, Digits);

SL = NormalizeDouble(Ask - stopLoss * pips2dbl, Digits);

res=OrderSend(symbol,OP_BUY,lotSize,ask,slippage * pips2dbl,SL,0,"Pivot Buy",SpecificMagic,0,Blue);

if( res<0 )

{

Print("Error opening BUY order : ",ErrorDescription(GetLastError()));

Print("Ask=" + DoubleToStr(ask,Digits) + " : SL=" + DoubleToStr(SL,Digits));

res=0;

}

else //now enter in the SL and TP via OrderModify to make compatible with ECN broker

{

if (OrderSelect(res, SELECT_BY_TICKET))

{

if (!OrderModify(res, Ask, SL, 0, 0, Blue))

Print("Error modifying order");

}

}

ttime=Time[0];

return;

}

}

Buna daha önce hiç rastlamadım.

Şerefe

Beno

Muhtemelen stop kaybınız çok yakındır. Stoploss değerini 10 ile çarpmaya çalışın. Sistemi 4 haneli broker üzerinde test ederken ve 5 haneli broker üzerinde işlem yapıyorsanız bu sık görülen bir problemdir. Ayrıca 5 basamaklı komisyoncu üzerinde test edebilirsiniz, ancak komisyoncuya asla bağlanmayın (çevrimdışı modda) ve ardından meta tüccar eski ayarlara sahip olacaktır (4 kazıdan).

İlk önce bu satırdan:

NormalizeDouble(Ask - stopLoss * pips2dbl, Rakamlar);

Bu değeri yazdır => stopLoss*pips2dbl

o zaman zararı durdurmanın gerçek değerini bileceksiniz.

20 veya 10 gibi olacaksa, bunu Puan değeriyle çarpmanız gerektiği anlamına gelir.

NormalizeDouble(Sor - (stopLoss * pips2dbl) *Puan, Rakamlar);

0.00009 gibi olacaksa, o zaman sadece 10 ile çarpmanız gerekir çünkü 0.0009 olmalıdır (tabii ki 9 pip stop loss ayarlamak istiyorsanız)

 
cmfxtrader:
mq4'te mandallama/açma işlevini kodlamanın bir yolu var mı? Bir koşula dayalı olarak biraz doğru kilitlersiniz ve bu değeri başka bir koşul tarafından çözülene kadar saklar. cmfxtrader

Seni doğru anladığımdan emin değilim. ea'nın ( işlev ) belirli bir bölümünü açmak/kapatmak mı istiyorsunuz yoksa ea B'de gerçekleştirilen işlemle işlevi ea A'dan mı devre dışı bırakmak istiyorsunuz? Şu veya bu şekilde, her ikisi de mümkündür.

 

Para değerini fiyata dönüştürün (kar hedefi hesaplaması için)

Bir esnaf sepetinin belirli bir kar hedefi için bir fiyat değeri döndüren bir fonksiyon programlamak istiyorum, ancak güçlük çekiyorum. Ulaşmak istediğim hedef, kar hedefini gösteren, ekrana çizilecek basit bir yatay çizgidir . Ancak kâr hedefi, fiyat değeri değil, para değeri şeklinde kullanıcı tarafından tanımlanabilen bir değişkendir. (örneğin hedef = hedef = 1.2000 yerine 100 €)

Şimdiye kadar sahip olduğum rutin:

(Hesabım EUR cinsindendir!)

1) Diyelim ki USDJPY için birkaç alış pozisyonu açtım (örnek bir durum yaratmak adına rastgele pozisyonlarda)

2) Sepetin ortalama açılış fiyatını hesaplıyorum (yine varsayımsal olarak 1.1500 diyelim) ve bunu belirtmek için yatay bir çizgi gösteriyorum

3) Kar hedefi ayarlanmış bir değişkenim var: diyelim ki hedef = 100 €

4) Sepet kar >= hedef olduğunda tüm açık pozisyonları başarıyla kapatabilirim

Aradaki adım eksik. Bir fonksiyona ihtiyacım var: hedefFiyat değerini döndüren double targetPrice(){}. Sorun yatay çizgiyi çizmek değil: targetPrice'ı hesaplamak!

targetPrice = ortalama açık fiyat + para-değer hedefi (100€)

Temel olarak bilmek istediğim şey: bir para-değerini pip'e nasıl çevirebilirim . Bu şekilde ortalama fiyata pip ekleyebilirim ve işte benim hedef Fiyatım var. Bunun ayrıca bir EUR hesabım olduğu ve USDJPY ile işlem yaptığım gerçeğini de hesaba katması gerektiğini unutmayın. Sanırım orada da tuzaklar var?

 

ECN SL çalışmıyor

günaydın

Bir ECN üzerinde çalışacak bir EA kurmaya çalışıyorum, SL ve TP'nin yerleştirilmesi / değiştirilmesi gerektiğini anlıyorum ve kurulumun doğru olduğunu düşünüyorum, sipariş şimdi açılıyor ancak SL harici çift StopLoss yerleştirilmiyor = 100; herhangi bir yardım harika olurdu.

//---- buy conditions

if(buysig && ttime!=Time[0]) {

ticket = OrderSend(Symbol(), OP_BUY, lotSize, MarketInfo(Symbol(), MODE_ASK), 2, 0, 0, "", 12345);

if(ticket > -1){

if (!OrderSelect(ticket, SELECT_BY_TICKET)) {

error_code = GetLastError();

Print("Error: " + ErrorDescription(error_code));

return(-1);

}

Print("order "+ticket+" successfully opened");

//now enter in the SL and TP via OrderModify to make compatible with ECN broker

SL = MarketInfo(Symbol(), MODE_ASK) - (StopLoss * pips2points);

Print("Ask = " + DoubleToStr(Ask,Digits) + " : SL = " + DoubleToStr(SL,Digits));

//round to nearest Tickvalue

SL = DoubleRound(SL, MarketInfo(Symbol(), MODE_TICKSIZE));

Print("SL rounded: " + SL);

if(!OrderModify(ticket, entry_price, SL, 0, Blue)) {

error_code = GetLastError();

Print("Error: " + ErrorDescription(error_code));

return(-1);

}

Print("Stoploss successfully set");

ttime=Time[0];

return(0);

}

}

}

//Tickvalue Rounding

double DoubleRound(double number, double step){

double mod = MathMod(number, step);

if(mod < step/2.0)

step = 0;

double rounded = number - mod + step;

return (rounded);

}
 

,,,,,,,,,,,.,,,,,,,,

Dosyalar:
test_ea.txt  10 kb
aizig.ex4  10 kb
Neden: