EA kodu 2 ile ilgili sorun (SL yöneticisi)

 

Merhaba,

MQL öğrenirken yardımınız için tekrar teşekkürler.

İşte bir sonraki sorunum.... Buna çok yakınım.... İstediğim her şeyi yaptırıyorum... Ancak, GAP bu kriterin üzerindeyse, EVERYTICK'teki SL'leri değiştiriyor. BİR KEZ ÇALIŞTIRMAKTAN daha...

Bu çok basit bir kod ve bu aşamada çözemediğim çok basit bir problem ve herhangi bir yardım öğrenmeme yardımcı olacaktır..

Bu sadece BUY SIDE atm'dir, ancak OP_SELL tarafı için IFGAP için daha sonra izinler yazdım.


Bu EA'nın işlevi:

1. mevcut değilse bir satın alma işlemi başlatın.

2. TP seviyesi 1'de, SL'yi yukarı hareket ettirin.... TP seviyesi 2'de, SL'yi tekrar yukarı hareket ettirin…. TP seviyesi 3'te, geçen sefer SL'yi tekrar yukarı hareket ettirin. güzel ve sade gerçekten..


Karşılaştığım noob sorunu:

1. GAP üzerinden ise OrderModify EVERYTICK'imi yürütüyor... Mantığı nasıl değiştireceğimi düşünemiyorum, ancak bir kez gösterildiğimde, gelecek için bileceğim ...


Şimdiden teşekkürler.

Saygılarımla ve herkese mutlu tırtıllar.


 int start()
{
     if ( Bars < 10 )
    {
         Comment ( "Not enough bars" );
         return ( 0 );
    }
     if (Terminated == true)
    {
         Comment ( "EA Terminated." );
         return ( 0 );
    }
    
    OnEveryTick();
    
}

void OnEveryTick()
{
     if (DetectBrokerDigits == false && FiveDigitBroker) PipValue = 10 ;
     if (DetectBrokerDigits && (NDigits == 3 || NDigits == 5 )) PipValue = 10 ;
    
    IfGap_Level_1();
    IfGap_Level_2();
    IfGap_Level_3();
    IfBUYOrderDoesNotExist();
    
}

void IfGap_Level_1()
{
     for ( int i= OrdersTotal ()- 1 ; i >= 0 ; i--)
     if ( OrderSelect (i, SELECT_BY_POS, MODE_TRADES))
    {
         if ( OrderSymbol () == Symbol () && OrderMagicNumber () == BUY_Magic)
        {
             if ((Gap_Level_1 < 0 && (( OrderType () == OP_BUY && Ask - OrderOpenPrice () < Gap_Level_1*PipValue* Point ) ||
            ( OrderType () == OP_SELL && OrderOpenPrice () - Bid < Gap_Level_1*PipValue* Point ))) ||
            ((Gap_Level_1 > 0 && (( OrderType () == OP_BUY && Ask - OrderOpenPrice () > Gap_Level_1*PipValue* Point ) ||
            ( OrderType () == OP_SELL && OrderOpenPrice () - Bid > Gap_Level_1*PipValue* Point )))))
            {
                BuyOrderModifyLevel_1();
                
            }
        }
    }
     else
     Print ( "OrderSelect() error - " , ErrorDescription( GetLastError ()));
    
}

void BuyOrderModifyLevel_1()
{
     for ( int i= OrdersTotal ()- 1 ; i >= 0 ; i--)
     if ( OrderSelect (i, SELECT_BY_POS, MODE_TRADES))
    {
         if ( OrderType () == OP_BUY && OrderSymbol () == Symbol () && OrderMagicNumber () == BUY_Magic)
        {
             double price = Ask;
             if (UseAskLineorNot == false)
            {
                price = OrderOpenPrice ();
            }
             bool ret = OrderModify ( OrderTicket (), OrderOpenPrice (), price - BuyStoploss_Level_1*PipValue* Point , price + BuyTakeprofit_Level_1*PipValue* Point , 0 , Modify_Order_Colour);
             if (ret == false)
             Print ( "OrderModify() error - " , ErrorDescription( GetLastError ()));
        }
    }
    
}

void IfGap_Level_2()
{
     for ( int i= OrdersTotal ()- 1 ; i >= 0 ; i--)
     if ( OrderSelect (i, SELECT_BY_POS, MODE_TRADES))
    {
         if ( OrderSymbol () == Symbol () && OrderMagicNumber () == 1 )
        {
             if ((Gap_Level_2 < 0 && (( OrderType () == OP_BUY && Ask - OrderOpenPrice () < Gap_Level_2*PipValue* Point ) ||
            ( OrderType () == OP_SELL && OrderOpenPrice () - Bid < Gap_Level_2*PipValue* Point ))) ||
            ((Gap_Level_2 > 0 && (( OrderType () == OP_BUY && Ask - OrderOpenPrice () > Gap_Level_2*PipValue* Point ) ||
            ( OrderType () == OP_SELL && OrderOpenPrice () - Bid > Gap_Level_2*PipValue* Point )))))
            {
                BuyOrderModifyLevel_2();
                
            }
        }
    }
     else
     Print ( "OrderSelect() error - " , ErrorDescription( GetLastError ()));
    
}

