시장이 언제 문을 닫는지 어떻게 알 수 있습니까? (mql4) - 페이지 2

[삭제]  
Alexey :

int Weekday = TimeDayOfWeek ( TimeLocal ());                                                          //Локальное время  |
int Weekdays = TimeDayOfWeek ( TimeCurrent ());                                                       //Серверное время  |

while ( IsExpertEnabled ())                                                                 //До тех пор пока запушенно  |

     {
     if (Weekday!= 0 ||Weekday!= 6 ){Exp= true ; if (Weekday== 1 ){Info( 4 ,Weekday, 0 );}}       //Если не Сбб. Воск. то разрешено  |
     if (Weekdays== 0 ||Weekdays== 6 )                                                  //Если Сбб. Воск. то не разрешено  |
       {
       Exp= false ;Info( 5 ,Weekdays, 0 );
       if (Weekdays== 6 ){ Sleep ( 86400000 );}                                                //Если суббота пауза 24 часа  |
       if (Weekdays== 0 ){ Sleep ( 3600000 );}                                               //Если воскресение пауза 1 час  |
       }

대충 이런 식으로 일시 중지와 주기를 거쳐 결정했지만 터미널 버전을 업데이트하기 전의 오래된 코드입니다. 이제 더 쉬운 방법이 있습니다. 약간의 문헌을 읽으면 됩니다.
물론 감사합니다. 그러나 그들이 말한 것처럼 한 곳을 통해 눈에 올라갑니다) 5.0의 가격으로 유로에 보증금을 넣을 수도 있습니다. 서버에서 허용 한 다음 각 타이머주기에서 변경하려고합니다. 예금, 오류가 132 이면 시장이 닫히고 정상이면 거래가 있지만 거래 시간에는 서버 플러드이며 "로커"가 아닌 인간적으로 문제를 해결하고 싶습니다. 그리고 이것은 이미 MK 개발자들을 위한 것입니다.
 

IsTradeAllowed

Expert Advisors의 도움으로 거래 가능성에 대한 정보를 반환합니다.

bool IsTradeAllowed ();

호출의 두 번째 형식은 지정된 시간에 지정된 기호에 대한 거래 기회에 대한 정보를 반환합니다.

bool IsTradeAllowed (
const 문자열 기호         // 기호
   날짜 시간    테스트된_시간    // 시각
);

옵션

기호

[인] 문자.

테스트된_시간

[제 시간에.

반환 값

EA가 거래할 수 있고 거래 작업 을 수행하기 위한 스레드가 비어 있으면 true를 반환하고, 그렇지 않으면 false를 반환합니다.

 
if( SymbolInfoInteger (NULL,SYMBOL_TIME)>60) return(0);
 
Kino :
물론 감사합니다. 그러나 그들이 말한 것처럼 한 곳을 통해 눈에 올라갑니다) 5.0의 가격으로 유로에 보증금을 넣을 수도 있습니다. 서버에서 허용 한 다음 각 타이머주기에서 변경하려고합니다. 예금, 오류가 132 이면 시장이 닫히고 정상이면 거래가 있지만 거래 시간에는 서버 플러드이며 "로커"가 아닌 인간적으로 문제를 해결하고 싶습니다. 그리고 이것은 이미 MK 개발자들을 위한 것입니다.
무역 허가 요청이 필요합니다. 이 예에서는 이 요청이 없습니다. 장 마감과의 시차가 3시간이고, 장 마감 3시간 전은 대부분 아파트로 지나가기 때문입니다. 그러므로 나는 그곳에서 어떻게 든 다르게, 그러나 또한 일시 중지와 함께 훨씬 더 작은 간격으로 그것을 했습니다.
[삭제]  
offfline :

IsTradeAllowed

Expert Advisors의 도움으로 거래 가능성에 대한 정보를 반환합니다.

bool IsTradeAllowed ();

호출의 두 번째 형식은 지정된 시간에 지정된 기호에 대한 거래 기회에 대한 정보를 반환합니다.

bool IsTradeAllowed (
const 문자열 기호         // 기호
   날짜 시간    테스트된_시간    // 시각
);

옵션

기호

[인] 문자.

테스트된_시간

[제 시간에.

반환 값

EA가 거래할 수 있고 거래 작업 을 수행하기 위한 스레드가 비어 있으면 true를 반환하고, 그렇지 않으면 false를 반환합니다.

알렉산더, 당신은 틀렸어)


 //+------------------------------------------------------------------+
//|                                                         test.mq4 |
//|                        Copyright 2015, MetaQuotes Software Corp. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2015, MetaQuotes Software Corp."
#property link        "https://www.mql5.com"
#property version    "1.00"
#property strict
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit ()
  {
//--- create timer
   EventSetTimer ( 1 );
      
//---
   return ( INIT_SUCCEEDED );
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit ( const int reason)
  {
//--- destroy timer
   EventKillTimer ();
      
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick ()
  {
//---
   
  }
//+------------------------------------------------------------------+
//| Timer function                                                   |
//+------------------------------------------------------------------+
void OnTimer ()
  {
//---
   if (IsTradeAllowed() == True) Print ( "---- Ура торгуем -----" );
   {
       int ticket= OrderSend ( Symbol (),OP_BUY, 1 ,Ask, 3 , 0 , 0 , "My order" , 16384 , 0 , clrGreen );
      {
         if (ticket < 0 ) Print ( "---- Уже не торгуем -----" , GetLastError ());
      }
   }

  }
//+------------------------------------------------------------------+
 

잘 작동하지 않는 옵션이 있습니다.

 //+------------------------------------------------------------------+
//|                                                         тест.mq4 |
//|                                                   Sergey Gritcay |
//|                                               sergey1294@list.ru |
//+------------------------------------------------------------------+
#property copyright "Sergey Gritcay"
#property link        "sergey1294@list.ru"
#property version    "1.00"
#property strict
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit ()
  {
//--- create timer
   EventSetTimer ( 1 );

//---
   return ( INIT_SUCCEEDED );
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit ( const int reason)
  {
//--- destroy timer
   EventKillTimer ();

  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick ()
  {
//---

  }
//+------------------------------------------------------------------+
//| Timer function                                                   |
//+------------------------------------------------------------------+
void OnTimer ()
  {
//---
   if (isNewTime())
     {
       Print ( "---- Ура торгуем -----" );
       int ticket= OrderSend ( Symbol (),OP_BUY, 1 ,Ask, 3 , 0 , 0 , "My order" , 16384 , 0 , clrGreen );
        {
         if (ticket< 0 ) Print ( "---- Уже не торгуем -----" , GetLastError ());
        }
     }
     else Print ( "---- функция isNewTime() = false, возможно торговля закрыта " );

  }
//+------------------------------------------------------------------+
bool isNewTime()
  {
//--- в статической переменной будем помнить время 
   static datetime last_time= 0 ;
//--- текущее время
   datetime time= TimeCurrent ();

//--- если это первый вызов функции
   if (last_time== 0 )
     {
       //--- установим время и выйдем 
      last_time=time;
       return ( false );
     }

//--- если время отличается
   if (last_time!=time)
     {
       //--- запомним время и вернем true
      last_time=time;
       return ( true );
     }
//--- дошли до этого места - значит время сервера не обновилось, вернем false
   return ( false );
  }
[삭제]  
sergey1294 :

잘 작동하지 않는 옵션이 있습니다.

감사합니다.
 
Kino :
올바른 길에 대한 조언을 주셔서 감사합니다. 하지만 시장이 열렸을 때 주문 작업의 가능성을 결정하려는 시도는 어쨌든 정확하지 않지만 작동할 것입니다.

필자는 다음과 같이 주장한다.

현재 기호에서 거래해야 하는 경우 시장이 열려 있다는 간접적인 신호는 새 틱의 도착입니다. 따라서 OnTick 이벤트로 충분하고 질문이 닫힙니다.

현재 기호가 아닌 다른 기호로 작업해야 하는 경우 현재 기호에서 거래가 시작되었다는 사실이 다른 기호에 대해 거래가 진행되고 있음을 보장하지 않습니다. 예를 들어, 고문은 EURUSD에서 시작되고 시간은 09:00 UTC이며 무엇보다도 시장이 13:00 UTC에만 열리는 미국 기업의 주식을 거래해야 합니다. 즉, OnTick은 도움이 되지 않습니다. 특정 간격으로 서버에 주문을 보내려고 시도하여 다른 기호에 의한 시장 개방 사실을 정확하게 판별해야합니다. 1분에 한 번 주문을 보내는 것은 결코 서버 폭탄이 아니라 완전히 정상적인 접근 방식입니다. 여기서 무슨 문제가 있습니까?

 

요일을 결정하는이 문제에 대해 서비스 데스크에서 한 번 답변을 받았으므로 틱 없음 거래 없음,

그들은 해결책을 제안했습니다

TimeDayOfWeek( TimeLocal ());

요일 이 터미널과 다를 수 있기 때문에 완전히 사실은 아닙니다.

 
최근 프로젝트 중 하나에서 작업은 임의 상품의 거래가 열려 있고 사용할 수 있다는 사실을 확인하는 것이었습니다.
다른 프로젝트에서 나는 반복적으로 이것에 의지했지만 중요한 조건은 주문을 열려고 시도하지 않는 것이 었습니다. 솔직히 말해서 지금까지 이것이 가장 간단하고 신뢰할 수 있는 방법인 것 같습니다.

따라서 현재로서는 내가 할 수 있는 최선의 선택은 다음과 같습니다(하지만 여전히 찾고 있습니다. 아래 참조).
1) 일대일 거래가 허용되는지 결정 - IsTradeAllowed() 함수의 두 번째 형식(위에서 언급함). 그렇지 않으면 재판이 없습니다 :)
2) SymbolInfoInteger(<symbol>, SYMBOL_TIME) 기호에 대한 마지막 호가 시간을 거래 세션 중 하나( SymbolInfoSessionTrade() )의 시간과 비교합니다. 호가 시간이 세션 중 하나의 범위 내에 있으면 우리는 거래가 가능하다고 봅니다.
3) 견적 시간이 너무 "오래된" 것이 아닌지 확인합니다. xx분 이상 전이라면(SymbolInfoInteger(<symbol>, SYMBOL_TIME) 및 TimeCurrent() 비교) 견적이 오래되었다고 간주하므로 거래가 불가능하다는 내용이 나옵니다.

이 접근 방식의 단점은 다음과 같습니다. 상품 거래가 불가능한 상황이 있을 수 있지만 틱은 계속됩니다.
나는 메커니즘을 탐구하지 않았고 개발은 중개인을 위해 수행되었으며 테스트 할 때 그러한 모드를 켰습니다. 틱은 계속되지만 거래는 할 수 없습니다. 이 옵션을 극복하는 것은 아직 불가능합니다.

공정하게 말하면 실제 거래에서 나는 이것을 경험하지 못했다는 점에 유의해야 합니다. 따라서 "일반적인" 조건에서 솔루션은 허용 가능한 것으로 보입니다. 하지만 여전히 지켜보고 있습니다 :)

추신: 1단계와 2단계를 결합하는 것이 가능할 것 같지만(SymbolInfoInteger(<symbol>, SYMBOL_TIME)을 IsTradeAllowed 함수에 전달), 아직 이 옵션을 테스트하지 않았으므로 확인하지 않겠습니다.

SymbolInfoSessionTrade - Документация на MQL4
  • docs.mql4.com
SymbolInfoSessionTrade - Документация на MQL4