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

 
Artyom Trishkin :

Bu barda henüz bir pozisyon açılmadığını nasıl kontrol edersiniz?

Belki Alexey Vazhmikin'in işlevini biraz değiştirebilir ve bu şekilde yeni bir çubukta bir pozisyonun açılmasını kontrol etmek için bir yapı ekleyebilir:

 struct open_bar {
   bool      IsPositionOpened; // Flag
   int       bn;               // Bar Number
   datetime bot;               // Bar Open Time
   double    bop;               // Bar Open Price
}; 
open_bar BarOpen;

//+------------------------------------------------------------------------------------------------------------------+
//| Возвращает TRUE, если появился новый бар на текущем ТФ
//+------------------------------------------------------------------------------------------------------------------+
bool isNewBar()
  {
   datetime tm[];
   static datetime prevBarTime= 0 ;

   if ( CopyTime ( _Symbol , 0 , 0 , 1 ,tm)< 0 )
     {
       Print ( "%s CopyTime error = %d" , __FUNCTION__ , GetLastError ());
     }
   else
     {
       if (prevBarTime!=tm[ 0 ])
        {
         prevBarTime=tm[ 0 ];
         BarOpen.IsPositionOpened= false ;
         BarOpen.bn++;
         BarOpen.bot= iTime ( NULL , PERIOD_CURRENT , 0 );
         BarOpen.bop= iOpen ( NULL , PERIOD_CURRENT , 0 );
         return true ;
        }
       return false ;
     }
   return true ;
  }

Ardından, bir pozisyonun başarılı bir şekilde açılması üzerine Expert Advisor'daki kontrol bayrağını kaldırın:

BarOpen.IsPositionOpened= true ;

Ve bir sonraki pozisyonu açmadan önce kontrol edin. Yani daha güvenilir olacak mı?

 
Grigori.SB :

İkinci pozisyon, birinciden hemen sonra açılır, aynı saniyede biletler birer birer farklılık gösterir.

 

Yardım için teşekkürler. Her şeyi ayrıntılı olarak inceledim. Her takas talebinden sonra 5 saniyelik bir gecikme yaşıyorum, ancak yine de yardımcı olmuyor. Sorun sadece ICMarkets demo MT5 hedge'de. Kontroller ekleyeceğim ve durum anketinin sonuçlarını görüntüleyeceğim. Aynı sunucuya bağlı olmamıza rağmen, sorunu kendi başıma yeniden oluşturamamam ve müşteride düzenli olarak olması durumu daha da kötüleştiriyor.

 
Merhaba beyler! Simferopol'den kimse var mı???
 
Олег Юдин :
Merhaba beyler! Simferopol'den kimse var mı???

Ve yine de bir şekilde MQL5 öğrenmenize yardımcı olacağını düşünüyorsunuz :) . Burada MQL5'te programlama için bir forum var, ancak bir flört kulübü değil.

 
Vladimir Karputov :

Ve yine de bir şekilde MQL5 öğrenmenize yardımcı olacağını düşünüyorsunuz :) . Burada MQL5'te programlama için bir forum var, ancak bir flört kulübü değil.

Hayır, mql5 programlama konusunda zaten çok bilgiliyim, mükemmel değil ama fena değil!!!
 
Grigori.SB :

Yardım için teşekkürler. Her şeyi ayrıntılı olarak inceledim. Her takas talebinden sonra 5 saniyelik bir gecikme yaşıyorum, ancak yine de yardımcı olmuyor. Sorun sadece ICMarkets demo MT5 hedge'de. Kontroller ekleyeceğim ve durum anketinin sonuçlarını görüntüleyeceğim. Aynı sunucuya bağlı olmamıza rağmen, sorunu kendi başıma yeniden oluşturamamam ve müşteride düzenli olarak olması durumu daha da kötüleştiriyor.

