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

 

Buradaki bağlantı bu aşamada 'yol' üstü, ancak sorunlarımı çözmek için nasıl harika bir kütüphane dosyası yapabileceğimi görebiliyorum... https://www.mql5.com/en/articles/1390 . Atm bilet dizileri oluşturmak konusunda biraz gerginim ve şimdilik bunun üstesinden gelebileceğimi umuyorum..

Değiştir bölümüne gelmeden önce her şeyi doğru yaptım. Bilete göre doğru seçer ve sonra Değiştir bloğuna geçer... o kısım harika.

'Bu değişiklik bölümünde bir şeyler takılırsa' veya 'bir sonraki siparişi almak için bu bölümlerden geçmesi gerektiğinden' başım belada mı göremiyorum.

Onu değiştirme bloğuna gönderebileceğimi ve o Sihirli Sayı ve Sembolün tüm sıralarını değiştirmesini sağlayabileceğimi ummuştum. Bu yüzden biraz doğru veya yanlış anahtarı denedim.

Her bir 'bir sonraki siparişi seçmek için' bu bölümlerden geçmesi gerekiyorsa, başım belada olabilir.

Belki değiştirilmesi gereken biletleri manuel olarak adlandırabilirim, ancak sorunun bu olduğunu düşünmüyorum, çünkü onları doğru bir şekilde alıyor, sadece her tik atıyor ve nedenini bilmek için bir acemiyim ...

Bu başka bir seçenek olabilir mi?

 for ( int i = 1 ; i <= OrdersTotal () ; i ++ )
     { 
      if ( OrderSelect ( i - 1 , SELECT_BY_POS )
       executedpreviously = true;
       while ( true )
         {
         modify section is ok...   
          }
        executedpreviously = false;
      }
//or would I declare this back to false elsewhere... 
//I am just not sure if it needs to run here each tick to grab the next order

Bir devam eder mi;, döner() veya ara verir; bir yerde işe yarar mı?

 

Ah, önceki örneklerimden birinde bir hata gördüm...

 if ( OrderType () == OP_SELL && OrderSymbol () == Symbol () && OrderMagicNumber () == SELL_Magic01 && !IfGap_SELLLevel_00AlreadyExe) 

Bence olmalı:

 bool IfGap_SELLLevel_00AlreadyExe = FALSE; //(this time up in declared varibales before program start)


     for ( int i= OrdersTotal ()- 1 ; i >= 0 ; i--)
     if ( OrderSelect (i, SELECT_BY_POS, MODE_TRADES))
    {
         if ( OrderType () == OP_SELL && OrderSymbol () == Symbol () && OrderMagicNumber () == SELL_Magic01 && IfGap_SELLLevel_00AlreadyExe == FALSE)
        { 
             double Level_00_SL = Bid + Stoploss_Level_00*PipValue* Point ;
             if (Stoploss_Level_00 == 0 ) Level_00_SL = 0 ;
             double Level_00_TP = Bid - Takeprofit_Level_00*PipValue* Point ;
             if (Takeprofit_Level_00 == 0 ) Level_00_TP = 0 ;
             bool ret00 = OrderModify ( OrderTicket (), OrderOpenPrice (), Level_00_SL, Level_00_TP, 0 , Modify_Order_Colour);
            IfGap_SELLLevel_00AlreadyExe = TRUE;
             if (ret00 == false)
             Print ( "OrderModify() error - " , ErrorDescription( GetLastError ()));
            break;  (EDIT: going to try this break in the morning, pls let me know if I am off track totally anyway)
         }
    }

Bu, onu o bölümde ayırmalı... sabahın 5'i henüz test edilecek... (bir saat kaybetti, lanet olası gün ışığından yararlanma haha)

Bu bölüme bir şekilde geçmesine izin verirsem, her tikte sipariş değişikliklerini en son siparişle spam yapar... ..

Siparişleri geriye doğru 5,4,3,2,1 veya ileriye 1,2,3,4,5 arasında kaydırarak alabilirim, ancak tüm siparişleri spam göndermeden değiştirmeye izin vermenin bir yolunu düşünemiyorum.

Merak ediyorum 1) Geçen tüm siparişleri değiştirmek için bir kez geçmesine izin vermem mi gerekiyor... veya 2) yeni bir sipariş seçmesi için her seferinde geçmesi mi gerekiyor?

