코딩하는 방법? - 페이지 304

 

...

1. 일반적으로. 아니요, 이동 평균이 "안정화"되는 데 필요한 것보다 훨씬 더 많은 막대가 있기 때문에 확인할 필요가 없습니다. 오래된 버그는 아니지만 히스토리에 막대가 몇 개나 있는지 간단하게 확인하는 것입니다.

2. 네. iClose()(비슷한 iOpen(), iHigh() 및 iLow())는 함수인 반면 Close[],Open,High[],Low[]는 훨씬 빠른 값에 액세스할 수 있으므로 액세스하는 배열 의 속도와 단순성보다 함수의 유연성이 정말로 필요한 경우 가중치를 부여해야 합니다.

zzz:
안녕하세요, 저는 프로그래밍에 익숙하지 않지만 거래에 익숙하지 않습니다. 한동안 아무 것도 게시하지 않았고 지금은 EA 개발을 시작한 이후로 많은 질문이 있습니다. 먼저 지표를 만드는 것부터 시작했고, 내가 원하는 대로 되면 더 나아가겠습니다. 찾을 수 있는 모든 설명서를 읽었으므로 이제 코딩을 진행할 차례입니다.

죄송합니다. 잘못된 스레드라면 그런 질문을 어디에 게시해야 하는지 알려주세요.

지금 당장은 2가지, 아마도 기본적인 질문이 있습니다.

1. MA를 사용하는 많은 지표에서 차트에 막대가 몇 개인지 확인하는 선이 표시됩니다. 따라서 MA200이 필요하고 차트에 예를 들어 100개의 막대만 있는 경우 iMA200이 작동합니까? 내 생각에 그렇습니다. 확인했는데 차트에 문제 없이 모든 MA가 그려지므로 이것은 Metaquotes가 지금 수정한 오래된 버그라고 생각합니다. 그렇다면 MA를 그리거나 iMA 기능을 사용하기 위해 차트에 막대가 몇 개 있는지 확인하는 포인트가 있습니까?

2. 닫기와 iClose의 차이점은 무엇입니까? 내가 이해하는 바에 따르면 Close는 현재 차트의 막대 종가만 반환할 수 있고 iClose는 모든 통화 쌍 및 기간의 종가를 반환할 수 있습니다. 그리고 두 경우 모두 마지막으로 닫힌 막대를 얻으려면 인덱스 [1]을 사용해야 합니다. 내가 보고 있는 것이 맞습니까?

고맙습니다.
 

MT4용 DoubleStochastic, 실제 DoubleStochastic

안녕하세요 여러분 - 새로운 MT4 사용자입니다.

MT4에 대한 DoubleStochastic 지표를 찾는 데 어려움을 겪고 있습니다. VTT 플랫폼에서 내가 가장 좋아하는 지표였습니다. 원래 DoubleStochastic과 완전히 다른 표시를 제공하는 Bressert Double Stochastic 이 아니라 REAL DoubleStochastic을 의미합니다. 첨부 파일 참조 - VTT의 Double은 MT4의 Double과 약간 다른 표시를 제공합니다.

VTT'2 DoubleStochastic을 MT4로 코딩하는 데 도움을 줄 수 있는 사람이 있습니까? 다음은 VTT 코드 및 논리입니다.

빠른 %K = ((오늘 종가 - %K 기간의 최저 저점) / (%K 기간의 최고 고가 - %K 기간의 최저 저가)) * 100

감속 %K = 빠른 %K의 N 기간 이동 평균

Double %K = ((오늘의 감속 %K - %K 기간의 최저 감속 %K) / (%K 기간의 최고 최고 감속 %K - %K 기간의 최저 최저 감속 %K)) * 100

Double 감속 %K = Double %K의 N 기간 이동 평균

%D = 두 배 감속 %K의 3기간 단순 이동 평균

그리고 코드 자체:

St:= Mov(((C-LLV(L,K))/(HHV(H,K)-LLV(L,K)))*100,S1,Mt);

DSt:= Mov(((St-LLV(St,K))/(HHV(St,K)-LLV(St,K)))*100,Sl,Mt);

DStD:= 이동(DSt,D,MtD);

MT4에 능통하신 분 계신가요?

VTT 버전에 너무 익숙해져서 다른 버전은 사용할 수 없습니다.

 

...

지메일

