Yeni başlayanlardan sorular MQL5 MT5 MetaTrader 5 - sayfa 64

 
Leser : MA'nın 2 No'lu pencereye ait olduğunu Expert Advisor'da nasıl ve nerede belirteceğimi söyleyin. Örneğin, MFI'ye MA ekledim ve bu MA'yı EA'ya kaydettirmek istiyorum. Nasıl ve nerede bilmiyorum.
Ve daha ayrıntılı olarak? Uzman Danışmanınız zaten MFI göstergesini kullanıyor ve şimdi ikinci gösterge olan MA göstergesini kullanmanız mı gerekiyor? Yoksa EA henüz göstergeleri hiç kullanmıyor mu ve MA göstergesini kullanmak için buna ihtiyacınız var mı?
 
Yedelkin :

1. Şunu söyleyebilirim: Başka birinin kodunu çok dikkatli kullanmalısınız. Çünkü bir başkasının kodu aynı zamanda bir başkasının hatasıdır.

2. Burada ( https://www.mql5.com/ru/forum/6343/page64#comment_357008 ) Değişkenleri kullanmadan önce doğru şekilde sıfırlamayı denemenizi önerdim. Ancak kodunuzda bu öneri henüz uygulanmadı. Ayrıca, kodda bu tür yapılar vardır:

Görüyorsunuz, bu yapıda istek ve sonuç değişkenleri kullanımdan önce değil, kullanımdan sonra sıfırlanıyor. Ayrıca, bu yerel değişkenleri sıfırladıktan sonra, fonksiyon işini durdurur, yani böyle bir sıfırlamanın kendisi anlamsızdır. Başka bir deyişle, böyle bir yapı, MqlTradeRequest ve MqlTradeResult türlerinin değişkenlerinin nasıl sıfırlanmayacağının açık bir örneğidir. Bu nedenle, dilerseniz, sonuçta değişkenleri doğru bir şekilde sıfırlamayı deneyin. Bir şey işe yaramazsa, tam olarak neyin "işe yaramadığını" ayrıntılı olarak açıklayın.

3. Standart Kitaplıkta " MQL5 Referans / Standart Kitaplık / Ticaret Sınıfları / CTrade" ticaret sınıfı vardır. Nasıl uygulamaya koyacağınızı bulmaya çalışın. Dile dalmanın ilk aşamasında, bu sınıf oldukça yeterli olabilir. Örneğin, bu sınıf şu metoda sahiptir: " MQL5 Reference / Standard Library / Trade Classes / 2 CTrade / PositionModify". Bu şekilde uygulanır:

'ClearStructures();' satırını içerir. sadece kullanmadan önce m_request değişkenini sıfırlar.

yedelkin,

Çok teşekkürler :)

Baktım ve hatamı gördüm.

Şu şekilde yazılabilir:

 //+------------------------------------------------------------------+
//| Clear structures request,result and check_result                 |
//+------------------------------------------------------------------+
void ClearStructures()
  {
   MqlTradeRequest request;
   MqlTradeResult result;
   MqlTradeCheckResult check_result;
   ZeroMemory (request);
   ZeroMemory (result);
   ZeroMemory (check_result);
  } 

Ama önerilerinizi beğendim:

   MqlTradeRequest request={ 0 };
   MqlTradeResult result={ 0 };
Her neyse, sonuçlar aynı.

Bekle, pozisyon bulamaz, bu görevin acısını çekeceğim.

Teşekkürler.

 

yedelkin,

Yeterince cevap verdiğin için sana yazıyorum.

İki kaynak - MT4 ve MT5.

Neden MT5'te çalışmıyor - bunlar aynı.

Dosyalar:
MTB_1E.mq4  4 kb
MTB_E.mq5  9 kb
 
mario065 : İki kaynak - MT4 ve MT5. Neden MT5'te çalışmıyor - bunlar aynı.

Ne yazık ki, MT4'ü hiç anlamıyorum. Bir göz atacağım ve bir şey yakalayabilirsem yayınlayacağım.

Ek. Genel olarak, piyasanın açılmasını beklersiniz ve tam olarak neyin işe yaraması gerektiğini, ancak neyin işe yaramadığını yazarsınız.

 
Yedelkin :

Ne yazık ki, MT4'ü hiç anlamıyorum. Bir göz atacağım ve bir şey yakalayabilirsem yayınlayacağım.

Ek. Genel olarak, piyasanın açılmasını beklersiniz ve tam olarak neyin işe yaradığını, ancak neyin işe yaramadığını yazarsınız.

Yani UTB'yi kendime ve gerekirse kime yapıyorum.

İşte yorumlar:

Değişiklik için pip göstergesi sıfırdan büyükse, iki dil için (MT4 ve MT5):

 if (TradeTrailing> 0 )

if (MStop > 0 )

Bir pipsi (Teklif - pip) daha fazla açık pozisyon varsa:

 if (( NormalizeDouble (Bid, Digits )-TradeTrailing)>=OrderOpenPrice())