Hala öğreniyorum bu kadar.. Kimse beni doğru yöne yönlendiremezse, yukarıdaki satırı bir ara ve son ile deneyeceğim ve bitip bitmediğine bakacağım.... basit bir şey olmalı..

 
IfGap_SELLLevel_00AlreadyExe == FALSE)  this may still compile, but truly speaking, this a "mis-spelt" boolean syntax.

Herhangi bir hata YAPMADINIZ. İlki gitmek İYİ...

 if ( OrderType () == OP_SELL && OrderSymbol () == Symbol () && OrderMagicNumber () == SELL_Magic01 && !IfGap_SELLLevel_00AlreadyExe ) <--- this is GOOD to go..


Tüm bunları doğru okursam, daha önce de benzer bir sorun yaşayabilirdim. Teklif/Soruşturma x Pip uzaklaşırsa, kendi " stop/limit emirlerini minimum MODE_STOP düzeyine göre değiştir..." oluşturmaya çalışıyordum.

Sizin durumunuz benzer mi?

 
diostar :

Herhangi bir hata YAPMADINIZ. İlki gitmek İYİ...


Tüm bunları doğru okuduysam, daha önce de benzer bir sorunum olabilirdi. Teklif/Soruşturma x Pip uzaklaşırsa, kendi "stop/limit emirlerini minimum MODE_STOP düzeyine göre değiştir..." oluşturmaya çalışıyordum.

Sizin durumunuz benzer mi?



Teşekkürler Diostar, Bekleyen Siparişlerle bir tür yığın oluşturmaya çalışıyorum, sonra bir sonraki başarılı Bekleyen Siparişe gelince, eski durakları gündeme getirin.

ile deneyeceğim! tekrar o zaman... denenecek çok fazla kombinasyon var... ve görüyorum ki, boole değeri için YANLIŞ yerine "yanlış" kullanmalıydım... evet derleme yaptı ve yine de çalıştı, ama aynı sorun. Bu taslağı tekrar bulabilir ve "yanlış" ile deneyebilirim.. Örnek 2'de, siparişler arasında gezinmeyecek ve her onay işaretini değiştirmeyecek, bu yüzden bu değişken değiştirilerek tekrar deneyeceğim.

Değiştirme bloğuna geçmesini ve siparişleri ileri veya geri döndürmesini sağlayabilirim, ancak her onay işaretini değiştirir ve değiştirildikten sonra doğru veya yanlış bir filtre koyarsam, yalnızca önbellekteki ilk sırayı değiştirir... .

bana göre bu, EA'nın bir sonraki siparişi almak için her bir işaretin bu bloğa ulaşması gerektiğini gösteriyor (bu bloğa ne zaman ulaşacağından emin değildim, eğer burayı mühürleyebilirsem ve siparişler arasında dönmesini sağlayabilirsem) bir Zamanlar)...

Bu bana bir sorun teşkil ediyor, çünkü doğru veya yanlış herhangi bir soru, bunun geçmesine izin vermiyor...

Sanırım bir sipariş önbelleği oluşturmayı ve aralarından seçim yapmayı öğrenseydim, yine aynı sorunu yaşardım...Bütün kombinasyonlar oldu ama hepsi aynı anda olmadı. Onu bir kez değiştirip devam ettirdim, ancak yalnızca ilk siparişi aldı ve durdu... bu yüzden bunu, her sipariş biletini gerçekten belirtilen bir anahtarla kullanmam gerekip gerekmediğini merak ediyorum... Emin değildim. benim bool OrderTicket() hata mesajımı bildirmek için, bir Pending_OrderTicket_XX bildirimini de karıştırdı... Basit bir şey olmalı ..

sende bu sorunu nasıl çözdün

 
void IfGap_SELLLevel_00()
{
     if ( OrderSelect (FirstRunSell_ticket_00,SELECT_BY_TICKET,MODE_TRADES)) 
    {
         if ( OrderSymbol () == Symbol () && OrderMagicNumber () == SELL_Magic01)
        {
             if ((Gap_Level_00 < 0 && ( OrderType () == OP_SELL && OrderOpenPrice () - Bid < Gap_Level_00*PipValue* Point ))
             || (Gap_Level_00 > 0 && ( OrderType () == OP_SELL && OrderOpenPrice () - Bid > Gap_Level_00*PipValue* Point )))
            {
                SellOrderModifyLevel_00();
            }
        }
    }
    
    
}

