코딩 도움말 - 페이지 39

 

이 코드 줄을 작성했습니다.

int TriggerChart = PERIOD_H4;

정수 FastMACDPeriod = 12;

int SlowMACDPeriod = 26 ;

정수 SignalPeriod = 9;

MacdCurrent = iMACD(Symbol(), TriggerChart, FastMACDPeriod,SlowMACDPeriod,SignalPeriod, PRICE_CLOSE, MODE_MAIN, 1);

이러한 변수가 삽입된 상태에서 EA가 TriggerChart가 'int timeframe'이고 int 기간에 사용된 다른 것을 식별할 수 있는지 궁금합니다. 예를 들어 TriggerChart와 FastMACDPeriod가 모두 함께 있는 곳에서 보고 둘 다 int timeframe과 관련이 있다고 생각하고 혼동을 일으킬 수 있습니까? EA는 어떤 변수가 iMACD의 어느 부분에 적용되는지 어느 시점에서 인식합니까?

 

...

간단히 말해서 : 아니요, 혼란스러워 할 수 없습니다 (컴퓨터는 잘하고 생각하지 않지만 해석하지 않고 같은 일을 계속 반복합니다) 코더 만 때때로 혼란스러워합니다.

함수 를 호출할 때 특정 순서로 매개변수를 받습니다(예: 첫 번째 매개변수는 기호, 두 번째 매개변수는 시간 프레임 등). function : 매개변수 호출 목록의 위치에 따라 엄격하게 사용됩니다.

crsnape@btinternet.com:
이 코드 줄을 작성했습니다.

int TriggerChart = PERIOD_H4;

정수 FastMACDPeriod = 12;

int SlowMACDPeriod = 26 ;

정수 SignalPeriod = 9;

MacdCurrent = iMACD(Symbol(), TriggerChart, FastMACDPeriod,SlowMACDPeriod,SignalPeriod, PRICE_CLOSE, MODE_MAIN, 1);

이러한 변수가 삽입된 상태에서 EA가 TriggerChart가 'int timeframe'이고 int 기간에 사용된 다른 것을 식별할 수 있는지 궁금합니다. 예를 들어 TriggerChart와 FastMACDPeriod가 모두 함께 있는 곳에서 보고 둘 다 int timeframe과 관련이 있다고 생각하고 혼동을 일으킬 수 있습니까? EA는 어떤 변수가 iMACD의 어느 부분에 적용되는지 어느 시점에서 인식합니까?
 

감사합니다. 논리적으로 들립니다.

이 코드를 사용하여 int init() 함수 에서 BarsGV를 0으로 선언했습니다. 그러나 오류가 발생하면 올바르게 말했듯이 여전히 false를 반환합니다. int init()에서 0을 선언하는 대신 1로 재설정할 수 있다고 생각했습니다. 어떻게 생각하나요? 나는 200SMA를 가지고 있고 Bars가 200보다 작으면 어쨌든 여기서 오류가 발생합니다.

그래서 이것 대신에:

정수 초기화()

{

//---

GlobalVariableSet(BarsGV, 0);

//---

리턴(0);

}

이것은 INT START() 아래에 있습니다.

if ((GlobalVariableGet(BarsGV) == 0) || (GlobalVariableGet(BarsGV) < 막대))

{

GlobalVariableSet(HasOrderedGV, 거짓);

GlobalVariableSet(BarsGV, 막대);

}

//--- 롱포지션(BUY) 가능성 확인

if (GlobalVariableGet(HasOrderedGV) == false)

{

다음으로 변경:

정수 초기화()

{

//---

GlobalVariableSet(BarsGV, 1);

//---

리턴(0);

}

이것은 INT START() 아래에 있습니다.

if (GlobalVariableGet(BarsGV) == 0);

{

Print("전역 변수 BarsGV 오류", GetLastError());

리턴(0);

}

if (GlobalVariableGet(BarsGV) < 막대)

{

GlobalVariableSet(HasOrderedGV, 거짓);

GlobalVariableSet(BarsGV, 막대);

}

//--- 롱포지션(BUY) 가능성 확인

if (GlobalVariableGet(HasOrderedGV) == false)

{

어떻게 생각하나요?

 

...

다음과 같이 변경하십시오.

int BarsGV;

bool HasOrderedGV;

int init()

{

//---

BarsGV=0;

HasOrderedGV=false;

//---

return(0);

}

THIS IS UNDER INT START()

if (BarsGV < Bars)

{

HasOrderedGV=false;

BarsGV=Bars;

}

//--- Check for long position (BUY) possibility

if (HasOrderedGV == false)

{[/PHP]

That way you are going to avoid other EA interference and you will keep the variables to only one instance of Ea (they can not mix at all). Much better to do it that way (even from the speed of execution point of view). But you still risk of opening a new order on a same bar this way. The best way is to use a function to count orders opened at the current bar and then allow or disallow ner order opening

Here is a function that can do that (it will check currently opened as well as already closed orders if they have been opened on a current bar) :

bool uniqueOnBar(int MagicNumber)

{

datetime startTime = Time[0];

datetime endTime = startTime+60*Period();

for (int i=OrdersTotal()-1; i>=0; i--)

{

if (!OrderSelect(i,SELECT_BY_POS,MODE_TRADES)) continue;

if (OrderSymbol() != Symbol()) continue;

if (OrderMagicNumber() != MagicNumber) continue;

if (OrderOpenTime()endTime) continue;

return(false);

}

for (i=OrdersHistoryTotal()-1; i>=0; i--)

{

if (!OrderSelect(i,SELECT_BY_POS,MODE_HISTORY)) continue;

if (OrderSymbol() != Symbol()) continue;

if (OrderMagicNumber() != MagicNumber) continue;

if (OrderOpenTime()endTime) continue;

return(false);

}

return(true);

}

Checking would be very simple :

[PHP]if (uniqueOnBar(MagicNumber)) .... you can open an a new order

그렇게 하면 변수에 의존하지 않고 주문에만 의존하게 되며 이것이 유일하게 100% 신뢰할 수 있는 방법입니다.

crsnape@btinternet.com:
감사합니다. 논리적으로 들립니다.

이 코드를 사용하여 int init() 함수에서 BarsGV를 0으로 선언했습니다. 그러나 오류가 발생하면 올바르게 말했듯이 여전히 false를 반환합니다. int init()에서 0을 선언하는 대신 1로 재설정할 수 있다고 생각했습니다. 어떻게 생각하나요? 나는 200SMA를 가지고 있고 Bars가 200보다 작으면 어쨌든 여기서 오류가 발생합니다.

그래서 이것 대신:

정수 초기화()

{

//---

GlobalVariableSet(BarsGV, 0);

//---

리턴(0);

}

이것은 INT START() 아래에 있습니다.

if ((GlobalVariableGet(BarsGV) == 0) || (GlobalVariableGet(BarsGV) < 막대))

{

GlobalVariableSet(HasOrderedGV, 거짓);

GlobalVariableSet(BarsGV, 막대);

}

//--- 롱포지션(BUY) 가능성 확인

if (GlobalVariableGet(HasOrderedGV) == false)

{

다음으로 변경:

정수 초기화()

{

//---

GlobalVariableSet(BarsGV, 1);

//---

리턴(0);

}

이것은 INT START() 아래에 있습니다.

if (GlobalVariableGet(BarsGV) == 0);

{

Print("전역 변수 BarsGV 오류", GetLastError());

리턴(0);

}

if (GlobalVariableGet(BarsGV) < 막대)

{

GlobalVariableSet(HasOrderedGV, 거짓);

GlobalVariableSet(BarsGV, 막대);

}

//--- 롱포지션(BUY) 가능성 확인

if (GlobalVariableGet(HasOrderedGV) == false)

{

어떻게 생각하나요?
 

슈퍼스타. 감사해요.

 

안녕하세요 mladen님

이 부분:

날짜 시간 종료 시간 = 시작 시간 + 60 * 기간();

Is Period()는 이 인스턴스의 차트 타임프레임 입니다. EndTime은 초 단위로 기록되므로 H4(240) * 60이라고 하면 240분을 초로 변환하면 기간(240)의 분에 해당합니까?

내가 읽고 있는 것이 맞습니까?

다음과 같이 작성할 수도 있습니다.

날짜/시간 EndTime = (StartTime / 60) + Period();?

 

...

예, 당신은 그것을 올바르게 읽고 있습니다

다른 형식으로 : OrderOpenTime()이 표준 날짜/시간 형식이기 때문에 사용할 수 없습니다. 즉, EndTime에서는 1970년 1월 1일 이후 경과된 초 수와 작성한 방식에 분이 포함되어야 함을 의미합니다. - 메타 트레이더는 그것이 초라고 가정하고 모든 잘못된 결과를 줄 것입니다.

crsnape@btinternet.com:
안녕하세요 mladen님

이 부분:

날짜 시간 종료 시간 = 시작 시간 + 60 * 기간();

Is Period()는 이 인스턴스의 차트 기간입니다. EndTime은 초 단위로 기록되므로 H4(240) * 60이라고 하면 240분을 초로 변환하면 기간(240)의 분에 해당합니까?

내가 읽고 있는 것이 맞습니까?

다음과 같이 작성할 수도 있습니다.

날짜/시간 EndTime = (StartTime / 60) + Period();?
 

안녕 mladen, 여기 for 루프가 마지막으로 열렸거나 보류 중인 주문 을 선택합니까?

bool UniqueOnBar(int MagicNumber)

{

날짜 시간 시작 시간 = 시간[0];

datetime EndTime = StartTime + 60 * 기간(TriggerChart);

for (int i = OrdersTotal() - 1, i >= 0, i--)

{

if (!OrderSelect (i, SELECT_BY_POS, MODE_TRADES)) 계속;

if (OrderSymbol() != Symbol()) 계속;

if (OrderMagicNumber() != MagicNumber) 계속;

(OrderOpenTime() endTime) 계속하면;

반환(거짓);

}

따라서 느낌표가 'not'으로 해석되는 곳에서 내가 원하기 때문에 이것이 옳지 않다고 생각합니다.

- 가장 최근에 열렸거나 보류 중인 주문을 선택하려면 제거하십시오! OrderSelect를 떠나시겠습니까?

- OrderSymbol()은 Symbol()과 동일해야 합니다.

- OrderMagicNumber()는 MagicNumber와 같으므로... 다음과 같이 둡니다.

int TriggerChart = PERIOD_H4;

정수 MagicNumber = 42;

bool UniqueOnBar(int MagicNumber)

{

날짜 시간 시작 시간 = 시간[0];

datetime EndTime = StartTime + 60 * 기간( TriggerChart );

for (int i = OrdersTotal() - 1, i >= 0, i--)

{

if (OrderSelect (i, SELECT_BY_POS, MODE_TRADES)) 계속

if (OrderSymbol() == Symbol()) 계속;

if (OrderMagicNumber() == MagicNumber) 계속;

(OrderOpenTime() endTime) 계속하면;

반환(거짓);

}

 

내 감독은 표현식이 true를 반환할 때 현재 표시줄에서 열린 주문이 선택되지 않는다는 것을 깨달았습니다.

 

...

네, 그렇습니다. 따라서 tru를 반환하면 새 주문을 열 수 있습니다.

또한 대상 시간 프레임 현재 막대에서 주문이 열린 경우 현재 시간 프레임과 다른 시간 프레임을 테스트하려는 경우 기능을 다음과 같이 변경할 수 있습니다.

bool UniqueOnBar (int MagicNumber, int timeFrame=0)

{

if (timeFrame==0) timeFrame=Period();

datetime StartTime = iTime(NULL,timeFrame,0);

datetime EndTime = StartTime + 60*timeFrame;

for (int i=OrdersTotal()-1; i>=0; i--)

{

if (OrderSelect(i,SELECT_BY_POS,MODE_TRADES)) continue;

if (OrderSymbol() == Symbol()) continue;

if (OrderMagicNumber() == MagicNumber) continue;

if (OrderOpenTime() EndTime) continue;

return(false);

}

return(true);

}

[/PHP]

And then the call to it would be for your example 2 posts ago

[PHP]if (UniqueOnBar(MagicNumber,TriggerChart) ... open an order

추신: 예에서 마감된 주문 확인을 제거했습니다. 마감된 주문도 확인하려면 원래 형식의 두 번째 부분을 사용하십시오.

crsnape@btinternet.com:
내 감독은 표현식이 true를 반환할 때 현재 표시줄에서 열린 주문이 선택되지 않는다는 것을 깨달았습니다.