초보자의 질문 MQL5 MT5 MetaTrader 5 - 페이지 828

 
인사말. 질문은 대부분 논리적입니다.
증가 횟수에 제한이 있는 이른바 안티 마틴게일 시스템. 차익실현 시, 다음 로트는 1배 증가합니다. 손실이 발생하거나 연속으로 수익성 있는 포지션의 수가 지정된 수를 초과하는 경우, 로트는 시작 포지션과 동일합니다.
지정된 수익성 포지션 수를 초과한 후 증가 주기를 다시 시작하는 방법은 무엇입니까?
 int K_U_= 5 ;
double   LotExponent= 2.00 ;
//+------------------------------------------------------------------+
double llot()
  {
   double lt1=LotLastCloPos( Symbol (),m_magic);//лот последней закрытой позиции
   if (CountProfit( Symbol (),m_magic)>= 1 && CountProfit( Symbol (),m_magic)<K_U_)
      LotSize=lt1*LotExponent; //
   else
      LotSize=Lots;
   return (LotSize);
  }


/

 
lil_lil :
인사말. 질문은 대부분 논리적입니다.
증가 횟수에 제한이 있는 이른바 안티 마틴게일 시스템. 차익실현 시, 다음 로트는 1배 증가합니다. 손실이 발생하거나 연속으로 수익성 있는 포지션의 수가 지정된 수를 초과하는 경우, 로트는 시작 포지션과 동일합니다.
지정된 수익성 포지션 수를 초과한 후 증가 주기를 다시 시작하는 방법은 무엇입니까?


/

손절매 이익 실현 코드의 예: 로트 크기는 글로벌 프로그램 수준(헤더)에서 선언된 "ExtLot" 변수에 저장(덮어쓰기, 증가 및 최소값으로 재설정)됩니다. OnTradeTransaction()에서 "시장 출구" 유형의 거래가 포착되고 거래가 어떻게 마감되었는지 확인합니다 - 이익실현 또는 손절매:

         if (deal_entry== DEAL_ENTRY_OUT )
           {
             if (deal_reason== DEAL_REASON_SL )
               ExtLot*= 2.0 ;
             else if (deal_reason== DEAL_REASON_TP )
               ExtLot=m_symbol.LotsMin();
           }

손절매로 하면 로트를 두 배로 늘리고 이익 실현 으로 하면 로트 크기를 최소값으로 재설정합니다.


참고: EA 자체에서 손절매 및 이익실현 계산은 약간 정확하지 않지만 코드는 곧 다시 게시됩니다.

 
Vladimir Karputov :

손절매 이익 실현 코드의 예: 로트 크기는 글로벌 프로그램 수준(헤더)에서 선언된 "ExtLot" 변수에 저장(덮어쓰기, 증가 및 최소값으로 재설정)됩니다. OnTradeTransaction()에서 "시장 출구" 유형의 거래가 포착되고 거래가 어떻게 마감되었는지 확인합니다 - 이익실현 또는 손절매:

손절매로 하면 로트를 두 배로 늘리고 이익 실현 으로 하면 로트 크기를 최소값으로 재설정합니다.


참고: EA 자체에서 손절매 및 이익실현 계산은 약간 정확하지 않지만 코드는 곧 다시 게시됩니다.

나는 수익성있는 거래의 수를 연속으로 세고 5를 초과하면 초기 로트로 돌아가서 초기 로트로 포지션 6을 열고 볼륨 = 포지션 6 로트에 계수를 곱하여 포지션 7 열어야합니다 등 로트 증액 주기를 새로 시작해야 하며, 5자리 이상 이익이 나면 다시 처음 로트로 돌아가야 합니다.  

20개 연속 수익성 위치. 그들의 로트는 1, 2, 4, 8.16, 1, 2, 4, 8.16, 1, 2, 4, 8.16, 1, 2, 4, 8.16이어야 합니다.


 
lil_lil :

나는 수익성있는 거래의 수를 연속으로 세고 5를 초과하면 초기 로트로 돌아가서 초기 로트로 포지션 6을 열고 볼륨 = 포지션 6 로트에 계수를 곱하여 포지션 7 열어야합니다 등 로트 증액 주기를 새로 시작해야 하며, 5자리 이상 이익이 나면 다시 처음 로트로 돌아가야 합니다.  

20개 연속 수익성 위치. 그들의 로트는 1, 2, 4, 8.16, 1, 2, 4, 8.16, 1, 2, 4, 8.16, 1, 2, 4, 8.16이어야 합니다.


로트 계산 기능에서 정적 변수 를 사용해야 합니다. 작동 방식은 다음과 같습니다.

 //+------------------------------------------------------------------+
//|                                                       Test_1.mq5 |
//|                        Copyright 2016, MetaQuotes Software Corp. |
//|                                              http://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2016, MetaQuotes Software Corp."
#property link        "http://www.mql5.com"
#property version    "1.00"
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart ( void )
  {
   static int counter= 0 ;
   for ( int i= 0 ;i< 18 ;i++)
     {
       Print (counter);
      counter++;
       if (counter== 5 )
         counter= 0 ;
     }
  }
//+------------------------------------------------------------------+

결과:

 0
1
2
3
4
0
1
2
3
4
0
1
2
3
4
0
1
2
파일:
Test_1.mq5  2 kb
 
Vladimir Karputov :

로트 계산 기능에서 정적 변수 를 사용해야 합니다. 작동 방식은 다음과 같습니다.

결과:

나는 당신의 예에 따라 재설정하지만 로트를 늘리는 순서가 작동하지 않습니다

20개 연속 수익성 위치. 그들의 제비는 1, 2, 4, 8.16, 1, 2, 4, 8.16, 1, 2, 4, 8.16, 1, 2, 4, 8.16이어야 하며, 1, 2, 4, 8,16 과 같이 나옵니다. , 1, 1, 1, 1, 1, ...........

뭐가 잘못 되었 니?

 int K_U_= 5 ;  double   Lots=1.0;
double   LotExponent= 2.00 ;
//+------------------------------------------------------------------+
double llot()
  {
   double lt1=LotLastCloPos( Symbol (),m_magic);
   if (CountProfit( Symbol (),m_magic)>= 1 && CountProfit( Symbol (),m_magic)<K_U_)
      LotSize=lt1*LotExponent; //
   else
      LotSize=Lots;
   return (LotSize);
  }
  
//+------------------------------------------------------------------

int CountProfit( const string Symb, const long MagicNumber= 0 )
  {
     int counter= 0 ;
   ulong Ticket;

   if ( HistorySelect ( 0 , LONG_MAX ))
       for ( int i= HistoryDealsTotal ()- 1 ; i>= 0 ; i--){
      
         if (( bool )(Ticket= HistoryDealGetTicket (i)) && 
            ( HistoryDealGetInteger (Ticket, DEAL_ENTRY ) == DEAL_ENTRY_OUT ) &&
            ( HistoryDealGetInteger (Ticket, DEAL_MAGIC ) == MagicNumber) &&
            ( HistoryDealGetString (Ticket, DEAL_SYMBOL ) == Symb))
           {
             if ( HistoryDealGetDouble (Ticket, DEAL_PROFIT )> 0 )
            counter++; else
               break ;
           }
           }
   if (counter==K_U_)
      counter= 0 ;
   return (counter);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
double LotLastCloPos( const string Symb, const long MagicNumber= 0 )
  {
   ulong Ticket;
   double lot_= 0 ;

   if ( HistorySelect ( 0 , LONG_MAX ))
       for ( int i= 0 ; i< HistoryDealsTotal (); i++)
         if (( bool )(Ticket= HistoryDealGetTicket (i)) && 
            ( HistoryDealGetInteger (Ticket, DEAL_ENTRY ) == DEAL_ENTRY_OUT ) &&
            ( HistoryDealGetInteger (Ticket, DEAL_MAGIC ) == MagicNumber) &&
            ( HistoryDealGetString (Ticket, DEAL_SYMBOL ) == Symb))
           {

            lot_= HistoryOrderGetDouble (Ticket, ORDER_VOLUME_INITIAL );

           }

   return (lot_);
  }
 
lil_lil :

나는 당신의 예에 따라 재설정하지만 로트를 늘리는 순서가 작동하지 않습니다

20개 연속 수익성 위치. 그들의 제비는 1, 2, 4, 8.16, 1, 2, 4, 8.16, 1, 2, 4, 8.16, 1, 2, 4, 8.16이어야 하며, 1, 2, 4, 8,16 과 같이 나옵니다. , 1, 1, 1, 1, 1, ...........

뭐가 잘못 되었 니?

그래서 여전히 OnTradeTransaction 을 통해 정상적으로 작업하고 싶지 않습니까? 따라서 절대적으로 전체 거래 내역(1970년 이후)을 요청하시겠습니까? 무엇 때문에???

 
Vladimir Karputov :

그래서 여전히 OnTradeTransaction 을 통해 정상적으로 작업하고 싶지 않습니까? 따라서 절대적으로 전체 거래 내역(1970년 이후)을 요청하시겠습니까? 무엇 때문에???

이유가 있었다, 괄호.

내가 원하지 않는다는 말은 무슨 뜻인가요? OnTradeTransaction 이 내 질문과 어떤 관련이 있습니까?)

 

이제 분명히 내 질문 앞에 두 개의 게시물이 계산의 예입니다.

고맙습니다.

 
lil_lil :

이유가 있었다, 괄호.

내가 원하지 않는다는 말은 무슨 뜻인가요? OnTradeTransaction 이 내 질문과 어떤 관련이 있습니까?)

거래내역만 요청

 HistorySelect ( 0 , LONG_MAX )

1970년 이후 이 거래 계정의 모든 기록을 요청하는 것을 의미합니다. 이것은 매우 차선책입니다.

  • 이 계정에 수천 건의 거래가 있으면 어떻게 됩니까?
  • 그리고 (신이 금지하는) 매 틱마다 이 요청을 한다면?

 

거래내역과 연동되는 기능을 공유해주세요.

마지막 거래 개시일, 마감, 거래량, 재무 결과 및 유형(구매 또는 판매)에 대한 정보를 수신해야 합니다.

비슷한 기성 기능이 있는 사람이 있으면 공유해 주세요.

사유: