#130 stoploss 오류는 더 이상 나타나지 않습니다. 마지막 단계가 마침내 문제를 파악한 것처럼 보였습니다. 이 후에 취한 모든 단계를 요약하여 다른 게시물을 게시하겠습니다. 따라서 오류 #130과 싸우는 포럼의 다른 사람들은 이 스레드를 참조로 사용할 수 있습니다.
일반 팁 오류 방지를 위한 가장 중요한 기술은 과도한 로깅입니다. 원격으로 오류에 연결할 수 있는 모든 항목을 출력합니다. 켜고 끌 수 있는 로그 기능을 정의하면 문제를 해결한 후에도 코드를 유지할 수 있습니다. 전문 고문을 초기화할 때 MarketInfo에서 알려줄 수 있는 모든 정보를 기록해야 합니다. https://docs.mql4.com/constants/marketinfo 또한 항상 함수의 반환 값을 확인하십시오(예: OrderModify의 경우):
시장 환율 변경 또 다른 가능한 원인은 틱이 Expert Advisor(EA)를 활성화하고 EA OrderSend() 또는 OrderModify()가 실행된 사이에 시장 환율이 변경되었기 때문입니다. 이 문제를 방지하기 위해 두 가지 가능한 솔루션이 있습니다. 첫 번째는 Ask 및 Bid와 같은 사전 정의된 시장 변수를 사용하기 전에 RefreshRates()를 사용하는 것입니다. (이 변수는 틱이 EA를 활성화할 때 값을 얻습니다) 두 번째는 미리 정의된 시장 변수를 전혀 사용하지 않는 것입니다. 대신 MarketInfo()를 사용하여 현재 시장 가치를 사용할 수 있습니다. Ask 대신 Bid 및 Point 사용
MarketInfo ( Symbol (), MODE_ASK)
MarketInfo ( Symbol (), MODE_BID)
MarketInfo ( Symbol (), MODE_POINT)
확산 손절매 또는 이익실현이 진입 가격에 너무 가까우면 주문이 거부됩니다. 이 문제를 피하려면 Ask와 Bid 사이의 현재 스프레드를 고려해야 합니다. 다시 두 가지 솔루션이 있습니다. 첫 번째는 스프레드를 계산하고 손절매/이익 실현에 더하거나 빼는 것입니다.
정지 레벨 브로커는 특정 정지 수준이 있습니다. 손절매가 해당 수준보다 낮으면 주문이 거부됩니다. MarketInfo(Symbol(), MODE_STOPLEVEL)로 스톱 레벨을 확인할 수 있습니다. 이를 방지하려면 브로커의 정지 수준에 대해 손절매를 확인하고 필요한 경우 조정하십시오.
double stoplevel = MarketInfo ( Symbol (), MODE_STOPLEVEL);
if (stoploss < stoplevel)
stoploss = stoplevel + 1 ;
동결 수준 동결 수준도 비슷한 개념입니다. 손절매는 또한 브로커의 동결 수준보다 커야 합니다. MarketInfo(Symbol(), MODE_FREEZELEVEL)로 동결 수준을 확인할 수 있습니다. 이를 방지하려면 브로커의 동결 수준에 대해 손절매를 다시 확인하십시오.
double freezelevel = MarketInfo ( Symbol (), MODE_FREEZELEVEL);
if (stoploss < freezelevel)
stoploss = freezelevel + 1 ;
틱사이즈 마지막으로 귀하의 손절매 또는 이익실현은 거부될 수 있습니다. 왜냐하면 Symbol은 틱 크기와 일치하는 손절매/이익실현만 지원하기 때문입니다. ticksize는 심볼의 상품이 위아래로 움직일 수 있는 최소 거리입니다. 예를 들어 가격이 1000이고 ticksize가 0.25이면 가격은 0.25의 배수(0.25 * n, 여기서 n은 자연수)만큼만 오르거나 내릴 수 있습니다. 따라서 가격은 0.25에서 1000.25로 올라가거나 1.75에서 998.25로 내려갈 수 있습니다. ticksize를 설명하려면 double 값을 특정 단계 값(예: 가장 가까운 0.25)으로 반올림하는 함수가 필요합니다. 다음은 그러한 기능입니다.
double DoubleRound( double number, double step)
{
double mod = MathMod (number, step);
if (mod < step/ 2.0 )
step = 0 ;
double rounded = number - mod + step;
return (rounded);
}
예를 들어 숫자 = 1023.81234이고 단계 = 0.25인 DoubleRound를 호출하면 1023.75가 반환됩니다. 1023.967834로 호출하면 1024.00이 반환됩니다. 이제 손절매나 이익실현을 보내기 전에 다음을 사용하여 기호의 눈금 크기로 반올림하십시오.
stoploss = (stoploss, MarketInfo ( Symbol (), MODE_TICKSIZE));
takeprofit = (takeprofit, MarketInfo ( Symbol (), MODE_TICKSIZE));
MODE_TICKSIZE(0.25) 대신 MODE_TICKVALUE(12.50)를 사용하여 DoubleRound 함수 를 호출했습니다.
고쳤지만 #130이 사라지지 않았습니다.
업데이트된 DoubleRound 라인의 오류 로그는 다음과 같습니다.
비교를 위해 다음은 작동한 로그입니다.
어쨌든 이제는 더 자주 작동하는 것 같고 확실히 가까워지고 있습니다. :)
어쨌든 이제는 더 자주 작동하는 것 같고 확실히 가까워지고 있습니다. :)
수정이 실패한 이유를 알 수 없습니다. . . OrderSend와 OrderModify 사이에 새로운 Bid/Ask를 받고 있습니까?
내가 지금 제안할 수 있는 것은 오류가 발생했을 때 130 이라는 것입니다. . . 모든 것을 새로 인쇄, Bid, Ask(MarketInfo 사용), OOP, StopLevel, 설정하려는 SL 등
MODE_TICKSIZE(0.25) 대신 MODE_TICKVALUE(12.50)를 사용하여 DoubleRound 함수를 호출했습니다.
#130 stoploss 오류는 더 이상 나타나지 않습니다. 마지막 단계가 마침내 문제를 파악한 것처럼 보였습니다.
이 후에 취한 모든 단계를 요약하여 다른 게시물을 게시하겠습니다. 따라서 오류 #130과 싸우는 포럼의 다른 사람들은 이 스레드를 참조로 사용할 수 있습니다.
지속적인 도움에 감사드립니다 :).
시노비
지속적인 도움에 감사드립니다 :).
시노비
오류 방지를 위한 가장 중요한 기술은 과도한 로깅입니다. 원격으로 오류에 연결할 수 있는 모든 항목을 출력합니다. 켜고 끌 수 있는 로그 기능을 정의하면 문제를 해결한 후에도 코드를 유지할 수 있습니다.
전문 고문을 초기화할 때 MarketInfo에서 알려줄 수 있는 모든 정보를 기록해야 합니다. https://docs.mql4.com/constants/marketinfo
또한 항상 함수의 반환 값을 확인하십시오(예: OrderModify의 경우):
ECN 브로커는 매수/매도 및 손절매/이익 실현에 대해 별도의 주문을 해야 합니다. 따라서 다음과 같이 코드를 두 가지 순서로 분할해야 합니다.
판매 주문의 경우 OP_BUY를 OP_SELL로 바꿔야 합니다. 또한 OrderSelect 및 OrderModify의 반환 값을 확인해야 합니다(위의 일반 팁 참조).
일부 중개인은 손절매, 이익 실현 및 슬리피지를 4/5 자리로 조정하도록 요구합니다. init() 함수(thx WHRoeder)에 다음 코드를 넣으면 됩니다.
그런 다음 브로커에게 보내기 전에 pips2db1로 손절매, 이익실현 및 슬리피지를 곱해야 합니다.
또 다른 가능한 원인은 틱이 Expert Advisor(EA)를 활성화하고 EA OrderSend() 또는 OrderModify()가 실행된 사이에 시장 환율이 변경되었기 때문입니다. 이 문제를 방지하기 위해 두 가지 가능한 솔루션이 있습니다.
첫 번째는 Ask 및 Bid와 같은 사전 정의된 시장 변수를 사용하기 전에 RefreshRates()를 사용하는 것입니다. (이 변수는 틱이 EA를 활성화할 때 값을 얻습니다)
두 번째는 미리 정의된 시장 변수를 전혀 사용하지 않는 것입니다. 대신 MarketInfo()를 사용하여 현재 시장 가치를 사용할 수 있습니다. Ask 대신 Bid 및 Point 사용
손절매 또는 이익실현이 진입 가격에 너무 가까우면 주문이 거부됩니다. 이 문제를 피하려면 Ask와 Bid 사이의 현재 스프레드를 고려해야 합니다. 다시 두 가지 솔루션이 있습니다.
첫 번째는 스프레드를 계산하고 손절매/이익 실현에 더하거나 빼는 것입니다.
손절매 또는 이익실현을 계산할 때 Ask 및 Bid를 사용하여 스프레드를 암시적으로 고려하는 두 번째 솔루션:
브로커는 특정 정지 수준이 있습니다. 손절매가 해당 수준보다 낮으면 주문이 거부됩니다. MarketInfo(Symbol(), MODE_STOPLEVEL)로 스톱 레벨을 확인할 수 있습니다.
이를 방지하려면 브로커의 정지 수준에 대해 손절매를 확인하고 필요한 경우 조정하십시오.
동결 수준도 비슷한 개념입니다. 손절매는 또한 브로커의 동결 수준보다 커야 합니다. MarketInfo(Symbol(), MODE_FREEZELEVEL)로 동결 수준을 확인할 수 있습니다.
이를 방지하려면 브로커의 동결 수준에 대해 손절매를 다시 확인하십시오.
마지막으로 귀하의 손절매 또는 이익실현은 거부될 수 있습니다. 왜냐하면 Symbol은 틱 크기와 일치하는 손절매/이익실현만 지원하기 때문입니다. ticksize는 심볼의 상품이 위아래로 움직일 수 있는 최소 거리입니다. 예를 들어 가격이 1000이고 ticksize가 0.25이면 가격은 0.25의 배수(0.25 * n, 여기서 n은 자연수)만큼만 오르거나 내릴 수 있습니다. 따라서 가격은 0.25에서 1000.25로 올라가거나 1.75에서 998.25로 내려갈 수 있습니다.
ticksize를 설명하려면 double 값을 특정 단계 값(예: 가장 가까운 0.25)으로 반올림하는 함수가 필요합니다. 다음은 그러한 기능입니다.
예를 들어 숫자 = 1023.81234이고 단계 = 0.25인 DoubleRound를 호출하면 1023.75가 반환됩니다. 1023.967834로 호출하면 1024.00이 반환됩니다.
이제 손절매나 이익실현을 보내기 전에 다음을 사용하여 기호의 눈금 크기로 반올림하십시오.
다음은 위의 모든 대응 조치를 고려한 완전한 작은 예입니다.
#130을 제거하는 데 도움이 되길 바랍니다. 코드 수정이 작동하지 않으면 먼저 위와 같은 최소한의 예제를 사용하십시오. 그런 다음 오류가 사라지면 변경된 내용이 코드에 적용됩니다.
행운을 빕니다,
시노비
오류를 제거하고 이 참조를 통합하는 데 도움을 준 Raptor, WHRoeder, SDC, BigAl, gjol 및 35806에 감사드립니다.