마침내 스레드를 찾았습니다 https://www.mql5.com/en/forum/14327
해당 스레드를 찾는 데 2시간이 걸렸습니다... 어쨌든 EA가 충분히 오래 자지 않아서 이중 항목을 수행하는 이유는 무엇입니까?
나는 같은 문제가 있었고 xxxx를 사용하는 사람을 기억합니다.
그 스레드를 찾을 수 없었습니다. 누군가가 저를 도울 수 있다면 큰 감사가 될 것입니다.
On_Tick()에서 다음과 같은 내 코드
0.01 로트를 입력해야 하지만 대신 0.02 로트를 입력합니다.
저널에서
2013.12.20 08:35:01 거래 '800****': 거래 #27731692 1.36354에서 0.01 EURUSD 구매 완료( 주문 #40018327 기준)
2013.12.20 08:35:01 거래 '800****': 331ms 후 실행을 위해 배치된 시장에서 0.01 EURUSD 교환 구매
2013.12.20 08:35:01 거래 '800****': 거래 #27731691 1.36353에 0.01 EURUSD 구매 완료(주문 #40018326 기준)
2013.12.20 08:35:00 거래 '800****': 시장에서 0.01 EURUSD 교환 구매
2013.12.20 08:35:00 거래 '800****': 313ms 후 실행을 위해 배치된 시장에서 0.01 EURUSD 교환 구매
2013.12.20 08:35:00 거래 '800****': 시장에서 0.01 EURUSD 교환 구매
- 이것은 게시한 코드의 로그가 아닙니다(Print 문의 결과는 어디에 있습니까?).
- 왜 Sleep()을 사용해야 합니까? 불필요하다.
- 왜 루프가 필요합니까? 오류의 원인을 확인하지도 않았으니 시정하지도 마십시오.
- ResultComment()가 아니라 ResultRetcode() 및/또는 GetLastError()를 확인해야 합니다.
- 이것은 게시한 코드의 로그가 아닙니다(Print 문의 결과는 어디에 있습니까?).
전문가 탭 아래에는 EURUSD에서 열린 포지션 외에는 인쇄 명세서의 출력이 없습니다.
- 왜 Sleep() 을 사용해야 합니까? 불필요하다.
- ResultComment()가 아니라 ResultRetcode() 및/또는 GetLastError()를 확인해야 합니다.
나는 이것들을 읽을 것이다
그러나 if (! PositionSelect ( 기호 ()))
왜 여전히 2 번 실행됩니까?
- 이것은 게시한 코드의 로그가 아닙니다(Print 문의 결과는 어디에 있습니까?).
전문가 탭 아래에는 EURUSD에서 열린 포지션 외에는 인쇄 명세서의 출력이 없습니다.
- 왜 Sleep() 을 사용해야 합니까? 불필요하다.
다른 스레드가 절전 모드를 사용하여 해결하는 것 같습니다.
- ResultComment()가 아니라 ResultRetcode() 및/또는 GetLastError()를 확인해야 합니다.
나는 이것들을 읽을 것이다
하지만 if (! PositionSelect ( 기호 ()))
왜 여전히 2 번 실행됩니까?
예, 2번 인쇄되었습니다. > 포지션은 EURUSD로 열렸습니다.
다른 사용자가 보고한 동일한 문제 > https://www.mql5.com/en/forum/14327
350ms로 절전 모드를 사용하여 해결
내 EA는 이 전에 2번의 다른 거래를 했고 완벽하게 괜찮습니다.
내 EA가 이미 주문 처리를 완료했고 중개인이 아직 거래 세부 정보를 반환하지 않았고 내 EA가 2개의 항목을 유발하는 새 틱을 처리했다면?
예, 2번 인쇄되었습니다. > 포지션은 EURUSD로 개설되었습니다.
다른 사용자가 보고한 동일한 문제 > https://www.mql5.com/en/forum/14327
350ms로 절전 모드를 사용하여 해결
내 EA는 이 전에 2번의 다른 거래를 했고 완벽하게 괜찮습니다.
내 EA가 이미 주문 처리를 완료했고 중개인이 아직 거래 세부 정보를 반환하지 않았고 내 EA가 2개의 항목을 유발하는 새 틱을 처리했다면?
이것은 가능한 설명처럼 보이지만, 만약 그렇다면 정상이 아닙니다. 비동기 모드를 사용하고 있습니까? 그렇지 않은 경우 EA는 서버의 응답을 기다렸다가 다음 틱만 계속 진행해야 합니다.
내가 잘 이해한다면 이것은 임의의 문제이며 재현할 수 없습니까?
m_Trade 선언 뒤에 다음 줄을 추가하여 더 많은 디버그 정보를 인쇄할 수 있습니다.
m_Trade.LogLevel(LOG_LEVEL_ALL);
이것은 가능한 설명처럼 보이지만, 만약 그렇다면 정상이 아닙니다. 비동기 모드를 사용하고 있습니까? 그렇지 않은 경우 EA는 서버의 응답을 기다렸다가 다음 틱만 계속 진행해야 합니다.
내가 잘 이해한다면 이것은 임의의 문제이며 재현할 수 없습니까?
m_Trade 선언 뒤에 다음 줄을 추가하여 더 많은 디버그 정보를 인쇄할 수 있습니다.
나는 cTrade 클래스를 사용하고 있습니다. 비동기 모드는 기본적으로 켜져 있습니까?
이 m_Trade.SetAsyncMode(false);
이것을 on_init() 안에 설정해야 합니까?
나는 cTrade 클래스를 사용하고 있습니다. 비동기 모드는 기본적으로 켜져 있습니까?
이 m_Trade.SetAsyncMode(false);
이것을 on_init() 안에 설정해야 합니까?
일반적으로 기본적으로 false입니다. 그리고 사용 중인 코드는 false여야 합니다.
당신이보고 한 것은 "흥미로운"것입니다. 제 생각에는 정상적인 행동이 아니며 어딘가에 버그가있는 것 같습니다. 오류를 재현하기 위해 샘플 코드를 게시할 수 있습니까? 어쨌든 이 문제에 대해 조사하겠습니다.
- www.mql5.com
조사에 도움을 주셔서 감사합니다. EA를 개발할 때 사용한 템플릿을 첨부하겠습니다. Sleep()은 이전에 100ms에 있었고 다른 사용자가 시작한 스레드를 읽은 후 방금 800으로 업데이트했습니다.
//+------------------------------------------------------------------+ //| Template.mq5 | //| doshur | //| http://tradeaud.blogspot.com | //+------------------------------------------------------------------+ #property copyright "doshur" #property link "http://tradeaud.blogspot.com" #property version "1.00" #include <Trade\Trade.mqh> #define ErrCnt 5 //--- Input Parameters input int TP = 50 ; input int SL = 40 ; input double LotSize = 0.01 ; //--- Buffers double MA_Fast[]; double MA_Slow[]; //--- Handles int h_MA_Fast; int h_MA_Slow; //--- Globals double AdjPoints; CTrade m_Trade; //+------------------------------------------------------------------+ //| Expert initialization function | //+------------------------------------------------------------------+ int OnInit () { //--- h_MA_Fast = iDEMA ( Symbol (), 0 , 3 , 0 , PRICE_CLOSE ); h_MA_Slow = iDEMA ( Symbol (), 0 , 5 , 0 , PRICE_CLOSE ); //--- long SymDigits; double SymPoints; SymPoints = SymbolInfoDouble ( Symbol (), SYMBOL_POINT ); SymDigits = SymbolInfoInteger ( Symbol (), SYMBOL_DIGITS ); if (SymDigits == 3 || SymDigits == 5 ) { AdjPoints = SymPoints * 10 ; } else { AdjPoints = SymPoints; } //--- return ( INIT_SUCCEEDED ); } //+------------------------------------------------------------------+ //| Expert deinitialization function | //+------------------------------------------------------------------+ void OnDeinit ( const int reason) { //--- IndicatorRelease (h_MA_Fast); IndicatorRelease (h_MA_Slow); //--- } //+------------------------------------------------------------------+ //| Expert tick function | //+------------------------------------------------------------------+ void OnTick () { //--- if (!CopyBufferAsSeries(h_MA_Fast, 0 , 0 , 3 , true , MA_Fast)) return ; if (!CopyBufferAsSeries(h_MA_Slow, 0 , 0 , 3 , true , MA_Slow)) return ; //--- double Price; ulong SymSpread; int ErrorCount; ErrorCount = 0 ; SymSpread = SymbolInfoInteger ( Symbol (), SYMBOL_SPREAD ); m_Trade.SetDeviationInPoints(SymSpread); MqlDateTime sTime; TimeCurrent (sTime); //--- if (! PositionSelect ( Symbol ())) if (TradeCount( PERIOD_CURRENT ) == 0 ) { // Open BUY Position if (MA_Fast[ 0 ] > MA_Slow[ 0 ] && MA_Fast[ 1 ] < MA_Slow[ 1 ]) { // { do { Price = SymbolInfoDouble ( Symbol (), SYMBOL_ASK ); if (m_Trade.PositionOpen( Symbol (), ORDER_TYPE_BUY , LotSize, Price, 0 , 0 )) { Print ( "Position opened in " , Symbol ()); Sleep ( 800 ); break ; } else { ErrorCount++; Print ( "Error opening BUY position in " , Symbol (), " - " , m_Trade.ResultComment(), "\n" , "Return Code Desc - " , m_Trade.ResultRetcodeDescription()); } if (ErrorCount == ErrCnt) { Print ( "Error count = " , ErrCnt); } } while (ErrorCount < ErrCnt); } } // Open SELL Position if (MA_Fast[ 0 ] < MA_Slow[ 0 ] && MA_Fast[ 1 ] > MA_Slow[ 1 ]) { // { do { Price = SymbolInfoDouble ( Symbol (), SYMBOL_BID ); if (m_Trade.PositionOpen( Symbol (), ORDER_TYPE_SELL , LotSize, Price, 0 , 0 )) { Print ( "Position opened in " , Symbol ()); Sleep ( 800 ); break ; } else { ErrorCount++; Print ( "Error opening SELL position in " , Symbol (), " - " , m_Trade.ResultComment(), "\n" , "Return Code Desc - " , m_Trade.ResultRetcodeDescription()); } if (ErrorCount == ErrCnt) { Print ( "Error count = " , ErrCnt); } } while (ErrorCount < ErrCnt); } } } //--- long Pos_OT, Pos_HT; double Pos_OP; if ( PositionSelect ( Symbol ())) { Pos_OT = PositionGetInteger ( POSITION_TIME ); Pos_HT = TimeCurrent () - Pos_OT; Pos_OP = PositionGetDouble ( POSITION_PRICE_OPEN ); Price = PositionGetDouble ( POSITION_PRICE_CURRENT ); if ( PositionGetInteger ( POSITION_TYPE ) == POSITION_TYPE_BUY ) { // Take Profit if (Price - Pos_OP >= TP * AdjPoints) { m_Trade.PositionClose( Symbol (), SymSpread); Sleep ( 800 ); } // Stop Loss if (Pos_OP - Price >= SL * AdjPoints) { m_Trade.PositionClose( Symbol (), SymSpread); Sleep ( 800 ); } } if ( PositionGetInteger ( POSITION_TYPE ) == POSITION_TYPE_SELL ) { // Take Profit if (Pos_OP - Price >= TP * AdjPoints) { m_Trade.PositionClose( Symbol (), SymSpread); Sleep ( 800 ); } // Stop Loss if (Price - Pos_OP >= SL * AdjPoints) { m_Trade.PositionClose( Symbol (), SymSpread); Sleep ( 800 ); } } } //--- } //+------------------------------------------------------------------+ //| Tester function | //+------------------------------------------------------------------+ double OnTester () { //--- //--- } //+------------------------------------------------------------------+ //| Copy Buffer As Series | //+------------------------------------------------------------------+ bool CopyBufferAsSeries( int handle, int buffer, int start, int number, bool asSeries, double &M[]) { //--- if ( CopyBuffer (handle, buffer, start, number, M) <= 0 ) return ( false ); ArraySetAsSeries (M, asSeries); return ( true ); //--- } //+------------------------------------------------------------------+ //| Trade Count | //+------------------------------------------------------------------+ int TradeCount( ENUM_TIMEFRAMES TimeFrame) { //--- int Cnt; ulong Ticket; long EntryType; datetime DT[ 1 ]; Cnt = 0 ; if ( CopyTime ( Symbol (), TimeFrame, 0 , 1 , DT) <= 0 ) { Cnt = - 1 ; } else { HistorySelect (DT[ 0 ], TimeCurrent ()); for ( int i = HistoryDealsTotal () - 1 ; i >= 0 ; i--) { Ticket = HistoryDealGetTicket (i); EntryType = HistoryDealGetInteger (Ticket, DEAL_ENTRY ); if (EntryType == DEAL_ENTRY_IN ) if ( Symbol () == HistoryDealGetString (Ticket, DEAL_SYMBOL )) { Cnt++; } } } //--- return (Cnt); }
나는 같은 문제가 있었고 xxxx를 사용하는 사람을 기억합니다.
그 스레드를 찾을 수 없었습니다. 누군가가 저를 도울 수 있다면 큰 감사가 될 것입니다.
On_Tick()에서 다음과 같은 내 코드
0.01 로트를 입력해야 하지만 대신 0.02 로트를 입력합니다.
저널에서
2013.12.20 08:35:01 거래 '800****': 거래 #27731692 1.36354에서 0.01 EURUSD 구매 완료( 주문 #40018327 기준)
2013.12.20 08:35:01 거래 '800****': 331ms 후 실행을 위해 배치된 시장에서 0.01 EURUSD 교환 구매
2013.12.20 08:35:01 거래 '800****': 거래 #27731691 1.36353에서 0.01 EURUSD 구매 완료(주문 #40018326 기준)
2013.12.20 08:35:00 거래 '800****': 시장에서 0.01 EURUSD 교환 구매
2013.12.20 08:35:00 거래 '800****': 313ms 후 실행을 위해 배치된 시장에서 0.01 EURUSD 교환 구매
2013.12.20 08:35:00 거래 '800****': 시장에서 0.01 EURUSD 교환 구매