순환 연산자 'for' 질문 - 페이지 4

 

사이먼,

좋아, 좋은 측정을 위해 EA에 스톱 레벨을 추가해 보겠습니다.

아하! USDJPY의 동결 레벨 은 0이고 스탑 레벨은 30입니다.

브로커가 5자리이기 때문에 30은 3을 나타내는 것으로 가정합니다. MODE_SPREAD를 사용하여 20을 받았습니다. 분명히 USDJPY의 스프레드는 20이 아니라 ;) 2.0입니다. 2핍은 20포인트에 해당한다고도 할 수 있습니다.

고맙습니다.

 

당신을 위한 단서. . . .

 

사이먼,

이번에도 선정순 문제인 것 같습니다.

OrderClose() 함수가 USDJPY 주문이 아닌 주문을 마감하려고 합니다. EURUSD 차트 에서 주문을 마감하려고 합니다.

OrderPrint() 함수는 이전에 실행 전에 선택되었으며 의도한 목적과 명확하게 유사합니다.

유효하지 않은 가격에 동그라미 친 붉은 색은 WRONG을 나타내야 합니다.

USDJPY를 둘러싼 녹색은 RIGHT를 표시해야 합니다.

따라서 모두 true이면 OrderClose() 함수를 실행하기 전에 빨간색 원에 초점을 맞추고 주문을 선택해야 합니다.

고맙습니다.

 
WhooDoo22 :


입찰 및 질문은 무엇입니까?

Ask는 현재 기호에 대해 알려진 최신 판매자 가격(매도 가격)입니다.

Bid는 현재 기호의 가장 최근에 알려진 구매자 가격(제안 가격, 입찰 가격)입니다.

닫기가 실패한 이유를 이미 알고 있습니다. . . . 잠시만 신중히 생각하십시오.


코드를 보십시오. 주문을 마감하는 데 사용하는 가격은 무엇입니까?

 

사이먼,

Ask/Bid는 현재 기호에 대한 가장 최근에 알려진 판매자/구매자의 가격입니다.

EA가 주문을 마감하고자 하는 가격은 EURUSD 기호 가격입니다.

EA가 주문을 마감하기 위해 USDJPY 차트에 배치되는 데 의존하는 이유는 무엇입니까? OrderSelect() 함수 는 티켓 번호를 선택하기 위한 것이며 티켓 번호가 선택되면 EA는 다음을 선택할 수 있습니다.

분명히 EA는 USDJPY 기호 차트에 있어야 주문을 마감할 수 있습니다.


내가 방금 말한 모든 것을 긁으십시오.

이것이 해결책입니다. 오류는 세 번째 매개변수 내에 있습니다. 나는 기호를 지정하고 그 매개변수(OrderClose() 함수의 위치 3번째 매개변수) 내에 Ask/bid 변수를 배치하는 것을 고려하고 있습니다. 이것은 생각에서 모든 모호함을 제거해야 합니다.

고맙습니다.

 
WhooDoo22 : .

이것이 해결책입니다. 오류는 세 번째 매개변수 내에 있습니다. 나는 기호를 지정하고 그 매개변수(OrderClose() 함수의 위치 3번째 매개변수) 내에 Ask/bid 변수를 배치하는 것을 고려하고 있습니다. 이것은 생각에서 모든 모호함을 제거해야 합니다.

고맙습니다.

BidAsk사전 정의된 변수 이며 EA가 있는 현재 차트 에만 관련됩니다. EA가 있는 차트와 다른 기호에 대해 Bid 또는 Ask를 원하는 경우 Bid 및 Ask 사전 정의된 변수를 사용할 수 없습니다. 하지만 MarketInfo()를 사용할 수 있습니다 ;-)
 

사이먼,

오류는 OrderClose() 함수 의 세 번째 매개변수 내에 있습니다. 왜냐하면 ;) Ask/Bid가 현재 기호에 대한 가장 최근에 알려진 판매자/구매자의 가격이기 때문입니다. "현재 기호" 가 EA가 배치된 현재 차트를 의미하는 경우 약간 혼란스러울 수 있습니다. MQL4는 한동안 사용되었으며 고유한 일러스트레이션 및 표현 방법이 있음을 기억해야 합니다.

솔루션은 Ask/Bid 미리 정의된 변수를 다음과 같은 대안으로 대체하는 것입니다.

 // solution 1.

MarketInfo( "USDJPY" ,MODE_BID);

// solution 2.

MarketInfo( "USDJPY" ,MODE_ASK);

이에 대해 뭐라고 합니까?


USDJPY 주문 정보를 인쇄할 수 있는 기능이 있는 이 EA 버전을 추가했습니다. USDJPY 주문 SL 및 TP를 아직 수정했는지 여부는 아직 확인하지 않았지만 확인되면 확인하겠습니다. EA는 해결하기 어려운 마녀가 아닌 최종 오류를 생성합니다. 현재 이 작업을 하고 있습니다. 다음은 오류 판독의 스냅샷입니다.

잘못된 티켓 오류

고맙습니다.

 
WhooDoo22 :

사이먼,

오류는 OrderClose() 함수의 세 번째 매개변수 내에 있습니다. 왜냐하면 ;) Ask/Bid가 현재 기호에 대한 가장 최근에 알려진 판매자/구매자의 가격이기 때문입니다. "현재 기호" 가 EA가 배치된 현재 차트를 의미하는 경우 약간 혼란스러울 수 있습니다. MQL4는 한동안 사용되었으며 고유한 일러스트레이션 및 표현 방법이 있음을 기억해야 합니다.

솔루션은 Ask/Bid 미리 정의된 변수를 다음과 같은 대안으로 대체하는 것입니다.

이에 대해 뭐라고 합니까?


USDJPY 주문 정보를 인쇄할 수 있는 기능이 있는 이 EA 버전을 추가했습니다. USDJPY 주문 SL 및 TP를 아직 수정했는지 여부는 아직 확인하지 않았지만 확인되면 확인하겠습니다. EA는 해결하기 어려운 마녀가 아닌 최종 오류를 생성합니다. 현재 이 작업을 하고 있습니다. 다음은 오류 판독의 스냅샷입니다.


고맙습니다.

이제 코드의 한계를 알 수 있습니다. . . 더 이상 USDJPY 주문이 없으므로 동안은 위치 0에서 주문을 찾고 USDJPY가 아닙니다. 그런 다음 1에서 다음 주문을 찾고 USDJPY가 아닌 다음 위치 2를 보고 OrderSelect()가 실패하면 동안이 종료됩니다. 그러나 나머지 코드가 실행되면 실패한 OrderModify(), 실패한 OrderPrint(), 실패한 OrderType() 및 실패한 OrderClose()가 발생합니다. . . GetLastError()가 자체적으로 수행하는 작업은 무엇입니까?
 

사이먼,

순환 'while' 연산자는 다음과 같이 수행됩니다. 표현식이 true이면 표현식이 false가 될 때까지 연산자가 실행됩니다. 표현식이 거짓이면 제어는 다음 연산자에게 넘어갑니다.

아래 SRC 상자에 있는 코드의 목적은 다음을 수행하는 것입니다.

변수 'i'( OrderSelect() 함수 내에 포함)가 USDJPY 티켓 포지션 번호가 아니고 주문 기호가 USDJPY가 아닌 동안, 변수 'i'가 USDJPY 티켓 포지션 번호이고 주문 기호가 USDJPY 가 될 때까지 변수 'i'가 증가합니다. 'while' 주기가 false가 되면 제어가 다음 코드 줄 아래로 전달됩니다.

시각 자료를 위해 'while' 헤더와 본문을 제공했습니다.

 while ( OrderSelect (i,SELECT_BY_POS,MODE_TRADES)== true && OrderSymbol()!= "USDJPY" )

i++;