Bunun bir şekilde müşterinin bağlantısının kalitesiyle, örneğin büyük bir ping ile ilgili olduğunu düşünüyorum. Gerçekten 5 saniyelik bir gecikmeniz var ama kodunuzdan anladığım kadarıyla ihtiyacınız olan yerde değil. m_trade sınıfı ne döndürür? Bilet numarası? Ya da doğru mu yanlış mı? Bu nesne tarafından döndürülen sonucu kontrol etmelisiniz, ancak sunucu ile iletişimdeki gecikme nedeniyle henüz olumlu bir yanıtın gelmediğini hayal edin. if ifadesini çalıştırmanın sonucu ne olur? Görünüşe göre yanlış ve sonuç olarak, döngünüz 5 saniye içinde ikinci yinelemeye gidecek. Ve şu anda, nihayet sunucudan bir yanıt gelecek, ancak ikinci yineleme zaten başlatılacak ve benzer bir pozisyon açmak için ikinci istek gidecek. Emirlerin açılış saatinde bir miktar delta olduğu gerçeği, her iki emrin de grafikte dengelenmiş olması, yani farklı zamanlarda ve farklı fiyatlarla gerçekleştirilmiş olmaları ile kanıtlanmıştır.

 
Grigori.SB :

Aynı sunucuya bağlı olmamıza rağmen, sorunu kendi başıma yeniden oluşturamamam ve müşteride düzenli olarak olması durumu daha da kötüleştiriyor.

Her sembol için bir pozisyon olacak şekilde çubuğu kontrol edin. Büyük ihtimalle problemden kurtulacaksınız.

 
Konstantin Nikitin :

Her sembol için bir pozisyon olacak şekilde çubuğu kontrol edin. Büyük ihtimalle problemden kurtulacaksınız.

Bir pürüz daha var. Bu durumda, bir koltuk değneği icat etmekten MT4 stiline yeniden yazmak daha kolaydır.

 

Herkese iyi günler!

İşte Metatrader5 için komut dosyasının bir parçası:

 #property copyright "Copyright 2019, MetaQuotes Software Corp."
#property link        "https://www.mql5.com"
#property version    "1.00"
//---- показывать входные параметры
#property script_show_inputs
//---
#include <Trade\Trade.mqh>
#include <Trade\SymbolInfo.mqh>
CTrade         m_trade;                       // trading object
CSymbolInfo    m_symbol;                     // symbol info object
//+------------------------------------------------------------------+
//| Enum Stop or Limit                                               |
//+------------------------------------------------------------------+
enum ENUM_STOP_OR_LIMIT
  {
   stop= 0 ,     // Buy stop and Sell stop
   limit= 1      // Buy limit and Sell limit
  };
//--- input parameters
input ushort                InpUpGap          = 15 ;     // Gap for pending orders UP from the current price (in points)
input ushort                InpUpStep         = 30 ;     // Step between orders UP (in points)

input ushort                InpDownGap        = 15 ;     // Gap for pending orders DOWN from the current price (in points)
input ushort                InpDownStep       = 30 ;     // Step between orders DOWN (in points)

input ENUM_STOP_OR_LIMIT   InpPending        = stop;   // Type of pending orders

input uchar                 InpUpQuantity     = 1 ;     // UP quantity orders
input uchar                 InpDownQuantity   = 1 ;     // DOWN quantity orders

input double                InpLots           = 0.01 ;   // Lots
input ushort                InpStopLoss       = 50 ;     // Stop Loss (in points)
input ushort                InpTakeProfit     = 50 ;     // Take Profit (in points)
//---
ulong                       m_slippage= 30 ;             // slippage

double                      ExtUpGap= 0.0 ;
double                      ExtUpStep= 0.0 ;

double                      ExtDownGap= 0.0 ;
double                      ExtDownStep= 0.0 ;

double                      ExtStopLoss= 0.0 ;
double                      ExtTakeProfit= 0.0 ;
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart ()
  {
//---
   if (InpLots<= 0.0 )
     {
       Print ( "The \"Lots\" can't be smaller or equal to zero" );
       return ;
     }
//---
   if (!m_symbol.Name( Symbol ())) // sets symbol name
       return ;
   if (!RefreshRates())
       return ;

   string err_text= "" ;
   if (!CheckVolumeValue(InpLots,err_text))
     {
       Print (err_text);
       return ;
     }

//---
   if (IsFillingTypeAllowed( SYMBOL_FILLING_FOK ))
      m_trade.SetTypeFilling( ORDER_FILLING_FOK );
   else
       if (IsFillingTypeAllowed( SYMBOL_FILLING_IOC ))
         m_trade.SetTypeFilling( ORDER_FILLING_IOC );
       else
         m_trade.SetTypeFilling( ORDER_FILLING_RETURN );

//---
   m_trade.SetDeviationInPoints(m_slippage);
   m_trade.SetAsyncMode( true );

//---
   ExtUpGap = m_symbol. Point () * InpUpGap;
   ExtUpStep = m_symbol. Point () * InpUpStep;

   ExtDownGap = m_symbol. Point () * InpDownGap;
   ExtDownStep = m_symbol. Point () * InpDownStep;

   ExtStopLoss = m_symbol. Point () * InpStopLoss;
   ExtTakeProfit = m_symbol. Point () * InpTakeProfit;

//--- start work
   double start_price_ask=m_symbol.Ask()-ExtUpGap;
   double start_price_bid=m_symbol.Bid()+ExtDownGap;

//--- set pending orders
   for ( int i= 0 ; i<InpUpQuantity; i++)
     {
       double price_ask = start_price_ask+i*ExtUpStep;
       double price_bid = start_price_bid+i*ExtUpStep;
       if (InpPending==stop)
        {
         double sl = (ExtStopLoss== 0.0 )   ? 0.0 : price_ask - ExtStopLoss;
         double tp = (ExtTakeProfit== 0.0 ) ? 0.0 : price_ask + ExtTakeProfit;
         m_trade.BuyStop(InpLots,m_symbol.NormalizePrice(price_ask),m_symbol.Name(),
         m_symbol.NormalizePrice(sl),
         m_symbol.NormalizePrice(tp));
        }
       else
        {
         double sl = (ExtStopLoss== 0.0 )   ? 0.0 : price_bid + ExtStopLoss;
         double tp = (ExtTakeProfit== 0.0 ) ? 0.0 : price_bid - ExtTakeProfit;
         m_trade.SellLimit(InpLots,m_symbol.NormalizePrice(price_bid),m_symbol.Name(),
         m_symbol.NormalizePrice(sl),
         m_symbol.NormalizePrice(tp));
        }
     }

   for ( int i= 0 ; i<InpDownQuantity; i++)
     {
       double price_ask = start_price_ask-i*ExtDownStep;
       double price_bid = start_price_bid-i*ExtDownStep;
       if (InpPending==limit)
        {
         double sl = (ExtStopLoss== 0.0 )   ? 0.0 : price_ask - ExtStopLoss;
         double tp = (ExtTakeProfit== 0.0 ) ? 0.0 : price_ask + ExtTakeProfit;
         m_trade.BuyLimit(InpLots,m_symbol.NormalizePrice(price_ask),m_symbol.Name(),
         m_symbol.NormalizePrice(sl),
         m_symbol.NormalizePrice(tp));
        }
       else
        {
         double sl = (ExtStopLoss== 0.0 )   ? 0.0 : price_bid + ExtStopLoss;
         double tp = (ExtTakeProfit== 0.0 ) ? 0.0 : price_bid - ExtTakeProfit;
         m_trade.SellStop(InpLots,m_symbol.NormalizePrice(price_bid),m_symbol.Name(),
         m_symbol.NormalizePrice(sl),
         m_symbol.NormalizePrice(tp));
        }
     }
  }


Sorular ortaya çıktı:

1. Planlandığı gibi, komut dosyası, talep ve tekliften belirli bir mesafede bekleyen limit emirleri veya durdurma emirleri vermelidir. Limit bekleyen emirler sorunsuz bir şekilde belirlenir, ancak durdurma emirleri değildir. Lütfen Buy Stop ve Sell Stop bekleyen emirlerinin neden ayarlanmadığını anlamama yardım edin.

2. Piyasa kapalıyken (örneğin hafta sonları) senaryoyu test etmenin bir yolu var mı?

Saygılarımla, Vladimir.