여기에 이중 확률론 게시: https://www.mql5.com/en/forum/177239/page28 (모든 버전의 확률론을 한 곳에서 유지하기 위해)

나는 그것이 당신이 찾고있는 것이라고 생각합니다.

gmailer:
안녕하세요 여러분 - 새로운 MT4 사용자입니다.

MT4에 대한 DoubleStochastic 지표를 찾는 데 어려움을 겪고 있습니다. VTT 플랫폼에서 내가 가장 좋아하는 지표였습니다. 원래 DoubleStochastic과 완전히 다른 표시를 제공하는 Bressert Double Stochastic이 아니라 REAL DoubleStochastic을 의미합니다. 첨부 파일 참조 - VTT의 Double은 MT4의 Double과 약간 다른 표시를 제공합니다.

VTT'2 DoubleStochastic을 MT4로 코딩하는 데 도움을 줄 수 있는 사람이 있습니까? VTT 코드와 로직은 다음과 같습니다.

빠른 %K = ((오늘 종가 - %K 기간의 최저 저점) / (%K 기간의 최고 고가 - %K 기간의 최저 저가)) * 100

감속 %K = 빠른 %K의 N 기간 이동 평균

Double %K = ((오늘의 감속 %K - %K 기간의 최저 감속 %K) / (%K 기간의 최고 최고 감속 %K - %K 기간의 최저 최저 감속 %K)) * 100

두 배 감속 %K = 두 배 %K의 N 기간 이동 평균

%D = 두 배 감속 %K의 3기간 단순 이동 평균

그리고 코드 자체:

St:= Mov(((C-LLV(L,K))/(HHV(H,K)-LLV(L,K)))*100,S1,Mt);

DSt:= Mov(((St-LLV(St,K))/(HHV(St,K)-LLV(St,K)))*100,Sl,Mt);

DStD:= 이동(DSt,D,MtD);

MT4에 능통하신 분 계신가요?

VTT 버전에 너무 익숙해져서 다른 버전은 사용할 수 없습니다.
 

^ 감사합니다 - 그럴 수도 있습니다. 하의와 상의에 있는 "녹색 및 분홍색 점"을 제거하는 방법을 알고 있습니까?

 

감사합니다. 말이 되는군요.

 

안녕 모두,

스토캐스틱 라인이 과매도(80) 또는 과매도(20) 영역 내에서 교차할 때 거래를 트리거하는 방법을 찾기 위해 고군분투하고 있습니다. 내 라인이 교차할 때 거래를 트리거할 수 있지만 과매도 또는 과매도 영역에 있을 때만 거래를 촉발하도록 설정할 수 없습니다. 이 작업을 수행하는 방법에 대해 아는 사람이 있습니까? 아니면 참조할 수 있는 다른 곳이 있습니까?

일부 값을 20.1 및 80.1로 설정하는 것에 대해 언급했지만 그 이상은 아닌 일부 사이트를 발견했습니다.

빛을 비출 수 있도록 도와주세요. 감사해요.

문안 인사

테런스

 

...

테렌스,

다음은 필요한 예제로 사용할 수 있는 실용적인 코드가 있는 스레드입니다. https://www.mql5.com/en/forum/179114

tkuan77:
안녕 모두,

스토캐스틱 라인이 과매도(80) 또는 과매도(20) 영역 내에서 교차할 때 거래를 트리거하는 방법을 찾기 위해 고군분투하고 있습니다. 내 라인이 교차할 때 거래를 트리거할 수 있지만 과매도 또는 과매도 영역에 있을 때만 거래를 촉발하도록 설정할 수 없습니다. 이 작업을 수행하는 방법에 대해 아는 사람이 있습니까? 아니면 참조할 수 있는 다른 곳이 있습니까?

일부 값을 20.1 및 80.1로 설정하는 것에 대해 언급했지만 그 이상은 아닌 일부 사이트를 발견했습니다.

빛을 비출 수 있도록 도와주세요. 감사해요.

문안 인사

테런스
 

안녕하세요, 저는 기능을 수정했고 지금은 만족합니다. 좋아 보인다. 그러나 백테스트 할 때 거래 결과 로그에는 1개의 구매 주문만 포함됩니다. 제 GetLots 기능과 관련이 있는 것 같지만 여러 번 살펴보았음에도 100%는 아닙니다. 이 기능을 살펴보고 잘못된 부분을 발견하면 알려주시겠습니까? 감사해요.

//--- 롱 포지션 랏 계산 함수

