[아카이브!] 포럼을 어지럽히 지 않도록 초보자 질문. 프로, 놓치지 마세요. 너 없이는 아무데도 - 2. - 페이지 294

 
CreAndr :
트롤에 대해 질문이 있습니다. 누가 나에게 말해줄 수 있습니까? 손익분기점에 맞는 트롤인 것 같지만 작동하지 않습니다.

여기에 트롤이 있습니다: https://www.mql5.com/en/forum/131859

텍스트에 코드를 삽입하려면 텍스트 입력 필드 위에 있는 SRC 버튼을 누릅니다.

 
DhP :

여기에 트롤이 있습니다: https://www.mql5.com/en/forum/131859

텍스트에 코드를 삽입하려면 텍스트 입력 필드 위에 있는 SRC 버튼을 누릅니다.


고맙습니다.
 
CreAndr :
트롤에 대해 질문이 있습니다. 누가 나에게 말해줄 수 있습니까? 손익분기점에 맞는 트롤인 것 같지만 작동하지 않습니다.


중요도 내림차순으로 원인 나열:

1. 컴퓨터는 포함되어 있지 않습니다

2. 메타 트레이더는 포함되지 않습니다.

3. 차트에 스크립트가 설치되어 있지 않습니다.

4. 고문은 허용되지 않습니다.

5. 트롤할 것이 없습니다.

6. 코드에 문제가 있습니다.

 
Roger :


중요도 내림차순으로 원인 나열:

1. 컴퓨터는 포함되어 있지 않습니다

2. 메타 트레이더는 포함되지 않습니다.

3. 차트에 스크립트가 설치되어 있지 않습니다.

4. 고문은 허용되지 않습니다.

5. 트롤할 것이 없습니다.

6. 코드에 문제가 있습니다.

훌륭한 답변입니다. Roger, 하지만 컴퓨터가 켜져 있고 메타 트레이더도 있고 고문이 차트에 첨부되어 있고 고문이 허용되고 거래가 열리고 따라서 추적할 것이 있습니다! 그러나 코드에서 무엇이 잘못되었는지, 이것이 질문이었습니다.
 
artmedia70 :
OrderOpenTime() 사용
그는 무엇을 위해 필요합니까?


그래서 네, 하지만 일련번호에 따르면 상당히 짧은 것으로 나타났습니다. 그리고 OrderOpenTime을 사용하면 어떻게 해야 하는지 이해가 되지 않습니다 . 오픈 시간 을 어딘가에 놓고 목록의 다음 주문과 비교해야 합니다. 시간이 더 길면 변수 등을 다시 작성하십시오. 나는 아직 알고리즘에 익숙하지 않다.


 bool DeleteOrders()
{
   for ( int i= 0 ; i <= OrdersTotal () ; i++)
      {
       if ( OrderSelect (i,SELECT_BY_POS,MODE_TRADES))
         {
         if ( Symbol ()==OrderSymbol())
            {
             if (OrderType()!= OP_SELL)
               {
               int ticket=OrderTicket();
               OrderDelete(ticket);
               return (true);
               }
            }
         }
      }
return (false);
} 
 
CreAndr :
훌륭한 답변입니다. Roger, 하지만 컴퓨터가 켜져 있고 메타 트레이더도 있고 고문이 차트에 첨부되어 있고 고문이 허용되고 거래가 열리고 따라서 추적할 것이 있습니다! 그러나 코드에서 무엇이 잘못되었는지, 이것이 질문이었습니다.


처음에는 코드가 없었고 나중에 첨부했습니다.

아마도 주문 시작 기능에 후행을 넣어 작동하지 않기 때문일 것입니다. 즉, 주문을 여는 조건이 와서 주문이 열리고 더 이상 나오지 않을 수 있습니다.

 
Pyro :

