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

 
Alexey Viktorov :

정말 내가 그렇게 어렵게 암시? DC는 스프레드와 커미션으로 수익을 올리고 프로그래머는 코드 작성으로 수익을 얻습니다.

거래자 중 한 명은 스프레드와 수수료를 절약할 필요가 있다고 말합니다(가능하면 지불하지 마십시오).

다른 거래자는 돈을 위해 코드를 작성하는 것은 공정하지 않다고 말합니다(가능하면 지불하지 마십시오).

둘 다 지갑을 관리합니다. 별반 다르지 않은듯...

여기에서만 프로그래머로서 첫 번째를 지원하고 두 번째와 논쟁하여 그가 틀렸음을 증명합니다.

나는 더 싼 프로그래머를 찾고 싶어하는 상인을 이해합니다. 나는 또한 더 유리한 거래 조건을 찾는 상인을 이해합니다. 문제가 무엇입니까? 돈을 저축하려는 것이 무슨 문제입니까?

그러나 여기에는 완전히 다른 이야기가 있습니다. 알고리즘이 주문과 함께 더 효율적으로 작동하여 시스템의 이익을 증가시키도록 알고리즘에 대해 생각하는 것은 훌륭한 개발자가 되는 것을 의미합니다. 제 생각에는 아이디어를 대략적으로 확인하는 단계에서만 몇 핍을 무시할 수 있습니다.

 
Andrey Khatimlianskii :

나는 더 싼 프로그래머를 찾고 싶어하는 상인을 이해합니다. 나는 또한 더 유리한 거래 조건을 찾는 상인을 이해합니다. 문제가 무엇입니까? 돈을 저축하려는 것이 무슨 문제입니까?

그러나 여기에는 완전히 다른 이야기가 있습니다. 알고리즘이 주문과 함께 더 효율적으로 작동하여 시스템의 이익을 증가시키도록 알고리즘에 대해 생각하는 것은 훌륭한 개발자가 되는 것을 의미합니다. 제 생각에는 아이디어를 대략적으로 확인하는 단계에서만 몇 핍을 무시할 수 있습니다.

아주. 그리고 웬일인지 나는 당신이 무료로 더 많이 쓰기를 꺼리는 것을 이해합니다. 그리고 문제도 없고...

일반적으로 나는 돈을 저축하려는 시도에 반대하지 않지만, 미친 정도까지는 아닙니다. 거래의 선두에서 스프레드에 저축하지 마십시오 ...

 
Alexey Viktorov :

일반적으로 나는 돈을 저축하려는 시도에 반대하지 않지만, 미친 정도까지는 아닙니다. 거래의 선두에서 스프레드에 저축하지 마십시오 ...

계산하면 그런 미친 짓이 아닙니다. 하지만 설득할 생각은 없습니다.

 
Andrey Khatimlianskii :

계산하면 그런 미친 짓이 아닙니다. 하지만 설득할 생각은 없습니다.

비용이 아닌 이익을 계산해야 합니다.

비용을 절감할 때 손실을 입는 것은 매우 쉽습니다. TS가 비용을 발생시키도록 설계되었지만 동시에 수익을 창출하는 경우 다른 시나리오에서는 손실을 유발할 수 있으므로 이것은 좋은 TS입니다.

그리고 일반적으로 승자는 판단되지 않습니다!

 

7에서 현재 페이지까지를 별도의 주제로 분리하는 것이 가능하며("여기에 추가 토론"과 같은 링크를 제공할 수도 있습니다), 이 주제에서 작성된 내용을 계속하시겠습니까?

 
Vitaly Muzichenko :

비용이 아닌 이익을 계산해야 합니다.

비용을 절감할 때 손실을 입는 것은 매우 쉽습니다. TS가 비용을 발생시키도록 설계되었지만 동시에 수익을 창출하는 경우 다른 시나리오에서는 손실을 유발할 수 있으므로 이것은 좋은 TS입니다.

그리고 일반적으로 승자는 판단되지 않습니다!

이 댓글이 무슨 내용인지 알 수가 없습니다.

초고수익 전략을 위한 수수료 규모의 부적절성에 대해?

 
MT4 EURUSD에서 그런 어드바이저를 시작합시다.
 // В случае изменения количества ордеров по основному символу, сигнализирует об их количестве

// #include <MT4Orders.mqh>

const bool Init =   EventSetMillisecondTimer ( 1 );

int AmountOrders( const string &Symb )
{
   int Res = 0 ;
  
   for ( int i = OrdersTotal () - 1 ; i >= 0 ; i--)
     if ( OrderSelect (i, SELECT_BY_POS ) && ( OrderSymbol () == Symb))
      Res++;
      
   return (Res);
}

void OnTimer ()
{
   static int PrevAmount = 0 ;
  
   const int Amount = AmountOrders( _Symbol );
  
   if (Amount != PrevAmount)
  {
    PrevAmount = Amount;
    
     Alert (Amount);
  }    
}


