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

 
Vasiliy Sokolov :

루핑은 가장 위험한 프로그래밍 기술 중 하나입니다. 분석하기가 거의 불가능한 이상하고 드물게 나타나는 오류로 가득 차 있습니다.

반복하는 대신 반대로 사용자 스레드를 가능한 한 빨리 완료하도록 해야 합니다. 당신이 정말로 "맥박"을 유지하고 싶다면 - MT5에서 OnTradeTransaction을 분석하십시오. MT4는 일반적으로 그러한 단점에 좋지 않습니다. 왜냐하면 단순함이 절도보다 더 나쁘기 때문입니다.

구체적인 구현에 대한 것이 아니라 잠시 멈춘 후 TS를 흔드는 원리에 대한 것이었습니다. 음, 어디에서 끔찍한 루핑이 있는지 명확하지 않습니다. 뿐만 아니라 명확하지 않은 사용자 흐름을 완료하기 위해 서두르십시오.

 
fxsaber :

글쎄, 끔찍한 루핑이있는 곳은 분명하지 않습니다.

OnTick에서 OnTick 호출 - 재귀를 통한 중요하지 않은 반복:

 // Редкий, но правильный костяк модификации ордеров
for ( int i = OrdersTotal () - 1 ; i >= 0 ; i--)
   if ( OrderSelect (i, SELECT_BY_POS ))
     if ( OrderModify ( OrderTicket (), Price, SL, TP, OrderExpiration ()))     
    {
      i = OrdersTotal (); // Хотя бы так
      
       // А лучше так
      // OnTick(); break; // вместо строки выше лучше делать такой вызов (переполнения стека от рекурсивных вызовов быть не должно)
    }

뿐만 아니라 명확하지 않은 사용자 흐름을 끝내기 위해 서두르십시오.

우리는 이벤트 모델 로 작업합니다. 따라서 다음 이벤트의 대기 모드로 전환하려면 현재 이벤트를 최대한 빨리 처리해야 합니다. 시냇물에서 보낸 시간은 블랙홀입니다. 흐름에 더 많은 시간을 할애할수록 우리가 사용하는 거래 환경은 더 구식입니다.

 
Vasiliy Sokolov :

OnTick에서 OnTick 호출 - 재귀를 통한 중요하지 않은 반복:

분명히, 그것이 나를 두렵게 만드는 유일한 것입니다.

우리는 이벤트 모델로 작업합니다. 따라서 다음 이벤트에 대한 대기 모드로 전환하려면 현재 이벤트를 최대한 빨리 처리해야 합니다. 시냇물에서 보낸 시간은 블랙홀입니다. 흐름에 더 많은 시간을 할애할수록 우리 가 사용하는 거래 환경은 더 구식입니다 .

글쎄, 그건 사실이 아니야!
 
:
 void OnTick ()
{
   for ( int i = 0 ; i < symbols.Total(); i++)
   {
      request.symbol = symbols.At(i); 
       OrderSendAsynch(request, result); // Начиная с этой строки, анализировать торговое окружение в текущем потоке не имеет смысла
                                         // Единственная верная стратегия - как можно быстрее завершить цикл, и выйти из OnTick
                                         // Для дальнейшего анализа например в OnTransaction
   }
}

추신 일반적으로 우리는 서로를 절대적으로 이해하지 못합니다. 나는 우리 사이에 어떤 대화도 없을 것이라고 생각합니다.

 
Vasiliy Sokolov :
:

코드에서 일시 중지가 발생한 위치에서 TS를 처음부터 흔들어야 하는 이유는 무엇입니까? 당신은 그것을 가지고 있지 않습니다!

 
fxsaber :

코드에서 일시 중지가 발생한 위치에서 TS를 처음부터 흔들어야 하는 이유는 무엇입니까? 당신은 그것을 가지고 있지 않습니다!