void SellOrderModifyLevel_00()
{
     for ( int i= OrdersTotal ()- 1 ; i >= 0 ; i--)
     if ( OrderSelect (i, SELECT_BY_POS, MODE_TRADES))
    {
         if ( OrderType () == OP_SELL && OrderSymbol () == Symbol () && OrderMagicNumber () == SELL_Magic01 && !IfGap_SELLLevel_00AlreadyExe) 
        { 
             double Level_00_SL = Bid + Stoploss_Level_00*PipValue* Point ;
             if (Stoploss_Level_00 == 0 ) Level_00_SL = 0 ;
             double Level_00_TP = Bid - Takeprofit_Level_00*PipValue* Point ;
             if (Takeprofit_Level_00 == 0 ) Level_00_TP = 0 ;
             OrderModify ( OrderTicket (), OrderOpenPrice (), Level_00_SL, Level_00_TP, 0 , Modify_Order_Colour);
            IfGap_SELLLevel_00AlreadyExe = true;
            
        }
    }
    
}


Global değişkenlerde nasıl beyan ettiğime bakılmaksızın ...

bool IfGap_SELLLevel_00AlreadyExe;

..bir kez değiştiriyor gibi görünüyor, AMA emirlerden sadece biri, emirleri kaydırma şeklimle son siparişi kabul ediyorum.

Ben de bilet siparişi vermeden önce ret00'ü çıkardım...

En azından her onay işareti değil, bu örneği, ilk forumun koşulları doğru olduğunda hala siparişlerimde gezinirse kullanabilirim (ancak en başarılı girişimim gibi, kaydırmadan sonra her onayda 'spam değişiklik yapmaz'. ..)

Bu girişim de işe yaramadı:

 **sent here first from that other decision, but for Pending Order 5 instead of FirstSell 00 etc...

void SellOrderModifyLevel_05()
{
     for ( int i= OrdersTotal ()- 1 ; i >= 0 ; i--)
     if ( OrderSelect (i, SELECT_BY_TICKET))
    {
         if ( OrderType () == OP_SELL && OrderSymbol () == Symbol () && OrderMagicNumber () == SELL_Magic01 && !IfGap_SELLLevel_00AlreadyExe) 
        { 
             double Level_05_SL = Bid + Stoploss_Level_05*PipValue* Point ;
             if (Stoploss_Level_05 == 0 ) Level_05_SL = 0 ;
             double Level_05_TP = Bid - Takeprofit_Level_05*PipValue* Point ;
             if (Takeprofit_Level_05 == 0 ) Level_05_TP = 0 ;
             OrderModify (FirstRunSell_ticket_00, OrderOpenPrice (), Level_05_SL, Level_05_TP, 0 , Modify_Order_Colour);
             OrderModify (SellPendingOrderTicket_01, OrderOpenPrice (), Level_05_SL, Level_05_TP, 0 , Modify_Order_Colour);
             OrderModify (SellPendingOrderTicket_02, OrderOpenPrice (), Level_05_SL, Level_05_TP, 0 , Modify_Order_Colour);
             OrderModify (SellPendingOrderTicket_03, OrderOpenPrice (), Level_05_SL, Level_05_TP, 0 , Modify_Order_Colour);
             OrderModify (SellPendingOrderTicket_04, OrderOpenPrice (), Level_05_SL, Level_05_TP, 0 , Modify_Order_Colour);
             OrderModify (SellPendingOrderTicket_05, OrderOpenPrice (), Level_05_SL, Level_05_TP, 0 , Modify_Order_Colour);
            IfGap_SELLLevel_00AlreadyExe = true;
            
        }
    }
    
}

Zaten ne yapmaya çalıştığımı daha net gösteriyorum, keşke yukarıdakiler işe yarasa, olsaydı işim biterdi...

Yine de doğru yolda olduğumu umuyorum.. Daha önceki örnek 1'in neden yanlış olduğunu hala anlamıyorum, aptalca şey tam olarak istediğimi yapıyor, ama her tik... Programladığımda bile çalıştıramıyorum siparişlerde, bu yüzden tekrar tamamen kayboldum ..

Herhangi bir işaretçi var mı?