이중 GetLotsLong(int LowRisk, int HighRisk, 이중 SLDistanceLong, int LastOpenTicket, int LastTicket)

{

새로 고침 비율();

이중 MinLots, MaxLots, LotStep;

int LotDigit = 2;

이중 LotLong = 0;

MinLots = NormalizeDouble(MarketInfo(Symbol(), MODE_MINLOT), 2); // LotStep을 수용하려면 로트를 정규화해야 합니다.

MaxLots = NormalizeDouble(MarketInfo(Symbol(), MODE_MAXLOT), 2); // 정규화는 반올림하지 않지만 LotStep보다 큰 로트 부분을 자릅니다.

LotStep = NormalizeDouble(MarketInfo(Symbol(), MODE_LOTSTEP), 2); // 그렇게 하면 위험이 약간 줄어듭니다.

if (MarketInfo(Symbol(), MODE_DIGITS) == 3 || MarketInfo(Symbol(), MODE_DIGITS) == 5) SLDistanceLong *= 10.0;

if (LotStep == 1.00) LotDigit = 0;

if (LotStep == 0.10) LotDigit = 1;

if (LotStep == 0.01) LotDigit = 2;

if (GetWinLossPreviousLong (LastOpenTicket, LastTicket, WinLossPreviousLong) == "W")

{

if (AccountBalance() > AccountFreeMargin())

LotLong = NormalizeDouble(AccountFreeMargin() * (HighRisk / 100) / (SLDistanceLong * MarketInfo(Symbol(), MODE_TICKVALUE)), LotDigit);

else LotLong = NormalizeDouble(AccountBalance() * (HighRisk / 100) / (SLDistanceLong * MarketInfo(Symbol(), MODE_TICKVALUE)), LotDigit);

}

LotLong = NormalizeDouble(NormalizeDouble(LotsLong / LotStep, 0) * LotStep, LotDigit);

LotLong = MathMax(MathMin(LotsLong, MaxLots), MinLots);

반환(LotsLong);

if (GetWinLossPreviousLong (LastOpenTicket, LastTicket, WinLossPreviousLong) == "L")

{

if (AccountBalance() > AccountFreeMargin())

LotLong = NormalizeDouble(AccountFreeMargin() * (LowRisk / 100) / (SLDistanceLong * MarketInfo(Symbol(), MODE_TICKVALUE)), LotDigit);

else lotLong = NormalizeDouble(AccountBalance() * (LowRisk / 100) / (SLDistanceLong * MarketInfo(Symbol(), MODE_TICKVALUE)), LotDigit);

}

LotLong = NormalizeDouble(NormalizeDouble(LotsLong / LotStep, 0) * LotStep, LotDigit);

LotLong = MathMax(MathMin(LotsLong, MaxLots), MinLots);

반환(LotsLong);

}

 

...

내가 게시한 형식의 GetLots()는 테스트를 거쳐 정상적으로 작동합니다. 변경할 필요가 없습니다. 오픈 오더의 순간에 로트 사이즈를 결정하는 기능으로 사용합니다. 논리의 나머지 부분은 제외합니다(해당 기능은 다음 작업만 수행해야 함: 위험, 손절매 및 현재 계정 상태에 따라 주문 크기 찾기)

나머지 코드가 없으면 나는 당신을 도울 수 없습니다. 마치 작은 구멍을 뚫고 세상 전체를 볼 수 있는 것 같았습니다. 불가능한. 나머지 코드를 비밀로 유지하려면 여기에 게시한 코드만 있으면 됩니다. 다시 반복하겠습니다. 원래 형식의 GetLots()가 제대로 작동하고 원래 형식으로 사용해야 합니다. 형태.

가변 결과와 함께 사용하려면 위험 또는 손절매 피드를 동적으로 변경하십시오(GetLots() 이전에 코드에서 위험 또는 손절매를 "결정"한 다음 변경된 위험 또는 손절매로 호출하십시오. - 함수는 지정된 경고 입력에 대해 올바르게 계산함) 함수의 코드를 변경할 필요가 없습니다.

crsnape@btinternet.com:
안녕하세요, 저는 기능을 수정했고 지금은 만족합니다. 좋아 보인다. 그러나 백테스트할 때 거래 결과 로그에는 1개의 구매 주문만 포함됩니다. 제 GetLots 기능과 관련이 있는 것 같지만 여러 번 살펴보았지만 100%는 아닙니다. 이 기능을 살펴보고 잘못된 부분을 발견하면 알려주시겠습니까? 감사해요.

//--- 롱 포지션 랏 계산 함수

이중 GetLotsLong(int LowRisk, int HighRisk, 이중 SLDistanceLong, int LastOpenTicket, int LastTicket)

{

새로 고침 비율();

이중 MinLots, MaxLots, LotStep;

int LotDigit = 2;

이중 LotLong = 0;

MinLots = NormalizeDouble(MarketInfo(Symbol(), MODE_MINLOT), 2); // LotStep을 수용하려면 로트를 정규화해야 합니다.

MaxLots = NormalizeDouble(MarketInfo(Symbol(), MODE_MAXLOT), 2); // 정규화는 반올림하지 않지만 LotStep보다 큰 로트 부분을 자릅니다.

LotStep = NormalizeDouble(MarketInfo(Symbol(), MODE_LOTSTEP), 2); // 그렇게 하면 위험이 약간 줄어듭니다.

if (MarketInfo(Symbol(), MODE_DIGITS) == 3 || MarketInfo(Symbol(), MODE_DIGITS) == 5) SLDistanceLong *= 10.0;

if (LotStep == 1.00) LotDigit = 0;

if (LotStep == 0.10) LotDigit = 1;

if (LotStep == 0.01) LotDigit = 2;

if (GetWinLossPreviousLong (LastOpenTicket, LastTicket, WinLossPreviousLong) == "W")

{

if (AccountBalance() > AccountFreeMargin())

LotLong = NormalizeDouble(AccountFreeMargin() * (HighRisk / 100) / (SLDistanceLong * MarketInfo(Symbol(), MODE_TICKVALUE)), LotDigit);

else LotLong = NormalizeDouble(AccountBalance() * (HighRisk / 100) / (SLDistanceLong * MarketInfo(Symbol(), MODE_TICKVALUE)), LotDigit);

}

LotLong = NormalizeDouble(NormalizeDouble(LotsLong / LotStep, 0) * LotStep, LotDigit);

LotLong = MathMax(MathMin(LotsLong, MaxLots), MinLots);

반환(LotsLong);

if (GetWinLossPreviousLong (LastOpenTicket, LastTicket, WinLossPreviousLong) == "L")

{

if (AccountBalance() > AccountFreeMargin())

LotLong = NormalizeDouble(AccountFreeMargin() * (LowRisk / 100) / (SLDistanceLong * MarketInfo(Symbol(), MODE_TICKVALUE)), LotDigit);

else lotLong = NormalizeDouble(AccountBalance() * (LowRisk / 100) / (SLDistanceLong * MarketInfo(Symbol(), MODE_TICKVALUE)), LotDigit);

}

LotLong = NormalizeDouble(NormalizeDouble(LotsLong / LotStep, 0) * LotStep, LotDigit);

LotLong = MathMax(MathMin(LotsLong, MaxLots), MinLots);

반환(LotsLong);

}
 

안녕하세요 mladen 전적으로 동의합니다. 제공한 GetLots 기능 이 제대로 작동합니다. 내 코드의 일부로 테스트했으며 작동했습니다.

나는 승패에 따라 위험 요소를 변경하고 싶기 때문에 단순히 변경했습니다. 나는 기본적으로 추가 자금 관리 규칙을 통합하는 기존 코드(또는 어쨌든 시도)에 대해 자세히 설명했습니다.

내 코드는 비밀이 아니라고 솔직히 말할 수 있습니다. 나는 많은 다른 사람들이 내가 하려고 하는 것을 고려하고 코드로 구현했다고 확신합니다. 하지만 개인적으로 너무 많은 시간을 들여 개발했기 때문에 프라이버시의 요소가 있다고 생각합니다.

나는 내 코드를 계속 검토할 것이고, 처음부터 배우고 일을 하는 것에 자부심을 느끼기 때문에 어떤 문제라도 스스로 시도하고 해결하고 싶습니다.

그러나 나는 당신의 마지막 단락을 이해합니다. 하나의 '위험' 변수를 사용하고 함수의 출력에 따라 이 위험을 변경할 것입니다.

어쨌든 다시 한 번 응답해 주셔서 감사합니다. 이 포럼은 솔직히 당신 없이는 똑같지 않을 것입니다. 당신은 나를 수없이 도와주었습니다.

건배 :-)