Ve yukarıdaki kütükten bir sayaç olduğu belli değil mi?
Bir Uzman Danışmanın başka bir Uzman Danışman üyeliğini iptal etmediği yukarıdaki günlükten görülebilir. Ancak bunun nasıl uygulanacağı - bir sayaç veya başka bir şey aracılığıyla - net değil. Ayrıca, konu bildiricisinin bir göstergesi ve bir danışmanı vardı. Ve gösterge, bildiğiniz gibi, OnInit() ve OnDeinit() başlatma sırasını karıştırmak gibi hoş olmayan bir özelliğe sahiptir. Her ne kadar bu, öyle görünüyor ki, gerçekten öyleyse, tezgahı düşürmemelidir.
Bir Uzman Danışmanın başka bir Uzman Danışman üyeliğini iptal etmediği yukarıdaki günlükten görülebilir. Ancak bunun nasıl uygulanacağı - bir sayaç veya başka bir şey aracılığıyla - net değil. Ayrıca, konu bildiricisinin bir göstergesi ve bir danışmanı vardı. Ve gösterge, bildiğiniz gibi, OnInit() ve OnDeinit() başlatma sırasını karıştırmak gibi hoş olmayan bir özelliğe sahiptir.
Bu nedenle, karışıklık olmaması için is_book değişkeni tanıtılmıştır.
Geliştiricilerin MarketBookAdd()' ı bir İŞLEV haline getirmeleri boşuna değil.
Ve yukarıdaki kütükten bir sayaç olduğu belli değil mi?
Sorunun oluştuğu durumdan farklı bir durum kullanıldığında hiçbir şey hakkında oturum açma.
Programlarınızdan 2 tanesini alın (bir uzman ve bir hindi veya 2 hindi) - bir çizelgeye asın ve ardından birini silin. Kalan kopyanın aboneliği düşecek.
OnInit/OnDeinit'e yapılan çağrıların sırası doğru olsa bile (bu testlerde her zaman doğru olmuştur), bir sorun vardır.
Henüz terminalde çalıştırmadım, ancak soru ortaya çıktı - kodu bir nesne sarmalayıcıya aktarmak, terminalin kendi içinde (şu anda olduğu gibi) "uçları kesmeye" nasıl yardımcı olacak? Pekala, bir nesne yaratılacak ve abonelik başlayacak ve sonra biri başka bir programı abonelikle kapatırsa, nesne aboneliğin artık olmadığını asla bilemeyecek.
Basit bir şekilde yaptım: OnBookEvent ve OnTick için zaman aşımlarını karşılaştırırım. İlk zaman aşımı, ikinci zaman aşımını N saniyeden fazla aşarsa, yeniden abone olurum.
Henüz terminalde çalıştırmadım, ancak soru ortaya çıktı - kodu bir nesne sarmalayıcıya aktarmak, terminalin kendi içinde (şu anda olduğu gibi) "uçları kesmeye" nasıl yardımcı olacak? Pekala, bir nesne yaratılacak ve abonelik başlayacak ve sonra biri başka bir programı abonelikle kapatırsa, nesne aboneliğin artık olmadığını asla bilemeyecek.
Basit bir şekilde yaptım: OnBookEvent ve OnTick için zaman aşımlarını karşılaştırırım. İlk zaman aşımı, ikinci zaman aşımını N saniyeden fazla aşarsa, yeniden abone olurum.
Beklendiği gibi, yanılıyorsunuz.
1. gösterge
//+------------------------------------------------------------------+//| Test_ind_1.mq5 |//| Copyright 2018 prostotrader |//| https://www.mql5.com |//+------------------------------------------------------------------+#property copyright"Copyright 2018 prostotrader"#property link"https://www.mql5.com"#property version"1.00"#define on_call - 111#property indicator_separate_windowbool is_book = false ;
double Buff[];
int event_cnt = 0 ;
#property indicator_buffers1#property indicator_plots1//--- plot Label1#property indicator_label1"Test_1"#property indicator_type1DRAW_LINE#property indicator_color1clrAqua#property indicator_style1STYLE_SOLID#property indicator_width11//+------------------------------------------------------------------+//| Custom indicator initialization function |//+------------------------------------------------------------------+intOnInit ()
{
//--- Set buffers IndicatorSetInteger ( INDICATOR_DIGITS , 0 );
IndicatorSetString ( INDICATOR_SHORTNAME , "Test_ind_1" );
//---Set buffersSetIndexBuffer ( 0 ,Buff, INDICATOR_DATA );
PlotIndexSetDouble ( 0 , PLOT_EMPTY_VALUE , EMPTY_VALUE );
ArraySetAsSeries (Buff, true );
is_book = MarketBookAdd ( Symbol ());
if (is_book == true )
{
Print ( __FUNCTION__ , ": Подписка на стакан добавлена. Символ " , Symbol ());
}
//---return ( INIT_SUCCEEDED );
}
//+------------------------------------------------------------------+//| Expert deinitialization function |//+------------------------------------------------------------------+voidOnDeinit ( constint reason)
{
if (is_book == true )
{
MarketBookRelease ( Symbol ());
Print ( __FUNCTION__ , ": Подписка на стакан удалена. Символ " , Symbol ());
}
}
//+------------------------------------------------------------------+//| Custom indicator iteration function |//+------------------------------------------------------------------+intOnCalculate ( constint rates_total,
constint prev_calculated,
constint begin,
constdouble &price[])
{
if (prev_calculated == 0 )
{
ArrayInitialize (Buff, EMPTY_VALUE );
}
Buff[ 0 ] = 2 ;
//--- return value of prev_calculated for next call
event_cnt = rates_total;
return (rates_total);
}
//+------------------------------------------------------------------+//| BookEvent function |//+------------------------------------------------------------------+voidOnBookEvent ( conststring &symbol)
{
if (symbol == Symbol ())
{
Print ( __FUNCTION__ , ": Подписка работает. Символ " , symbol);
double price[];
OnCalculate (event_cnt,event_cnt,on_call,price);
}
}
//+------------------------------------------------------------------+
İkinci gösterge
//+------------------------------------------------------------------+//| Test_ind_1.mq5 |//| Copyright 2018 prostotrader |//| https://www.mql5.com |//+------------------------------------------------------------------+#property copyright"Copyright 2018 prostotrader"#property link"https://www.mql5.com"#property version"1.00"#define on_call - 111#property indicator_separate_windowbool is_book = false ;
double Buff[];
int event_cnt = 0 ;
#property indicator_buffers1#property indicator_plots1//--- plot Label1#property indicator_label1"Test_2"#property indicator_type1DRAW_LINE#property indicator_color1clrLime#property indicator_style1STYLE_SOLID#property indicator_width11//+------------------------------------------------------------------+//| Custom indicator initialization function |//+------------------------------------------------------------------+intOnInit ()
{
//--- Set buffers IndicatorSetInteger ( INDICATOR_DIGITS , 0 );
IndicatorSetString ( INDICATOR_SHORTNAME , "Test_ind_2" );
//---Set buffersSetIndexBuffer ( 0 ,Buff, INDICATOR_DATA );
PlotIndexSetDouble ( 0 , PLOT_EMPTY_VALUE , EMPTY_VALUE );
ArraySetAsSeries (Buff, true );
is_book = MarketBookAdd ( Symbol ());
if (is_book == true )
{
Print ( __FUNCTION__ , ": Подписка 2 на стакан добавлена. Символ " , Symbol ());
}
//---return ( INIT_SUCCEEDED );
}
//+------------------------------------------------------------------+//| Expert deinitialization function |//+------------------------------------------------------------------+voidOnDeinit ( constint reason)
{
if (is_book == true )
{
MarketBookRelease ( Symbol ());
Print ( __FUNCTION__ , ": Подписка 2 на стакан удалена. Символ " , Symbol ());
}
}
//+------------------------------------------------------------------+//| Custom indicator iteration function |//+------------------------------------------------------------------+intOnCalculate ( constint rates_total,
constint prev_calculated,
constint begin,
constdouble &price[])
{
if (prev_calculated == 0 )
{
ArrayInitialize (Buff, EMPTY_VALUE );
}
Buff[ 0 ] = 2 ;
//--- return value of prev_calculated for next call
event_cnt = rates_total;
return (rates_total);
}
//+------------------------------------------------------------------+//| BookEvent function |//+------------------------------------------------------------------+voidOnBookEvent ( conststring &symbol)
{
if (symbol == Symbol ())
{
Print ( __FUNCTION__ , ": Подписка 2 работает. Символ " , symbol);
double price[];
OnCalculate (event_cnt,event_cnt,on_call,price);
}
}
//+------------------------------------------------------------------+
Henüz terminalde çalıştırmadım, ancak soru ortaya çıktı - kodu bir nesne sarmalayıcıya aktarmak, terminalin kendi içinde (şu anda olduğu gibi) "uçları kesmeye" nasıl yardımcı olacak?
Init ve Deinit aboneliğe katılmaz. Belki bu durum yardımcı olacaktır.
Geliştiricilerden bir yorum almak istiyorum çünkü belgelerde bununla ilgili hiçbir şey yok.
Ve yukarıdaki kütükten bir sayaç olduğu belli değil mi?
Ve yukarıdaki kütükten bir sayaç olduğu belli değil mi?
Bir Uzman Danışmanın başka bir Uzman Danışman üyeliğini iptal etmediği yukarıdaki günlükten görülebilir. Ancak bunun nasıl uygulanacağı - bir sayaç veya başka bir şey aracılığıyla - net değil. Ayrıca, konu bildiricisinin bir göstergesi ve bir danışmanı vardı. Ve gösterge, bildiğiniz gibi, OnInit() ve OnDeinit() başlatma sırasını karıştırmak gibi hoş olmayan bir özelliğe sahiptir. Her ne kadar bu, öyle görünüyor ki, gerçekten öyleyse, tezgahı düşürmemelidir.
Bir Uzman Danışmanın başka bir Uzman Danışman üyeliğini iptal etmediği yukarıdaki günlükten görülebilir. Ancak bunun nasıl uygulanacağı - bir sayaç veya başka bir şey aracılığıyla - net değil. Ayrıca, konu bildiricisinin bir göstergesi ve bir danışmanı vardı. Ve gösterge, bildiğiniz gibi, OnInit() ve OnDeinit() başlatma sırasını karıştırmak gibi hoş olmayan bir özelliğe sahiptir.
Bu nedenle, karışıklık olmaması için is_book değişkeni tanıtılmıştır.
Geliştiricilerin MarketBookAdd()' ı bir İŞLEV haline getirmeleri boşuna değil.
Ve yukarıdaki kütükten bir sayaç olduğu belli değil mi?
Sorunun oluştuğu durumdan farklı bir durum kullanıldığında hiçbir şey hakkında oturum açma.
Programlarınızdan 2 tanesini alın (bir uzman ve bir hindi veya 2 hindi) - bir çizelgeye asın ve ardından birini silin. Kalan kopyanın aboneliği düşecek.
OnInit/OnDeinit'e yapılan çağrıların sırası doğru olsa bile (bu testlerde her zaman doğru olmuştur), bir sorun vardır.
Bu yaklaşım işe yaramıyor mu?
Henüz terminalde çalıştırmadım, ancak soru ortaya çıktı - kodu bir nesne sarmalayıcıya aktarmak, terminalin kendi içinde (şu anda olduğu gibi) "uçları kesmeye" nasıl yardımcı olacak? Pekala, bir nesne yaratılacak ve abonelik başlayacak ve sonra biri başka bir programı abonelikle kapatırsa, nesne aboneliğin artık olmadığını asla bilemeyecek.
Basit bir şekilde yaptım: OnBookEvent ve OnTick için zaman aşımlarını karşılaştırırım. İlk zaman aşımı, ikinci zaman aşımını N saniyeden fazla aşarsa, yeniden abone olurum.
Henüz terminalde çalıştırmadım, ancak soru ortaya çıktı - kodu bir nesne sarmalayıcıya aktarmak, terminalin kendi içinde (şu anda olduğu gibi) "uçları kesmeye" nasıl yardımcı olacak? Pekala, bir nesne yaratılacak ve abonelik başlayacak ve sonra biri başka bir programı abonelikle kapatırsa, nesne aboneliğin artık olmadığını asla bilemeyecek.
Basit bir şekilde yaptım: OnBookEvent ve OnTick için zaman aşımlarını karşılaştırırım. İlk zaman aşımı, ikinci zaman aşımını N saniyeden fazla aşarsa, yeniden abone olurum.
Beklendiği gibi, yanılıyorsunuz.
1. gösterge
İkinci gösterge
Sonuç
Henüz terminalde çalıştırmadım, ancak soru ortaya çıktı - kodu bir nesne sarmalayıcıya aktarmak, terminalin kendi içinde (şu anda olduğu gibi) "uçları kesmeye" nasıl yardımcı olacak?
Init ve Deinit aboneliğe katılmaz. Belki bu durum yardımcı olacaktır.
Bu göstergeleri aynı sembolün farklı pencerelerinde çalıştırdım ve gayet iyi çalışıyor.
ama her iki göstergeyi de aynı sembol penceresinde çalıştırdığımda, o zaman gerçekten
bir gösterge silindiğinde abonelik "düştü".
SD'ye yazın (belki yeni yapıda bir düzeltme yapmak için zamanları olur)
Ticaret, otomatik ticaret sistemleri ve ticaret stratejilerinin test edilmesi hakkında forum
OnBookEvent aboneliği bazen düşüyor - böyle bir şey var mı?
2018.07.24 21:25