따라서 이 코드는 현재 스레드가 가능한 한 빨리 완료되어야 하는 이유를 보여줍니다. OnTick에서 거래 환경을 쿼리할 수도 없습니다.

 void OnTick ()
{
   for ( int i = 0 ; i < symbols.Total(); i++)
   {
      request.symbol = symbols.At(i); 
      OrderSendAsynch(request, result); // Начиная с этой строки, анализировать торговое окружение в текущем потоке не имеет смысла
                                         // Единственная верная стратегия - как можно быстрее завершить цикл, и выйти из OnTick
                                         // Для дальнейшего анализа например в OnTransaction      
   }
   // Далее торговое окружение начинает меняться. Мы не можем анализировать его в OnTick
   // Бессмысленно зацикливать OnTick дальше.
   // Результат работы этого кода будет неопределен
   Sleep ( 50 );
   int total_1 = OrdersTotal ();
   Sleep ( 50 );
   int total_2 = OrdersTotal ();
   //Результат операции не определен
   if (total_1 == total_2)
}

두 변수를 비교하는 시점에 있으므로 비교할 수 없습니다. 환경은 계속 변화하고 있습니다. total_1 및 total_2의 값이 서로 같지 않거나 둘 다 오래되었거나 존재하지 않는 주문 수를 포함하거나 올바른 값을 포함합니다. OnTick에서 변화하는 거래 환경을 처리하는 것은 의미가 없습니다. 대신 for 루프 직후에 OnTick을 종료하고 거래 환경의 변경을 나타내는 새로운 이벤트를 기다려야 합니다.

 
Vasiliy Sokolov :

따라서 이 코드는 현재 스레드가 가능한 한 빨리 완료되어야 하는 이유를 보여줍니다. OnTick에서 거래 환경을 쿼리할 수도 없습니다.

두 변수를 비교하는 시점에 있으므로 비교할 수 없습니다. 환경은 계속 변화하고 있습니다. total_1 및 total_2의 값이 서로 같지 않거나 둘 다 오래되었거나 존재하지 않는 주문 수를 포함하거나 올바른 값을 포함합니다. OnTick에서 변화하는 거래 환경을 처리하는 것은 의미가 없습니다. 대신 for 루프 직후에 OnTick을 종료하고 거래 환경의 변경을 나타내는 새로운 이벤트를 기다려야 합니다.

왜 일시 중지합니까?


다시 한 번, 일시 중지(슬립 또는 동기 거래 주문) 후에 TS가 흔들려야 합니다. 거래 논리는 처음부터 시작됩니다. 따라서 비동기 거래 주문을 사용하는 경우 언급된 일시 중지가 발생하지 않고 새로운 이벤트가 예상되는 이벤트 기능이 종료됩니다. 비동기 작업이 없으면 전체 거래 논리를 루프 스크립트에 넣을 수도 있습니다.

 
fxsaber :

왜 일시 중지합니까?

다시 한 번, 일시 중지(슬립 또는 동기 거래 주문) 후에 TS가 흔들려야 합니다. 거래 논리는 처음부터 시작됩니다. 따라서 비동기 거래 주문을 사용하는 경우 언급된 일시 중지가 발생하지 않고 새로운 이벤트가 예상되는 이벤트 기능이 종료됩니다. 비동기 작업이 없으면 전체 거래 논리를 루프 스크립트에 넣을 수도 있습니다.

나는 Foma에 대해 이야기하고 당신은 Yeryoma에 대해 이야기합니다. 대화를 끝내자. 반복되는 스크립트를 계속 작성하십시오. 네, 정말 효과가 있지만 작업 방식으로 추천하는 것은 절대 불가능합니다.

 

MT4에서 그런 상황에 대한 경험자들의 의견이 흥미롭습니다. 누가 어떻게 해결합니까?


EA의 TOR는 보류 상태를 유지하고 각 틱의 현재 가격에서 일정 거리에서 열린 포지션 을 취합니다.


브로커의 수정이 가격 틱 사이의 평균 시간 간격보다 약간 더 오래 걸리도록 하십시오.


따라서 역주기(SELECT_BY_POS 인덱스가 감소하는 방향)로 실행하고 해당 OrderModify를 수행합니다.


따라서 이 주기 동안 OnTick에 채워지면 다음과 같은 일이 발생할 수 있습니다.

  1. OrdersTotal은 증가할 수 있습니다(예: 개봉 또는 부분 채우기 손으로).
  2. 보류 중인 항목 및 위치 다시 인덱싱(예: 일부 보류 중인 항목이 주기 중에 실행되었거나 일부 보류 중인 항목이 수동으로 삭제되었으며 일부는 짧은 핑으로 시스템에 설정되었습니다.
  3. 첫 번째 또는 두 번째 지점이지만 OrderSelect 및 OrderModify 오류가 발생하지 않습니다. 주기 동안 1/2절로 인해 일부 주문/포지션은 건너뛰게 됩니다.

어떻게 될 것인가?

이 질문은 위의 논의와 간접적으로 관련되어 있지만 이것은 계속하기 위한 것이 아닙니다(주제는 닫혀 있음). MT5용 MT4Orders에서 명확하지 않은 뉘앙스를 해결해야 합니다. 따라서 MT4를 잘 하는 분들의 설명을 들은 상황에 대한 의견을 듣는 것이 도움이 될 것입니다. 글쎄, 나는 유일한 사람이 아닙니다. 아마도 유용 할 것입니다.


OnTimer를 통해 문제를 해결하려면 아마도 즉시 제공될 것입니다. 그러나 그것 없이 가자 - 오직 OnTick.

 
fxsaber :

MT4에서 그런 상황에 대한 경험자들의 의견이 흥미롭습니다. 누가 어떻게 해결합니까?


EA의 TOR는 보류 상태를 유지하고 각 틱의 현재 가격에서 일정 거리에서 열린 포지션 을 취합니다.


브로커의 수정이 가격 틱 사이의 평균 시간 간격보다 약간 더 오래 걸리도록 하십시오.


따라서 역주기(SELECT_BY_POS 인덱스가 감소하는 방향)로 실행하고 해당 OrderModify를 수행합니다.


따라서 이 주기 동안 OnTick에 채워지면 다음과 같은 일이 발생할 수 있습니다.

  1. OrdersTotal은 증가할 수 있습니다(예: 개봉 또는 부분 채우기 손으로).
  2. 보류 중인 항목 및 위치 다시 인덱싱(예: 일부 보류 중인 항목이 주기 중에 실행되었거나 일부 보류 중인 항목이 수동으로 삭제되었으며 일부는 짧은 핑으로 시스템에 설정되었습니다.
  3. 첫 번째 또는 두 번째 지점이지만 OrderSelect 및 OrderModify 오류가 발생하지 않습니다. 주기 동안 1/2절로 인해 일부 주문/포지션은 건너뛰게 됩니다.

어떻게 될 것인가?

이 질문은 위의 논의와 간접적으로 관련되어 있지만 이것은 계속하기 위한 것이 아닙니다(주제는 닫혀 있음). MT5용 MT4Orders에서 명확하지 않은 뉘앙스를 해결해야 합니다. 따라서 MT4를 잘 하는 분들의 설명을 들은 상황에 대한 의견을 듣는 것이 도움이 될 것입니다. 글쎄, 나는 유일한 사람이 아닙니다. 아마도 유용 할 것입니다.


OnTimer를 통해 문제를 해결하려면 아마도 즉시 제공될 것입니다. 그러나 그것 없이 가자 - 오직 OnTick.

첫째, 상황이 비표준으로 제시되며 문제가 있는 경우 이미 이 상황을 해결한 사람은 거의 없습니다.

순전히 이론적으로:

OrderModify의 경우 역 주기를 구성할 필요가 없으므로 직접

 int i, total = OrdersTotal ();
for (i = 0 ; i < total; i++)

그런 다음 주문 목록 변경에 체크하십시오.

 if (total != OrdersTotal ())
 {
  i = 0 ;
  total = OrdersTotal ();
  continue ;
 }

수에 변경 사항이 있는 경우 새로운 주문 수로 주기를 새로 시작합니다.

그리고 또 다른 질문:

fxsaber :

  1. OrdersTotal은 증가할 수 있습니다(예: 개봉 또는 부분 채우기 손으로).
  2. 보류 중인 항목 및 위치의 재인덱싱(예: 일부 보류 중인 항목이 주기 중에 실행되었거나 일부 보류 중인 항목이 수동으로 삭제 되었으며 일부는 짧은 핑이 있는 시스템에 설정되었습니다.
  3. 첫 번째 또는 두 번째 지점이지만 OrderSelect 및 OrderModify 오류가 발생하지 않습니다. 주기 동안 1/2절로 인해 일부 주문/포지션은 건너뛰게 됩니다.

그들이 추가되면 그들 또는 다른 사람들이 건너 뛸 것이 분명합니다. 방금 삭제된 경우에는 어떻게 됩니까? 주문 목록의 경계를 넘을 수 없습니까?