EURUSD에 대해 5개 주문과 USDJPY에 대해 5개 주문을 무작위로 엽니다. 이제 무해한 AmountOrders 코드를 자세히 살펴보고 다음 시나리오를 상상해 보겠습니다.

  1. 우리는 어드바이저가 실행되는 동안 AmountOrders 안에 있습니다. 여기서 i == 3입니다.
  2. USDJPY 에서 포지션을 마감합니다 . 그 후 현재 테이블에서 주문이 흔들립니다.
  3. OrderSelect를 통한 i == 2에서의 흔들림으로 인해 1단계에서와 동일한 순서로 실행될 수 있습니다. 이 때문에 AmountOrders는 실제보다 하나 더 많은 값을 반환할 수 있습니다.


그리고 여기 확인이 있습니다

 #property strict

void OnStart ()
{
   for ( int i = 0 ; i < 5 ; i++)
     OrderSend ( _Symbol , OP_BUY , 1 , Ask , 100 , 0 , 0 );
    
   int PrevTicket = 0 ;
  
   for ( int i = OrdersTotal () - 1 ; i > 0 ; i--)
     if ( OrderSelect (i, SELECT_BY_POS ))
    {
       const int Ticket = OrderTicket ();
      
       if (Ticket == PrevTicket)
         Alert ( "Hello World!" );
        
      PrevTicket = Ticket;
      
       if ( OrderSelect (i - 1 , SELECT_BY_POS ))      
         OrderClose ( OrderTicket (), OrderLots (), OrderClosePrice (), 100 );
    }
}


결과

 2017.10 . 06 01 : 28 : 05.885 TestTets EURUSD,M1: close # 240725107 buy 1.00 EURUSD at 1.17121 at price 1.17099
2017.10 . 06 01 : 28 : 05.775 TestTets EURUSD,M1: Alert : Hello World!
2017.10 . 06 01 : 28 : 05.775 TestTets EURUSD,M1: close # 240725108 buy 1.00 EURUSD at 1.17121 at price 1.17099
2017.10 . 06 01 : 28 : 05.673 TestTets EURUSD,M1: Alert : Hello World!
2017.10 . 06 01 : 28 : 05.673 TestTets EURUSD,M1: close # 240725110 buy 1.00 EURUSD at 1.17121 at price 1.17099
2017.10 . 06 01 : 28 : 05.578 TestTets EURUSD,M1: Alert : Hello World!
2017.10 . 06 01 : 28 : 05.578 TestTets EURUSD,M1: close # 240725111 buy 1.00 EURUSD at 1.17121 at price 1.17099
2017.10 . 06 01 : 28 : 05.480 TestTets EURUSD,M1: open # 240725112 buy 1.00 EURUSD at 1.17121 ok
2017.10 . 06 01 : 28 : 05.343 TestTets EURUSD,M1: open # 240725111 buy 1.00 EURUSD at 1.17121 ok
2017.10 . 06 01 : 28 : 05.253 TestTets EURUSD,M1: open # 240725110 buy 1.00 EURUSD at 1.17121 ok
2017.10 . 06 01 : 28 : 05.138 TestTets EURUSD,M1: open # 240725108 buy 1.00 EURUSD at 1.17121 ok
2017.10 . 06 01 : 28 : 05.035 TestTets EURUSD,M1: open # 240725107 buy 1.00 EURUSD at 1.17121 ok


같은 티켓이 무해한 주문 계산 주기에서 두 번 나올 수 있습니다!

Совершение сделок - Торговые операции - Справка по MetaTrader 5
Совершение сделок - Торговые операции - Справка по MetaTrader 5
  • www.metatrader5.com
Торговая деятельность в платформе связана с формированием и отсылкой рыночных и отложенных ордеров для исполнения брокером, а также с управлением текущими позициями путем их модификации или закрытия. Платформа позволяет удобно просматривать торговую историю на счете, настраивать оповещения о событиях на рынке и многое другое. Открытие позиций...
 
fxsaber :

같은 티켓이 무해한 주문 계산 주기에서 두 번 나올 수 있습니다!

모든 의심을 없애기 위해 이렇게 합니다.

우리는 고문을 배치

 // Советник будет алертовать, если OrderSelect соседних индексов выберет один и тот же ордер
const bool Init =   EventSetMillisecondTimer ( 1 );

void OnTimer ()
{
   int PrevTicket = 0 ;
  
   for ( int i = OrdersTotal () - 1 ; i >= 0 ; i--)
     if ( OrderSelect (i, SELECT_BY_POS ))
    {
       const int Ticket = OrderTicket ();
      
       if (Ticket == PrevTicket)
         Alert ( "Hello World!" );
        
      PrevTicket = Ticket;
      
       Sleep ( 1 ); // 1 миллисекунда - это много или мало?
    }
}


스크립트 실행

 #property strict

void OnStart ()
{
   // Открыли позиции
   for ( int i = 0 ; i < 25 ; i++)
     OrderSend ( _Symbol , OP_BUY , 1 , SymbolInfoDouble ( _Symbol , SYMBOL_ASK ), 100 , 0 , 0 );

   int Tickets[];
   const int Total = OrdersTotal ();
  
   ArrayResize (Tickets, Total);
  
   for ( int i = 0 ; i < Total; i++)
     if ( OrderSelect (i, SELECT_BY_POS ))
      Tickets[i] = OrderTicket ();
    
   // Закрыли позиции
   for ( int i = 0 ; i < Total; i++)
     OrderClose (Tickets[i], 1 , SymbolInfoDouble ( _Symbol , SYMBOL_BID ), 100 );
}


그리고 우리는 다른 지수에 있는 어드바이저가 어떻게 같은 주문을 선택하는지 관찰합니다. 그리고 이것은 거래 논리의 완전한 실패로 이어질 수 있습니다.

 
fxsaber :

다른 지수의 고문이 동일한 주문을 선택합니다. 그리고 이것은 거래 논리의 완전한 실패로 이어질 수 있습니다.

글쎄, 실제로 모든 영광의 주제! 주문을 통해 루프를 구성하는 방법? 예를 들어, 그러한 함수를 작성하는 올바른 방법은 무엇입니까?

 // Возращает количество ордеров данного символа
int AmountOrders( const string &Symb )
{
   int Res = 0 ;
  
   for ( int i = OrdersTotal () - 1 ; i >= 0 ; i--)
     if ( OrderSelect (i, SELECT_BY_POS ) && ( OrderSymbol () == Symb))
      Res++;
      
   return (Res);
}


스레드는 반복 루프 내부에 일시 중지가 있을 때 몇 가지 반복 작업의 필요성을 표명하는 것으로 시작되었습니다. 효과를 보기 위해 밀리초 영역에 충분한 일시 중지가 있습니다.

그런 목발 동안

 bool IsChange( const bool InitFlag = false )
{
   static int PrevTotal = 0 ;
   static int PrevHistoryTotal = 0 ;
  
   const int Total = OrdersTotal ();
   const int HistoryTotal = OrdersHistoryTotal ();    
  
   if (InitFlag)
  {
    PrevTotal = Total;
    PrevHistoryTotal = HistoryTotal ;    
  }
  
   return (!InitFlag && ((Total != PrevTotal) || ( HistoryTotal != PrevHistoryTotal)));
}

// Возращает количество ордеров данного символа
int AmountOrders( const string &Symb )
{
   int Res = 0 ;
  
   IsChange( true );
  
   for ( int i = OrdersTotal () - 1 ; i >= 0 ; i--)
     if ( IsChange() )
    {
      i = OrdersTotal ();
      
      Res = 0 ;
    }
     else if ( OrderSelect (i, SELECT_BY_POS ) && ( OrderSymbol () == Symb))
      Res++;
      
   return (Res);
}

그러나 항상 올바르게 작동한다는 보장은 없습니다.

 
fxsaber :

모든 의심을 없애기 위해 이렇게 합니다.

우리는 고문을 배치

스크립트 실행

그리고 우리는 다른 지수에 있는 어드바이저가 어떻게 같은 주문을 선택하는지 관찰합니다. 그리고 이것은 거래 논리의 완전한 실패로 이어질 수 있습니다.

변경됨

 // Советник будет алертовать, если OrderSelect соседних индексов выберет один и тот же ордер
const bool Init =   EventSetMillisecondTimer ( 1 );

bool IsChange( const bool InitFlag = false )
{
   static int PrevTotal = 0 ;
   static int PrevHistoryTotal = 0 ;
  
   const int Total = OrdersTotal ();
   const int HistoryTotal = OrdersHistoryTotal ();    
  
   if (InitFlag)
  {
    PrevTotal = Total;
    PrevHistoryTotal = HistoryTotal ;    
  }
  
   return (!InitFlag && ((Total != PrevTotal) || ( HistoryTotal != PrevHistoryTotal)));
}

void OnTimer ()
{
   int PrevTicket = 0 ;
  
   IsChange( true );
  
   for ( int i = OrdersTotal () - 1 ; i >= 0 ; i--)
     if ( IsChange() )
    {
      i = OrdersTotal ();
      
      PrevTicket = 0 ;
    }
    
     else if ( OrderSelect (i, SELECT_BY_POS ))
    {
       const int Ticket = OrderTicket ();
      
       if (Ticket == PrevTicket)
         Alert ( "Hello World!" );
        
      PrevTicket = Ticket;
      
       Sleep ( 1 ); // 1 миллисекунда - это много или мало?
    }
}

이제 경고 없이.