이 지표에서 이벤트를 수신하고 거래 작업을 시도하는 간단한 전문가 조언자를 만들었습니다 (여기서는 일부이며 전체 텍스트는 첨부 파일에 있습니다):
voidOnChartEvent(constint id, // 차트이벤트 이벤트 핸들러constlong &lparam,
constdouble &dparam,
conststring &sparam) // sparam에는 계측기 이름이 포함됩니다.
{
// 이벤트가 발생한 상품에 대한 숫자, 포인트, 매도, 매도호가를 요청합니다.if(!SymbolInfoInteger(sparam,SYMBOL_DIGITS,dig)) Print("SymbolInfoInteger(SYMBOL_DIGITS) ERROR!");
if(!SymbolInfoDouble(sparam,SYMBOL_POINT,p)) Print("SymbolInfoDouble(SYMBOL_POINT) ERROR!");
if(!SymbolInfoDouble(sparam,SYMBOL_BID,Bid)) Print("SymbolInfoDouble(SYMBOL_BID) ERROR!");
if(!SymbolInfoDouble(sparam,SYMBOL_ASK,Ask)) Print("SymbolInfoDouble(SYMBOL_ASK) ERROR!");
d=(int)dig;
if(1>0) // 우리는 항상 구매
{
q.action=TRADE_ACTION_DEAL; // MqlTradeRequest 구조를 채우고 거래 작업을 시도합니다.
q.symbol=sparam; // sparam에는 도구 이름이 포함됩니다.
q.volume=Lot;
q.price=NormalizeDouble(Ask,d);
q.sl=NormalizeDouble(Ask-p*StopLoss,d);
q.tp=NormalizeDouble(Ask+p*TakeProfit,d);
q.deviation=0;
q.type=ORDER_TYPE_BUY;
q.type_filling=ORDER_FILLING_FOK;
// 현재 도구 속성 확인Print("Bid=",DoubleToString(Bid,8),", Ask=",DoubleToString(Ask,8),", Digits=",d,", Points=",DoubleToString(p,8));
// 전송할 거래 요청의 구조를 확인합니다.Print("q.action=",q.action,", q.symbol=",q.symbol,", q.volume=",q.volume,", q.price=",DoubleToString(q.price,d),", q.sl=",DoubleToString(q.sl,d),", q.tp=",DoubleToString(q.tp,d),", q.deviation=",q.deviation,", q.type=",q.type,", q.type_filling=",q.type_filling);
Print(OrderCheck(q,ch)); // 거래 작업 수행 가능 여부 확인Print("ch.retcode=",ch.retcode,", ch.comment=",ch.comment); // 결과Print("OrderSend:",OrderSend(q,s)); // 거래 작업 시도Print("s.retcode=",s.retcode,", s.comment=",s.comment); // 결과
}
if(0>0) // 조건이 수정되면 판매합니다.
{
// аналогично для продажи
}
}
}
전문가 조언자는 지표에서 이벤트를 수신하지만 테스터에서 (시각화 유무에 관계없이) 거래 작업을 수행 할 수 없습니다 - "잘못된 요청"오류가 반환되고 코드 10013이 반환됩니다. 실시간에서는 정상적으로 작동합니다. Expert Advisor의 거래 작업이 OnChartEvent() 대신 OnTick()에서 수행되는 경우에도 정상적으로 작동합니다.
코드베이스의 기사 작성자가 제공 한 Expert Advisor 템플릿에 거래 요청 전송을 삽입했는데도 거래 작업이 작동하지 않습니다 (동일한 오류).
누구든지 이유가 무엇인지 알려주실 수 있나요? 이 스레드에서 온 차트 이벤트 ()가 테스터에서 처리되지 않는다는 것을 읽었지만이 경우 표시기가 보낸 이벤트는 테스터에서 처리되지만 테스터의 온 차트 이벤트 () 에서 거래 작업을 실행하는 것은 불가능합니다.
새 시세가 도착하면 이벤트를 보내는 간단한 "인디케이터 스파이" SendEvent.mq5를 만들었습니다:
이 지표에서 이벤트를 수신하고 거래 작업을 시도하는 간단한 전문가 조언자를 만들었습니다 (일부만 제공하고 전체 텍스트는 첨부 파일에 있습니다):
전문가 조언자는 지표에서 이벤트를 수신하지만 테스터 (시각화 유무에 관계없이)에서 거래 작업을 수행 할 수 없습니다 - "잘못된 요청"오류가 반환되고 코드 10013이 반환됩니다. 실시간에서는 정상적으로 작동합니다. 전문가용 어드바이저의 거래 작업이 OnChartEvent() 대신 OnTick()에서 수행되는 경우에도 정상적으로 작동합니다.
코드베이스의 글 작성자가 제공한 Expert Advisor 템플릿에 거래 요청 전송을 삽입했는데도 거래 작업이 작동하지 않습니다(동일한 오류).
누구든지 이유가 무엇인지 말해 줄 수 있습니까? 이 스레드에서 온 차트 이벤트 ()가 테스터에서 처리되지 않는다는 것을 읽었지만이 경우 표시기가 보낸 이벤트는 테스터에서 처리되지만 테스터의 온 차트 이벤트 () 에서 거래 작업을 실행하는 것은 불가능합니다.
내 물고기를 떠올려 보세요. 물론 논리는 완전하지 않고 매우 멍청하지만 필요한 것과 매우 유사한 것 같습니다.
적어도 시장의 포지션은 테스터와 데모 모두에서 열립니다.
이유를 모르겠지만 (너무 게으 르기 때문에 알아 내기에는 너무 게으르다), 귀하의 예제는 어떤 상황에서도 10013을 제공했습니다.
추신
표준 객체(예: CAccountInfo 및 CTrade)에 바인딩하는 것이 좋습니다. 그러나 모든 것을 직접 쓸 수있는 인내심이 있다면 나는 기뻐할 것입니다.
그건 그렇고, 스파이 자체의 구현은 기사에서 가져 오거나 수정 가능한 사본을 만드는 것이 좋습니다 (예를 들어, 올해 "(long)_Period" 를 이벤트 또는 기타 유용한 정보를 보내는 날짜 시간으로 대체하는 것이 좋습니다). 귀하의 변형은 어떻게 보면 상당히 "원시적"입니다.
EURUSD, EURGBP, GBPUSD 세 쌍의 가격을 얻으려고 합니다. 전략 테스터에서"모든 틱" 또는 "공개 가격만"을 선택하면 모든 것이 정상적으로 작동합니다. 그러나 "실제 틱을 기준으로 한 모든 틱"을 선택하면 어떤 이유로 한 상품에 대해 1 분 동안 여러 개의 "새 막대"이벤트가 발생할 수 있습니다.
반복하려면 예를 들어 2016.07.15부터 2016.07.19까지 간격을 선택할 수 있습니다. 다음은 예제 로그입니다. 7분, 9분째를 보세요:
EURUSD, EURGBP, GBPUSD 세 쌍의 가격을 얻으려고 합니다. 전략 테스터에서"모든 틱" 또는 "공개 가격만"을 선택하면 모든 것이 정상적으로 작동합니다. 그러나 "실제 틱을 기준으로 한 모든 틱"을 선택하면 어떤 이유로 한 상품에 대해 1 분 동안 여러 개의 "새 막대"이벤트가 발생할 수 있습니다.
반복하려면 예를 들어 2016.07.15부터 2016.07.19까지 간격을 선택할 수 있습니다. 다음은 예제 로그입니다. 7분, 9분째를 보세요:
"실제 틱을 기준으로 한 모든 틱" 모드를 선택할 때 이 동작이 발생하는 이유는 무엇인가요?
"새 막대" 이벤트는 어떻게 포착하나요? 1375 빌드에서는 틱 도착 정확도가 밀리초 단위로 개선되었습니다:
테스터: 시간에서 밀리초 정확도 지원이 추가되었습니다. 이전에는 전략 테스터에서 시간 퀀텀이 1초였습니다.
이제 전략 테스터에서 이벤트 설정 밀리초 타이머 및 절전 기능이 더 정확하게 작동합니다.
다중 통화 전문가 자문 테스트에서 틱 제출의 정확도가 향상되었습니다. 이전에는 1초 동안 여러 개의 틱이 배치된 경우(분 막대의 틱 볼륨이 60개 이상) 모두 같은 시간이 할당되었습니다. 단일 통화 전문가를 테스트할 때는 틱이 순차적으로 전문가에게 전달되기 때문에 크게 중요하지 않습니다. 그러나 여러 쌍을 테스트할 때는 어떤 쌍의 틱이 먼저 왔는지 아는 것이 중요합니다. 이전에는 각 심볼의 틱이 순차적으로 전문가에게 전송되었는데, 먼저 한 심볼의 모든 틱을 1초 동안 전송한 다음 다른 심볼의 모든 틱을 전송했습니다. 이제 밀리초를 고려하여 전송됩니다.
실제 틱에서 테스트할 때 밀리초는 원본 틱 데이터에서 가져옵니다. 틱을 생성할 때 밀리초는 틱 볼륨에 따라 표기됩니다. 예를 들어 1초에 3개의 틱이 있는 경우 000, 333, 666 밀리초가 할당됩니다.
알려주세요,
1. 다른 통화의 매수 및 매도만 필요한 경우 "스파이"를 사용하는 것이 공정한가요?
2. 그냥 생각인데, 현재 통화뿐만 아니라 다른 통화의 이벤트를 확인할 수 있는 onChartEvent 함수는 없나요?
3. onTimer 이벤트에서 타이머 값을 1보다 작게 설정하여 시세 값을 훨씬 더 자주 다운로드하고 그에 따라 마지막 틱의 시간보다 최소 시간만큼 지연되도록 설정할 수 있습니까?
4. 또는 제 경우 다른 그래프에서 매쉬의 교차점을 확인하기 위해 "CHARTEVENT_CUSTOM+n"을 사용할 수 있습니까?
1. 사용 중입니다.
2. 옵션이 있습니다. 다른 통화의 이벤트는 OnChartEvent()가 설정된 EA가 있는 차트로 보내야 합니다.
3. 하나는 최소입니다.
4. 할 수 있습니다.
새 호가가 도착하면 이벤트를 보내는 간단한 "스파이 인디케이터" SendEvent.mq5를 만들었습니다:
이 지표에서 이벤트를 수신하고 거래 작업을 시도하는 간단한 전문가 조언자를 만들었습니다 (여기서는 일부이며 전체 텍스트는 첨부 파일에 있습니다):
전문가 조언자는 지표에서 이벤트를 수신하지만 테스터에서 (시각화 유무에 관계없이) 거래 작업을 수행 할 수 없습니다 - "잘못된 요청"오류가 반환되고 코드 10013이 반환됩니다. 실시간에서는 정상적으로 작동합니다. Expert Advisor의 거래 작업이 OnChartEvent() 대신 OnTick()에서 수행되는 경우에도 정상적으로 작동합니다.
코드베이스의 기사 작성자가 제공 한 Expert Advisor 템플릿에 거래 요청 전송을 삽입했는데도 거래 작업이 작동하지 않습니다 (동일한 오류).
누구든지 이유가 무엇인지 알려주실 수 있나요? 이 스레드에서 온 차트 이벤트 ()가 테스터에서 처리되지 않는다는 것을 읽었지만이 경우 표시기가 보낸 이벤트는 테스터에서 처리되지만 테스터의 온 차트 이벤트 () 에서 거래 작업을 실행하는 것은 불가능합니다.
새 시세가 도착하면 이벤트를 보내는 간단한 "인디케이터 스파이" SendEvent.mq5를 만들었습니다:
이 지표에서 이벤트를 수신하고 거래 작업을 시도하는 간단한 전문가 조언자를 만들었습니다 (일부만 제공하고 전체 텍스트는 첨부 파일에 있습니다):
전문가 조언자는 지표에서 이벤트를 수신하지만 테스터 (시각화 유무에 관계없이)에서 거래 작업을 수행 할 수 없습니다 - "잘못된 요청"오류가 반환되고 코드 10013이 반환됩니다. 실시간에서는 정상적으로 작동합니다. 전문가용 어드바이저의 거래 작업이 OnChartEvent() 대신 OnTick()에서 수행되는 경우에도 정상적으로 작동합니다.
코드베이스의 글 작성자가 제공한 Expert Advisor 템플릿에 거래 요청 전송을 삽입했는데도 거래 작업이 작동하지 않습니다(동일한 오류).
누구든지 이유가 무엇인지 말해 줄 수 있습니까? 이 스레드에서 온 차트 이벤트 ()가 테스터에서 처리되지 않는다는 것을 읽었지만이 경우 표시기가 보낸 이벤트는 테스터에서 처리되지만 테스터의 온 차트 이벤트 () 에서 거래 작업을 실행하는 것은 불가능합니다.
내 물고기를 떠올려 보세요. 물론 논리는 완전하지 않고 매우 멍청하지만 필요한 것과 매우 유사한 것 같습니다.
적어도 시장의 포지션은 테스터와 데모 모두에서 열립니다.
이유를 모르겠지만 (너무 게으 르기 때문에 알아 내기에는 너무 게으르다), 귀하의 예제는 어떤 상황에서도 10013을 제공했습니다.
추신
표준 객체(예: CAccountInfo 및 CTrade)에 바인딩하는 것이 좋습니다. 그러나 모든 것을 직접 쓸 수있는 인내심이 있다면 나는 기뻐할 것입니다.
그건 그렇고, 스파이 자체의 구현은 기사에서 가져 오거나 수정 가능한 사본을 만드는 것이 좋습니다 (예를 들어, 올해 "(long)_Period" 를 이벤트 또는 기타 유용한 정보를 보내는 날짜 시간으로 대체하는 것이 좋습니다). 귀하의 변형은 어떻게 보면 상당히 "원시적"입니다.
제 물고기를 작동시킬 수 있는지 보세요. 논리가 불완전하고 매우 모호하지만 필요한 것과 매우 유사한 것 같습니다.
EURUSD, EURGBP, GBPUSD 세 쌍의 가격을 얻으려고 합니다. 전략 테스터에서"모든 틱" 또는 "공개 가격만"을 선택하면 모든 것이 정상적으로 작동합니다. 그러나 "실제 틱을 기준으로 한 모든 틱"을 선택하면 어떤 이유로 한 상품에 대해 1 분 동안 여러 개의 "새 막대"이벤트가 발생할 수 있습니다.
반복하려면 예를 들어 2016.07.15부터 2016.07.19까지 간격을 선택할 수 있습니다. 다음은 예제 로그입니다. 7분, 9분째를 보세요:
2016.07.15 00:05:00 > -> id=2: EURGBP CHARTEVENT_NEWBAR_M1 price=0.8333
2016.07.15 00:05:00 > -> id=0: EURUSD CHARTEVENT_NEWBAR_M1 price=1.1119
2016.07.15 00:05:00 > -> id=1: GBPUSD CHARTEVENT_NEWBAR_M1 price=1.33399
2016.07.15 00:06:00 > -> id=2: EURGBP CHARTEVENT_NEWBAR_M1 price=0.8334
2016.07.15 00:06:00 > -> id=0: EURUSD CHARTEVENT_NEWBAR_M1 price=1.1119
2016.07.15 00:06:00 > -> id=1: GBPUSD CHARTEVENT_NEWBAR_M1 price=1.33394
2016.07.15 00:07:19 > -> id=2: EURGBP CHARTEVENT_NEWBAR_M1 price=0.8333700000000001
2016.07.15 00:07:19 > -> id=0: EURUSD CHARTEVENT_NEWBAR_M1 price=1.11174
2016.07.15 00:07:19 > -> id=1: GBPUSD CHARTEVENT_NEWBAR_M1 price=1.33382
2016.07.15 00:07:19 > -> id=2: EURGBP CHARTEVENT_NEWBAR_M1 price=0.8333700000000001
2016.07.15 00:07:19 > -> id=0: EURUSD CHARTEVENT_NEWBAR_M1 price=1.11174
2016.07.15 00:07:19 > -> id=1: GBPUSD CHARTEVENT_NEWBAR_M1 price=1.33381
2016.07.15 00:07:19 > -> id=2: EURGBP CHARTEVENT_NEWBAR_M1 price=0.8333700000000001
2016.07.15 00:07:19 > -> id=0: EURUSD CHARTEVENT_NEWBAR_M1 price=1.11174
2016.07.15 00:07:19 > -> id=1: GBPUSD CHARTEVENT_NEWBAR_M1 price=1.33384
2016.07.15 00:08:00 > -> id=2: EURGBP CHARTEVENT_NEWBAR_M1 price=0.83329
2016.07.15 00:08:00 > -> id=0: EURUSD CHARTEVENT_NEWBAR_M1 price=1.11167
2016.07.15 00:08:00 > -> id=1: GBPUSD CHARTEVENT_NEWBAR_M1 price=1.33394
2016.07.15 00:09:00 > -> id=2: EURGBP CHARTEVENT_NEWBAR_M1 price=0.83327
2016.07.15 00:09:00 > -> id=0: EURUSD CHARTEVENT_NEWBAR_M1 price=1.11166
2016.07.15 00:09:00 > -> id=1: GBPUSD CHARTEVENT_NEWBAR_M1 price=1.33396
2016.07.15 00:09:00 > -> id=2: EURGBP CHARTEVENT_NEWBAR_M1 price=0.83327
2016.07.15 00:09:00 > -> id=0: EURUSD CHARTEVENT_NEWBAR_M1 price=1.11166
EURUSD, EURGBP, GBPUSD 세 쌍의 가격을 얻으려고 합니다. 전략 테스터에서"모든 틱" 또는 "공개 가격만"을 선택하면 모든 것이 정상적으로 작동합니다. 그러나 "실제 틱을 기준으로 한 모든 틱"을 선택하면 어떤 이유로 한 상품에 대해 1 분 동안 여러 개의 "새 막대"이벤트가 발생할 수 있습니다.
반복하려면 예를 들어 2016.07.15부터 2016.07.19까지 간격을 선택할 수 있습니다. 다음은 예제 로그입니다. 7분, 9분째를 보세요:
"실제 틱을 기준으로 한 모든 틱" 모드를 선택할 때 이 동작이 발생하는 이유는 무엇인가요?"새 막대" 이벤트는 어떻게 포착하나요? 1375 빌드에서는 틱 도착 정확도가 밀리초 단위로 개선되었습니다:
테스터: 시간에서 밀리초 정확도 지원이 추가되었습니다. 이전에는 전략 테스터에서 시간 퀀텀이 1초였습니다.
실제 틱에서 테스트할 때 밀리초는 원본 틱 데이터에서 가져옵니다. 틱을 생성할 때 밀리초는 틱 볼륨에 따라 표기됩니다. 예를 들어 1초에 3개의 틱이 있는 경우 000, 333, 666 밀리초가 할당됩니다.
나는 기사에 쓰여진 방식대로새 막대를 잡습니다. 즉, 표시기는 이러한 방식으로 "새 막대" 이벤트를 전송합니다(이전 시간 분, 시간, 일, 월과 비교):
double price_current=price[rates_total-1];
TimeCurrent(time);
if(prev_calculated==0)
{
EventCustom(CHARTEVENT_INIT,price_current);
prev_time=time;
return(rates_total);
}
//--- new tick
if((flag_event & CHARTEVENT_TICK)!=0) EventCustom(CHARTEVENT_TICK,price_current);
//--- check change time
if(time.min==prev_time.min &&
time.hour==prev_time.hour &&
time.day==prev_time.day &&
time.mon==prev_time.mon) return(rates_total);
//--- new minute
if((flag_event & CHARTEVENT_NEWBAR_M1)!=0) EventCustom(CHARTEVENT_NEWBAR_M1,price_current);
업데이트: 빌드 1375를 설치할 때 이 문제가 해결되었습니다.
이 방대한 기사를 작성해 주셔서 감사합니다. 이벤트차트커스텀에 대해 들어본 적이 없습니다. 다른 차트 이벤트를 시도해 보았지만 사람의 행동으로 인한 이벤트만 고려했습니다. 많은 것을 해결해줍니다.
그건 그렇고, 저는 MQL4에서 작업하는데 98 %가 똑같았습니다.
Cheers
정말 유용한 정보입니다. 수고하셨습니다!