MQL4 및 MQL5에 대한 초보자 질문, 알고리즘 및 코드에 대한 도움말 및 토론 - 페이지 1386

 
Mikhail Mishanin :

미소) 해서는 안 된다)

전투가 정상적인 스프레드로 거래하는 것이라면 입력에 "한도"를 입력하고 스프레드가 한도를 초과하면 거래를 무시하십시오.

롤오버 없이도 거래를 통해 스프레드를 늘릴 수 있습니다.

내 스프레드는 10 단위에서 45 단위로 꽤 많이 떠 있습니다.

화면 45 까지 기다려야 합니다.

동시에 이 함수는 평균 17을 고려하므로 상당히 만족스럽습니다.

롤오버 후 1시간 후에 100-140으로 상승합니다. 코드를 실행하고 추가 동작을 확인합니다.

 
Vitaly Muzichenko :

그러나 다음과 같이 작성할 수 있습니다.

제대로 작동해야 할 것 같습니다.

나는 이런 논리가 싫다.

함수에 대한 첫 번째 항목:

res = 0 ;

따라서 조건

 if (dt.hour== 22 && res<_sp)

완료되지 않았습니다.

그리고 나서 무언가를 탐구하려는 욕구가 없습니다. 왜 그런 조건입니까?

   if (tc> LONG_MAX - 1 )
일반적으로 전체 논리가 명확하지 않습니다.
 
Alexey Viktorov :

나는 이런 논리가 싫다.

함수에 대한 첫 번째 항목:

res = 0 ;

따라서 조건

 if (dt.hour== 22 && res<_sp)

완료되지 않았습니다.

그리고 나서 무언가를 탐구하려는 욕구가 없습니다. 왜 그런 조건입니까?

   if (tc> LONG_MAX - 1 )
일반적으로 전체 논리가 명확하지 않습니다.

1. 이 조건은 시간이 22시간인 경우 롤오버 후 1시간 동안만 적용됩니다. 그러나 이것은 처음 시작할 때만 가능하며 터미널은 항상 어드바이저와 함께 작동하므로 한 번 비어 있음을 의미합니다.

아마도 시간 프레임이 변경되는 경우에도 정적으로 선언해야 합니다.

2. if(tc> LONG_MAX -1) = 긴 한계가 범위를 벗어나면 tc 변수 를 재설정합니다. 예를 들어 같은 주말에 터미널에 과부하가 걸리는 경우가 있기 때문에 이런 일은 일어나지 않을 것입니다.

---

코드가 변경되었습니다. 아마도 최종일 것입니다.

 void OnTick ()
{
 int sp = SymbolInfoInteger ( Symbol (), SYMBOL_SPREAD );
   if (CheckSpr(sp)) {
       // Здесь код отправки
   }
}

//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
MqlDateTime dt;
bool CheckSpr( int _sp)
{
   static int ts= 0 ;
   static ulong tc= 0 ;
   static int res= 0 ;
   TimeGMT (dt);
   if (res<_sp && ( dt.hour== 22 ||dt.hour== 23 )) { // Если 2 часа после Rollover спред упадёт до нормального - торгуем
       Comment ( "Rollover: Спред: " ,_sp, ", Средний: " ,res, ", Тиков: " ,tc);
       return ( false );
   }
   tc++;
   ts += _sp;
   res =ts/tc;
   if (tc< 500 ) {
       Comment ( "Тиков менее 500: " ,tc, ", Спред: " ,_sp, ", Средний: " ,res);
       return ( false );
   }
   if (res>_sp) {
       Comment ( "Торгуем: Спред: " ,_sp, ", Средний: " ,res, ", Тиков: " ,tc);
       return ( true );
   }
   Comment ( "Не торгуем - спред завышен: Спред: " ,_sp, ", Средний: " ,res, ", Тиков: " ,tc);
   return ( false );
}

PS 나는 그것을 테스트에 넣었다

추신 _ 코드 수정

----

추신 _ _ 에스 _ 에스 _ 롤오버 후 1시간을 더 추가했습니다. 그렇지 않으면 일부 거래 데스크에 매우 높은 스프레드를 썼습니다.

최종 버전은 20시간 동안 작업했고 결과는 괜찮습니다.

평균 일일 스프레드 10-45pp, 그러나 대부분 10-17, 평균은 19로 계산됨

참여해 주셔서 감사합니다. 추가할 사항이 있으면 작성해 주세요!

 
Vitaly Muzichenko :

아마도 시간 프레임이 변경되는 경우에도 정적으로 선언해야 합니다.

나는 그것에 들어갔다. 그것은 작동해야 할 것 같다. 나는 그것을 되돌려서는 안 된다), 이제 당신은 정말로 제로화/할당의 순간을 처리해야 한다.

 

포럼에서 토론을 보았지만 찾을 수 없습니다.

