Forex programozás › Fórum › Kérdések az MQL4 programozási nyelvvel kapcsolatban › Pozíciók darabszámának szabályozása
-
SzerzőBejegyzés
-
Hello Radu!
A problémám a következő: a robotom olyan hibát követ el, hogy ha igaz a feltétel ami alapján kereskedik akkor addig nyitja a pozíciót amíg van szabad tőke.
A pozícióknak adtam külön nevet és magic számot.
A robotom több idősíkot figyel.Ticket_EURUSD_Buy_a_MN1=OrderSend(Symbol()….
Ticket_EURUSD_Buy_a_W1=OrderSend(Symbol()….
Ticket_EURUSD_Buy_a_D1=OrderSend(Symbol()….
…
Tehát van, hogy pl:.Ticket_EURUSD_Buy_a_MN1 nevű pozíciómat addig nyitja folyamatosan amíg van szabad tőke.
Hogyan lehet azt beszabályozni, hogy pl:.Ticket_EURUSD_Buy_a_MN1 nevű pozícióból csak egy legyen egészen addig amíg az be nem zár, és csak után jöhetne létre ismét majd egy Ticket_EURUSD_Buy_a_MN1 nevű pozíció.Az össze kereskedések számát nem szabályozhatom le egyre mert van, hogy egyszerre több pozíció más névvel és más feltételek alapján jön létre.
if(OrdersTotal<1){
Ticket_EURUSD_Buy_a_W1=OrderSend(Symbol()…. // ez így semmiféle képen nem jöhet szóba.Válaszodat előre is köszönöm!
for(i=0;i<=OrdersTotal();i++){
if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)){
if(OrderMagicNumber()==Magic_EURUSD_buy_a_MN1)
Ticket_EURUSD_Buy_a_MN1=true;
else
Ticket_EURUSD_Buy_a_MN1=false;}}
if(Ticket_EURUSD_Buy_a_MN1==false){
** if(A_M5_Close-Támasz_MN1<=0.0005 && Vétel_M15==True && Eladás_M30==False && Eladás_H1==False && Vétel_H4==True && Vétel_D1==True){
Ticket_EURUSD_Buy_a_MN1=OrderSend(Symbol(),OP_BUY,lots,Bid,Slippage,Bid-StopLoss_MN1*Point,Bid+TakeProfit_MN1*Point,Komment,Magic_EURUSD_buy_a_MN1,EURUSD_Expiration,Green);}}Így próbáltam megoldani, hogy ne nyitogassa folyamatosan a pozíciót, de hiába. Amíg a „**”-gal megjelölt feltétel igaz addig folyamatosan nyitja az új pozíciót. Minden új tickénél nyit egyet.
Régebben küldtél nekem egy ilyen segítséget:
„A kulcs az, hogy minden gyertya első tickjében fusson le a programod.Ezt többféleképpen el lehet érni, pl. a Bars (gyertyák száma) változását figyelve vagy az aktuális szerver idő figyelésével:
if (Bars != Bars.Prev) {
// Funkciók
Bars.Prev = Bars;
}if (TimeCurrent() >= NextRun) {
// Funkciók
NextRun = Time[0] + Period() * 60;
}Az első esetben azt használjuk ki, hogy a gyertyák száma csak akkor növekszik ha egy új gyertya elkezdődött.
A második esetben pedig azt, hogy tudjuk: a beérkező ticknél a gyertyák periodikus időbeli indulásához igazítjuk a legközelebbi futást.”
Azóta a stratégiám változott, azért nem tudom ezt alkalmazni.
Türelmedet előre is köszönöm!
Szerintem próbálj meg valami hasonlót:
if(CountTradesByMagic(MasterMagicNumber)>0){ if(OrderType()==OP_BUY)LongAllowed=false; if(OrderType()==OP_SELL)ShortAllowed=false; } if((EMA0>SMA0 && EMA1<=SMA1) || (EMA0<SMA0 && EMA1>=SMA1)) enddirection=true; if((CountTradesByMagic(MasterMagicNumber)==0 || (CountTradesByMagic(MasterMagicNumber)>0 && OrderType()!=OP_BUY)) && (signal==0 || signal==2))LongAllowed=true; if((CountTradesByMagic(MasterMagicNumber)==0 || (CountTradesByMagic(MasterMagicNumber)>0 && OrderType()!=OP_SELL)) && (signal==0 || signal==1))ShortAllowed=true;
A signal =
** if(A_M5_Close-Támasz_MN1<=0.0005 && Vétel_M15==True && Eladás_M30==False && Eladás_H1==False && Vétel_H4==True && Vétel_D1==True){
Az enddirection-hoz bármilyen feltételt beállíthatsz a mozgó átlagok helyett.
Tulajdonképpen ez akadályozza meg a visszanyitást.if(!Ticket_EURUSD_Buy_a_MN1 && enddirection && LongAllowed){ ** if(A_M5_Close-Támasz_MN1<=0.0005 && Vétel_M15==True && Eladás_M30==False && Eladás_H1==False && Vétel_H4==True && Vétel_D1==True){
A magicnumber számláló elég egyszerü:
int CountTradesByMagic(int magic) { int count = 0; for (int trade = OrdersTotal() - 1; trade >= 0; trade--) { OrderSelect(trade, SELECT_BY_POS, MODE_TRADES); if (OrderSymbol() != Symbol() || OrderMagicNumber()!=magic) continue; if (OrderSymbol() == Symbol() && OrderMagicNumber()==magic) if (OrderType() == OP_SELL || OrderType() == OP_BUY) count++; } return (count); }
Remélem tudsz kezdeni vele valamit.
Köszönöm a segítséget!
Próbálkozok azzal amit írtál.
Majd megírom mire jutottam.Így sikerült megoldani:
for(i=0;i<=OrdersTotal();i++){ if(OrderSelect(i,SELECT_BY_POS)){ if(OrderMagicNumber()==Magic_EURUSD_buy_a_H1)Buy_H1=true;}} if(A_M5_Close-Támasz_H1<=0.0005 && Vétel_M5==True && Vétel_M15==True && Vétel_M30==True && Vétel_H1==True && Vétel_H4==True && Eladás_D1==False){ if(Buy_H1==false){ Ticket_EURUSD_Buy_a_H1=OrderSend(Symbol(),OP_BUY,lots,Bid,Slippage,Bid-StopLoss_H1*Point,Bid+TakeProfit_H1*Point,Komment,Magic_EURUSD_buy_a_H1,EURUSD_Expiration,Green);}}
-
SzerzőBejegyzés
- Be kell jelentkezni a hozzászóláshoz.