N분 안에 포지션을 하나씩 청산하는 방법은 무엇입니까?

 

mql4
예를 들어 주문을 연 후 5분이 지나면 이 주문이 종료됩니다.
마감 티켓과 각 주문의 분을 별도로 계산 하는 개장 시간 을 기억하는 것은 나에게 너무 배부른 코드로 판명되었습니다.
위치는 1,2,3-10이 될 수 있으며 동시에 사고 팔 수 있습니다.

원하는 티켓을 더 비교하고 닫기 위해 이 데이터를 배열에 저장하는 기능을 알려주실 수 있습니까?


 
따라서 결국 모든 티켓과 개장 시간 은 이미 표준 배열에 있습니다.
타이머로 모든 위치를 반복하고 TimeCurrent()-OrderOpenTime()>=300을 비교합니다.
 
Taras Slobodyanik :
따라서 결국 모든 티켓과 개장 시간 은 이미 표준 배열에 있습니다.
타이머로 모든 위치를 반복하고 TimeCurrent()-OrderOpenTime()>=300을 비교합니다.

표준 배열이란 무엇입니까?
더?

 
배열이 아닌 표준 MQL 함수
Торговые функции - Справочник MQL4
Торговые функции - Справочник MQL4
  • docs.mql4.com
Торговые функции могут использоваться в экспертах и скриптах. Торговые функции OrderSend(), OrderClose(), OrderCloseBy(), OrderModify(), OrderDelete(), изменяющие состояние...
 

5분 후에 한 번에 모두가 아닌 이러한 기능 세트를 사용하여 포지션을 개별적으로 어떻게 청산할 수 있습니까?

첫 번째 열린 위치 가 있고 시간과 티켓이 변수에 기록됩니다.
그런 다음 두 번째 위치가 열리면 사이클에서 마지막 위치로 보고 시간과 티켓을 변수에 씁니다.
그러나 이러한 모든 작업은 덮어 쓰여지고 데이터는 마지막 위치에서만 저장됩니다.

 
Natalya Dzerzhinskaya :

5분 후에 한 번에 모두가 아닌 이러한 기능 세트를 사용하여 포지션을 개별적으로 어떻게 청산할 수 있습니까?

첫 번째 열린 위치 가 있고 시간과 티켓이 변수에 기록됩니다.
그런 다음 두 번째 위치가 열리면 사이클에서 마지막 위치로 보고 시간과 티켓을 변수에 씁니다.
그러나 이러한 모든 작업은 덮어 쓰여지고 데이터는 마지막 위치에서만 저장됩니다.

개봉 후 5분 이내에 마감해야 하는 주문 중에서 정확히 하나의 주문을 선택하는 조건은 완전히 명확하지 않습니다.

그래서 뭐라고 대답해야 할지 모르겠습니다.

조건이 있으면 시작해야 합니다.

그리고 현재는 모두 가상으로 선택되어 하나씩 묶음으로 닫힐 것입니다.

첫 번째 미결 주문은 다음과 같습니다. TimeCurrent()-OrderOpenTime()이 가장 큽니다. 예를 들어 해당 티켓 OrderTicket()

이러한 주기에서 모든 시장 주문을 처리할 수 있습니다.

 int i;      
     for (i= OrdersTotal ()- 1 ; i>= 0 ; i--)
         {
             if ( OrderSelect (i, SELECT_BY_POS , MODE_TRADES ))
               {
                  ............
               }
         }
 
Natalya Dzerzhinskaya :

mql4
예를 들어 주문을 연 후 5분이 지나면 이 주문이 종료됩니다.

Kim Igor의 기능을 확인하십시오.

여기서 vskidku, 함수는 마지막 위치가 열린 후의 시간(초)을 반환합니다.

 //+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 19.02.2008                                                     |
//|  Описание : Возвращает количество секунд после открытия последней позиций. |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    sy - наименование инструмента   (""   - любой символ,                   |
//|                                     NULL - текущий символ)                 |
//|    op - операция                   (-1   - любая позиция)                  |
//|    mn - MagicNumber                (-1   - любой магик)                    |
//+----------------------------------------------------------------------------+
datetime SecondsAfterOpenLastPos( string sy= "" , int op=- 1 , int mn=- 1 ) {
   datetime t= 0 ;
   int       i, k= OrdersTotal ();

   if (sy== "0" ) sy= Symbol ();
   for (i= 0 ; i<k; i++) {
     if ( OrderSelect (i, SELECT_BY_POS , MODE_TRADES )) {
       if ( OrderSymbol ()==sy || sy== "" ) {
         if ( OrderType ()== OP_BUY || OrderType ()== OP_SELL ) {
           if (op< 0 || OrderType ()==op) {
             if (mn< 0 || OrderMagicNumber ()==mn) {
               if (t< OrderOpenTime ()) t= OrderOpenTime ();
            }
          }
        }
      }
    }
  }
   return ( TimeCurrent ()-t);
}

필요에 맞게 수정하십시오. 그것에 하나의 선택된 위치 를 닫는 기능을 추가하십시오.

 
Renat Akhtyamov :

개봉 후 5분 이내에 마감해야 하는 주문 중에서 정확히 하나의 주문을 선택하는 조건은 완전히 명확하지 않습니다.

좀 더 간단하게 설명하자면 다음과 같습니다.