if ( NormalizeDouble (Bid - MStop, 4 ) >= Open)
Eğer stop = 0 veya Teklif - pip dal takip >= açık pozisyondan + pip tanımından:
 if (OrderStopLoss()== 0 || ( NormalizeDouble (Bid, Digits )-TradeTrailing)>=(OrderStopLoss()+ 0.0005 ))

if (SL == 0 || NormalizeDouble (Bid - MStop, 4 ) >= NormalizeDouble (SL + MStop, 4 ))

değişiklik:

ОrderModify(OrderTicket(),OrderOpenPrice(), NormalizeDouble (Bid, Digits )-TradeTrailing,OrderTakeProfit(), 0 ,Blue);

ModifyPosition( Symbol (), NormalizeDouble (Bid - MStop, 4 ),TP);

Bu kadar.

Değişiklik için ayrı bir işlev yapmak istiyorum.

 
Yedelkin :
Ve daha ayrıntılı olarak? Uzman Danışmanınız zaten MFI göstergesini kullanıyor ve şimdi ikinci gösterge olan MA göstergesini kullanmanız mı gerekiyor? Yoksa EA henüz göstergeleri hiç kullanmıyor mu ve MA göstergesini kullanmak için buna ihtiyacınız var mı?
EA, MFI kullanıyor, ancak MA göstergesinin nasıl yazılacağını çözemiyorum! Ana koşul, MA'nın yeridir. Ma grafikte değil (1 numaralı pencere), ancak MFI göstergeli pencerede (2 numaralı pencere).
 
Leser : EA, MFI kullanıyor, ancak MA göstergesini nasıl yazacağımı bulamıyorum! Ana koşul, MA'nın yeridir. Ma grafikte değil (1 numaralı pencere), ancak MFI göstergeli pencerede (2 numaralı pencere).

EA, MFI kullanıyorsa, kodunda bu göstergenin ele alındığı bir satır bulunmalıdır: " MQL5 Referans / Teknik Göstergeler / iMFI". Buna göre, hareketli ortalama göstergesinin tutacağının elde edilmesi burada açıklanmaktadır: " MQL5 Referans / Teknik Göstergeler / iMA".

Ayrıca " MQL5'te bir göstergeye dayalı gösterge " makalesini okumaya çalışın.

 
mario065 : İşte yorumlar: Değişiklik için pip sıfırdan büyükse, iki dil için (MT4 ve MT5): Pipsi (Bid - pip) açık pozisyondan büyükse: stop = 0 veya Bid - pipsi dal takip ediyorsa >= Açık konum + pip tanımından: değişiklik: İşte bu kadar. Değişiklik için ayrı bir işlev yapmak istiyorum.

1. Ne yazık ki, tam olarak neyin "işe yaramadığını" belirtmediniz. Onlar. Programın mantığını (nasıl çalışması gerektiğini) özetlediniz, ancak programın mantığının nerede ihlal edildiğini ve bu ihlallerin tam olarak ne ifade edildiğini belirtmediniz. Sorunun ayrıntılı bir açıklaması olmadan, yalnızca kod hakkında yorum yapmak kalır.

2. bool ModifyPosition(const string symbol,double StopLoss,double Takeprofit) işlevi aşağıdaki satırları içerir:

   if (! OrderSend (request,result) || result.deal== 0 )
     {
       Print ( "Modify error =" , GetLastError ());
       return ( false );
     }

MqlTradeResult yapısının açıklamasına bakarsanız, anlaşma alanının aşağıdaki gibi tanımlandığını göreceksiniz:

anlaştık mı

Tamamlanmışsa, anlaşma bileti. Bir ticaret işlemi sırasında rapor edildi TRADE_ACTION_DEAL

ModifyPosition() işleviniz tamamen farklı bir işlem gerçekleştirdiğinden, sonuç.deal değeri her zaman sıfır olmalıdır. Bu nedenle operatör
 if (! OrderSend (request,result) || result.deal== 0 )

değişiklik başarılı olsa bile her zaman çalışır ve aynı zamanda bazı hatalar hakkında bir mesaj yazdırır.

2. Bir önceki paragraftaki satırlara bakıyoruz 2. Orada son hatanın kodunu döndürmek için tasarlanmış GetLastError () işlevini kullanıyorsunuz. Ancak hata kodunu içeren değişkeni kullanmadan önce kesinlikle resetlemezsiniz, bu nedenle modifikasyon başarılı olsa bile, pozisyon değiştirme talebi gönderilmeden çok önce oluşmuş olabilecek bir hatayı yazdırırsınız. Bunun gibi bir şey olmalı:

 ResetLastError ();   
if (! OrderSend (request,result))
   { 
    ... 
     Print ( "Modify error =" , GetLastError ());
    ...
   }

3. Şu satırlara bakın:

           if (SL == 0 || NormalizeDouble (Bid - MStop, 4 ) >= SL) 
           {
            ModifyPosition( Symbol (), NormalizeDouble (Bid - MStop, 4 ),TP);
           }

Diyelim ki bir sonraki tikte NormalizeDouble (Bid - MStop, 4 ) == SL koşulu sizin için çalıştı. Bu durumda SL==1.11110 olduğunu varsayalım. Ama sonra ModifyPosition( Symbol (), 1.11110 ,TP). Onlar. böyle bir değişiklikle, önceden belirlenmiş seviyeler belirtilecektir.

Ve bir sonraki tikte NormalizeDouble (Bid - MStop, 4 ) == SL eşitliği tekrar çalışırsa ne olur? :) Özellikle (a) normalleştirmenin dört hane ile gerçekleştirildiğini ve olası beş haneli kotasyonların varlığını dikkate alırsanız, (b) alım satım istekleri sunucuda biraz gecikmeli olarak gerçekleştirilebilir.

4. SYMBOL_TRADE_STOPS_LEVEL gibi bir sembol özelliği de vardır. Ancak kodunuzda bu seviye kontrolü yok. Yani, bir Buy pozisyonu için yeni stop loss adayı SL_new olarak belirlenmişse, if(Bid-STOPS_LEVEL>SL_new) gibi bir koşulu kontrol etmek gereksiz olmayacaktır.

 

Evet ve genel olarak, gerçek sayıları karşılaştırmak için El Kitabına bakmaya çalışın. Hatırladığım kadarıyla, iki gerçek sayının bu şekilde karşılaştırılması kategorik olarak önerilmez: if( double_1 == double_2 ).

 

Yedelkin ,

Çok teşekkür ederim Reshetov da hatanın nerede olduğunu gösterdi.

İşte işlevin kendisi:

 //+------------------------------------------------------------------+
//| Modify position.                                                 |
//+------------------------------------------------------------------+
bool ModifyPosition( const string symbol, double StopLoss, double Takeprofit){
//---- обявяване на структурата и резултата на търговското искане
   MqlTradeRequest request={ 0 };
   MqlTradeResult result={ 0 };
//---- структурна инициализация на  търговското искане MqlTradeRequest за модифициране на  позиция
   request.action       = TRADE_ACTION_SLTP ;
   request.symbol       = symbol;
   request.sl           = StopLoss;
   request.tp           = Takeprofit;
   string word          = "" ;
   StringConcatenate (word,
                     "<<< ============ Modifyposition():   Модифицираме позицията  " ,
                     symbol, " ============ >>>" );
   Print (word);
//---- модифицираме позицията и  проверяваме резултата от търговското искане
   if (! OrderSend (request,result))
     {
       Print ( "Modify error =" , GetLastError ());
       return ( false );
     }
   return ( true );
  }

Ve vize işlevinin kendisinin nasıl yapılması gerektiği aşağıda açıklanmıştır:

   double buy_trail = 0 ;
   double sel_trail = 0 ;
   double SL,TP,Open;
   if ( PositionSelect ( Symbol ())){
     if ( PositionGetInteger ( POSITION_TYPE )== POSITION_TYPE_BUY )
      {
      Open = PositionGetDouble ( POSITION_PRICE_OPEN );
      SL   = PositionGetDouble ( POSITION_SL );
      TP   = PositionGetDouble ( POSITION_TP );
      Bid  = SymbolInfoDouble ( Symbol (), SYMBOL_BID );
      buy_trail = NormalizeDouble (Bid - Open, Digits ());
       if (buy_trail > MStop)
       {
         if ( NormalizeDouble ((Bid - MStop), Digits ()) >= Open && Open > SL)
          {
           ModifyPosition( Symbol (),Open,TP);
          }
           if ( NormalizeDouble ((Bid - MStop), Digits ()) > SL && Open <= SL)
           {
            ModifyPosition( Symbol (), NormalizeDouble ((SL + 0.001 ), Digits ()),TP);
           }
        }
      }
     if ( PositionGetInteger ( POSITION_TYPE )== POSITION_TYPE_SELL )
      {
      Open = PositionGetDouble ( POSITION_PRICE_OPEN );
      SL   = PositionGetDouble ( POSITION_SL );
      TP   = PositionGetDouble ( POSITION_TP );
      Ask  = SymbolInfoDouble ( Symbol (), SYMBOL_ASK );
      sel_trail = NormalizeDouble (Open - Ask, Digits ());
       if (sel_trail > MStop)
       { 
         if ( NormalizeDouble ((Ask + MStop), Digits ()) <= Open && Open < SL)
          {
           ModifyPosition( Symbol (),Open,TP);
          }
           if ( NormalizeDouble ((Ask + MStop), Digits ()) < SL && Open >= SL)
           {
            ModifyPosition( Symbol (), NormalizeDouble ((SL - 0.001 ), Digits ()),TP);
           }
        }
      }
     }

Şu anda her şey iyi çalışıyor.

Teşekkürler.