Forex programozás Fórum Kérdések az MQL4 programozási nyelvvel kapcsolatban Pozíciók darabszámának szabályozása

5 bejegyzés megtekintése - 1-5 / 5
  • Szerző
    Bejegyzés
  • káROBOTi
    Tag
    Bejegyzések száma: 28

    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!

    káROBOTi
    Tag
    Bejegyzések száma: 28

    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!

    filewalker
    Tag
    Bejegyzések száma: 19

    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áROBOTi
    Tag
    Bejegyzések száma: 28

    Köszönöm a segítséget!
    Próbálkozok azzal amit írtál.
    Majd megírom mire jutottam.

    káROBOTi
    Tag
    Bejegyzések száma: 28

    Í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);}}
5 bejegyzés megtekintése - 1-5 / 5
  • Be kell jelentkezni a hozzászóláshoz.