거래 환경에서 작업할 때 일반적인 실수와 이를 제거하는 방법

 
이 주제에서는 다양한 알고리즘에서 터미널의 거래 환경으로 작업할 때 발생하는 일반적인 오류, 향후 제거 및 방지 방법에 대해 설명합니다.
 
확인.
종자의 경우:
EA는 마지막으로 마감된 주문의 방향(또는 이익, ...)을 분석합니다. 마지막 하나는 2 일 전에 닫혔습니다.
그리고 거래자는 히스토리 깊이를 1일로 설정했습니다.
OrdersHistoryTotal()은 더 이상 해당 주문을 볼 수 없습니다.
결정?
 
Andrei Fandeev :
확인.
종자의 경우:
EA는 마지막으로 마감된 주문의 방향(또는 이익, ...)을 분석합니다. 마지막 하나는 2 일 전에 닫혔습니다.
그리고 거래자는 히스토리 깊이를 1일로 설정했습니다.
OrdersHistoryTotal()은 더 이상 해당 주문을 볼 수 없습니다.
결정?

MT4의 경우 - 제 생각에는 확실히 어드바이저를 시작할 때 필요한 기록 깊이를 사용해야 할 필요성에 대해 사용자에게 경고합니다.

MT5를 사용하면 히스토리를 원하는 깊이까지 다운로드할 수 있습니다.

 
Artyom Trishkin :

MT4의 경우 - 제 생각에는 확실히 어드바이저를 시작할 때 필요한 기록 깊이를 사용해야 할 필요성에 대해 사용자에게 경고합니다.

사용자에게 의존하는 것은 나쁜 생각입니다. 확인이 필요합니다.
Artyom, 설정된 히스토리 깊이의 값을 얻기 위해 MT4에서 Get을 찾지 못했습니다.
프로그래밍 방식으로 얻는 것이 정말로 불가능합니까?

 
Andrei Fandeev :

사용자에게 의존하는 것은 나쁜 생각입니다. 확인이 필요합니다.
Artyom, 설정된 히스토리 깊이의 값을 얻기 위해 MT4에서 Get을 찾지 못했습니다.
프로그래밍 방식으로 얻는 것이 정말로 불가능합니까?

정말로.

 

거래 환경을 다루는 데에는 Expert Advisors를 작성하는 두 가지 패러다임이 있습니다.

  1. 이벤트 입력(OnTick, OnTimer 등)은 서로 의존합니다. 이벤트 사이에 필수 정보(캐시와 같은 가속이 아니라 성능을 위해)가 있어야 합니다. 예를 들어 OrderSendAsync의 결과를 저장하고 OnTradeTransaction 에서 사용해야 합니다. 캐시는 필수 정보가 아니며 속도 향상을 위해서만 사용됩니다. 따라서 즉시 고려되지 않습니다.
  2. 이벤트 입력(OnTick, OnTimer 등)은 서로 종속되지 않습니다. 모든 항목은 깨끗한 슬레이트입니다. 대략, 각 이벤트에 대해 자체적으로 실행하는 스크립트와 같습니다.
MT4에서는 아마도 두 번째 옵션을 통해 모든 것을 해결할 수 있을 것입니다. MT5는 그렇게 명확하지 않습니다.


첫 번째 옵션보다 두 번째 옵션의 장점

  • 어디에서나(정상적으로든 비정상적으로든) 알고리즘을 종료할 수 있습니다.
  • 어디서든 시작/계속.
  • 높은 신뢰성.


단점

  • 테스터에서는 첫 번째 옵션보다 성능이 떨어집니다.
  • 논리 "처음부터" 강제로 "비논리적인" 코드를 작성해야 하므로 첫 번째 단계에서 익숙해져야 합니다.

 

거래 환경 API를 비교하는 방법은 무엇입니까? 수많은 다른 차량을 상상해보십시오. 그리고 최소한의 노력으로 안정적인 코드로 TS를 구현할 수 있는 이상적인 가상 API를 상상해 봅시다.

이 매우 이상적인 가상 API를 실제 API에서 래퍼로 생성할 수 있다면 원래 API가 우수합니다. 래퍼를 만드는 데 얼마나 많은 노력과 시간이 소요되는지에도 불구하고.


MT4와 MT5는 이런 점에서 훌륭한 API입니다. 원래 API만 복잡하지만 (아키텍처/기술적 제한 없음) 훌륭한 래퍼를 작성할 수 있습니다.

따라서 MT5가 MT4보다 복잡하다고 말할 때 사용하는 MT4 래퍼만큼 편리한 MT5 래퍼(아직 작성되지 않았을 수도 있음)를 아직 만나지 못했다는 의미입니다.


일반적으로 두 플랫폼 모두 하위 수준 API에서 단일 상위 수준 API(래퍼)를 만들 수 있습니다. 따라서 거래 환경 API의 복잡성은 그들에게 동일합니다!

 