void BuyOrderModifyLevel_2()
{
     for ( int i= OrdersTotal ()- 1 ; i >= 0 ; i--)
     if ( OrderSelect (i, SELECT_BY_POS, MODE_TRADES))
    {
         if ( OrderType () == OP_BUY && OrderSymbol () == Symbol () && OrderMagicNumber () == 1 )
        {
             double price = Ask;
             if (true == false)
            {
                price = OrderOpenPrice ();
            }
             bool ret = OrderModify ( OrderTicket (), OrderOpenPrice (), price - BuyStoploss_Level_2*PipValue* Point , price + BuyTakeprofit_Level_2*PipValue* Point , 0 , White );
             if (ret == false)
             Print ( "OrderModify() error - " , ErrorDescription( GetLastError ()));
        }
    }
    
}

void IfGap_Level_3()
{
     for ( int i= OrdersTotal ()- 1 ; i >= 0 ; i--)
     if ( OrderSelect (i, SELECT_BY_POS, MODE_TRADES))
    {
         if ( OrderSymbol () == Symbol () && OrderMagicNumber () == 1 )
        {
             if ((Gap_Level_3 < 0 && (( OrderType () == OP_BUY && Ask - OrderOpenPrice () < Gap_Level_3*PipValue* Point ) ||
            ( OrderType () == OP_SELL && OrderOpenPrice () - Bid < Gap_Level_3*PipValue* Point ))) ||
            ((Gap_Level_3 > 0 && (( OrderType () == OP_BUY && Ask - OrderOpenPrice () > Gap_Level_3*PipValue* Point ) ||
            ( OrderType () == OP_SELL && OrderOpenPrice () - Bid > Gap_Level_3*PipValue* Point )))))
            {
                BuyOrderModifyLevel_3();
                
            }
        }
    }
     else
     Print ( "OrderSelect() error - " , ErrorDescription( GetLastError ()));
    
}

void BuyOrderModifyLevel_3()
{
     for ( int i= OrdersTotal ()- 1 ; i >= 0 ; i--)
     if ( OrderSelect (i, SELECT_BY_POS, MODE_TRADES))
    {
         if ( OrderType () == OP_BUY && OrderSymbol () == Symbol () && OrderMagicNumber () == 1 )
        {
             double price = Ask;
             if (true == false)
            {
                price = OrderOpenPrice ();
            }
             bool ret = OrderModify ( OrderTicket (), OrderOpenPrice (), price - BuyStoploss_Level_3*PipValue* Point , price + BuyTakeprofit_Level_3*PipValue* Point , 0 , White );
             if (ret == false)
             Print ( "OrderModify() error - " , ErrorDescription( GetLastError ()));
        }
    }
    
}

void IfBUYOrderDoesNotExist()
{
     bool exists = false;
     for ( int i= OrdersTotal ()- 1 ; i >= 0 ; i--)
     if ( OrderSelect (i, SELECT_BY_POS, MODE_TRADES))
    {
         if ( OrderType () == InitialOrderType && OrderSymbol () == Symbol () && OrderMagicNumber () == BUY_Magic)
        {
            exists = true;
        }
    }
     else
    {
         Print ( "OrderSelect() error - " , ErrorDescription( GetLastError ()));
    }
    
     if (exists == false)
    {
        Initial_BuyOrder();
        
    }
}

void Initial_BuyOrder()
{
     double SL = Ask - InitialBuyStoploss*PipValue* Point ;
     if (BuyStoploss_Level_3 == 0 ) SL = 0 ;
     double TP = Ask + Initial_Takeprofit*PipValue* Point ;
     if (Initial_Takeprofit == 0 ) TP = 0 ;
     int ticket = - 1 ;
     if (true)
    ticket = OrderSend ( Symbol (), OP_BUY, InitialBuyLots, Ask, 4 , 0 , 0 , "My Expert" , BUY_Magic, 0 , Blue );
     else
    ticket = OrderSend ( Symbol (), OP_BUY, InitialBuyLots, Ask, 4 , SL, TP, "My Expert" , BUY_Magic, 0 , Blue );
     if (ticket > - 1 )
    {
         if (true)
        {
             OrderSelect (ticket, SELECT_BY_TICKET);
             bool ret = OrderModify ( OrderTicket (), OrderOpenPrice (), SL, TP, 0 , Blue );
             if (ret == false)
             Print ( "OrderModify() error - " , ErrorDescription( GetLastError ()));
        }
            
    }
     else
    {
         Print ( "OrderSend() error - " , ErrorDescription( GetLastError ()));
    }
}



