KimIV의 유용한 기능 - 페이지 12

 

IndexByTicket() 함수.

티켓별 주문 또는 포지션의 인덱스(주문 또는 오픈 포지션의 일반 목록에 있는 일련 번호)를 반환합니다. IndexByTicket() 함수가 필요한 티켓으로 주문이나 위치를 찾을 수 없으면 -1 을 반환합니다. 함수 매개변수로 확인된 주문 또는 위치 목록을 제한할 수 있습니다.

  • sy - 도구 이름. 이 매개변수를 설정하면 이 기능은 지정된 기기에 대해서만 주문과 위치를 확인합니다. NULL 은 현재 도구를 의미하고 "" (기본값)은 모든 도구를 의미합니다.
  • op - 거래 작업, 보류 중인 주문 또는 위치 유형. 유효한 값은 OP_BUY, OP_BUYLIMIT, OP_BUYSTOP, OP_SELL, OP_SELLLIMIT, OP_SELLSTOP 또는 -1 입니다. 기본값 -1 은 모든 주문 또는 위치를 의미합니다.
  • mn - 주문 또는 위치 ID(MagicNumber). 기본값은 -1 - 모든 마법입니다.
 //+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,   http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 20.04.2007                                                     |
//|  Описание : Возвращает индекс ордера или позиции по тикету                 |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    ti - тикет ордера, позиции                                              |
//|    sy - наименование инструмента   (""   - любой символ,                   |
//|                                     NULL - текущий символ)                 |
//|    op - операция                   (-1   - любая позиция)                  |
//|    mn - MagicNumber                (-1   - любой магик)                    |
//+----------------------------------------------------------------------------+
int IndexByTicket ( int ti , string sy = "" , int op =- 1 , int mn =- 1 ) {
   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 == "" ) && ( op < 0 || OrderType () == op )) {
         if (( mn < 0 || OrderMagicNumber () == mn ) && OrderTicket () == ti ) return ( i ) ;
       }
     }
   }
   return ( - 1 ) ;
}
 

사용자 지정 Expert Advisor에서 IndexByTicket() 함수를 작성했습니다. 그것 없이는 불가능했던 것으로 기억합니다. 그렇지 않으면 왜 그것을 쓰기 시작하겠습니까? 그런데 여기에서 어떻게 사용했는지, 왜 원칙적으로 작성했는지는 평생 기억이 나지 않습니다 :-) 어드바이저가 망가진 소스코드를 찾아보세요. 수백 가지가 있습니다.

일반적으로 내가 이미 제시한 것과 유사한 예를 제시하는 것은 의미가 없습니다. 잘 아는 사람은 매개변수를 어디에 둘 것인지 추측할 것입니다. 그리고 IndexByTicket() 함수 사용에 대한 좋은 아이디어가 있는 사람이 있으면 여기에 게시하십시오. 구현하도록 노력하겠습니다.


짧은 발표.

SelectByTicket()SelectByTicketFromHistory() 함수를 제거했습니다. 나 자신도 더 이상 사용하지 않을 것이므로 게시할 이유가 없습니다. 이 주제에 대해 토론하고 싶은 분들은 언제나 환영합니다. 내 모든 망상을 있는 그대로 보여주세요.

 

NumberOfOrders() 함수.

이 함수는 주문 수를 반환하고 기능적으로 ExistOrders() 를 완전히 재정의합니다. ExistOrders() 함수를 NumberOfOrders () 함수로 바꾸려면 반환 값이 0보다 큰지 확인하는 것이 필요하고 충분합니다. 함수 매개변수로 확인된 주문 목록을 제한할 수 있습니다.

  • sy - 도구 이름. 이 매개변수를 설정하면 이 기능은 지정된 악기의 순서만 확인합니다. NULL 은 현재 도구를 의미하고 "" (기본값)은 모든 도구를 의미합니다.
  • op - 보류 중인 주문 유형. 유효한 값은 OP_BUYLIMIT, OP_BUYSTOP, OP_SELLLIMIT, OP_SELLSTOP 또는 -1 입니다. 기본값 -1 은 모든 주문을 의미합니다.
  • mn - 주문 ID(MagicNumber). 기본값은 -1 - 모든 마법입니다.
 //+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,   http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 28.11.2006                                                     |
