Çoklu sipariş sorunu

 

Herkese selam,

Kodumla ilgili bir sorunum var. Bir emir (alış veya satış) açıldığında, diğerleri arka arkaya gelir.

Yapmaya çalıştığım şey;

eğer son emir bir satış ise, fiyat Openprice artı bir miktar pip (ReturnDist) üzerine çıktığında bir alış emri açın.

eğer son emir bir alış ise, o zaman fiyat Openprice eksi bir miktar pip altına düştüğünde bir satış emri açın.

Birisi burada yardım edebilir mi?

Şimdiden teşekkürler

Luis

Dosyalar:
 
luisneves :

Herkese selam,

Kodumla ilgili bir sorunum var. Bir emir (alış veya satış) açıldığında diğerleri arka arkaya gelir.

Yapmaya çalıştığım şey;

eğer son emir bir satış ise, fiyat Openprice artı bir miktar pip (ReturnDist) üzerine çıktığında bir alış emri açın.

eğer son emir bir alış ise, fiyat Açık Fiyat eksi bir miktar pip altına düştüğünde bir satış emri açın.

Birisi burada yardım edebilir mi?

Şimdiden teşekkürler

Luis

Kısıtlama planınız nedir?

OpenOpposite'ı 1 ile başlatırsınız.

 int     Ticket,total,OpenOpposite= 1 ,UseSlippage,i;

Her tikte OpenOppositeOrder()'ı çağırırsınız

   int start()
     {
       if ( OrdersTotal ()== 0 )GoToOpen();
       else GoToClose();      
       if (OpenOpposite> 0 )OpenOppositeOrder(); //<-- here 
       if ( OrdersTotal ()> 0 )OpPendingDel();
      
     }

OpenOpposite için başka bir referans göremiyorum.

OpenOppositeOrder'daki for döngüsü, şimdiye kadar gördüklerimden herhangi bir kısıtlama getirmiyor... öyle mi?

Kodunuzun neresinde hata olduğunu düşünüyorsunuz?

 

Merhaba Kronin,

Her şeyden önce, hızlı yanıtınız için teşekkürler.

Karışıklık için özür dilerim ama yapmaya çalıştığım bağımsız çalışan kod bloklarına sahip olmaktı.

Bu yüzden işaretlediğiniz satırı ve void OpenOpposite() yazan üst kısmı temizledim ve şimdi bazı hatalar geliyor;

küresel kapsamda ifadeye izin verilmiyor, vb.

Fazla vaktinizi almıyorsam bana burada yardımcı olur musunuz?

teşekkürler

Luis



 
luisneves :

Merhaba Kronin,

Her şeyden önce, hızlı yanıtınız için teşekkürler.

Karışıklık için özür dilerim ama yapmaya çalıştığım bağımsız çalışan kod bloklarına sahip olmaktı.

Bu yüzden işaretlediğiniz satırı ve void OpenOpposite() yazan üst kısmı temizledim ve şimdi bazı hatalar geliyor;

küresel kapsamda ifadeye izin verilmiyor, vb.

Fazla vaktinizi almıyorsam bana burada yardımcı olur musunuz?

teşekkürler

Luis

Hiçbir şeyi temizlemen gerektiğini söylemedim. EA'nın birden fazla sipariş açmasını nerede kısıtlamaya çalıştığınızı bilmek istedim.

Bunu deneyin (test etmedim):

Başlatma işlevini şu şekilde değiştirin (Belki de stratejinize bağlı olarak yalnızca açık piyasa emirlerini filtrelemeniz gerekir):

   int start()
     {
       if ( OrdersTotal ()== 0 ){GoToOpen();OpenOpposite= 0 ;} //<-- set OpenOpposite to 0 if no order is open (pending and market)
       else GoToClose();      
       if (OpenOpposite== 0 )OpenOppositeOrder();          //<-- only run OpenOpositeOrder, if OpenOpposite is 0.
       if ( OrdersTotal ()> 0 )OpPendingDel();      
     }

OpenOppositeOrder() işlevine bir OpenOpposite sayacı ekleyin:

         if (OrderSymbol() == Symbol ()&& OrderMagicNumber() == MagicNumber)
            {
            Op = OrderType();

             if (Op == OP_BUY  && Ask < (OrderOpenPrice()- ReturnDist*pt))
               {                
               Ticket = OrderSend ( Symbol (), OP_SELL, mlots, SellPrice, UseSlippage, 0 , 0 , "Sell Order" , MagicNumber, 0 , Red);
               if (Ticket > 0 ) 
                  {
                   Print ( "Opposite Sell order placed # " , Ticket);
                  AddLimitsSell();
                   OpenOpposite++;
                  }
               else
                  {
                   Print ( "Order Send failed, error # " , GetLastError ());
                  }
               }
               
             if (Op == OP_SELL && Bid > (OrderOpenPrice()+ ReturnDist*pt))
               {               
               Ticket = OrderSend ( Symbol (), OP_BUY, mlots, BuyPrice, UseSlippage, 0 , 0 , "Buy Order" , MagicNumber, 0 , Green);
               if (Ticket > 0 )
                  {
                   Print ( "Opposite Buy order placed # " , Ticket);
                  AddLimitsBuy();
                   OpenOpposite++;
                  }
               else
                  {  
                   Print ( "Order Send failed, error # " , GetLastError ());
                  }   
               }
            }

