"Yeni Başlayanlar için MQL5’te Uzman Danışman Yazmak İçin Adım Adım Açıklamalı Kılavuz" makalesi için tartışma - sayfa 22

 
Günaydın, biri bana yardımcı olabilir mi lütfen? Anladığım kadarıyla makalede belirtilen her şeyi yaptım. Ancak, yazarın zaten satın alma varsa satın alma veya zaten satma varsa satma yapmamasını istediğini anladığımın ötesinde, aynı anda iki açık işlem yapmayı başaramıyorum. Örneğin stratejim, açık bir satın alma emrim olduğunda bir satış sinyali gönderiyor ve bir satış açmak yerine, kod tp / sl'ye dokunamadan satın alma işlemini kapatıyor. Ve böylece elimde ne alım ne de satım kalıyor. Satış, satın almayı kapatır ve satın alma, satışı kapatır. Stratejimde yalnızca bir çift, yalnızca bir zaman dilimi ve yalnızca bir lot boyutu kullanıyorum. Stratejiyi tetiklerse aynı anda nasıl alış ve satış yapabileceğimi söyleyebilir misiniz? Yani, siparişlerin SADECE tp / sl tarafından kapatılması. Şimdiden çok teşekkür ederim.
 
Harika bir makale!
 
Sella170:
Bu EA'yı mini endeksler veya mini dolarlar için kullanıp kullanamayacağımı bilen var mı?
Evet, EA'yı fareyi grafiğe veya menü > ekle > Uzman danışman > {nomedoseurobo} öğesine sürükleyerek kullanabilirsiniz.

Umarım sorunuz cevaplanmıştır.

 
Mükemmel makale için çok teşekkürler. Gün İçi Zaman Filtresi modülünü kodunuza nerede ve nasıl uygulayabilirsiniz?
 

Merhaba arkadaşlar, günaydın.

Kılavuzun sonundaki bu dosya ile"Strateji Test Cihazı" içindeyim ve aşağıdaki hatayı gösteriyor:

*Hata bu makalede daha önce tartışılmıştı, ancak yazılı bir çözüm benim için işe yaramadı ve yardımınıza ihtiyacım var.


OF      0       12:44:39.040    EA_ADX (XAUUSD,H1)      2020.01.03 19:00:00   Alert: The Buy order request could not be completed -error:4756
ED      2       12:44:39.043    Trades  2020.01.03 20:00:00   failed market buy 0.1 XAUUSD sl: 1549.09 tp: 1549.16 [Invalid stops]
JP      0       12:44:39.043    EA_ADX (XAUUSD,H1)      2020.01.03 20:00:00   Alert: The Buy order request could not be completed -error:4756
ER      2       12:44:39.049    Trades  2020.01.03 21:00:00   failed market buy 0.1 XAUUSD sl: 1549.90 tp: 1549.97 [Invalid stops]
MR      0       12:44:39.049    EA_ADX (XAUUSD,H1)      2020.01.03 21:00:00   Alert: The Buy order request could not be completed -error:4756
PP      2       12:44:39.053    Trades  2020.01.03 22:00:00   failed market buy 0.1 XAUUSD sl: 1548.16 tp: 1548.23 [Invalid stops]


Dosya Kılavuzun sonundadır.

Bu sorunu nasıl çözebilirim?

 
surfdoode2:


Önerilen her iki düzeltmeyi de yaptıktan sonra hala bu hatayı alıyorum:

ZeroMemory(mrequest);

ve ayrıca

if(Buy_opened || Sell_opened)

Lütfen birisi 4756 hatası konusunda yardımcı olabilir mi? Sadece bir Satın Alma Emri veremiyor gibi görünüyor.

SymbolInfoTick fonksiyonunu kullanıp kullanmadığınızı ve kodun bu kısmını yazıp yazmadığınızı kontrol edin:

//--- MQL5 MqlTick Yapısını kullanarak son fiyat teklifini alın
   if(!SymbolInfoTick(_Symbol,latest_price))
     {
      Alert("Error getting the latest price quote - error:",GetLastError(),"!!");
      return;
     }
Documentation on MQL5: Market Info / SymbolInfoTick
Documentation on MQL5: Market Info / SymbolInfoTick
  • www.mql5.com