시장에는 1차 주문이 있고 그 다음에는 2차, 3차 등이 있습니다.
첫 번째 주문은 만료되었으며 닫혀야 하며 두 번째 주문은 시리즈의 첫 번째 주문이 되었으며 시간이 만료되었으며 닫혀 있어야 합니다.
실제로 >=5*60인 경우 마감하려면 가장 오래된 주문을 선택해야 합니다.
그러나 티켓으로 마감하는 시리즈에서 선택하려면 오픈 주문에서 티켓의 가장 작은 값을 어떻게 든 결정하고 수명을 결정해야합니다.

알렉산드르 볼로트코 :

Kim Igor의 기능을 확인하십시오.

여기서 vskidku는 마지막 위치를 연 후의 시간(초)을 반환합니다.

맞지 않습니다. 시장의 첫 번째 위치에 관심이 있습니다.

 
Natalya Dzerzhinskaya :

좀 더 간단하게 설명하자면 다음과 같습니다.

시장에는 1차 주문이 있고 2차, 3차 등이 있습니다.
첫 번째 주문은 만료되었으며 닫혀야 하며 두 번째 주문은 시리즈의 첫 번째 주문이 되었으며 시간이 만료되었으며 닫혀 있어야 합니다.
실제로 >=5*60인 경우 마감하려면 가장 오래된 주문을 선택해야 합니다.
그러나 티켓으로 마감하는 시리즈에서 선택하려면 오픈 주문에서 티켓의 가장 작은 값을 어떻게 든 결정하고 수명을 결정해야합니다.

맞지 않습니다. 시장의 첫 번째 위치에 관심이 있습니다.


그럼 뭐가 문제야?

  1. 전문가가 개설한 가장 오래된 주문을 찾습니다. 가장 작은 OrderOpenTime()이 있습니다.
  2. 이 주문이 열린 순간부터현재 시간 까지 경과한 시간을 비교합니다. 지정된 값보다 크거나 같으면 닫습니다.
 int nOlderTicket = - 1 ;
datetime dtOlderOrderTime = D'3000.12.30' ;
for ( int i = OrdersTotal () - 1 ; i >= 0 ; --i)
{
   if (! OrderSelect (i, SELECT_BY_POS ))
       continue ;

   if ( OrderSymbol () != Symbol ())
       continue ;

   if ( OrderMagicNumber () != i_nMagicNumber)
       continue ;

   if (nOlderTicket < 0 || OrderOpenTime () < dtOlderOrderTime)
   {
      nOlderTicket = OrderTicket ();
      dtOlderOrderTime = OrderOpenTime ();
   }
}

if ( TimeCurrent () - dtOlderOrderTime >= время в секундах)
{
   // Закрыть ордер nOlderTicket
}


 
Natalya Dzerzhinskaya :

좀 더 간단하게 설명하자면 다음과 같습니다.

시장에는 1차 주문이 있고 2차, 3차 등이 있습니다.
첫 번째 주문은 만료되었으며 닫혀야 하며 두 번째 주문은 시리즈의 첫 번째 주문이 되었으며 시간이 만료되었으며 닫혀 있어야 합니다.
실제로 >=5*60인 경우 마감하려면 가장 오래된 주문을 선택해야 합니다.
그러나 티켓으로 마감하는 시리즈에서 선택하려면 오픈 주문에서 티켓의 가장 작은 값을 어떻게 든 결정하고 수명을 결정해야합니다.

맞지 않습니다. 시장의 첫 번째 위치에 관심이 있습니다.

존재 시점까지, 당신은 모든 최초 공개 주문과 마지막 주문 모두에서 선택할 수 있습니다. 동시에 우리는 티켓과 존재 시간(초)을 기억합니다. 예를 들어

 int i, DeltaTimeOpen, prevDeltaMax, prevDeltaMin, TicketFirst, TicketLast, DeltaTimeClose;  
//---------------
prevDeltaMax= 0 ; prevDeltaMin= 9999999999999 ; TicketFirst=0; TicketLast=0; DeltaTimeClose = 5*60;     
     for (i= OrdersTotal ()- 1 ; i>= 0 ; i--)
         {            
            if ( OrderSelect (i, SELECT_BY_POS , MODE_TRADES ))
               { 
                  DeltaTimeOpen = TimeCurrent ()- OrderOpenTime ();//возраст ордера в секундах
                  if (DeltaTimeOpen>=DeltaTimeClose)
                  {
                     if (DeltaTimeOpen>prevDeltaMax)
                     {                         
                         TicketLast= OrderTicket ();//последний  
                         prevDeltaMax=DeltaTimeOpen;//возраст                    
                     }
                     if (DeltaTimeOpen<prevDeltaMin)
                     {
                         TicketFirst= OrderTicket (); //первый
                         prevDeltaMin=DeltaTimeOpen;//возраст                                              
                     }
                  }
               }
         }
if(TicketFirst>0)
{
//ну и пошло-поехало...
}

 

가장 간단한 방법은 주문을 마감해야 하는 시간을 댓글 필드에 작성하는 것입니다.

그런 다음 닫는 데 가장 가까운 시간만 기억하면 됩니다(심지어 최적화된 경우에도 마찬가지입니다).

타이머 또는 원하는 대로 "수정"할 시간이 되면 미결 주문을 순환하고 수명 이 주석에 지정된 기간을 초과한 주문을 마감합니다.