위의 로그에서 한 Expert Advisor가 다른 Expert Advisor의 구독을 취소하지 않는다는 것을 알 수 있습니다. 그러나 이것이 어떻게 구현되는지(카운터 또는 다른 것을 통해) 명확하지 않습니다. 또한 topicstater에는 지표와 고문이있었습니다. 그리고 인디케이터는 아시다시피 OnInit() 및 OnDeinit() 실행 순서를 혼동하는 불쾌한 기능이 있습니다. 이것이 실제로 존재한다면 카운터를 쓰러뜨리면 안 될 것 같습니다.
위의 로그에서 한 Expert Advisor가 다른 Expert Advisor의 구독을 취소하지 않는다는 것을 알 수 있습니다. 그러나 이것이 어떻게 구현되는지(카운터 또는 다른 것을 통해) 명확하지 않습니다. 또한 topicstater에는 지표와 고문이있었습니다. 그리고 인디케이터는 아시다시피 OnInit() 및 OnDeinit() 실행 순서를 혼동하는 불쾌한 기능이 있습니다.
아직 터미널에서 실행하지 않았지만 질문이 생겼습니다. 코드를 개체 래퍼로 전송하는 것이 터미널 자체 내부에서 (지금 일어나고 있는 것처럼) "끝을 자르는" 데 어떻게 도움이 될까요? 글쎄, 객체가 생성되고 구독이 시작되고 누군가가 구독으로 다른 프로그램을 닫으면 객체는 구독이 더 이상 없다는 것을 결코 알지 못합니다.
간단한 방법으로 수행했습니다. OnBookEvent와 OnTick의 시간 초과를 비교합니다. 첫 번째 제한 시간이 두 번째 제한 시간을 N초 이상 초과하면 다시 구독합니다.
아직 터미널에서 실행하지 않았지만 질문이 생겼습니다. 코드를 개체 래퍼로 전송하는 것이 터미널 자체 내부에서 (지금 일어나고 있는 것처럼) "끝을 자르는" 데 어떻게 도움이 될까요? 글쎄, 객체가 생성되고 구독이 시작되고 누군가가 구독으로 다른 프로그램을 닫으면 객체는 구독이 더 이상 없다는 것을 결코 알지 못합니다.
간단한 방법으로 수행했습니다. OnBookEvent와 OnTick의 시간 초과를 비교합니다. 첫 번째 제한 시간이 두 번째 제한 시간을 N초 이상 초과하면 다시 구독합니다.
글쎄요, 예상대로 당신은 틀렸습니다.
첫 번째 지표
//+------------------------------------------------------------------+//| 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);
}
}
//+------------------------------------------------------------------+
두 번째 지표
//+------------------------------------------------------------------+//| 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);
}
}
//+------------------------------------------------------------------+
이에 대한 문서가 없기 때문에 개발자의 의견을 듣고 싶습니다.
그리고 위의 로그에서 카운터가 있는지 명확하지 않습니까?
그리고 위의 로그에서 카운터가 있는지 명확하지 않습니까?
위의 로그에서 한 Expert Advisor가 다른 Expert Advisor의 구독을 취소하지 않는다는 것을 알 수 있습니다. 그러나 이것이 어떻게 구현되는지(카운터 또는 다른 것을 통해) 명확하지 않습니다. 또한 topicstater에는 지표와 고문이있었습니다. 그리고 인디케이터는 아시다시피 OnInit() 및 OnDeinit() 실행 순서를 혼동하는 불쾌한 기능이 있습니다. 이것이 실제로 존재한다면 카운터를 쓰러뜨리면 안 될 것 같습니다.
위의 로그에서 한 Expert Advisor가 다른 Expert Advisor의 구독을 취소하지 않는다는 것을 알 수 있습니다. 그러나 이것이 어떻게 구현되는지(카운터 또는 다른 것을 통해) 명확하지 않습니다. 또한 topicstater에는 지표와 고문이있었습니다. 그리고 인디케이터는 아시다시피 OnInit() 및 OnDeinit() 실행 순서를 혼동하는 불쾌한 기능이 있습니다.
그래서 혼란이 없도록 is_book 변수를 도입한 것이다.
개발자들이 MarketBookAdd() 를 FUNCTION으로 만든 것은 아무 것도 아닙니다.
그리고 위의 로그에서 카운터가 있는지 명확하지 않습니까?
문제가 발생한 상황과 다른 상황이 사용되면 아무것도 기록하지 않습니다.
프로그램 중 2개(전문가와 칠면조 또는 칠면조 2개)를 가져오십시오. 하나의 차트에 매달린 다음 그 중 하나를 삭제하십시오. 나머지 사본의 구독이 중단됩니다.
OnInit/OnDeinit에 대한 호출 순서가 정확하더라도(이 테스트에서는 항상 정확했음) 문제가 있습니다.
이 접근 방식이 작동하지 않습니까?
아직 터미널에서 실행하지 않았지만 질문이 생겼습니다. 코드를 개체 래퍼로 전송하는 것이 터미널 자체 내부에서 (지금 일어나고 있는 것처럼) "끝을 자르는" 데 어떻게 도움이 될까요? 글쎄, 객체가 생성되고 구독이 시작되고 누군가가 구독으로 다른 프로그램을 닫으면 객체는 구독이 더 이상 없다는 것을 결코 알지 못합니다.
간단한 방법으로 수행했습니다. OnBookEvent와 OnTick의 시간 초과를 비교합니다. 첫 번째 제한 시간이 두 번째 제한 시간을 N초 이상 초과하면 다시 구독합니다.
아직 터미널에서 실행하지 않았지만 질문이 생겼습니다. 코드를 개체 래퍼로 전송하는 것이 터미널 자체 내부에서 (지금 일어나고 있는 것처럼) "끝을 자르는" 데 어떻게 도움이 될까요? 글쎄, 객체가 생성되고 구독이 시작되고 누군가가 구독으로 다른 프로그램을 닫으면 객체는 구독이 더 이상 없다는 것을 결코 알지 못합니다.
간단한 방법으로 수행했습니다. OnBookEvent와 OnTick의 시간 초과를 비교합니다. 첫 번째 제한 시간이 두 번째 제한 시간을 N초 이상 초과하면 다시 구독합니다.
글쎄요, 예상대로 당신은 틀렸습니다.
첫 번째 지표
두 번째 지표
결과
아직 터미널에서 실행하지 않았지만 질문이 생겼습니다. 코드를 개체 래퍼로 전송하는 것이 터미널 자체 내부에서 (지금 일어나고 있는 것처럼) "끝을 자르는" 데 어떻게 도움이 될까요?
Init 및 Deinit는 구독에 참여하지 않습니다. 아마도이 상황이 도움이 될 것입니다.
동일한 기호의 다른 창에서 이 표시기를 실행했는데 잘 작동합니다.
그러나 동일한 기호 창에서 두 표시기를 모두 실행하면 실제로
하나의 지표가 삭제되었을 때 구독이 "떨어졌습니다".
SD에 쓰기(새 빌드에서 수정할 시간이 있을 수 있음)
거래, 자동 거래 시스템 및 거래 전략 테스트에 관한 포럼
OnBookEvent에 대한 구독이 때때로 중단됩니다. 그런 일이 있습니까?
2018.07.24 21:25