int deinit()
{
     if (ClearAllObjects) ObjectsDeleteAll ();
    
    
}

 
Funky :

Karşılaştığım noob sorunu:

1. Eğer GAP üzerindeyse OrderModify EVERYTICK'imi yürütüyor... Mantığı nasıl değiştireceğimi düşünemiyorum, ancak bir kez gösterildiğimde, gelecek için bileceğim..

Her tik için yürütmek istemiyorsanız, ne zaman yürütmek istersiniz? her tik ama sadece bir kez mi demek istiyorsun? bunu yapmak için sadece SL & TP'nin önceden ayarlanmış olup olmadığını kontrol edin. . .

Başka bir yorum. . . IfGap_Level_1() , Symbol ve Magic numarasıyla eşleşenleri arayan tüm açık siparişler arasında döngü yapar, ardından siparişin belirli bir miktarda kârlı olup olmadığını vb. kontrol eder. . . BuyOrderModifyLevel_1() öğesini çağırırsa, bu işlev Symbol ve Magic numarasıyla eşleşenleri arayan tüm açık siparişler arasında döner ve bir Buy . . Burada biraz tekrar görüyor musunuz? neden Bilet numarasını IfGap_Level_1() öğesinden BuyOrderModifyLevel_1() öğesine iletmiyorsunuz?

 
Funky :

Merhaba,

MQL öğrenirken yardımınız için tekrar teşekkürler.

İşte bir sonraki sorunum.... Buna çok yakınım.... İstediğim her şeyi yaptırıyorum... Ancak, GAP bu kriterin üzerindeyse, EVERYTICK'teki SL'leri değiştiriyor. BİR KEZ ÇALIŞTIRMAKTAN daha...

Bu çok basit bir kod ve bu aşamada çözemediğim çok basit bir problem ve herhangi bir yardım öğrenmeme yardımcı olacaktır..

Bu sadece BUY SIDE atm'dir, ancak OP_SELL tarafı için IFGAP için daha sonra izinler yazdım.


Bu EA'nın işlevi:

1. mevcut değilse bir satın alma işlemi başlatın.

2. TP seviyesi 1'de, SL'yi yukarı hareket ettirin.... TP seviyesi 2'de, SL'yi tekrar yukarı hareket ettirin…. TP seviyesi 3'te, geçen sefer SL'yi tekrar yukarı hareket ettirin. güzel ve sade gerçekten..


Karşılaştığım noob sorunu:

1. Eğer GAP'ı aşıyorsa OrderModify EVERYTICK'imi yürütüyor... Mantığı nasıl değiştireceğimi düşünemiyorum, ancak bir kez gösterildiğimde, gelecek için bileceğim...


Şimdiden teşekkürler.

Saygılarımla ve herkese mutlu tırtıllar.


Sen NOOB değilsin. Yazabilme ve ardından işlevleri çağırabilme konusundaki zarif yetenekten yola çıkarak, yaptığınız gibi. İşlev çağrılarınızın (mantık derinliği, vb.) 1-2 işleve kadar basitleştirilebileceğini kendiniz görebilmelisiniz.

Yerine:

 OrderOpenPrice () 