SymbolInfoTick - Market Info - MQL5 Reference - Reference on algorithmic/automated trading language for MetaTrader 5
 
Burada algoritmanın mantığında bir hata var:
 //--- Halihazırda açılmış pozisyonlarımız var mı?
     bool Buy_opened= false ;   // Buy açılan pozisyonun sonucunu tutmak için değişken
     bool Sell_opened= false ; // Satılan açık pozisyonun sonucunu tutan değişken
    
     if ( PositionSelect ( _Symbol ) == true )   // açılmış bir pozisyonumuz var
    {
         if ( PositionGetInteger ( POSITION_TYPE ) == POSITION_TYPE_BUY )
         {
            Buy_opened = true ;   //Bu bir Alış
         }
         else if ( PositionGetInteger ( POSITION_TYPE ) == POSITION_TYPE_SELL )
         {
            Sell_opened = true ; // Bu bir Satış
         }
    }

PositionSelect _Symbol için ilk pozisyonu seçtiğinden, EA bir alış pozisyonu açarsa, alış pozisyonu açıkken Sell_opened değişkeni her zaman false olur ve bir satış sinyali olduğunda birden fazla satış pozisyonunun gerçekleşmesine neden olur.

Bunu düzeltmek ve aynı anda açık alım ve satım pozisyonları olup olmadığını anlamak için aşağıdaki mantık kullanılabilir:

 //--- Halihazırda açılmış pozisyonlarımız var mı?
   bool Buy_opened = false ;   // Buy açılan pozisyonun sonucunu tutmak için değişken
   bool Sell_opened = false ; // Satılan açık pozisyonun sonucunu tutmak için değişkenler

   if ( PositionSelect ( _Symbol ) == true ) // açılmış bir pozisyonumuz var
   {
       for ( int i= 0 ;i< PositionsTotal ();i++){
	 
         PositionSelectByTicket ( PositionGetTicket (i));

         if ( PositionGetInteger ( POSITION_TYPE ) == POSITION_TYPE_SELL )
         {
            Sell_opened = true ; // Bu bir Satış
         } else if ( PositionGetInteger ( POSITION_TYPE ) == POSITION_TYPE_BUY )
         {
            Buy_opened = true ; //Bu bir Alış
         }
      }
   
Documentação sobre MQL5: Funções de Negociação / PositionSelect
Documentação sobre MQL5: Funções de Negociação / PositionSelect
  • www.mql5.com
PositionSelect - Funções de Negociação - Referência MQL5 - Referência sobre algorítimo/automatização de negociação na linguagem para MetaTrader 5
 
Vitor Gama Barreto:

Herkese merhaba, günaydın.

Kılavuzun sonundaki bu dosya ile"Strateji Test Cihazındayım" ve aşağıdaki hatayı gösteriyor:

*Hata bu makalede daha önce tartışıldı, ancak yazılı bir çözüm benim için işe yaramadı ve yardımınıza ihtiyacım var.



Dosya Kılavuzun sonunda yer almaktadır.

Bu sorunu nasıl çözebilirim?

Talep ettiğiniz satış fiyatını kontrol edin, bunu yapmak için mrequest.price, mrequest.sl ve mrequest.tp değişkenlerinde hata ayıklamak için kesme noktası kullanın.

Değiştirmeyi deneyin

mrequest.type_filling = ORDER_FILLING_FOK;                               // Sipariş gerçekleştirme türü

için:

mrequest.type_filling = ORDER_FILLING_IOC;                               // Sipariş gerçekleştirme türü


Bazı kağıtların minimum zararı durdurma kuralları vardır, daha fazlasını buradan okuyun: https://www.mql5.com/pt/forum/319474

ERRO 4756 - INVALID PRICE
ERRO 4756 - INVALID PRICE
  • 2019.08.06
  • www.mql5.com
Ja tentei de tudo, por favor, preciso muito da ajuda de voces!! alguem pode me dar uma luz??? E retorna o : 2019.08.05 13:42:51.236 Core 1 2019.08...
 

Merhaba,

Makale için çok teşekkür ederim Samuel, sen bir çatlaksın!

Brokerim ile çalışmasını sağlamak biraz zor oldu çünkü makale "net" modunda ve "hedging" moduna koymak için bilgi aramak zorunda kaldım. Karşılaştığım ilk sorun mrequest.type_filling ile ilgiliydi.

XM brokeri için işe yarayan şudur:

mrequest.type_filling = ORDER_FILLING_IOC;                                          // Emrin gerçekleştirilme türü

MT5'inizin hangisine izin verdiğini bilmiyorsanız, tavsiyem TypeFilling( ) işlevinibir Print( TypeFilling()) veya bir Comment( TypeFilling ()) içinde kullanmanızdır; size 1 (ORDER_FILLING_FOK) veya 2 (ORDER_FILLING_IOC) olduğunu söylerse, hangisini koymanız gerektiğini bilirsiniz(https://www.mql5.com/docs/constants/tradingconstants/orderproperties#enum_order_type_filling) çünküORDER_FILLING_FOK (1) bu broker ile benim için çalışmıyor.


Bu düzeltildikten sonra, sorun PositionSelect'in çok fazla pozisyon açmasıdır. Samuel stratejisinde bunu söylemese de, amacın belirlenen kriterlerle (4 boolean adımı) tek bir alış veya satış pozisyonu (hangisi önce gelirse) açmak olduğunu ve bu pozisyon kapanana kadar başka bir tane açamayacağımızı anlıyorum.

Yaptığım şey bu kodu değiştirmek ...

//--- hata yok, bu yüzden devam ediyoruz.
//--- Açık pozisyonlarımız var mı?
    bool Buy_opened=false;  // açık pozisyonun sonucunu saklayan değişken Satın alma
    bool Sell_opened=false; // açık pozisyon satışının sonucunu saklayan değişken
    
    if (PositionSelect(_Symbol) ==true)  // açık bir pozisyonumuz var
    {
         if (PositionGetInteger(POSITION_TYPE) == POSITION_TYPE_BUY)
         {
            Buy_opened = true;  // It's a Purchase
         }
         else if(PositionGetInteger(POSITION_TYPE) == POSITION_TYPE_SELL)
         {
            Sell_opened = true; // It's a Sale
         }
    }

Bunun için...

//--- Hata almadığımız için devam ediyoruz.
//--- Açık pozisyonlarımız var mı?
   bool Buy_opened = false;               // Açık Alış pozisyonunun sonucunu saklayan değişken
   bool Sell_opened = false;              // Açık Satış pozisyonunun sonucunu saklayan değişken
   
   // Açık sipariş olup olmadığını görmek için tüm siparişleri gözden geçirelim.
   for(int i = 0; i < PositionsTotal(); i++)   
        {
         ulong ticket = PositionGetTicket(i);
         PositionSelectByTicket(ticket);
    
    if(PositionGetInteger(POSITION_TYPE) == POSITION_TYPE_BUY)
         {
          Buy_opened = true;       // bir satın alma işlemidir
         }
         else if(PositionGetInteger(POSITION_TYPE) == POSITION_TYPE_SELL)
         {
          Sell_opened = true;      // bir satış
         }
   }

// eğer açık bir pozisyon varsa, aktif işlem kapanana kadar bekleriz (SL veyaTP'ye dokunarak).
   if (Buy_opened || Sell_opened) return; 

Not: Satır geldikten hemen sonra ...

//--- Önceki çubuğun kapanış fiyatını bar1 olan geçerli çubuğa kopyalayın.
   p_close=mrate[1].close;

Bu şekilde benim için iyi çalıştı. Umarım faydalı bulursunuz.

Saygılarımla.

 
surfdoode2:


Önerilen her iki düzeltmeyi de yaptıktan sonra hala bu hatayı alıyorum:

ZeroMemory(mrequest);

ve ayrıca

if(Buy_opened || Sell_opened)

Lütfen birisi 4756 hatası konusunda yardımcı olabilir mi? Sadece bir Satın Alma Emri veremiyor gibi görünüyor.


Brokerinizin Dolum Türü ORDER_FILLING_IOC olabilir, kodu şuradan düzenlemeyi deneyebilirsiniz:

mrequest.type_filling = ORDER_FILLING_FOK;

Şuna:

mrequest.type_filling = ORDER_FILLING_IOC;

Aynı sorunu ben de yaşadım ve şimdi başarıyla çözdüm