그래서 예, 하지만 일련 번호에 따르면 매우 짧은 것으로 나타났습니다. 그리고 OrderOpenTime을 사용하면 어떻게 해야 하는지 이해가 되지 않습니다. 오프닝 시간을 어딘가에 놓고 목록의 다음 주문과 비교해야 합니다. 시간이 더 길면 변수 등을 다시 작성하십시오. 나는 아직 알고리즘에 익숙하지 않다.


일련 번호로는 신뢰할 수 없으며 테스터에 대해서만 이 번호 지정에서 아무 것도 보장하지 않습니다. 몇 페이지 전에 열린 주문과 유사하게 마지막으로 마감된 주문을 검색하는 코드를 작성했습니다. 모든 것이 간단합니다. 그들은 그것을 분류하고 티켓을 기억한 다음 티켓에 대한 순서나 포즈를 선택했습니다. 그게 전부입니다.

   int lastclosetime=- 1 ;
   int lastcloseticket=- 1 ;
   int lastdealtype= 0 ;

   for ( int i= 0 ; i<OrdersHistoryTotal(); i++) 
  {
     if (! OrderSelect (i, SELECT_BY_POS, MODE_HISTORY)) continue ; 
     if (OrderSymbol()==symbol || OrderMagicNumber()==magic) 
    {
       if (lastclosetime<OrderCloseTime()) 
      {
        lastclosetime=OrderCloseTime();
        lastcloseticket=OrderTicket();
      }
    }
  }

   if ( OrderSelect (lastcloseticket, SELECT_BY_TICKET, MODE_HISTORY)) 
  {
     if (OrderType()==OP_BUY) lastdealtype= 1 ;
     if (OrderType()==OP_SELL) lastdealtype=- 1 ;   
  }
 
Figar0 :


일련 번호로는 신뢰할 수 없으며 테스터에 대해서만 이 번호 지정에서 아무 것도 보장하지 않습니다. 몇 페이지 전에 열린 주문과 유사하게 마지막으로 마감된 주문을 검색하는 코드를 작성했습니다. 모든 것이 간단합니다. 그들은 그것을 분류하고 티켓을 기억한 다음 티켓에 대한 순서나 포즈를 선택했습니다. 그게 전부입니다.

감사합니다. 정말 간단합니다. 나는 이것을 정리할 것이다.
 
Roger :


처음에는 코드가 없었고 나중에 첨부했습니다.

아마도 주문 시작 기능에 후행을 넣어 작동하지 않기 때문일 것입니다. 즉, 주문을 여는 조건이 와서 주문이 열리고 더 이상 나오지 않을 수 있습니다.

알았어 고마워.
 
Figar0 :


일련 번호로는 신뢰할 수 없으며 테스터에 대해서만 이 번호 지정에서 아무 것도 보장하지 않습니다. 몇 페이지 전에 열린 주문과 유사하게 마지막으로 마감된 주문을 검색하는 코드를 작성했습니다. 모든 것이 간단합니다. 그들은 그것을 분류하고 티켓을 기억한 다음 티켓에 대한 순서나 포즈를 선택했습니다. 그게 전부입니다.

코드가 잘못되었습니다.

먼저 다음과 같습니다.

 if (OrderSymbol()== symbol || OrderMagicNumber()== magic ) 

주문 기호가 기호 변수에 지정된 기호와 같 거나 주문의 마법은 마법의 마법 과 동일합니다 ... 따라서 기호 기호 가있는 주문이 선택되고 마법이 다르거나 없으면 조건이 충족됩니다. 이것이 아니면 저것이기 때문에... 따라서 or 대신 and 넣어야 하지만 검사를 별도의 줄로 분리하는 것이 좋습니다. 루프가 더 빨라지므로 최적화에 중요합니다.

다음... 티켓으로 선택: 매개변수는 무시됩니다. 즉, 여기에 쓰는 것은 무의미합니다.

 if ( OrderSelect (lastcloseticket, SELECT_BY_TICKET, MODE_HISTORY )) 

