모든 새로운 소프트웨어 제품에는 회사 내에서 가장 철저한 테스트에도 항상 감지할 수 없는 버그가 필연적으로 포함됩니다. 그래서 우리는 우리 프로그램에서 발견된 문제에 대한 모든 사용자 보고서를 매우 중요하게 여기고 각각에 답하려고 노력합니다.
먼저 잘못된 답변이 있으면 의사 소통하고 무시하는 방법. 신청 2016.06.22 08:06 , #1499568
커뮤니티에서 설명할 수 있을까요?
다음은 어드바이저 코드의 일부입니다. 내부 무효 OnTick()
bool openNew, newDay, newHour; if (( int )mqlDateTime.hour == startHour) // startHour = 0 Это условие выполнено. { newDay = newBar.IsNewBar( _Symbol , PERIOD_D1 , oldDay); // if (newDay) Print ( "***** newDay " , newDay, " mqlDateTime.hour " , mqlDateTime.hour); // Судя по распечатке newDay = true newHour = newBar.IsNewBar( _Symbol , PERIOD_H1 , oldHour); if (newHour) Print ( "***** newHour " , newHour); // Судя по распечатке newHour = true if (newDay && newHour) // A ЭТО УСЛОВИЕ НЕ ВЫПОЛНЕНО НЕСМОТРЯ НА ПРЕДЫДУЩИЕ РАСПЕЧАТКИ. { openNew = openNew_or_No(); Print ( "***** openNew " , openNew, " ***** PositionsTotal " , PositionsTotal ()); // Эта распечатка отсутствует if (openNew || PositionsTotal () == 0 ) // Продолжение кода... // На несоответствие количества открывающих и закрывающих фигурных скобок прошу не обращать внимания.
"전문가" 탭의 내용입니다.
2016.06 . 22 00 : 00 : 44.531 Toad Green (EURUSD,M15) ***** newHour true 2016.06 . 22 00 : 00 : 44.331 Toad Green (USDJPY,M15) ***** newHour true 2016.06 . 22 00 : 00 : 18.361 Toad Green (EURUSD,M15) ***** newDay true mqlDateTime.hour 0 2016.06 . 22 00 : 00 : 12.770 Toad Green (USDJPY,M15) ***** newDay true mqlDateTime.hour 0
21.06에 대한 로그 파일의 첫 번째 줄에서 위의 코드가 제대로 작동했음을 분명히 알 수 있습니다.
GM 0 00 : 00 : 30.116 Trades '3265046' : instant buy 0.01 EURUSD at 1.13188 tp: 1.13388 (deviation: 55 ) NK 0 00 : 00 : 30.246 Trades '3265046' : accepted instant buy 0.01 EURUSD at 1.13188 tp: 1.13388 (deviation: 55 ) IE 0 00 : 00 : 30.246 Trades '3265046' : deal # 73303810 buy 0.01 EURUSD at 1.13188 done (based on order # 87892298 ) KI 0 00 : 00 : 30.246 Trades '3265046' : order # 87892298 buy 0.01 / 0.01 EURUSD at 1.13188 done in 130 ms ON 0 00 : 00 : 30.256 Trades '3265046' : instant sell 0.01 EURUSD at 1.13093 tp: 1.12893 (deviation: 55 ) LQ 0 00 : 00 : 30.366 Trades '3265046' : accepted instant sell 0.01 EURUSD at 1.13093 tp: 1.12893 (deviation: 55 ) HG 0 00 : 00 : 30.376 Trades '3265046' : deal # 73303813 sell 0.01 EURUSD at 1.13093 done (based on order # 87892301 ) RK 0 00 : 00 : 30.376 Trades '3265046' : order # 87892301 sell 0.01 / 0.01 EURUSD at 1.13093 done in 120 ms MJ 0 00 : 00 : 30.376 Trades '3265046' : modify # 87608748 sell 0.01 EURUSD sl: 0.00000 , tp: 1.12031 -> sl: 0.00000 , tp: 1.12462 GK 0 00 : 00 : 30.476 Trades '3265046' : accepted modify # 87608748 sell 0.01 EURUSD sl: 0.00000 , tp: 1.12031 -> sl: 0.00000 , tp: 1.12462 OK 0 00 : 00 : 30.486 Trades '3265046' : modify # 87608748 sell 0.01 EURUSD -> sl: 0.00000 , tp: 1.12462 done in 107 ms OH 0 00 : 00 : 30.486 Trades '3265046' : modify # 87892301 sell 0.01 EURUSD sl: 0.00000 , tp: 1.12893 -> sl: 0.00000 , tp: 1.12462 GJ 0 00 : 00 : 30.586 Trades '3265046' : accepted modify # 87892301 sell 0.01 EURUSD sl: 0.00000 , tp: 1.12893 -> sl: 0.00000 , tp: 1.12462 KI 0 00 : 00 : 30.596 Trades '3265046' : modify # 87892301 sell 0.01 EURUSD -> sl: 0.00000 , tp: 1.12462 done in 109 ms EN 0 04 : 20 : 25.608 Trades '3265046' : deal # 73317674 sell 0.01 EURUSD at 1.13388 done (based on order # 87906853 )
다음날이 시작될 때까지 고문은 휴식합니다.
21.06에 대한 로그 파일의 마지막 2줄
OD 0 23:09:20.196 Network '3265046': scanning network for access points NR 0 23:09:33.496 Network '3265046': scanning network finished
22.06에 대한 로그의 시작
PM 1 02:13:39.422 Network '3265046': connection to MetaQuotes-Demo lost GF 2 02:13:39.582 MQL5.community authorization failed DO 2 02:13:39.682 MQL5.community authorization failed IP 2 02:13:40.052 MQL5.community authorization failed PK 0 02:13:43.252 Network '3265046': authorized on MetaQuotes-Demo through Access Point RU Moscow (ping: 117.48 ms) DI 0 02:13:43.252 Network '3265046': previous successful authorization performed from 31.173.80.184 on 2016.06.21 14:55:11
NewDay와 NewHour가 동시에 인쇄된 경우 로그에서 서로 옆에 있어야 합니다. 같은 시간으로
귀찮게 해서 죄송합니다. 한동안 관심을 기울이지 않았습니다. 하지만!!! 그렇다면 왜 새로운 날의 첫 번째 막대가 나타날 때 새로운 시간과 새로운 분의 첫 번째 막대이기도 한 동일한 함수가 누군가에게는 true를 반환하고 누군가에게는 false를 반환하고 원할 때 모든 것을 올바르게 반환할 수 있는 이유 모두에게?
이 기능의 문제점을 설명해 주시겠습니까?
/*****************Определение появления нового бара******************/ class cNewBar { public : bool IsNewBar( string symbol, ENUM_TIMEFRAMES timeframe, datetime & m_tOld) { datetime tNew = ( datetime ) SeriesInfoInteger (symbol, timeframe, SERIES_LASTBAR_DATE ); if (tNew > m_tOld) { m_tOld = tNew; return ( true ); } return ( false ); } }; /********************************************************************/왜 일주일 이상 동안 모든 것이 제대로 작동하고 갑자기 그러한 재앙이 일어날 수 있습니까 ???
지원팀 2016.06.22 11:31
이 기능은 다음으로 인해 여러 번 사용할 수 없습니다.
m_tOld = tNew;
알렉세이 빅토 로프 2016.06.23 10:17
나는 어제 즉시 깨닫지 못했습니다 ... 결국 변수는 참조에 의해 m_tOld 변수에 전달됩니다. 이는 전역 변수 수준에서 선언되며 다른 변수가 전달되는 경우 다중 호출에 어떤 식 으로든 영향을 미치지 않아야합니다 참조에 의한 기능. 안 그래? 이것은 첫째, 둘째-어떤 이유로 테스터와 디버그에서 모든 것이 올바르게 작동하지만 데모 계정에서는 너무 이상하게 작동합니다. 때로는 작동하고 때로는 작동하지 않습니다.
이 수표는 어떻습니까?
if (tNew > m_tOld)
지원팀 2016.06.23 10:24
함수를 연속으로 2번 호출합니다. 첫 번째 호출에서 true를 반환하면 같은 틱에서 호출하더라도 다음 호출에서 false를 반환합니다.
알렉세이 빅토 로프 2016.06.23 10:36
글쎄, 그렇게 불린다. 필요한 모든 코드를 제공했습니다. 이것이 테스터와 디버깅을 방해하지 않고 데모에서는 원하는 대로 수행되는 이유는 무엇입니까? 이해할 수 없는 것이 있습니다. 뭐, 그런 문제가 테스터에서 가끔 미끄러진다면 새로운 방법을 모색하는 것도 가능했고 필요했지만 테스터에는 문제가 없었습니다...
그럼에도 불구하고 이제 mql4에서 동일한 기능을 사용하는 Expert Advisor는 보존되지 않았지만 문제는 없었습니다. 이 문제는 mql5에서만 발생했습니다.알렉세이 빅토 로프 2016.06.23 10:41
그래서 무엇? 음, 확인해보세요... 결국, 확인하기 전에 tNew 변수에 값이 할당되고 m_tOld 변수 자체가 아니라 참조로 전달된 변수와 비교되지만, 이 m_tOld는 시간 값을 가질 수 있습니다. 지정된 기간의 이전 막대 또는 첫 번째 호출인 경우 1970년 1월 1일입니다. 그리고 각 기간의 다음 틱에서만 동일한 막대의 값이 비교됩니다.
알렉세이 빅토 로프 2016.06.23 10:57
다른 변수와 다른 기간이 함수에 전달된다는 점에 유의하십시오.
newDay = newBar.IsNewBar( _Symbol , PERIOD_D1 , oldDay ); newHour = newBar.IsNewBar( _Symbol , PERIOD_H1 , oldHour );
그리고 모든 것 ... 그 후, 완전히 무시합니다. 즉각적인 답변에 감사드립니다만 명확한 답변이 오지 않았습니다. mql5에 버그가 있는 경우 "우리가 알아내는 중입니다. 잠시만요"와 같이 작성할 수 있습니다. 그래서 문제는 단순히 무시됩니다.
mql4의 비슷한 함수가 15초의 배수로 시간의 변화를 알아냈는데 mql5에서 갑자기 그런 문제가 생겼습니다...
이것이 실험 중 관찰의 잘못된 구성이 의미하는 것입니다.
...
대답하려면 코드가 필요합니다. 코드 조각이 있습니다. 누구나 이 코드를 실행할 수 있도록 최소한의 코드를 만드십시오.
코드의 변수 값을 함수 입구와 함수 출구에서 인쇄하는 것이 좋을 것입니다.
드미트리, 또 시작됐어? "왜 2016년 6월 21일에 주문이 문제없이 열렸고, 2016년 6월 22일에 관찰 조직이 갑자기 잘못되었습니까?"라는 질문이나 다른 문제에 대답하는 것이 더 쉬울 수 있습니다.
제가 있는 그대로의 답변만 하면 아마 차단당할 가능성이 큽니다.
평생 동안...
잠을 자도 쉴 틈이 없다 꿈을 많이 꾸니?
의미는 어떻습니까? 결국, 당신은 그것에 속지 않을 것입니다.
삶의 의미가 증오일 때 사는 게 멋있을까? 하지만?
대답하려면 코드가 필요합니다. 코드 조각이 있습니다. 누구나 이 코드를 실행할 수 있도록 최소한의 코드를 만드십시오.
코드의 변수 값을 함수 입구와 함수 출구에서 인쇄하는 것이 좋을 것입니다.
괜찮아요.
그러나 문제가 없었고 갑자기 ... 왜? 코드 스니펫 외에도 2016년 6월 21일과 그 이전에는 정상적으로 작동했지만 2016년 6월 22일에 갑자기 문제가 발생한 것을 볼 수 있는 로그가 있습니다. SD에 쓰기 전에 테스터에서 반복적으로 실행하여 히스토리를 디버깅했는데 문제가 발견되지 않았습니다.
그렇기 때문에 코드 레이아웃의 유용성을 의심합니다. 엔터테인먼트를 제외하고.
#property strict datetime oldDay, oldHour; MqlDateTime mqlDateTime; /*******************Expert initialization function*******************/ int OnInit () { return ( INIT_SUCCEEDED ); } /*******************************************************************/ /************************Expert tick function************************/ void OnTick () { bool newDay, newHour; TimeToStruct ( TimeCurrent (), mqlDateTime); if (( int )mqlDateTime.hour == 0 ) { newDay = IsNewBar( _Symbol , PERIOD_D1 , oldDay); // Обратите внимание на то, что это отдельная переменная передаваемая в функцию по ссылке if (newDay) Print ( "***** newDay " , newDay, " mqlDateTime.hour " , mqlDateTime.hour); // Судя по распечатке newDay = true newHour = IsNewBar( _Symbol , PERIOD_H1 , oldHour); // А это совсем другая переменная if (newHour) Print ( "***** newHour " , newHour); // Судя по распечатке newHour = true if (newDay && newHour) // A ЭТО УСЛОВИЕ НЕ ВЫПОЛНЕНО НЕСМОТРЯ НА ПРЕДЫДУЩИЕ РАСПЕЧАТКИ. { Print ( "Ордер должен откыться. " ); } } } /*******************************************************************/ /*****************Определение появления нового бара******************/ bool IsNewBar( string symbol, ENUM_TIMEFRAMES timeframe, datetime &m_tOld) { datetime tNew = ( datetime ) SeriesInfoInteger (symbol, timeframe, SERIES_LASTBAR_DATE ); if (tNew > m_tOld) { m_tOld = tNew; return ( true ); } return ( false ); } /********************************************************************/ /******************Expert deinitialization function******************/ void OnDeinit ( const int reason) { Comment ( "" ); } /*******************************************************************/
작성자가 원하지 않기 때문에 다음을 시도합니다.
//+------------------------------------------------------------------+ //| test_1Vc2f.mq5 | //| Copyright © 2016, Vladimir Karputov | //| http://wmua.ru/slesar/ | //+------------------------------------------------------------------+ #property copyright "Copyright © 2016, Vladimir Karputov" #property link "http://wmua.ru/slesar/" #property version "1.00" //+------------------------------------------------------------------+ //| Expert initialization function | //+------------------------------------------------------------------+ int OnInit () { //--- //--- return ( INIT_SUCCEEDED ); } //+------------------------------------------------------------------+ //| Expert deinitialization function | //+------------------------------------------------------------------+ void OnDeinit ( const int reason) { //--- } //+------------------------------------------------------------------+ //| Expert tick function | //+------------------------------------------------------------------+ void OnTick () { //--- bool openNew,newDay,newHour; //--- newDay=IsNewBar( _Symbol , PERIOD_D1 ,oldDay); // if (newDay) Print ( "***** newDay " ,newDay, " mqlDateTime.hour " ,mqlDateTime.hour); // Судя по распечатке newDay = true newHour=IsNewBar( _Symbol , PERIOD_H1 ,oldHour); if (newHour) Print ( "***** newHour " ,newHour); // Судя по распечатке newDay = true } //+------------------------------------------------------------------+ //| | //+------------------------------------------------------------------+ bool IsNewBar( string symbol, ENUM_TIMEFRAMES timeframe, datetime &m_tOld) { datetime tNew=( datetime ) SeriesInfoInteger (symbol,timeframe, SERIES_LASTBAR_DATE ); if (tNew>m_tOld) { Print ( "in: m_tOld = " ,m_tOld); m_tOld=tNew; Print ( "out: m_tOld = " ,m_tOld); return ( true ); } return ( false ); } //+------------------------------------------------------------------+
" mqlDateTime " 구조가 무엇이며 "oldDay" 및 "oldHour" 변수를 선언할 위치를 결정하는 것이 남아 있습니다...
작성자가 원하지 않기 때문에 다음을 시도합니다.
" mqlDateTime " 구조가 무엇이며 "oldDay" 및 "oldHour" 변수를 선언할 위치를 결정하는 것이 남아 있습니다...