senin durumunda:

 if ((Gap_Level_1 < 0 && (( OrderType () == OP_BUY && Ask - OrderOpenPrice () < Gap_Level_1*PipValue* Point ) ||

OrderStopLoss() kullanmayı düşündünüz mü/denediniz mi?

 
RaptorUK :

Her tik için yürütmek istemiyorsanız, ne zaman yürütmek istersiniz? her tik ama sadece bir kez mi demek istiyorsun? bunu yapmak için sadece SL & TP'nin önceden ayarlanmış olup olmadığını kontrol edin. . .

Başka bir yorum. . . IfGap_Level_1() , Symbol ve Magic numarasıyla eşleşenleri arayan tüm açık siparişler arasında döngü yapar, ardından siparişin belirli bir miktarda kârlı olup olmadığını vb. kontrol eder. . . BuyOrderModifyLevel_1() öğesini çağırırsa, bu işlev Symbol ve Magic numarasıyla eşleşenleri arayan tüm açık siparişler arasında döngü yapar ve bir Buy . . Burada biraz tekrar görüyor musunuz? neden Bilet numarasını IfGap_Level_1() öğesinden BuyOrderModifyLevel_1() öğesine iletmiyorsunuz?

Tekrar merhaba Raptor, zaman ayırdığınız için tekrar teşekkür ederiz. Söyleme şeklim, kulağa kafa karıştırıcı geliyor. Tüm bu bileşenleri düzgün bir şekilde bir araya getirmekte sorun yaşıyorum sanırım. Şu anda yaşadığım asıl sorun ' her tıklamada siparişleri değiştiriyor', ancak şimdi yorumlarınızdan sonra başka sorunlar da görebiliyorum. Söylediklerinin son kısmıyla, eğer seni anlıyorsam, Boşluğa kendi {} yerine Gap'e ulaşılıp ulaşılmadığını kontrol ettikten sonra BuyOrderModify kodunu IfGap_Level_1 içine bir {} içine eklemek mi istiyorsunuz? Aşağıdaki bu örnekteki gibi mi?


 void OverGap1_soModify()
{
     for ( int i= OrdersTotal ()- 1 ; i >= 0 ; i--)
     if ( OrderSelect (i, SELECT_BY_POS, MODE_TRADES))
    {
         if ( OrderSymbol () == Symbol () && OrderMagicNumber () == BUY_Magic)
        {
             if ((Gap_Level_1 < 0 && (( OrderType () == OP_BUY && Ask - OrderOpenPrice () < Gap_Level_1*PipValue* Point ) ||
            ( OrderType () == OP_SELL && OrderOpenPrice () - Bid < Gap_Level_1*PipValue* Point ))) ||
            ((Gap_Level_1 > 0 && (( OrderType () == OP_BUY && Ask - OrderOpenPrice () > Gap_Level_1*PipValue* Point ) ||
            ( OrderType () == OP_SELL && OrderOpenPrice () - Bid > Gap_Level_1*PipValue* Point )))))
               {
                 double price = Ask;
                 if (UseAskLineorNot == false)
                {
                 price = OrderOpenPrice ();
                 }
             bool ret = OrderModify ( OrderTicket (), OrderOpenPrice (), price - BuyStoploss_Level_1*PipValue* Point , price + BuyTakeprofit_Level_1*PipValue* Point , 0 , Modify_Order_Colour);
             if (ret == false)
             Print ( "OrderModify() error - " , ErrorDescription( GetLastError ()));
                
            }
        }
    }
     else
     Print ( "OrderSelect() error - " , ErrorDescription( GetLastError ()));
    
}

Ve biliyorsunuz, diğer EA'mla bir şekilde dejavue gibi hissediyorum, bu kutu şimdi şekilleniyor (burada https://forum.mql4.com/42870 - kasıtlı olmayan benzerlik, çünkü farklı bir amaca sahip farklı bir EA , ancak bu, iki işlevi bir araya getirmek gibi öğrenmem gereken aynı alanlara işaret ediyor, yemin ederim forumu fazlalıklarla doldurmaya çalışmıyordum)...

Bu nedenle, aynı noktada IFNEWORDEREXIST = TRUE değişkeninin başka bir sorunu çözüp çözmeyeceğini tesadüfen sorabilir miyim? Bakın, ModeTrades'te yapılan son Açık İşlemin her zaman IfGap_Level_X ile karşılaştırdığım işlem olmasını istiyorum (sanırım bu kısım diğerine benziyor).


Bu hatayı EVERYTICK'te, eğer yukarıdaki kutu doğru değilse {} içinde sıkışıp kalırken OrderModify'ın meydana gelmesiyle düzelttiğimde ve En Son Sipariş Seçimi Sorunu ile ilgilendiğimde, IfGap_Level_3 tatmin olmuşken bir sonraki drama ile karşılaşacağım, IfGap_Level_2 ve IfGap_Level_1 de öyle.

EA'nın bir SL yöneticisi olarak hareket etmesini istiyorum ve (ilk tek satın alma emrine rağmen) onu birden fazla ticareti yönetmek için kullanacağım. İlk satın alma, onu tekrar test edebilmem içindi. Bu kodun şunları yapmasını istiyorum:

Siparişin Pips'i IfGap_Level_1'e ulaşırsa, BuyOrderModifyLevel_1'e gitmesini, ardından mevcut siparişleri değiştirmesini ve kodun bu bölümünü unutmasını istiyorum.

IfOrder'ın Pips'i IfGap_Level_2'ye ulaşırsa, BuyOrderModifyLevel_2'ye gitmesini, ardından mevcut siparişleri değiştirmesini ve kodun bu bölümünü unutmasını istiyorum

Siparişin Pips'i IfGap_Level_3'e ulaşırsa, BuyOrderModifyLevel_3'e gitmesini, ardından mevcut siparişleri değiştirmesini ve kodun bu bölümünü unutmasını istiyorum.

Umarım çok uzakta değilimdir, ilk başta basit geldi.

Bir "mola" ekleyebileceğimi umuyordum; ya da her bloğun sonunda bir şey ve bu koddan kurtulun ...
diostar :

Sen NOOB değilsin. Yazabilme ve ardından işlevleri çağırabilme gibi zarif yetenekten yola çıkarak, yaptığınız gibi. İşlev çağrılarınızın (mantık derinliği, vb.) 1-2 işleve kadar basitleştirilebileceğini kendiniz görebilmelisiniz.

Yerine:

senin durumunda:

OrderStopLoss() kullanmayı düşündünüz mü/denediniz mi?

Ah teşekkürler diostar, yorumlarınla çok naziksin. Temel senaryolar yazmakta iyiyim, ancak o seviyeden çok uzakta değilim ve şimdi hepsini bir araya getirmek başımı ağrıtıyor. Yine de cesaretlendirdiğiniz için teşekkür ederim, forumlar ve her şey bana anlamlı geliyor, program dilbilgisi/sözdizimi çok değil.

Kodu 1-2 fonksiyona indirgeyerek söylediklerinizin doğru olabileceğine inanıyorum, nasıl olduğundan emin değilim ...

Tecrübem olsaydı, hem sizin hem de Raptor'un önerdiğini düşündüğüm gibi bir blokta IFGAP ve MODIFY ORDER olurdu, ancak bu aşamada güvenli oynuyordum... Sanırım bir profesyonel olsaydım, yapardım. bir dizide veya anahtarda TP'lere sahip olun ve eski TP=oldTP+TPincrement_Level'i ayarlayın ve hepsini yaklaşık 10 satırlık bir kodda tek bir blokta alabilir... Sonunda bunu en son If Gap & ModifyOrder {} böylece SL artışı programlanabilir aralıklarla artırılır, ancak ilk birkaçını piyasa koşullarına bağlı olarak manuel olarak ayarlamak için bırakmak istiyorum...

Formülde OrderStopLoss() kullanmayı düşünmedim. Sanırım ilk birkaç hamle için SL'leri biraz değiştireceğim için, gerçekten OrderOpenPrice ve açıldığından beri artan Pips'e dayalı olmasını istiyorum. EA'yı çok iyi açıklamamıştım, özür dilerim. Zaman ayırdığın için teşekkür ederim dostum, çok takdir ediyorum.

 
Funky :

Tekrar merhaba Raptor, zaman ayırdığınız için tekrar teşekkür ederiz. Söyleme şeklim, kulağa kafa karıştırıcı geliyor. Tüm bu bileşenleri düzgün bir şekilde bir araya getirmekte zorlanıyorum sanırım. Şu anda yaşadığım asıl sorun 'her tikte siparişleri değiştiriyor', ancak şimdi yorumlarınızdan sonra başka sorunlar da görebiliyorum. Söylediklerinin son kısmıyla, eğer seni anlıyorsam, Boşluğa kendi {} yerine Gap'e ulaşılıp ulaşılmadığını kontrol ettikten sonra BuyOrderModify kodunu IfGap_Level_1 içine bir {} içine eklemek mi istiyorsunuz? Aşağıdaki bu örnekteki gibi mi?

Bunu yapabilirsin ama gerçekten demek istediğim bu değildi. . .

Şuna bir bakın, mantıklı olup olmadığına bakın. . .

          ( OrderType () == OP_SELL && OrderOpenPrice () - Bid > Gap_Level_1*PipValue* Point )))))
            {
                BuyOrderModifyLevel_1( OrderTicket () );     //  <-----  pass the ticket number to the function
                
            }
.
.
.


void BuyOrderModifyLevel_1( int Ticket)
{
     if ( OrderSelect ( Ticket , SELECT_BY_TICKET, MODE_TRADES))
    {
       double price = Ask;
       if (UseAskLineorNot == false)
       {
          price = OrderOpenPrice ();
       }
       bool ret = OrderModify ( Ticket , OrderOpenPrice (), price - BuyStoploss_Level_1*PipValue* Point , price + BuyTakeprofit_Level_1*PipValue* Point , 0 , Modify_Order_Colour);
       if (ret == false)
       Print ( "OrderModify() error - " , ErrorDescription( GetLastError ()));
     
    }
    
}

Bahsettiğim diğer şey, SL & TP'nin ne olduğuna bakarak Siparişin önceden değiştirilip değiştirilmediğini kontrol etmekle ilgiliydi, başka bir deyişle, siparişi son tikte zaten değiştirdiyseniz, bu tikte tekrar yapmayın. . . . yapmak istediğin bu muydu?

 
RaptorUK :

Bunu yapabilirsin ama gerçekten demek istediğim bu değildi. . .

Şuna bir bakın, mantıklı olup olmadığına bakın. . .

Bahsettiğim diğer şey, SL & TP'nin ne olduğuna bakarak Siparişin zaten değiştirilip değiştirilmediğini kontrol etmekle ilgiliydi, başka bir deyişle, siparişi son tikte zaten değiştirdiyseniz, bu tikte tekrar yapmayın. . . . yapmak istediğin bu muydu?