티켓으로 주문을 성공적으로 선택한 후에는 시장 또는 폐쇄된 주문 중에서 어떤 주문이 선택되었는지 확인해야 합니다. 이렇게 하려면 주문 마감 시간을 확인해야 하며 0보다 크면 주문이 확실히 마감된 것입니다. 열린 위치의 경우 이 매개변수는 항상 0과 같습니다. IMHO는 마지막 주문을 선택한 후 즉시 유형을 확인하고 변수에 입력해야 합니다.

이제 함수는 다음과 같이 보일 것입니다.

 int    GetTypeLastClosePos( int symbol, int magic)   // Функция возвращает 0 если последний закрытый Бай, 1 - если Селл и -1 при ошибке
{
int    i, lastclosetime= 0 , 
         lastdealtype=- 1 ;

   for (i= 0 ; i<OrdersHistoryTotal(); i++) {
       if ( OrderSelect (i, SELECT_BY_POS, MODE_HISTORY)) { // Если выбрали ордер в истории
         if (OrderSymbol()!=symbol)           continue ;   // Если его символ не равен переданному в функцию - идём к следующему
         if (OrderMagicNumber()!=magic)       continue ;   // Если его магик не равен переданному в функцию - идём к следующему
         if (OrderType()> 1 )                   continue ;   // Если ищем только Бай и Селл, значит если больше единицы - к следующему
         // ... теперь выбранный ордер соответствует критериям поиска по символу, магику и типу
         if (lastclosetime<OrderCloseTime()) {           // Посмотрим время его закрытия и если оно больше предыдущего, то...
            lastclosetime=OrderCloseTime();               // ... запишем его как предыдущее
            lastdealtype=OrderType();                     // Тип текущего закрытого ордера: 0 для Бай, 1 для Селл
            }
         }
       else if (! OrderSelect (i, SELECT_BY_POS, MODE_HISTORY)) { // Иначе, если не удалось выбрать ордер в истории
         Print ( "Func: GetTypeLastClosePos, Ошибка выбора ордера - " , GetLastError ());   // Посмотрим номер ошибки
         break ;                                                 // Выходим из цикла перебора ордеров
         }
      }
   return (lastdealtype);
}

이제 현재 차트의 매수 또는 매도만 확인하고 어떤 차트가 마지막으로 마감되었는지 확인하기 위해 이 함수를 다음과 같이 호출합니다.

 int LastPoseType=GetTypeLastClosePos( Symbol (), Magic);
if (LastPoseType==OP_BUY) {
   // ... код, если последний закрытый Buy ...
   }
if (LastPoseType==OP_SELL) {
   // ... код, если последний закрытый Sell ...
   }
else { // ... код обработки ошибки ... }

오류를 처리하기 위해 원칙적으로 예를 들어 전역 변수 를 만들 수 있습니다. 실수 ; 함수 자체의 본문에서 이 변수에 오류 번호를 저장합니다.

 else if (! OrderSelect (i, SELECT_BY_POS, MODE_HISTORY)) { // Иначе, если не удалось выбрать ордер в истории
         err= GetLastError ();                                                     // Посмотрим номер ошибки
         Print ( "Func: GetTypeLastClosePos, Ошибка выбора ордера - " ,err);       // Сообщим об ошибке и в какой ф-ции она произошла
         break ;                                                                  // Выходим из цикла перебора ордеров
         }

그런 다음 함수 호출 후 오류를 처리하려면 ...

GetTypeLastClosePos( Symbol (), Magic);

... 오류가 발생하면 해당 번호는 err 변수에 있고 이 번호는 처리 블록에서 처리됩니다.

 else {
   if (err==???) {
       // обработка этой ошибки
      }
   if (err==???) {
       // обработка этой ошибки
      }
// ... и т.д. ...
   }

스위치 를 사용하는 것이 좋습니다.