//|  Описание : Возвращает количество ордеров.                                 |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    sy - наименование инструмента   (""   - любой символ,                   |
//|                                     NULL - текущий символ)                 |
//|    op - операция                   (-1   - любой ордер)                    |
//|    mn - MagicNumber                (-1   - любой магик)                    |
//+----------------------------------------------------------------------------+
int NumberOfOrders ( string sy = "" , int op =- 1 , int mn =- 1 ) {
   int i , k = OrdersTotal () , ko = 0 , ot ;

   if ( sy == " 0 " ) sy = Symbol () ;
   for ( i = 0 ; i < k ; i ++ ) {
     if ( OrderSelect ( i , SELECT_BY_POS , MODE_TRADES )) {
       ot = OrderType () ;
       if ( ot > 1 && ot < 6 ) {
         if (( OrderSymbol () == sy || sy == "" ) && ( op < 0 || ot == op )) {
           if ( mn < 0 || OrderMagicNumber () == mn ) ko ++;
         }
       }
     }
   }
   return ( ko ) ;
}
 

NumberOfOrders() 함수 사용의 예.

  1. 모든 주문의 총 수를 가져옵니다.
     NumberOfOrders () ;
  2. 현재 악기에 대한 주문 수 를 가져옵니다.
     NumberOfOrders ( NULL ) ;
  3. 모든 상품에 대한 BuyLimit 주문 수 가져오기
     NumberOfOrders ( "" , OP_BUYLIMIT ) ;
  4. EURUSD에서 매직 123456으로 SellStop 주문 수를 가져옵니다.
     NumberOfOrders ( " EURUSD " , OP_SELLSTOP , 123456 ) ;
  5. 현재 악기에 대한 magic 2345로 주문 수를 가져옵니다.
     NumberOfOrders ( NULL , - 1 , 2345 ) ;

첨부 파일에서 다시 위의 예제와 함께 작동하는 스크립트입니다.

파일:
 
KimIV :

NumberOfOrders() 함수.

이 함수는 주문 수를 반환하고 기능적으로 ExistOrders() 를 완전히 재정의합니다. ExistOrders() 함수를 NumberOfOrders () 함수로 바꾸려면 반환 값이 0보다 큰지 확인하는 것이 필요하고 충분합니다. 함수 매개변수로 확인된 주문 목록을 제한할 수 있습니다.

  • sy - 도구 이름. 이 매개변수를 설정하면 이 기능은 지정된 악기의 순서만 확인합니다. NULL 은 현재 도구를 의미하고 "" (기본값)은 모든 도구를 의미합니다.
  • op - 보류 중인 주문 유형. 유효한 값은 OP_BUYLIMIT, OP_BUYSTOP, OP_SELLLIMIT, OP_SELLSTOP 또는 -1 입니다. 기본값 -1 은 모든 순서를 의미합니다.
  • mn - 주문 ID(MagicNumber). 기본값은 -1 - 모든 마법입니다. 에코

나는 약간 혼란스러워졌다. 어떤 이유에서인지 모순이 보입니다. 여기:

"... 반환 값이 0보다 큰지 확인하는 것이 필요하고 충분합니다 ."

"이것과 이것만"을 체크하면 주문수에 대한 함수의 의미가 사라집니다!