Bu, arka arkaya açık olan birden fazla siparişle sorunu çözmelidir. EA'nın birden fazla (zıt) sipariş açmasını kısıtlar.

 
luisneves :

Herkese selam,

Kodumla ilgili bir sorunum var. Bir emir (alış veya satış) açıldığında diğerleri arka arkaya gelir.

Aynı kod parçası hakkında neden ikinci bir konuya ihtiyacınız var?

Raptorİngiltere :

Kodunuza baktığımda, yapmaya çalıştığınız şeyi takip etmekte çok zorlanıyorum, bana yardımcı olacak çok az yorum görüyorum, start() işleviniz bana her tikte ne yapmaya çalıştığınızı göstermiyor, tutarlılığınız yok girinti düzeni.


Bu konudan: https://www.mql5.com/en/forum/142629 sayfa 3

 
RaptorUK :

Kodunuza baktığımda, yapmaya çalıştığınız şeyi takip etmekte çok zorlanıyorum, bana yardımcı olacak çok az yorum görüyorum, start() işleviniz bana her tikte ne yapmaya çalıştığınızı göstermiyor, tutarlılığınız yok girinti düzeni.

Buna katılıyorum. Kodun okunması kolay olmadığı için çoklu sipariş sorunundan başka bir şey kontrol etmedim. Kodun bölümleri başka biri tarafından yazılmış, başka bir koddan kopyalanıp yapıştırılmış gibi görünüyor. Kendi işlevlerinizi kendi (tutarlı) stilinizle daha iyi yazın.

 
kronin :

Hiçbir şeyi temizlemen gerektiğini söylemedim. EA'nın birden fazla sipariş açmasını nerede kısıtlamaya çalıştığınızı bilmek istedim.

Bunu deneyin (test etmedim):

Başlatma işlevini şu şekilde değiştirin (Belki de stratejinize bağlı olarak yalnızca açık piyasa emirlerini filtrelemeniz gerekir):

OpenOppositeOrder() işlevine bir OpenOpposite sayacı ekleyin:

Bu, arka arkaya açık olan birden fazla siparişle sorunu çözmelidir. EA'nın birden fazla (zıt) sipariş açmasını kısıtlar.


merhaba kronin,

Sorunuma hızlı yanıt verdiğiniz için teşekkür ederim. Almaya çalıştığım şey, bunun gibi emirleri açmak için bir koşul;

İlk önce bir gösterge aracılığıyla açılan bir alımdır (elbette bir satış olabilir) ve ardından bir alım emri açıktır, eğer fiyat alış emrinden açık fiyatın altındaki bir seviyeye düşerse, bir satış emri açılacaktır, ancak eğer fiyat tekrar yükselir, yeni bir açık alım olmamalıdır. Burada yeni bir satın alma emri, yalnızca fiyat satış emrinden geri döndüğünde gerçekleşmelidir. Aynı şekilde, ilk gerçekleşen bir satış emri ise.
Bunu aşağıdaki kodla birlikte almaya çalıştım ama çalışmıyor. Burada işe yarayan, ilk açılan emir bir alımdır, sonra ve beklendiği gibi bir satış emri açılacaktır, ancak buradan başka emir açılmaz...

Bu iki kod bloğuna sahibim ve ilki bekleneni yapıyor gibi görünüyor; Gösterge tarafından tanımlanan koşullar mevcutsa bir al veya sat emri açın. Bir sipariş bileti alındığında, sipariş limitlerini göndermek için bir sipariş değişikliği yapılır.