EDIT: Gerçekten yoruldum, ama sadece bunu düşündüm, ancak daha sonra zamanım tükendiği için denemek zorunda kalacağım ...

 void IfGap_SELLLevel_05()
{
     if ( OrderSelect (SellPendingOrderTicket_05,SELECT_BY_TICKET,MODE_TRADES)) 
    {
         if ( OrderSymbol () == Symbol () && OrderMagicNumber () == SELL_Magic01 && !IfGap_SELLLevel_00AlreadyExe)
        {
             if ((Gap_Level_05 < 0 && ( OrderType () == OP_SELL && OrderOpenPrice () - Bid < Gap_Level_05*PipValue* Point ))
             || (Gap_Level_05 > 0 && ( OrderType () == OP_SELL && OrderOpenPrice () - Bid > Gap_Level_05*PipValue* Point )))
            
             {
               for ( int i= OrdersTotal ()- 1 ; i >= 0 ; i--)
               if ( OrderSelect (i, SELECT_BY_POS, MODE_TRADES))
                     {
                     if ( OrderType () == OP_SELL && OrderSymbol () == Symbol () && OrderMagicNumber () == SELL_Magic01) 
                      { 
                       double Level_05_SL = Bid + Stoploss_Level_05*PipValue* Point ;
                       if (Stoploss_Level_05 == 0 ) Level_05_SL = 0 ;
                       double Level_05_TP = Bid - Takeprofit_Level_05*PipValue* Point ;
                       if (Takeprofit_Level_05 == 0 ) Level_05_TP = 0 ;
                       OrderModify (FirstRunSell_ticket_00, OrderOpenPrice (), Level_05_SL, Level_05_TP, 0 , Modify_Order_Colour);
                       OrderModify (SellPendingOrderTicket_01, OrderOpenPrice (), Level_05_SL, Level_05_TP, 0 , Modify_Order_Colour);
                       OrderModify (SellPendingOrderTicket_02, OrderOpenPrice (), Level_05_SL, Level_05_TP, 0 , Modify_Order_Colour);
                       OrderModify (SellPendingOrderTicket_03, OrderOpenPrice (), Level_05_SL, Level_05_TP, 0 , Modify_Order_Colour);
                       OrderModify (SellPendingOrderTicket_04, OrderOpenPrice (), Level_05_SL, Level_05_TP, 0 , Modify_Order_Colour);
                       OrderModify (SellPendingOrderTicket_05, OrderOpenPrice (), Level_05_SL, Level_05_TP, 0 , Modify_Order_Colour);
                       IfGap_SELLLevel_00AlreadyExe = true;
            
                      }
                }
           }
       }
    
    
}
 

kesirli nokta ile mi uğraşıyorsun?

 
diostar :

kesirli nokta ile mi uğraşıyorsun?


Demek istediğin buysa, SL ve TP değerini iki katına çıkardım, böylece SL ve TP'yi ayarlamak için fiyat atanır. Umarım burada bunu yaparken yanılmamışımdır.

O bloğa ulaşmak için sadece MT4'e ihtiyacım var ve sonra unut gitsin... İfadenin MT4 için fazla karmaşık olacağını hissediyorum ama denemeye devam edeceğim...

 
Funky :


Demek istediğin buysa, SL ve TP değerini iki katına çıkardım, böylece SL ve TP'yi ayarlamak için fiyat atanır. Umarım burada bunu yaparken yanılmamışımdır.

O bloğa ulaşmak için sadece MT4'e ihtiyacım var ve sonra unut gitsin... İfadenin MT4 için fazla karmaşık olacağını hissediyorum ama denemeye devam edeceğim...

Hayır, demek istediğim, 4/5 basamak mı - 0.0001 veya 0.00001 Puan ile uğraşıyorsunuz?
 
diostar :
Hayır, demek istediğim, 4/5 basamak mı - 0.0001 veya 0.00001 Puan ile uğraşıyorsunuz?


Ah 5 basamak... Bunu daha önce kullanıyorum...

 extern bool IsFiveDigitBroker = true;
extern bool DoDetectBrokerDigits = true;
double PipValue=1;
int NDigits = 4; 
// ----

int init()
{
    NDigits = Digits;
}

// ----
init start()

int start()
{
   OnEveryTick();
}
void OnEveryTick()
{
    if (DoDetectBrokerDigits == false && IsFiveDigitBroker) PipValue = 10;
    if (DoDetectBrokerDigits && (NDigits == 3 || NDigits == 5)) PipValue = 10;



    //then I go on to check the IfGaps on every tick...

    IfGap_SELLLevel_00();
    IfGap_SELLLevel_01();
    IfGap_SELLLevel_02();
    IfGap_SELLLevel_03();
    IfGap_SELLLevel_04();
    IfGap_SELLLevel_05();

 }



Ve daha önce düşünüyordum, bu Detect Digits'i ilk kütüphane ekim olarak çevirmeyi deneyebilirim, hehe, ama her seferinde bir adım, önce emeklemeyi öğrenmeliyim, hehe.

Kapatmak için 130 fiyat falan herhangi bir hata mesajı almıyorum.... Keşke böyle basit bir şey olsaydı..

Son sayfada örnek 1 çalışıyordum ve birçok benzer örnek vardı, keşke her işarette bir kez değişmesine izin verebilseydim ...

Önceki tüm SATIŞ siparişlerimi bir kerede almaya çalışmak yerine, acaba her biri için yeni bir kutu yapmalı mıyım? ve bunları bir kez değiştirin.


 && ( OrderStopLoss () < Stoploss_Level_00)

yerine

!IfGap_SELLLevel_00AlreadyExe

Diostart'tan önce beni düşündüren bir şey önerdiğini biliyorsun...

Bir !IfGap_SELLLevel_00AlreadyExe fikrinin işe yaramayacağını merak ediyorum (eğer o bloğu kilitlemeden önce tüm siparişleri alıp aynı geçişte değiştirmeyecekse), fikrinizi daha önce kullanıp kullanmadığımı merak ediyorum ve oraya şöyle bir soru koy... İşe yararsa geri dönerim.

Yine de yanlış yoldaysam lütfen bana bildirin, şerefe ;)

 
Funky :


Ah 5 basamak... Bunu daha önce kullanıyorum...



Ve daha önce düşünüyordum, bu Detect Digits'i ilk kütüphane ekim olarak çevirmeyi deneyebilirim, hehe, ama her seferinde bir adım, önce emeklemeyi öğrenmeliyim, hehe. <-- akıllıca hareket. sürünüyorsun. Kütüphanelerle, sonunda yürümeye OLACAKSINIZ.

Kapatmak için 130 fiyat falan herhangi bir hata mesajı almıyorum.... Keşke böyle basit bir şey olsaydı..

Son sayfada örnek 1 çalışıyordum ve birçok benzer örnek vardı, keşke her işarette bir kez değişmesine izin verebilseydim... <--- aşağıya bakın

Önceki tüm SATIŞ siparişlerimi bir kerede almaya çalışmak yerine, acaba her biri için yeni bir kutu yapmalı mıyım? ve bunları bir kez değiştirin. <--- aşağıya bakın


Muhtemelen bu biraz yardım sağlayabilir, umarım.

Başlangıçta, sembollerim 4 basamaktı, tüm takip eden duraklar, durdurma/limit emirleri değişiyor, beklendiği gibi gitti. Sonra brokerim kesirli olmaya karar verdi. Gerekli değişiklikleri yaptım ve piplerimin -3.4, -4.5, 0.1, 4.6, 7.3, vb. gibi gittiğini gördüm. Bunun iyi olduğunu düşündüm ama aslında değil: Diyelim ki limitimi=7 ayarladım ve yeni tik diyelim 1,tık 2,tık3 sırayla gerçekleşir:

1) 7.3>limit, sonra sipariş değiştirilir... komisyoncu 1 kaymayı doldurur...

2) 7.5>limit, sonra sipariş değiştirilir... komisyoncu 0 kayma doldurur...

3) 7.1>limit, sonra sipariş değiştirilir... komisyoncu 2 kaymayı doldurur...

Sonuç olarak, siparişlerimi 3 tik için 3 kez değiştirdim. Bunu fark ettikten sonra, bunları en yakın tamsayıya yuvarlamak için MathRound() kullanmaya karar verdim, böylece 1,2,3 olur

1) matround(7.3) =7 >limit, DOĞRU DEĞİL, değiştirilmedi

2) Mathround(7.5)=8 >limit, DOĞRU, sıra değiştirildi

3) mathround(7.1)=7>limit, DOĞRU DEĞİL, değiştirilmedi

Aslında hala yukarıdakileri nasıl geliştireceğim üzerinde çalışıyorum... şu ana kadar iyi çalışıyorlar, ama benimkinden daha iyi yollar olması gerektiğini düşünüyorum.