MT4에는 다소 높은 수준의 소스 API가 있으므로 보다 범용적인 래퍼를 작성하려는 사람은 거의 없습니다. 그러나 MT5에서는 상황이 다릅니다. 원래의 저수준 API는 최소한 일종의 래퍼를 작성해야 합니다. 따라서 이 항목에서는 각 래퍼의 기능을 논의하는 데 큰 의미가 없습니다. 오히려 래퍼가 여전히 필요하다는 것을 보여주는 것이 중요합니다. 고수준 API를 작성할 때 여전히 고려해야 하는 저수준 API의 기능은 무엇입니까?

В общем, обе платформы позволяют из низкоуровневых API создать единый высокоуровневый API (обертка). Так что сложности API торговых окружений у них равны!

이 문장을 바탕으로 MT4 코드에 비해 편의성 면에서 결코 뒤떨어지지 않는 MT5 코드를 작성하는 방법을 배워야 합니다. 래퍼 API는 다를 수 있지만(일반적으로 이것이 구문임) 구조적으로 MT5가 MT4보다 열등해서는 안 됩니다. 그렇지 않으면 강조 표시된 명령문의 의미가 손실됩니다. 따라서 좀 더 번거로운 MT5 코드를 비판의 이유가 아니라 MT4보다 사용하기 덜 편리한 래퍼로 꿰매기 위한 도움으로 받아들여야 합니다.

 
간단한 MT4 TS 템플릿 가져오기

거래, 자동 거래 시스템 및 거래 전략 테스트에 관한 포럼

주문 열거 주기의 구성

fxsaber , 2018.02.15 23:19

 // Шаблон большинства ТС

#property strict // обязательно

// Сигнал на покупку
bool BuySignal( const string Symb ) { return ( true ); }

// Сигнал на продажу
bool SellSignal( const string Symb ) { return ( false ); }

// Находит ордер соответствующего типа
bool OrdersScan( const string Symb, const int Type )
{
   for ( int i = OrdersTotal () - 1 ; i >= 0 ; i--)
     if ( OrderSelect (i, SELECT_BY_POS ) && ( OrderType () == Type) && ( OrderSymbol () == Symb))
       return ( true );    
    
   return ( false );  
}

// Торговое действие на сигнал
bool Action( const string Symb, const int Type, const double Lots = 1 )
{
   bool Res = true ;    
  
   // Закрыли противоположные сигналу позиции
   while ((OrdersScan(Symb, 1 - Type)) && (Res = OrderClose ( OrderTicket (), OrderLots (), OrderClosePrice (), 100 )));

   // Открыли позицию по сигналу
   return (Res && !OrdersScan(Symb, Type) && OrderSend (Symb, Type, Lots, SymbolInfoDouble (Symb, Type ? SYMBOL_BID : SYMBOL_ASK ), 100 , 0 , 0 ));
}

// Шаблон торговой стратегии
void Strategy( const string Symb )
{
   if (BuySignal(Symb))
    Action(Symb, OP_BUY );
   else if (SellSignal(Symb))
    Action(Symb, OP_SELL );
}

void OnTick ()
{
  Strategy( _Symbol );
}

MT4의 편리함을 전혀 보여주지 않고, 비교를 위한 출발점으로만 작용합니다. 이것은 MT5 래퍼가 보유할 수 있는 낮은 수준의 편의성입니다. 템플릿은 두 번째 패러다임 을 기반으로 작성되었습니다.


MT5에서 같은 것을 쓰는 것 같습니다.

거래, 자동 거래 시스템 및 거래 전략 테스트에 관한 포럼

주문 열거 주기의 구성

fxsaber , 2018.02.15 22:30

 // Шаблон большинства ТС

#include <Trade/Trade.mqh>

// Сигнал на покупку
bool BuySignal( const string Symb ) { return ( true ); }

// Сигнал на продажу
bool SellSignal( const string Symb ) { return ( false ); }

// Находит позицию соответствующего типа
bool PositionsScan( const string Symb, const ENUM_POSITION_TYPE Type )
{
   for ( int i = PositionsTotal () - 1 ; i >= 0 ; i--)
     if (( PositionGetSymbol (i) == Symb) && ( PositionGetInteger ( POSITION_TYPE ) == Type))
       return ( true );    
    
   return ( false );  
}

// Торговое действие на сигнал
bool Action( const string Symb, const ENUM_POSITION_TYPE Type, const double Lots = 1 )
{
   static CTrade Trade;    
   bool Res = true ;    
  
   // Закрыли противоположные сигналу позиции
   while ((PositionsScan(Symb, ( ENUM_POSITION_TYPE )( 1 - Type))) && (Res = Trade.PositionClose( PositionGetInteger ( POSITION_TICKET ))));

   // Открыли позицию по сигналу
   return (Res && !PositionsScan(Symb, Type) && (Type ? Trade.Sell(Lots, Symb) : Trade.Buy(Lots, Symb)));
}

// Шаблон торговой стратегии
void Strategy( const string Symb )
{
   if (BuySignal(Symb))
    Action(Symb, POSITION_TYPE_BUY );
   else if (SellSignal(Symb))
    Action(Symb, POSITION_TYPE_SELL );
}

void OnTick ()
{
  Strategy( _Symbol );
}

어떤 이유로 일부 사람들은 동일한 차량에 대해 더 많은 코드를 작성합니다. 그러나 실제로 이 코드도 마찬가지입니다. 대부분의 TS는 BuySignal 및 SellSignal만 작성하면 됩니다. 다른 것은 필요하지 않습니다.

예제 템플릿은 특별히 SB를 사용하여 작성되었습니다. 따라서 질문은 MT5 전문가를 위한 것입니다. 코드가 정확합니까?


함수는 래퍼가 필요함을 나타내는 빨간색으로 표시됩니다. 그녀의 문제는 여기 에 설명되어 있습니다. 누군가는 이것이 고대에 Sleep을 통해 해결되었던 포지션을 다시 여는 고대 문제라는 것을 기억하고 OrderSend 이후에 포지션이 열리기를 기다리게 될 것입니다. 그러나 사실 이 문제는 OrderSend와 아무 관련이 없습니다. 거래 환경을 올바르게 읽을 수 있어야 합니다.

 
fxsaber :

거래 환경을 올바르게 읽을 수 있어야 합니다.

간단한 예에 대한 올바른 옵션

 // Возвращает количество позиций по символу
int GetAmountPositions( const string Symb )
{
   int Res = 0 ;
  
   for ( int i = PositionsTotal () - 1 ; i >= 0 ; i--)
     if ( PositionGetSymbol (i) == Symb)
      Res++;
      
   for ( int i = OrdersTotal () - 1 ; i >= 0 ; i--)
     if ( OrderGetTicket (i) && ( OrderGetInteger ( ORDER_TYPE ) <= ORDER_TYPE_SELL ) &&
         ! OrderGetInteger ( ORDER_POSITION_ID ) && ( OrderGetString ( ORDER_SYMBOL ) == Symb))
      Res++;   

/*
  for (int i = OrdersTotal() - 1; i >= 0; i--)
    if (OrderSelect(i, SELECT_BY_POS) && (OrderType() <= OP_SELL) && (OrderSymbol() == Symb))
      Res++;
*/       
   return (Res);
}

간단히 말해서 의미는 다음과 같습니다. 시장 주문이 있는 경우 이를 "포지션"으로 간주합니다. 래핑 위치이기 때문에 따옴표로 묶습니다. 강조 표시된 코드는 원칙적으로 어디에도 나타나지 않습니다. 그러나 그것은 당신이 포지션을 다시 여는 것을 피할 수 있게 해줍니다. 여기서 가장 흥미로운 것은 빨간색으로 강조 표시되어 있습니다. 이 칩의 필요성은 즉시 실현되지 않습니다.

사실은 소위 마감 시장 주문이 있다는 것입니다. 동일한 SL/TP. 그러한 시장 주문은 "포지션"으로 간주되지 않을 것이 분명합니다. 예, 그리고 그 자신이 폐쇄를 위해 내놓은 명령도 비슷합니다. 여기서 강조 표시된 조건은 해당 필터입니다.


PS 여기 에 이 코드를 붙여넣고 데모 서버 에서 결과를 확인하십시오.

 
fxsaber :

간단한 예에 대한 올바른 옵션

간단히 말해서 의미는 다음과 같습니다. 시장 주문이 있는 경우 이를 "포지션"으로 간주합니다. 래핑 위치이기 때문에 따옴표로 묶습니다. 강조 표시된 코드는 원칙적으로 어디에도 나타나지 않습니다. 그러나 그것은 당신이 포지션을 다시 여는 것을 피할 수 있게 해줍니다. 여기서 가장 흥미로운 것은 빨간색으로 강조 표시되어 있습니다. 이 칩의 필요성은 즉시 실현되지 않습니다.

사실은 소위 마감 시장 주문이 있다는 것입니다. 같은 SL/TP. 그러한 시장 주문은 "포지션"으로 간주되지 않을 것이 분명합니다. 예, 그리고 그 자신이 폐쇄를 위해 내놓은 명령도 비슷합니다. 여기서 강조 표시된 조건은 해당 필터입니다.


PS 여기 에 이 코드를 붙여넣고 데모 서버 에서 결과를 확인하십시오.

질문: 거래 요청을 보낸 후 다음 틱까지 시장가 주문이 서버에 의해 배치되지 않으면 어떻게 됩니까?