그것이 내가 그것에 빠져들기 시작한 이유입니다. 내 Expert Advisor에 이 기능을 삽입했습니다. 매개변수에서 m=1로 설정하고 위치를 여는 조건은 다음과 같습니다.

 if ( NumberOfOrders ( "" , - 1 , MagicNumber ) < m ) { //если открытых позиций МЕНЬШЕ m

그러나 전문가는 이 한계를 보지 못하는 것 같습니다! 그리고 그것은 각 신호에 대해 계속해서 주문을 엽니다...

여기서 문제가 될 수 있는 것은 무엇입니까?

 
rid писал (а):
나는 약간 혼란스러워졌다. 어떤 이유에서인지 모순이 보입니다. 여기:
"... 반환 값이 0보다 큰지 확인하는 것이 필요하고 충분합니다 ."
"이것과 이것만"을 체크하면 주문수에 대한 함수의 의미가 사라집니다!

흠... ExistOrders()NumberOfOrders() 함수 각각이 반환하는 정보의 양에 주의를 기울이지 않은 것 같습니다. ExistOrders() 함수는 주문의 존재에 대한 정보만 반환하는 반면 NumberOfOrders() 함수는 주문 수에 대한 정보를 반환합니다. 주문 수에 대한 정보에는 주문의 존재에 대한 정보가 포함됩니다. 주문이 있는지 여부에 대한 질문에 대답해야 할 때 번호에 대한 정보는 중복됩니다. 그렇기 때문에 ExistOrders() 함수를 NumberOfOrders () 함수로 교체하려면 NumberOfOrders () 함수에서 반환된 값이 0보다 큰지 확인하는 것이 필요하고 충분하다고 말한 이유입니다. 결국 이 값이 0이면 주문이 없고 0보다 크면 주문이 있는 것이 분명합니다. ExistOrders() 함수는 주문 개수에 대한 정보가 필요하지 않을 때 사용할 수 있고 NumberOfOrders() 함수는 주문 개수에 대한 정보가 필요하지 않을 때와 필요할 때 사용할 수 있습니다. 이런 의미에서 NumberOfOrders() 함수는 ExistOrders() 함수를 완전히 대체합니다.

제거 :

그것이 내가 그것에 빠져들기 시작한 이유입니다. 내 Expert Advisor에 이 기능을 삽입했습니다. 매개변수에서 m=1로 설정하고 위치를 여는 조건은 다음과 같습니다.

 if ( NumberOfOrders ( "" , - 1 , MagicNumber ) < m ) { //если открытых позиций МЕНЬШЕ m

그러나 전문가는 이 한계를 보지 못하는 것 같습니다! 그리고 그것은 각 신호에 대해 계속해서 주문을 엽니다...

여기서 문제가 될 수 있는 것은 무엇입니까?

그래서... 그리고 여기에서 당신은 명령과 위치를 혼동하는 것 같습니다. 저에게는 이것들이 다른 것입니다. 직책이란 무엇입니까? 이들은 OP_BUY 및 OP_SELL거래 작업 이며 내가 이해하는 주문은 OP_BUYLIMIT, OP_BUYSTOP, OP_SELLLIMIT 및 OP_SELLSTOP 거래 작업입니다. 저는 포지션을 열고 주문을 합니다. 무엇을 열었습니까? NumberOfOrders() 함수는 주문과 함께 작동하도록 설계되었습니다.
 

덕분에. 알았다 . 첫 번째 질문과 두 번째 질문 모두.

즉, "확장된" NumberOfOrders() 함수는 사실 이미 IndexByTicket() 함수를 포함하고 있습니다.

네 확실합니다. OP_BUY 및 OP_SELL을 열었습니다 !

다음 함수인 cat의 예를 제공해야 합니다. 위치와 함께 작동합니다. (주문이 아닌 경우)

포럼 어딘가에 올렸던 걸로 기억합니다. 찾을 수 없습니다.

 
rid писал (а):
다음 함수인 cat의 예를 제공해야 합니다. 위치와 함께 작동합니다. (주문이 아닌 경우)

주문 기능을 마쳤습니다. 또한 위치에 대한 기능이 있습니다. 약 30개


리드 는 다음과 같이 썼습니다.
포럼 어딘가에 이미 게시한 것으로 기억합니다. 찾을 수 없습니다.

검색

 

친애하는 이고르, 도움을 요청합니다! 여러 도구에 대한 직책을 맡을 수 있도록 고문을 추가해야 합니다. 2명의 전문가 고문(표준 MACD 및 Ema)이 있으며 각각 6개의 직위를 가지고 있지만 단 하나의 직위만 열립니다... 이에 대한 귀하의 의견을 읽었지만, 제가 언어에 정통하지 않아서 어디에 추가해야할지 모르겠습니다... 어렵지 않으시면 도와주세요... Ema 어드바이저를 복사했습니다... 감사합니다!



//+----------------------------------------------- --------------------+
//| 포물선.mq4 |
//| 비탈릭 |
//| wwwita@mail.ru |
//+----------------------------------------------- --------------------+
외부 이중 로트=0.1;
외부 이중 Pip=5;
외부 이중 MoveBack=3;
외부 정수 chk=0;
외부 이중 SL=20;
//+----------------------------------------------- --------------------+
//| |
//+----------------------------------------------- --------------------+
정수 시작()
{
이중 hi=높음[1];
이중 lo=낮음[1];
이중 EMA, EMA1, EMA2, EMA3;
int cnt=0, 티켓, 총계;
EMA=iMA(0,0,5,0,MODE_EMA,PRICE_MEDIAN,1);
EMA1=iMA(0,0,10,0,MODE_EMA,PRICE_MEDIAN,1);
EMA2=iMA(0,0,5,0,MODE_EMA,PRICE_MEDIAN,0);
EMA3=iMA(0,0,10,0,MODE_EMA,PRICE_MEDIAN,0);
총계=주문총계();
if(총<1)
{
if(AccountFreeMargin()<(1000*Lots))
{
Print("당신은 돈이 없습니다. 무료 자금 = ", AccountFreeMargin());
리턴(0);
}
if(((EMA>EMA1) && (EMA2<EMA3)) || ((EMA<EMA1) && (EMA2>EMA3)))
{
chk=1;
Print("위치가 가능합니다!");
}
if(chk==1)
{
if(EMA3-EMA2>2*포인트 && 입찰>=(lo+MoveBack*Point))
{
ticket=OrderSend(Symbol(),OP_SELL,Lots,Bid,3,0,0,
"EMA 위치:",16385,0,빨간색);
if(티켓>0)
{
if(OrderSelect(티켓,SELECT_BY_TICKET,MODE_TRADES))
Print("판매 주문이 열렸습니다: ",OrderOpenPrice());
chk=0;
}
또 다른
{
Print("판매 주문 열기 오류: ",GetLastError());
리턴(0);
}
}
if(EMA2-EMA3>2*포인트 && 묻기<=(hi-MoveBack*Point))
{
ticket=OrderSend(Symbol(),OP_BUY,Lots,Ask,3,0,0,
"EMA 위치:",16385,0,녹색);
if(티켓>0)
{
if(OrderSelect(티켓,SELECT_BY_TICKET,MODE_TRADES))
Print("구매 주문이 열렸습니다: ",OrderOpenPrice());
chk=0;
}
또 다른
{
Print("구매 주문 열기 오류: ",GetLastError());
리턴(0);
}
}
}
리턴(0);
}
for(cnt=0;cnt<전체;cnt++)
{
주문 선택(cnt, SELECT_BY_POS, MODE_TRADES);
if(OrderType()<=OP_SELL && // 이것은 오픈 포지션 입니까? OP_BUY 또는 OP_SELL
OrderSymbol()==Symbol()) // 기기가 일치합니까?
{
if(OrderType()==OP_BUY) // 롱 포지션이 열려 있습니다.
{
// 이미 닫을 시간인지 확인합니까?
if(입찰가>=(OrderOpenPrice()+Pip*Point))
{
chk=0;
OrderClose(OrderTicket(),OrderLots(), 입찰, 3, 보라색); // 포지션을 닫는다
리턴(0); // 출구
}
if(입찰가<=(OrderOpenPrice()-SL*포인트))
{
chk=0;
OrderClose(OrderTicket(),OrderLots(), 입찰, 3, 보라색); // 포지션을 닫는다
리턴(0); // 출구
}
}
else // 그렇지 않으면 이것은 숏 포지션입니다.
{
// 이미 닫을 시간인지 확인합니까?
if(Ask<=(OrderOpenPrice()-Pip*Point))
{
chk=0;
OrderClose(OrderTicket(),OrderLots(),Ask,3,바이올렛); // 포지션을 닫는다
리턴(0); // 출구
}
if(Ask>=(OrderOpenPrice()+SL*Point))
{
chk=0;
OrderClose(OrderTicket(),OrderLots(),Ask,3,바이올렛); // 포지션을 닫는다
리턴(0); // 출구
}
}
}
}
반환(0);
}
//+----------------------------------------------- --------------------+
 

Igor, 저는 'INI 파일 작업을 위한 기능 라이브러리'에 있습니다. 질문했는데 답이 없네요 :(