Bu benim öğrenmem için harika bir şey... En başta bir fonksiyon adından sonra (OrderTicket()) eklenebileceğini bilmiyordum, güzel. Bu, en son Açık Siparişimin Bilet Numarasını ilişkilendirir, harika. Bu, atm'ye girdiğim şeyler için çok çok kullanışlı bir ipucu, teşekkür ederim.

( OrderType () == OP_SELL && OrderOpenPrice () - Bid > Gap_Level_1*PipValue* Point )))))
            {
                BuyOrderModifyLevel_1( OrderTicket () );     //  <-----  pass the ticket number to the function
                
            }

ve burada değişken Bilet yaptığınızı görüyorum. Aslında kodun bu bölümünde bir değişken bildirilebileceğini bilmiyordum. Yukarıdaki son kısımda bir değer verildiği için bu yapılabilir mi? Nasıl çalıştığını anlıyorum, o zaman burada benim 'belirsiz' OrderTicket() yerine bu son Trade's Order Ticket numarasını kullanıyor. Mantıklı. Benim için OrderSelect(i++.. vb.)'den çok daha doğru olacaktır.

 void BuyOrderModifyLevel_1( int Ticket)
{
     if ( OrderSelect (Ticket, SELECT_BY_TICKET, MODE_TRADES))
    {
       double price = Ask;
       if (UseAskLineorNot == false)
       {
          price = OrderOpenPrice ();
       }
       bool ret = OrderModify (Ticket, OrderOpenPrice (), price - BuyStoploss_Level_1*PipValue* Point , price + BuyTakeprofit_Level_1*PipValue* Point , 0 , Modify_Order_Colour);
       if (ret == false)
       Print ( "OrderModify() error - " , ErrorDescription( GetLastError ()));
     
    }
    
}


Saat neredeyse 1 oldu, bu yüzden yarın daha yakından bakacağım, zaman ayırdığınız için çok teşekkür ederim... İçimde bir his var, "BuyModify{} yerine "If_Gap_Levels{}"e bu mantığı eklemem gerekebilir. " engellemek. Fazla açık anlatamamıştım, özür dilerim. Sanırım bu ipucu, GAP için en son bileti kontrol etmeme ve ardından bu OP_BUY ve BUY_Magic vb. İle önceki TÜM siparişleri DEĞİŞTİRMEme yardımcı olacak.

Bahsettiğim diğer şey, SL & TP'nin ne olduğuna bakarak Siparişin önceden değiştirilip değiştirilmediğini kontrol etmekle ilgiliydi, başka bir deyişle, siparişi son tikte zaten değiştirdiyseniz, bu tikte tekrar yapmayın. . . . yapmak istediğin bu muydu?

Evet, asıl takıldığım nokta tam da burası... Bunu nasıl belirteceğimden emin değilim... NeedsModifying = false için bir bool değeri yapıp IfGap kriterleri karşılandığında bunu True'ya mı dönüştüreceğim? Mantığını düşünebilirim, sadece sözdizimini değil, ancak son EA'mda son cümlemi önermeyi bile benim için ipuçlarınızdan öğrendim. Raptor'a tekrar teşekkürler.

 
Funky :

Bu benim öğrenmem için harika bir şey... En başta bir fonksiyon adından sonra (OrderTicket()) eklenebileceğini bilmiyordum, güzel. Bu, Boşluk kriterini karşılayan Biletimi BuyOrderModifyLevel_1 işlevine mi bağlıyor? Bu, atm'ye girdiğim şeyler için çok çok kullanışlı bir ipucu, teşekkür ederim.

ve burada değişken Bilet yaptığınızı görüyorum. Aslında kodun bu bölümünde bir değişken bildirilebileceğini bilmiyordum. Yukarıdaki son kısımda bir değer verildiği için bu yapılabilir mi? Nasıl çalıştığını anlıyorum, o zaman burada benim 'belirsiz' OrderTicket() yerine bu son Trade's Order Ticket numarasını kullanıyor. Mantıklı. Benim için OrderSelect(i++.. vb.)'den çok daha doğru olacaktır.

İşlev tanımının bir parçasıdır. . . Standart İşlevlerden herhangi biri gibi, örneğin OrderModify ( https://docs.mql4.com/trading/OrderModify ) OrderModify bir işlevdir ve ona değişkenler iletirsiniz, en az 5 değişken, 6. isteğe bağlıdır. aynısını kendi Functions ile de yapabilirsiniz. . .

Rica ederim. Gece.

 
RaptorUK :

İşlev tanımının bir parçasıdır. . . Standart İşlevlerden herhangi biri gibi, örneğin OrderModify ( https://docs.mql4.com/trading/OrderModify ) OrderModify bir işlevdir ve ona değişkenler iletirsiniz, en az 5 değişken, 6. isteğe bağlıdır. aynısını kendi Functions ile de yapabilirsiniz. . .

Rica ederim. Gece.


Teşekkürler Raptor.... Ah, o yazının son cümlesini düzenlerken beni yakaladınız, evet, peşinde olduğum şeyde haklıydınız...

Bana o .doc'u tekrar hatırlattığın için teşekkürler... OrderMofidy'de o belirli .doc'u bu kadar çok okumam komik... O kılavuz bana Çince gibi geliyordu, ancak ilerledikçe daha gelişmiş ipuçları duruyor dışarı. Şimdi tekrar okuyacağım ve bahse girerim bahsettiğiniz özellik benim için gün ışığı kadar net olacaktır, ancak bana işaret ettiğiniz için teşekkürler, aramayı biliyordum.

--yukarıdan kopyaladım, siz yazarken o son kısmı farkında olmadan düzenlediğim için...

Bahsettiğim diğer şey, SL & TP'nin ne olduğuna bakarak Siparişin önceden değiştirilip değiştirilmediğini kontrol etmekle ilgiliydi, başka bir deyişle, siparişi son tikte zaten değiştirdiyseniz, bu tikte tekrar yapmayın. . . . yapmak istediğin bu muydu?

Evet, asıl takıldığım nokta tam da burası... Bunu nasıl belirteceğimden emin değilim... NeedsModifying = false için bir bool değeri yapıp IfGap kriterleri karşılandığında bunu True'ya mı dönüştüreceğim? Mantığını düşünebilirim, sadece sözdizimini değil, ancak son EA'mda son cümlemi önermeyi bile benim için ipuçlarınızdan öğrendim. Raptor'a tekrar teşekkürler.

Downunder'dan iyi geceler.

 
RaptorUK :

İşlev tanımının bir parçasıdır. . . Standart İşlevlerden herhangi biri gibi, örneğin OrderModify ( https://docs.mql4.com/trading/OrderModify ) OrderModify bir işlevdir ve ona değişkenler iletirsiniz, en az 5 değişken, 6. isteğe bağlıdır. aynısını kendi Functions ile de yapabilirsiniz. . .

Rica ederim. Gece.


Merhaba Raptor,

Bana gösterdiğin fikirleri kullanarak işleri biraz daha ileri götürdüm. Kodunuzun sorunumu çözeceğini anladım, ancak siparişler ikinci TP seviyeme ulaştığında yönetmek zor olacak..

OrderSelect i++'ı bırakıp bu denklemde kendi Biletimi seçebileceğimi bilmiyordum, bu yüzden birden fazla işlemle ilgili tüm sorunlarımı çözeceği için bunu denedim... bu işe yarar mı?

Birisi bu kodun işe yarayacağını benim için onaylayabilirse çok memnun olurum... desteğiniz için tekrar teşekkürler ;)

 void BuyPendingOrder_1()
{
     int expire = TimeCurrent () + 60 * 0 ;
     double price = NormalizeDouble (Ask, NDigits) + PriceOffset_1*PipValue* Point ;
     double SL = price - BuyStoploss_1*PipValue* Point ;
     if (BuyStoploss_1 == 0 ) SL = 0 ;
     double TP = price + BuyTakeprofit_1*PipValue* Point ;
     if (BuyTakeprofit_1 == 0 ) TP = 0 ;
     if ( 0 == 0 ) expire = 0 ;
     int PendingOrderTicket_1 = OrderSend ( Symbol (), OP_BUYSTOP, BuyLots_1, price, 4 , SL, TP, "EA_Pending_Order1" , BUY_Magic, expire, Blue );
     ///--^^^----^^^ allocate this ticket number to PendingOrderTicket_1 above
    if (PendingOrderTicket_1 == - 1 )
    {
         Print ( "OrderSend() error - " , ErrorDescription( GetLastError ()));
    }
    
}

void IfGap_Level_1()
{
     if ( OrderSelect (PendingOrderTicket_1,SELECT_BY_POS,MODE_TRADES)) ///--<<<---- select ticket number from PendingOrderTicket_1
     {
         if ( OrderSymbol () == Symbol () && OrderMagicNumber () == BUY_Magic)
        {
             if ((Gap_Level_1 < 0 && (( OrderType () == OP_BUY && Ask - OrderOpenPrice () < Gap_Level_1*PipValue* Point ) ||
            ( OrderType () == OP_SELL && OrderOpenPrice () - Bid < Gap_Level_1*PipValue* Point ))) ||
            ((Gap_Level_1 > 0 && (( OrderType () == OP_BUY && Ask - OrderOpenPrice () > Gap_Level_1*PipValue* Point ) ||
            ( OrderType () == OP_SELL && OrderOpenPrice () - Bid > Gap_Level_1*PipValue* Point )))))
            {
                BuyOrderModifyLevel_1; ///--<<<----if PendingOrderTicket_1 is over Gap_Level_1, then proceed to BuyOrderMoidfyLevel_1 section etc
                
            }
        }
    }
     else
     Print ( "OrderSelect() error - " , ErrorDescription( GetLastError ()));
    
}

void BuyOrderModifyLevel_1() 
{
     if ( OrderSymbol () == Symbol () && OrderMagicNumber () == BUY_Magic)  ///--<<<----select all trades of that pair and magic
    {
        
             double price = Ask;
             if (UseAskLineorNot == false)
            {
                price = OrderOpenPrice ();
            }
             bool ret = OrderModify ( OrderTicket (), OrderOpenPrice (), price - BuyStoploss_Level_1*PipValue* Point , price + BuyTakeprofit_Level_1*PipValue* Point , 0 , Modify_Order_Colour);
             ///--^^^^^^---- modify all trades of that pair and magic if it made it this far
            if (ret == false)
             Print ( "OrderModify() error - " , ErrorDescription( GetLastError ()));
            
    }
    
}
 

Önerdiğiniz şeyi yaparken bir sorun var. . . .

EA'nızın çalıştığını hayal edin. . . . daha sonra MT4'ünüz herhangi bir nedenle kesintiye uğrar, elektrik kesintisi, MT4 çökmesi, PC'nin yeniden başlatılması vb. . . artık PendingOrderTicket_1 için doğru değere sahip olmadığı için kodunuz kaldığı yerden devam edemiyor

 
RaptorUK :

Önerdiğiniz şeyi yaparken bir sorun var. . . .

EA'nızın çalıştığını hayal edin. . . . daha sonra MT4'ünüz herhangi bir nedenle kesintiye uğrar, elektrik kesintisi, MT4 çökmesi, PC'nin yeniden başlatılması vb. . . artık PendingOrderTicket_1 için doğru değere sahip olmadığı için kodunuz kaldığı yerden devam edemiyor


Merhaba Raptor, tekrar teşekkürler.

Yukarıdaki kodla ilgili tek sorun bu mu ??? Bence en kötü durumda PendingOrderTicket_1 değiştirilmez ve SL'sinde kapanır.

OrderSelect işlevini nasıl kullandığım doğru mu?

  if ( OrderSelect (PendingOrderTicket_1,SELECT_BY_POS,MODE_TRADES)) ///--<<<---- select ticket number from PendingOrderTicket_1

Sahip olacağımı düşündüğüm en büyük sorun, OrderTicket_1 ilk Gap_Level1'in üzerindeyken, bu kriterin karşılandığı EVERYTICK'teki sırayı değiştirmeye devam edecek.

Durum bu mu? Eğer öyleyse, aşağıdaki kod düzeltir mi?

bool HasBeenExecuted = false;
/// (further up in declared variables^^^)

void BuyOrderModifyLevel_1()
{
if ( OrderSymbol () == Symbol () && OrderMagicNumber () == BUY_Magic)
      {
        
             double price = Ask;
             if (UseAskLineorNot == false)
            {
                price = OrderOpenPrice ();
            }
             bool ret = OrderModify ( OrderTicket (), OrderOpenPrice (), price - BuyStoploss_Level_1*PipValue* Point , price + BuyTakeprofit_Level_1*PipValue* Point , 0 , Modify_Order_Colour);
            HasBeenExecuted = false ;
            if (ret == false)
             Print ( "OrderModify() error - " , ErrorDescription( GetLastError ()));
            {
            HasBeenExecuted = true ;
            }
     }    
   
}


Yoksa bunu CheckGapLevel_1 ile mi yapsam, orada sadece bir kez kontrol eder mi? Ve eğer öyleyse, aşağıda doğru yaptım mı???? "Mola" vermem gereken bir yer var mı?

bool HasBeenExecuted = false;
/// (further up in declared variables^^^)

void IfGap_Level_1()
{
     if ( OrderSelect (PendingOrderTicket_1,SELECT_BY_POS,MODE_TRADES))
    {
         if ( OrderSymbol () == Symbol () && OrderMagicNumber () == BUY_Magic)
        {
             if ((Gap_Level_1 < 0 && (( OrderType () == OP_BUY && Ask - OrderOpenPrice () < Gap_Level_1*PipValue* Point ) ||
            ( OrderType () == OP_SELL && OrderOpenPrice () - Bid < Gap_Level_1*PipValue* Point ))) ||
            ((Gap_Level_1 > 0 && (( OrderType () == OP_BUY && Ask - OrderOpenPrice () > Gap_Level_1*PipValue* Point ) ||
            ( OrderType () == OP_SELL && OrderOpenPrice () - Bid > Gap_Level_1*PipValue* Point )))))
            HasBeenExecuted = false ;
            {
            HasBeenExecuted = true ;                
            BuyOrderModifyLevel_1;
               
            }
        }
    }
     else
     Print ( "OrderSelect() error - " , ErrorDescription( GetLastError ()));
    
}

Tekrar teşekkürler ;)

Neden: