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

 
delf :

제가 표현을 잘못했을수도 있어요 :(

주문을 여는 알고리즘이 있습니다.

마지막 주문을 닫는 옵션의 경우 다음 주문이 다른 방향으로 열려야 합니다(각각 조건이 나타날 때).

모든 것이 작동하지만, 예를 들어 매도에 의해 손절매가 마감되고 이 방향으로 매도를 여는 조건이 있으면 개설이 계속됩니다. 그리고 매수 조건을 기다려야 합니다.

즉, 마지막 마감 주문이 시작 주문과 일치하지 않도록 확인해야 합니다(매수-매도-매도-팔기 교대로). 작동 중이거나 신호를 기다리는 주문은 하나만 있습니다.

나는 그것이 OrdersHistoryTotal()을 통해 필요할 가능성이 높다는 것을 이해하지만 작동하는 Expert Advisor에서는 어떻게 보일 수 있습니까?

고맙습니다.


아마 그런 곳이겠지. 단, 내역에 주문이 많다면 주문내역을 이용하는 것이 좋습니다. https://www.mql5.com/ru/articles/1404 https://www.mql5.com/ru/articles/1390
 //+------------------------------------------------------------------+
//|                                                         0000.mq4 |
//+------------------------------------------------------------------+
#property copyright ""
#property link       ""
void CloseOrder( string signal)
   {
   int       i,Ticket=- 1 ,error; 
   double    Price;
   datetime time= 0 ;
   for (i= 0 ;i<OrdersHistoryTotal();i++)  
      {
       if (! OrderSelect (i,SELECT_BY_POS,MODE_HISTORY));
         {
         error= GetLastError (); Print ( "Ошибка OrderSelect() = " , error);
      }
       if (OrderSymbol()== Symbol ()&&(OrderMagicNumber()==magic
      ||OrderClosePrice()==OrderStopLoss())
         {
         if (OrderCloseTime()>time)
            {
            time=OrderCloseTime();Ticket=OrderTicket();
         }
      }
   }
   if (! OrderSelect (Ticket,SELECT_BY_TICKET,MODE_HISTORY))
      {
      error= GetLastError (); Print ( "Ошибка OrderSelect() = " ,error);
   }
   if (OrderType()==OP_BUY&&signal== "CloseBUY" ||OrderType()==OP_SELL&&signal== "CloseSELL" ) return ;
   if (signal== "CloseBUY" )Price= NormalizeDouble (Bid, Digits );
   if (signal== "CloseSELL" )Price= NormalizeDouble (Ask, Digits );
   for (i= 0 ;i< OrdersTotal ();i++)  
      {
       if (! OrderSelect (i,SELECT_BY_POS,MODE_TRADES));
         {
         error= GetLastError (); Print ( "Ошибка OrderSelect() = " ,error);
      }
       if (OrderSymbol()== Symbol ()&&(OrderMagicNumber()==magic)
         {
         if (OrderType()==OP_BUY&&signal== "CloseBUY" ||OrderType()==OP_SELL||signal== "CloseSELL" )
            {
            Ticket=OrderClose(OrderTicket(),OrderLots(),Price, 0 , CLR_NONE );
         }
      }
       if (Ticket< 0 )
         {
         error= GetLastError (); Print ( "Ошибка = " ,error);
      }
   }
   return ;
}
       
 
peshihod :

더 엄격한 버전

응답해 주신 모든 분들께 깊은 감사를 드리며 필요한 결과를 얻었습니다.
 
delf :

제가 표현을 잘못했을수도 있어요 :(

주문을 여는 알고리즘이 있습니다.

마지막 주문을 닫는 옵션의 경우 다음 주문이 다른 방향으로 열려야 합니다(각각 조건이 나타날 때).

모든 것이 작동하지만, 예를 들어 매도에 의해 손절매가 마감되고 이 방향으로 매도를 여는 조건이 있으면 개설이 계속됩니다. 그리고 매수 조건을 기다려야 합니다.

즉, 마지막 마감 주문이 시작 주문과 일치하지 않도록 확인해야 합니다(매수-매도-매도-팔기 교대로). 작동 중이거나 신호를 기다리는 주문은 하나만 있습니다.

나는 그것이 OrdersHistoryTotal()을 통해 필요할 가능성이 높다는 것을 이해하지만 작동하는 Expert Advisor에서는 어떻게 보일 수 있습니까?

고맙습니다.

프로그래밍 방법을 배우거나 다른 사람의 코드를 구문 분석하려는 경우(CodaBase는 이를 위해 설계됨) 문제 해결을 위한 알고리즘에서 시작합니다. 코딩을 요청하는 것은 가장 희망 없는 학습 방법입니다. 대부분의 경우 이웃이 매분 초인종을 울리고 "이름이 무엇입니까?"와 같은 (우화적) 문제를 해결하는 데 있어 최상의 코드 버전을 받지 못할 것입니다. 이것은 불필요한(과도한) 계산에 관한 것입니다.

문제를 해결하기 위한 알고리즘은 다음과 같습니다. 먼저 "귀하의" 주문이 없는지 확인하십시오. 이 작업은 테스터가 아닌 경우(if(OrdersTotal() == 0) 조건으로 제한될 수 있음) OrderMagicNumber() 및 Symbol()을 일치시키는 필터를 사용하여 주문을 반복함으로써 해결됩니다. 그런 다음 (전략에 따라) 조건을 확인하여 주문을 엽니다. 신호가 있는 경우 OrdersHistoryTotal()(일반적으로 목록의 마지막 항목)을 반복하여 마지막으로 마감된 주문의 OrderType()을 계산합니다. 열려는 신호와 마지막으로 마감된 주문의 유형이 일치하지 않으면 신호에서 주문을 엽니다.

이 접근 방식은 최소한의 계산을 포함하고 테스터에서 Expert Advisor 최적화 시간을 크게 줄입니다.

 
TarasBY :
얼마 전에 마지막 위치 검색을 해결하는 알고리즘을 제공 했습니다. 그리고 그것들로 무엇을 하느냐는 중요하지 않습니다. STOP을 세고, 삭제하고, 수정하는 것입니다. 적어도 "이미지와 유사성"으로 코드를 작성할 수 없다면 이것은 당신의 (프로그래밍)이 아닙니다 ...


예, 동의합니다. 프로그래밍은 제 일이 아니기 때문에 여기에서 배우고 질문을 하고 있습니다. 귀하의 알고리즘에 포지션 클로징을 추가 하려고 시도했지만 작동하지 않았습니다(모든 구매 포지션이 클로즈됨). 그래서 나는 다른 쪽에서 문제에 접근하기로 결정하고 완성된 포지션에서 마지막 두 구매 포지션을 클로징하는 솔루션을 살펴보기로 했습니다. 나에게 제공되고 제안된 차단, 폐쇄 .

그리고 귀하의 예를 사용하여 마지막 두 매수 포지션을 마감하는 방법을 보여주시면 대단히 감사하겠습니다. 나는 내가 실수한 부분을 이해한다.

 double profits_buy_2pos()
{
     int ordercount = 0 , OpenOrders = OrdersTotal ();
     double pr_buy = 0 ;
     for ( int cnt = OpenOrders - 1 ; cnt >= 0 ; cnt--)   // scan all orders and positions. ..
    {
         if (! OrderSelect (cnt, SELECT_BY_POS)) return ( 0.0 );
         if (OrderSymbol() != Symbol ()) continue ;
         if (OrderMagicNumber() != magic) continue ;
         if (OrderType() != OP_BUY) continue ;
        pr_buy += OrderProfit();
        ordercount++;
         if (ordercount == 2 ) break ;
    } 
     Print ( "::::::::::::::::::::::::: pr_buy2 = " , pr_buy);   
     Print ( "::::::::::::::::::::::::: ordercount = " , ordercount);    
     return (pr_buy);   
}

 
TarasBY :

프로그래밍 방법을 배우거나 다른 사람의 코드를 구문 분석하려는 경우(CodaBase는 이를 위해 설계됨) 문제 해결을 위한 알고리즘에서 시작합니다. 코딩을 요청하는 것은 가장 희망 없는 학습 방법입니다. 대부분의 경우 이웃이 매분 초인종을 울리고 "이름이 무엇입니까?"와 같은 (우화적) 문제를 해결하는 데 있어 최상의 코드 버전을 받지 못할 것입니다. 이것은 불필요한(과도한) 계산에 관한 것입니다.

전적으로 동의한다. 당신이 100% 맞습니다. 이것이 올바른 길이며 정직하게 따르려고 노력했습니다. 하지만 교과서 수준에서 MQL4를 공부하고 목표 없이 읽는 것은 아무 소용이 없었다. 어떤 이유에서든 다른 사람의 코드를 분해해야 했습니다. 대부분의 경우 내 미친 아이디어를 프로그램 프레임워크에 넣는 것이 불가능했기 때문입니다. 저는 .... 엑셀로 전략을 세우기 시작했습니다. 전략의 기초를 깨는 측면에서 이것은 매우 성공적이고 분명합니다(물론 역사상). 정직한 수학은 손익을 있는 그대로 보여줍니다. 그러나 여전히 거래의 특성인 유동 스프레드, 스왑, DC의 기능을 고려해야 합니다. 이 모든 것을 엑셀 공식에 넣는 것은 이미 어렵습니다. 그래서 엑셀과 MQL의 이익의 차이가 무엇인지 알고 싶었습니다. 솔직히 - 그 차이는 크며 나에게 유리하지 않습니다. 어째서인지, 아직 모르겠어. 각자의 입장을 분석해 보겠다. 어드바이저의 실수가 있을지도 모르지만, 이건 이미 나다.

어쨌든 이 포럼의 친절한 사람들이 한 가지 특정 문제를 해결하는 데 도움을 주었습니다. 많은 사람들에게 감사드립니다.

 
Ekburg :

아니요, 그 중 하나가 닫혀있을 때 위치 일련 번호를 변경하는 문제가 해결되었습니다. 여기에 오류가있을 수 있다고 생각하여 두 번 이상 확인했지만 모든 것이 정상이며 필요한 순서가 선택되고 중지됩니다. 손실이 올바르게 계산되었지만 주문이 수정되기를 원하지 않습니다. .

오류 1 OrderModify () 함수에 전달된 모든 매개변수가 수정 중인 주문의 모든 매개변수와 동일한 경우에만 발생합니다. 유효성 검사를 사용하는 예:

"KimIV의 유용한 기능"만.

ModifyOrder() 함수 https://www.mql5.com/ru/forum/131859

 
rigonich :

오류 1 OrderModify () 함수에 전달된 모든 매개변수가 수정 중인 주문의 모든 매개변수와 동일한 경우에만 발생합니다.

1 (ERR_NO_RESULT) - 매개변수가 변경되지 않았거나 오류가 없지만 결과를 알 수 없는 경우 어떤 이유로 인해 순서가 수정되지 않고 있을 가능성이 큽니다...
 
abeiks :

예, 동의합니다. 프로그래밍은 제 일이 아니기 때문에 여기에서 배우고 질문을 하고 있습니다. 귀하의 알고리즘에 포지션 클로징을 추가 하려고 시도했지만 작동하지 않았습니다(모든 구매 포지션이 클로즈됨). 그래서 나는 다른 쪽에서 문제에 접근하기로 결정하고 완성된 포지션에서 마지막 두 구매 포지션을 클로징하는 솔루션을 살펴보기로 했습니다. 나에게 제공되고 제안된 차단, 폐쇄 .

그리고 귀하의 예를 사용하여 마지막 두 매수 포지션을 마감하는 방법을 보여주시면 대단히 감사하겠습니다. 나는 내가 실수한 부분을 이해한다.

int Slippage = 3;
int Close_buy_2pos()
{
    int ordercount = 0, OpenOrders = OrdersTotal();
    for (int cnt = OpenOrders - 1; cnt >= 0; cnt--)   // scan all orders and positions. ..
    {
        if (!OrderSelect (cnt, SELECT_BY_POS)) return (ordercount);
        if (OrderSymbol() != Symbol()) continue;
        if (OrderMagicNumber() != magic) continue;
        if (OrderType() != OP_BUY) continue;
        if (OrderClose (OrderTicket(), OrderLots(), Bid, Slippage)) ordercount++;
        else return (ordercount);
        if (ordercount == 2) break;
    } 
    Print ("::::::::::::::::::::::::: ordercount = ", ordercount);    
    return (ordercount);   
}

일반적으로 그렇습니다. "노인" 옵션을 사용하는 경우(저는 사용) 주기를 실행해야 합니다. 먼저 마지막으로 열린 BUY 위치 를 찾은 다음 티켓으로 삭제하고 필요한 만큼 반복합니다.

추신 BUY 및 SELL에 대한 기능을 별도로 작성하는 것은 초기에 변형(IMHO)입니다.

그리고 이 경우 함수는 훨씬 더 복잡해 보이지 않습니다.

 int Slippage = 3 ;
int Close_LastPos ( string fs_Symbol,
                   int fi_Magic,
                   int fi_Type = - 1 ,   // тип закрываемых позиций
                   int fi_cnt = 1 )     // количсетво закрываемых позиций
{
     int ordercount = 0 , OpenOrders = OrdersTotal ();
     double ld_PriceClose;
     for ( int cnt = OpenOrders - 1 ; cnt >= 0 ; cnt--)   // scan all orders and positions. ..
    {
         if (! OrderSelect (cnt, SELECT_BY_POS)) return (ordercount);
         if (OrderSymbol() != fs_Symbol) continue ;
         if (OrderMagicNumber() != fi_Magic) continue ;
         if (OrderType() != fi_Type) if (fi_Type != - 1 ) continue ;
         if (OrderType() > 1 ) continue ;
         if (OrderType() == OP_BUY) ld_PriceClose = NormalizeDouble (Bid, Digits );
         else ld_PriceClose = NormalizeDouble (Ask, Digits );
         if (OrderClose (OrderTicket(), OrderLots(), ld_PriceClose, Slippage)) ordercount++;
        else return (ordercount);
        if (ordercount == fi_cnt) break ;
    } 
     Print ( "::::::::::::::::::::::::: ordercount = " , ordercount);    
     return (ordercount);   
}
 
Ekburg :

1 (ERR_NO_RESULT) - 매개변수가 변경되지 않았거나 오류가 없지만 결과를 알 수 없는 경우 어떤 이유로 인해 순서가 수정되지 않고 있을 가능성이 큽니다...
ERR_NO_RESULT 는 or, 즉 No error가 아니지만 결과는 알 수 없습니다 . 이 오류가 반환되는 경우는 위에 나와 있습니다. OrderModify () 함수 다음에 GetLastError() 함수가 호출되면 오류 코드( 즉, 주문이 수정되지 않은 이유 ) 또는 0(수정이 성공한 경우) 반환합니다. 거래 주문이 체결되었다는 것입니다.

 
TarasBY :

일반적으로 그렇습니다. "노인" 옵션을 사용하는 경우(저는 사용) 주기를 실행해야 합니다. 먼저 마지막 열린 BUY 위치를 찾은 다음 티켓으로 삭제하고 필요한 만큼 반복합니다.

추신 BUY 및 SELL에 대한 기능을 별도로 작성하는 것은 초기에 변형(IMHO)입니다.

그리고 이 경우 함수는 훨씬 더 복잡해 보이지 않습니다.


감사합니다. 조사해 보겠습니다.