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; // Flagint bn; // Bar Numberdatetime bot; // Bar Open Timedouble bop; // Bar Open Price
};
open_bar BarOpen;
//+------------------------------------------------------------------------------------------------------------------+//| Возвращает TRUE, если появился новый бар на текущем ТФ//+------------------------------------------------------------------------------------------------------------------+bool isNewBar()
{
datetime tm[];
staticdatetime 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 );
returntrue ;
}
returnfalse ;
}
returntrue ;
}
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ı?
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ı???
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.
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!!!
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.
İş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 parametersinputushort InpUpGap = 15 ; // Gap for pending orders UP from the current price (in points)inputushort InpUpStep = 30 ; // Step between orders UP (in points)inputushort InpDownGap = 15 ; // Gap for pending orders DOWN from the current price (in points)inputushort InpDownStep = 30 ; // Step between orders DOWN (in points)input ENUM_STOP_OR_LIMIT InpPending = stop; // Type of pending ordersinputuchar InpUpQuantity = 1 ; // UP quantity ordersinputuchar InpDownQuantity = 1 ; // DOWN quantity ordersinputdouble InpLots = 0.01 ; // Lotsinputushort InpStopLoss = 50 ; // Stop Loss (in points)inputushort InpTakeProfit = 50 ; // Take Profit (in points)//---ulong m_slippage= 30 ; // slippagedouble 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 |//+------------------------------------------------------------------+voidOnStart ()
{
//---if (InpLots<= 0.0 )
{
Print ( "The \"Lots\" can't be smaller or equal to zero" );
return ;
}
//---if (!m_symbol.Name( Symbol ())) // sets symbol namereturn ;
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 );
elseif (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 workdouble start_price_ask=m_symbol.Ask()-ExtUpGap;
double start_price_bid=m_symbol.Bid()+ExtDownGap;
//--- set pending ordersfor ( 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ı?
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:
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ı?
İkinci pozisyon, birinciden hemen sonra açılır, aynı saniyede biletler birer birer farklılık gösterir.
https://www.mql5.com/en/forum/271445
https://www.mql5.com/en/forum/308940
https://www.mql5.com/en/forum/271445
https://www.mql5.com/en/forum/308940
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ı???
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.
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.
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.
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.
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ı:
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.