언제든지 열 수 있는 바의 한 위치로 자신을 제한해야 합니다. 이제 이 옵션이 제공되지만 제 생각에는 "무거운" 것입니다.

 if ( Bars ( Symbol (), PERIOD_CURRENT , Buy.LastOpenTime, TimeCurrent ())== 0 ) return ; // Открывать не более 1 на баре

더 쉽게 하기 위해 무엇을 대체할 수 있습니까?

 
Vitaly Muzichenko :

포럼에서 토론을 보았지만 찾을 수 없습니다.

언제든지 열 수 있는 바의 한 위치로 자신을 제한해야 합니다. 이제 이 옵션이 제공되지만 제 생각에는 "무거운" 것입니다.

더 쉽게 하기 위해 무엇을 대체할 수 있습니까?

"언제든지 열 수 있는 바의 한 위치로 우리 자신을 제한해야 합니다..."

너무 일반적인 표현은 이 기호의 막대당 한 번씩 OrderSend 를 보낼 수 있음을 의미합니다.

 
Mikhail Mishanin :

"언제든지 열 수 있는 바의 한 위치로 우리 자신을 제한해야 합니다..."

너무 일반적인 표현은 이 기호의 막대당 한 번씩 OrderSend 를 보낼 수 있음을 의미합니다.

네. EA는 H1 시간에 작동하며 10:17에 위치를 열 수 있습니다. 11:00 이전에 완료되어야 합니다. 즉, 현재 막대에서 더 이상 열리지 않습니다.

 
Vitaly Muzichenko :

네. EA는 H1 시간에 작동하며 10:17에 위치를 열 수 있습니다. 11:00 이전에 완료되어야 합니다. 즉, 현재 막대에서 더 이상 열리지 않습니다.

eprst, 다시 내 생각에 완전한 조건은 아닙니다. "악마는 세부 사항에 있습니다"라는 텍스트가 있으면 간단한 방법으로

포지션 개설 - "금지 플래그" 설정 및/또는 "시간" 저장

새로운 바가 열렸습니다 - "금지 플래그"를 제거했습니다 ...

질문: 위치가 어떻게든 변경되면 어떻게 됩니까?

H1 - 3600.0의 경우 새 막대를 정의하는 방법의 예 - doTB 제수(초)

BARii[].time - M1이 있는 막대의 시간, 임의의 간격이 있을 수 있으며 1보다 크거나 같으면 다른 "막대"의 "시간"을 의미합니다.

 if ( MathFloor (BARii[ 0 ].time/doTB)- MathFloor (BARii[ 1 ].time/doTB)>= 1.0 ) //если бар закрылся
Совершение сделок - Торговые операции - Справка по MetaTrader 5
Совершение сделок - Торговые операции - Справка по MetaTrader 5
  • www.metatrader5.com
Торговая деятельность в платформе связана с формированием и отсылкой рыночных и отложенных ордеров для исполнения брокером, а также с управлением...
 
Mikhail Mishanin :

eprst, 다시 내 생각에 완전한 조건은 아닙니다. "악마는 세부 사항에 있습니다"라는 텍스트가 있으면 간단한 방법으로

포지션 개설 - "금지 플래그" 설정 및/또는 "시간" 저장

새로운 바가 열렸습니다 - "금지 플래그"를 제거했습니다 ...

질문: 위치가 어떻게든 변경되면 어떻게 됩니까?

H1 - 3600.0의 경우 새 막대를 정의하는 방법의 예 - doTB 제수(초)

BARii[].time - M1이 있는 막대의 시간, 임의의 간격이 있을 수 있으며 1보다 크거나 같으면 다른 "막대"의 "시간"을 의미합니다.

어째서인지 플래그의 옵션이 당시 저에게 어울리지 않아 기억이 나지 않지만 다음으로 대체했습니다.

 if ( Bars ( Symbol (), PERIOD_CURRENT , Buy.LastOpenTime, TimeCurrent ())== 0 ) return ; // Открывать не более 1 на баре

알겠습니다. 다른 구현에 대해 생각하겠습니다.

 
Vitaly Muzichenko :

어째서인지 플래그의 옵션이 당시 저에게 어울리지 않아 기억이 나지 않지만 다음으로 대체했습니다.

알겠습니다. 다른 구현에 대해 생각하겠습니다.

그리고 이 구현보다 속도가 느려지나요? 마찬가지로 내 코드는 하나의 "막대" 또는 다른 막대에서 두 번 정의합니다. 다른 "막대"에 있을 때 내 버전이 "true"이고, 한 막대에 있을 때 "true" 버전에서 비교 ==를 "0", 특히 정수로 무시하고 조건을 다음으로 대체할 수 있습니다. > 0.0 또는 > 0.9, 생각해야 합니다...