티켓이 현재 통화 쌍에 있지 않아도 '동안' 주기가 USDJPY 통화 쌍에서 티켓을 찾는 방법을 이해하고 있다고 생각하지만 ;) 저는 유감입니다.

USDJPY 차트에 찾을 주문이 없는 경우 'while' 주기가 USDJPY 차트에서 티켓을 어떻게 찾을 수 있습니까?

나는 당신이 위치 0에서 주문을 찾는 라인을 따라 무언가를 썼다고 생각합니다 . 이것에 대해 설명하거나 연구를 위한 링크를 제공할 수 있습니까?

고맙습니다.

 
WhooDoo22 :


현재 통화 쌍에 티켓이 없는 경우에도 '동안' 주기가 USDJPY 통화 쌍에서 티켓을 찾는 방법을 이해하고 있다고 생각하지만 ;) 그렇지 않습니다.

USDJPY 차트에 찾을 주문이 없는 경우 'while' 주기가 USDJPY 차트에서 티켓을 어떻게 찾을 수 있습니까?

나는 당신이 위치 0에서 주문을 찾는 라인을 따라 무언가를 썼다고 생각합니다 . 이것에 대해 설명하거나 연구를 위한 링크를 제공할 수 있습니까?

스스로 코드를 작성하려면 3명의 작업을 수행해야 합니다. 어쩌면 4명일 수도 있습니다. 요구 사항 문서의 초안을 작성하는 사람, 소프트웨어 엔지니어 및 테스트 엔지니어. 구문을 거꾸로 알고 코드를 작성할 수 있는 것만으로는 충분하지 않습니다. . . 해결하려는 문제와 해결 방법을 이해하고 코드가 요구 사항을 충족하는지 확인하기 위해 코드를 테스트하는 방법 도 알아야 합니다.

기본 수준에서 이것은 코드를 한 줄씩 살펴보고 원하는 작업을 수행하는지 확인하는 것을 의미합니다. 일반적으로 이는 최소값에서 일반 값을 거쳐 최대값으로 이동하는 각 변수의 값 범위를 사용하는 것입니다.


while 루프를 사용하여 이 작업을 수행할 수 있습니다. . .

값을 설정하지 않고 int 변수를 선언하면 시작 값이 0 이므로 i 를 선언할 때(더 설명적인 변수 이름을 사용하지 않는 이유는 무엇입니까?) 값이 0 이므로 처음에는 while을 반올림합니다. 루프 i 는 0이므로 OrderSelect()가 작동하는 경우 위치 0 에서 주문을 선택하려고 시도합니다. OrderSymbol() 호출은 위치 0에서 주문에 대한 올바른 기호 이름을 반환하고 "USDJPY"가 아니면 표현식 ( OrderSymbol() != "USDJPY" )는 OrderSelect()가 true 이고 기호 검사가 true , truetrue = true 이고 다음 코드 라인(이는 while 루프 내에 있음)인 경우 true 값이 됩니다. 실행됩니다.

이제 i 는 1이고 OrderSelect()는 위치 1에서 주문을 선택하므로 true 값이 반환되고 기호 검사는 USDJPY 기호를 찾지 않으므로 true 를 반환하고 다시 true 를 반환하고 true = true 를 반환하므로 i++가 다시 실행됩니다.

이제 i 는 2이고
OrderSelect()는 위치 2에서 Order를 선택하려고 시도하지만 실패합니다. . . 위치 0과 1에 2개의 주문만 열려 있으므로 OrderSelect()는 false 를 반환하고 OrderSymbol()은 무엇을 합니까? 유효한 주문이 선택되지 않았습니다. . . 그러나 이상한 이유로 true 를 반환하더라도 OrderSelect()는 이미 false , falsetrue = false 를 반환했습니다. . . while 루프가 종료되고 i 가 2로 설정됩니다.

이제 i 값이 2 라는 것을 염두에 두고 나머지 코드를 살펴보십시오. . .