주문 열거 주기의 구성 - 페이지 14

 
Andrey Khatimlianskii :

그리고 OrderClose는 거래를 마감하는 것을 보장합니까?

보장되지는 않지만 이 경우 코드에 확인 사항이 있습니다. 각 OnTick 호출은 이전 호출과 독립적입니다.

 
fxsaber :

보장되지는 않지만 이 경우 코드에 확인 사항이 있습니다. 각 OnTick 호출은 이전 호출과 독립적입니다.

좋아요, 다음 틱을 닫으면 됩니다.

 
@Artyom Trishkin , @Andrey Khatimlianskii , 참여해주셔서 감사합니다! 아무도 MT5 코드 에 대해 말하지 않은 것이 유감입니다. 분명히 그들은 모든 것이 정상이라고 생각합니다.
 
fxsaber :
@Artyom Trishkin , @Andrey Khatimlianskii , 참여해주셔서 감사합니다! 아무도 MT5 코드 에 대해 말하지 않은 것이 유감입니다. 분명히 그들은 모든 것이 정상이라고 생각합니다.

물론 MT5에서는 모든 것이 전혀 옳지 않다는 대답을 하기 위해 예를 들었다. 문제를 보여주는 예

 // Пример неправильного считывания торгового окружения на каждом тике
// Скрипт эмулирует два тика ТС, которая должна открыть одну позицию, если ее нет.

#include <Trade/Trade.mqh>

// Возвращает количество позиций по символу
int GetAmountPositions( const string Symb )
{
   int Res = 0 ;
  
   // Этот MQL5-код с ошибкой
   for ( int i = PositionsTotal () - 1 ; i >= 0 ; i--)
     if ( PositionGetSymbol (i) == Symb)
      Res++;

/*
   // В MT4 такой код выполняется без ошибки
  for (int i = OrdersTotal() - 1; i >= 0; i--)
    if (OrderSelect(i, SELECT_BY_POS) && (OrderType() <= OP_SELL) && (OrderSymbol() == Symb))
      Res++;
*/       
   return (Res);
}

// Пример OnTick
void ExampleOnTick()
{
   static CTrade Trade;
  
   // Если нет позиции, открываем
   if (!GetAmountPositions( _Symbol ))
    Trade.Buy( 1 );    
}

// Эмуляция прихода двух Tick-событий
void OnStart ()
{
  ExampleOnTick(); 
  
   Sleep ( 10 ); // Между двумя тиками ~10 мс.
  
  ExampleOnTick();
}

위치가 없는 기호에 이 스크립트를 실행하면 결과가 어떻게 될까요?

정답: 하나 또는 두 개의 포지션 이 열릴 것입니다.

 
fxsaber :

물론 MT5에서는 모든 것이 전혀 옳지 않다는 대답을 하기 위해 예를 들었다. 문제를 보여주는 예

위치가 없는 기호에 이 스크립트를 실행하면 결과가 어떻게 될까요?

정답: 하나 또는 두 개의 포지션 이 열릴 것입니다.

그 결과, 코드베이스에 있는 대다수의 MT5 Expert Advisors가 잘못 작성되었습니다!

 
fxsaber :
이 말에 이의를 제기하는 사람은 거의 없을 것입니다.

이것은 보편적인 규칙입니다. 그러나 MT5에서의 구현에 대해 생각하는 사람은 거의 없습니다. 따라서 가장 간단한 TS에 대한 템플릿을 작성했습니다(거의 모두 코드베이스에 있음).

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

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

우연히 이 스레드에 들어왔습니다. 일반적으로 저는 오랫동안 전략 템플릿에 대해 논의하는 스레드를 시작하고 싶었습니다. 귀하의 템플릿은 내가 생각하기에 정확하다고 생각하는 것에 충분히 가깝지만(혼자 읽을 수 있음), 단일 함수 호출이 OnTick에 삽입되면 전체 광업 및 처리 공장이 숨겨져 있는 것이 여전히 마음에 들지 않습니다.

한때 나는 MetaEditor: Building on on the power of templates 라는 기사를 쓰기도 했습니다. 그 이후로 언어가 변경되었으며 편집기 템플릿이 없습니다. 이 문제에 대해 논의하는 것은 흥미로울 것이며(별도의 스레드에서 가능함) 이 주제에 대한 기사를 얻는 것도 좋을 것입니다. 코드를 작성할 때 클래스나 매크로의 메서드에 얽매이지 않고 전략을 한 눈에 읽을 수 있도록 노력해야 한다고 생각합니다.

 
fxsaber :

그 결과, 코드베이스에 있는 대다수의 MT5 Expert Advisors가 잘못 작성되었습니다!

언제나처럼 - 절대적으로. 당신의 코드를 읽지 않았지만 그럴 수는 없습니다.

 
Rashid Umarov :

우연히 이 스레드에 들어왔습니다. 일반적으로 저는 오랫동안 전략 템플릿에 대해 논의하는 스레드를 시작하고 싶었습니다. 귀하의 템플릿은 내가 생각하기에 정확하다고 생각하는 것에 충분히 가깝지만(혼자 읽을 수 있음), 단일 함수 호출이 OnTick에 삽입되면 전체 광업 및 처리 공장이 숨겨져 있는 것이 여전히 마음에 들지 않습니다.

OnTick == Strategy로 설정하면 템플릿이 음란한 크기로 축소/단순화됩니다.

한때 나는 MetaEditor: Building on on the power of templates 라는 기사를 쓰기도 했습니다. 그 이후로 언어가 변경되었으며 편집기 템플릿이 없습니다. 이 문제에 대해 논의하는 것은 흥미로울 것이며(별도의 스레드에서 가능함) 이 주제에 대한 기사를 얻는 것도 좋을 것입니다. 코드를 작성할 때 클래스나 매크로의 메서드에 얽매이지 않고 전략을 한 눈에 읽을 수 있도록 노력해야 한다고 생각합니다.

따라서 두 플랫폼의 템플릿이 표시되었습니다. MT5에게는 근본적으로 잘못된 것이지만 너무 간단해서 논의하기 어렵다. 따라서 CExpert도 있습니다. 나는 그것을 직접 보지 않았다 - 그것은 무섭다.

 
Rashid Umarov :

언제나처럼 - 절대적으로. 귀하의 코드를 읽지 않았지만 그렇지 않을 수도 있습니다.

당신은 읽고, 당신의 의견은 매우 흥미 롭습니다.

 
fxsaber :

물론 MT5에서는 모든 것이 전혀 옳지 않다는 대답을 하기 위해 예를 들었다. 문제를 보여주는 예

위치가 없는 기호에 이 스크립트를 실행하면 결과가 어떻게 될까요?

정답: 하나 또는 두 개의 포지션 이 열릴 것입니다.

그리고 GetAmountPositions를 일반 OnTradeTransaction 으로 바꾸면 ???

다음과 같이 다소:

 #include <Trade/Trade.mqh>
   int Res = 0 ;

// Возвращает количество позиций по символу
/*********************TradeTransaction function*********************/
void OnTradeTransaction ( const MqlTradeTransaction & trans,
                         const MqlTradeRequest & request,
                         const MqlTradeResult & result)
{
   if (trans.type == TRADE_TRANSACTION_DEAL_ADD && trans.symbol == _Symbol )
   {
     /******************** Если открылась позиция********************/
     if ( PositionSelectByTicket (trans.position))
     Res++;
     /******************** Если закрылась позиция********************/
     if (! PositionSelectByTicket (trans.position))
     Res--;
   }
} /*******************************************************************/

// Пример OnTick
void ExampleOnTick()
{
   static CTrade Trade;
  
   // Если нет позиции, открываем
   if (Res == 0 )
    Trade.Buy( 1 );    
}

// Эмуляция прихода двух Tick-событий
void OnStart ()
{
  ExampleOnTick(); 
  
   Sleep ( 10 ); // Между двумя тиками ~10 мс.
  
  ExampleOnTick();
}