Birden fazla siparişin açılmasını önlemek için kodda BuyTicket ve SellTicket kullanıyorum ama bu doğru bir yöntem değil gibi görünüyor...

 // Buy Order Condition to Open

   if (Volume[ 0 ] > volume_previous + OpenDistance*pt && BuyTicket == 0 )                       
          { //5  
           while (IsTradeContextBusy()) Sleep ( 10 );
          RefreshRates();       
                       
     BuyTicket= OrderSend ( Symbol (),OP_BUY,LotSize,Ask,RealSlippage, 0 , 0 , "Buy Order" ,MagicNumber, 0 ,Green);
     if (BuyTicket > - 1 )
        { //6
         Print ( "Opposite Buy order placed # " ,BuyTicket);
         AddLimitsBuy();        
         } //6
       else
         { //7 
         Print ( "Order Send failed, error # " , GetLastError ());
         } //7 
         
       return ( 0 );
      } //5
   //-----------------------------------------------------------------------------+      
  
   // Sell Order Condition to Open

   if (Volume[ 0 ] < volume_previous - OpenDistance*pt && SellTicket == 0 )                   
     { //8                                 
           while (IsTradeContextBusy()) Sleep ( 10 );
          RefreshRates();       
                                                
          SellTicket= OrderSend ( Symbol (),OP_SELL,LotSize,Bid,RealSlippage, 0 , 0 , "Sell Order" ,MagicNumber, 0 ,Red);
           if (SellTicket > - 1 )
                  { //9
         Print ( "Opposite Sell order placed # " , SellTicket);
        AddLimitsSell();       
        } //9
     else
        { //10
         Print ( "Order Send failed, error # " , GetLastError ());
        } //10      
     return ( 0 );
     } //8                       


Aşağıdaki kod, açık siparişleri tanımlar ve satın alma sembolü, sihirli sayı ve sipariş türünü filtreler. Havuzdaki son açık emri tespit ettiğinde ve açma koşulu (son emrin alış olduğunu düşünerek) ve satış biletinin olmadığını onayladıktan sonra satış emri açılır. Son sipariş bir satış ise aynı. Ve burada kod çalışıyor.

Üçüncü bir sipariş açmak için bir koşul geldiğinde bir sorun ortaya çıkar ve bu böyle devam eder. Yine de burada açma koşulları var ve kod ikinci açılışta gayet iyi, kod neden burada çalışmıyor?

 int Op;  
   
   for ( int Counter = OrdersTotal ()- 1 ; Counter >= 0 ; Counter--)
      { //14
       if ( OrderSelect (Counter,SELECT_BY_POS,MODE_TRADES))  
         { //15
         if (OrderSymbol() == Symbol ()&& OrderMagicNumber() == MagicNumber)
            { //16
            Op = OrderType();

             if (Op == OP_BUY && Bid < OrderOpenPrice() - (ReturnDist*pt) && SellTicket == 0 )
               { //17               
               SellTicket = OrderSend ( Symbol (), OP_SELL, MLots, Bid, RealSlippage, 0 , 0 , "Sell Order" , MagicNumber, 0 , Red);
               if (SellTicket > - 1 ) 
                  { //18
                   Print ( "Opposite Sell order placed # " , SellTicket);
                  AddLimitsSell();
                  } //18
               else
                  { //19
                   Print ( "Order Send failed, error # " , GetLastError () );
                  } //19
                } //17
                           
             if (Op == OP_SELL && Ask > OrderOpenPrice() + (ReturnDist*pt)&& BuyTicket == 0 )
               { //20             
               BuyTicket = OrderSend ( Symbol (), OP_BUY, MLots, Ask, RealSlippage, 0 , 0 , "Buy Order" , MagicNumber, 0 , Green);
               if (BuyTicket > - 1 )
                  { //21
                   Print ( "Opposite Buy order placed # " , BuyTicket);
                  AddLimitsBuy();
                  } //21
               else
                  { //22  
                   Print ( "Order Send failed, error # " , GetLastError ());
                  } //22   
               } //20
            } //16
         } //15    
      } //14

Açıklamaya çalıştığım şeyi görmeniz gerekirse, kodun tamamı eklenmiştir.

Lütfen diğer bazı sorunları çözmeye devam ettiğinize ve bazı kodların garip görünebileceğine dikkat edin, bu benim siparişleri açma yöntemim için geçerli çünkü hala Teklif artı eksi Mesafeye dayalı siparişleri nasıl açacağımı öğreneceğim.

Bana burada yardımcı olabilirseniz gerçekten minnettarım.


saygılarımla
Luis

Dosyalar:
 
Volume[0]'un size ne verdiğini biliyor musunuz? Buna bir Puan değeri eklemek nasıl bir anlam ifade ediyor?
 

Merhaba Raptor,

Haklısın !

Hala öğreniyorum ve ihtiyacım olanı almanın birkaç yolunu deniyorum ve bazen aptalca şeyler çıkıyor.

Bir nesneyi Teklif seviyesine koymak için kullanmaya çalıştım ve sonra bu pozisyonu emirleri açmak için aldım, bundan daha iyi görünüyor. Ana konulardan biri, açık emir kapalı değilken yeni açılışların sınırlandırılmasıdır.

Öğrenecek ve yanlışlıkla deneyecek çok şeyin olduğunu biliyorum, bunun pratikte nasıl çalıştığını daha iyi anlamak için bulduğum bir yol. Kitap ve belgelerdeki bilgileri anlamak için elimden gelenin en iyisini yaparken bazen kendimi kaybolmuş hissediyorum ve başkalarından yardım almaya çalışıyorum. Burada Portekiz'de bu konuda eğitim almak çok zor ve bu yüzden yardım ve tavsiye almak için başkalarının iyi niyetine, sabrına ve kararlılığına bağımlıyım. O yardım geldiğinde anlamak için elimden geleni yapıyorum ama bazen bununla baş edemiyorum.

Her neyse, bana hacmin bu tür bir gösterge elde etmenin yolu olmadığını gösterdiğin için teşekkür ederim.

Saygılarımla

Luis

 
luisneves :

Merhaba Raptor,

Haklısın !

Hala öğreniyorum ve ihtiyacım olanı elde etmek için birkaç yol deniyorum ve bazen aptalca şeyler çıkıyor.

Ayrıca öğrenmeye çalıştığınız için teşekkür ederim, belki de önce daha basit bir EA oluşturmaya çalışmalı ve ihtiyacınız olanı nasıl yapacağınızı anlayana kadar bununla çalışmalısınız, birkaç şey deneyin, bazı Print ifadeleri ekleyin, ne olduğunu görün, bu şekilde öğrenecek ve anlayacaksınız, daha sonra daha fazlasını öğrendiğinizde EA'nıza daha fazlasını ekleyebilirsiniz. EA'nızı kodlamadan önce ne yapmasını istediğiniz konusunda net bir fikre sahip olmanız gerekir, aynı anda çok fazla işlevsellik bu net düşünme sürecini daha kolay hale getirmeyecektir.

Yardımcı olacak bir diğer şey, görevleri diğer EA'larla yeniden kullanabileceğiniz modüllere ayırmaya çalışın, ardından bu modülü, bir komut dosyasının veya test edilecek basit bir EA'nın parçası olarak kendi başına kullanıcı tanımlı bir İşlev olarak kodlayabilirsiniz. ve çalıştığından ve sağlam olduğundan emin olun. . . o zaman bu işlevi, çalıştığını bilerek bir EA'da güvenle kullanabilirsiniz.
 

Merhaba RaptorUK,

Dürüstlük cevabınız için teşekkür ederiz. Zaten görevleri kırmaya çalışıyorum ve başka tür sorunlar ortaya çıkmaya başlıyor, bu yüzden hepsini bir araya getirmeye başlıyorum (ve diğer sorunlar başlıyor ....)

Zaten başka bir EA yapmaya çalışıyorum ve iyi çalıştım, ancak şimdi bu yaklaşımı göstergeler (standart olanlar) kullanmadan kullanmak işler karmaşıklaşıyor.

Şey şu anda tamamen kayboldum. Her ne kadar kod çalışmasını teoride kene olarak görsem de, çalışması gereken ve daha sonra birden fazla açılıştan kaçınmak için limitler almaya çalışın, işleri daha da kötüleştirir.

Şimdi iyi çalışan bazı kod blokları var, performansı iyileştirmek için biraz dikkat gerektiren diğerleri ve çalışmayan diğerleri (iki) ve burada buradan nasıl çıkacağımı bilmiyorum ... bu kadar basit ve ben Bununla nasıl başa çıkacağını bilen insanların yardımından tamamen sanık. Sen m konulara daha fazla zaman ayıran insanlardan birisin, ama yine de bazı problemlerle başa çıkamıyorum. Tüm mql kodlarını öğrenecek ve daha sonra birçok teori ve geçmişte edindiğim deneyime dayanarak yazmaya başlayacak zamanım olsaydı, belki de burada değildim.

Bir EA (ek) gördüm, sonra aradığımı bana getirmesi gereken ancak başarısız olan kod bölümlerinde nasıl çalıştığını anlamaya çalıştım. Gördüğüm şey, fiyat artı ve eksi bazı mesafelere dayalı açılışlar elde etmek için bir kod kullanmasıydı. Burada bunu elde etmeye çalıştığımda limitlerle ilgili bir problem geliyor ve sonra hiçbir şey… bunu tamamen işe koyamıyorum… ve sonra alternatif siparişlerin neden teoride olduğu gibi çalışmadığını göremiyorum (en azından gördüğüm şekilde). Saf rezalet......

Her neyse, bunlar sınırlı bir adamdan sadece bazı sözler...

saygılarımla

Luis

Dosyalar:
Neden: