MQL4 및 MQL5에 대한 초보자 질문, 알고리즘 및 코드에 대한 도움말 및 토론 - 페이지 46

 
sile :

안녕하세요.

도와주세요.

마감된 위치 에서 하루의 시작부터 손실이 10%에 이르렀는지 확인하는 방법은 무엇입니까?

이 EA는 설정된 기간 동안의 손익 비율을 왼쪽 상단 모서리에 표시합니다.

//+------------------------------------------------------------------+
//|                                                       test02.mq4 |
//|                                                   Sergey Gritsay |
//|                         https://www.mql5.com/ru/users/sergey1294 |
//+------------------------------------------------------------------+
#property copyright "Sergey Gritsay"
#property link        "https://www.mql5.com/ru/users/sergey1294"
#property version    "1.00"
#property strict
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
enum mode_type
  {
   BUY= OP_BUY ,
   SELL= OP_SELL ,
   ALL = - 1
  };
input string Symbols= NULL ;
input int Magic=- 1 ; //Identification number
input mode_type ModeType=ALL;
input ENUM_TIMEFRAMES TimeFrame= PERIOD_D1 ;

double procent= 0.0 ;
double prev_balans= 0.0 ;
double Profit= 0.0 ;
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit ()
  {
//---

//---
   return ( INIT_SUCCEEDED );
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit ( const int reason)
  {
//---

  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick ()
  {
   Profit=LastProfit( iTime ( _Symbol ,TimeFrame, 0 ),Symbols,Magic,ModeType);
   prev_balans=Balans( 0 , iTime ( _Symbol ,TimeFrame, 0 ));
   if (prev_balans!= 0.0 )procent=Profit/prev_balans* 100.0 ;
   Comment (
           "\nTime = " , iTime ( _Symbol ,TimeFrame, 0 ),
           "\nProfit = " , DoubleToStr (Profit, 2 ),
           "\nprev_balans = " , DoubleToStr (prev_balans, 2 ),
           "\nprocent = " , DoubleToStr (procent, 4 ), " %"
           );
  }
//+------------------------------------------------------------------+
double LastProfit(
                   datetime time,       // Дата, представленная в виде количества секунд, прошедших после 00:00 1 января 1970 года.
                   string symbol= NULL , // символ, если NULL то любой символ
                   int magic=- 1 ,       // идентификатор, если -1 то любой идентификатор
                   int cmd=- 1            // торговая операция, если -1 любая торговая операция
                  )
  {
   double profit= 0 ;
   int total= OrdersHistoryTotal ();
   for ( int i=total- 1 ;i>= 0 ;i--)
     {
       if (! OrderSelect (i, SELECT_BY_POS , MODE_HISTORY )) continue ;
       if ( OrderSymbol ()==symbol || symbol!= NULL )
        {
         if ( OrderMagicNumber ()==magic || magic==- 1 )
           {
             if ( OrderType ()==cmd || cmd==- 1 )
              {
               if ( OrderCloseTime ()<time) continue ;
               profit+= OrderProfit ()+ OrderCommission ()+ OrderSwap ();
              }
           }
        }
     }
   return (profit);
  }
//+------------------------------------------------------------------+
double Balans(
               datetime start_time, // C какой даты. Дата, представленная в виде количества секунд, прошедших после 00:00 1 января 1970 года.
               datetime stop_time, // По какую дату. Дата, представленная в виде количества секунд, прошедших после 00:00 1 января 1970 года.
              )
  {
   double profit= 0 ;
   int total= OrdersHistoryTotal ();
   for ( int i= 0 ; i<total; i++)
     {
       if (! OrderSelect (i, SELECT_BY_POS , MODE_HISTORY )) continue ;
       if ( OrderCloseTime ()<start_time || OrderCloseTime ()>stop_time) continue ;
      profit+= OrderProfit ()+ OrderCommission ()+ OrderSwap ();
     }
   return (profit);
  }
//+------------------------------------------------------------------+

...

파일:
test02.mq4  8 kb
 
Sergey Gritsay :

이 EA는 설정된 기간 동안의 손익 비율을 왼쪽 상단 모서리에 표시합니다.


고맙습니다.

항상 수익이 나지 않는 포지션의 수를 세는 기능이 있습니다.

무엇으로 변경   오늘 연속으로 마감된 수익성 없는 포지션의 수를 알아보세요.



int GetLastNegativeOrdersCount()
{
   int PosCnt = 0 ;
   int cnt = HistoryTotal ();
   for ( int i = cnt- 1 ; i >= 0 ; i--) {
    
     if (! OrderSelect (i, SELECT_BY_POS , MODE_HISTORY )) continue ;
     if ( OrderSymbol () != Symbol ()) continue ;
     if ( OrderMagicNumber () != Magic) continue ;

      
     int type = OrderType ();
     if (type != OP_BUY && type != OP_SELL ) continue ;
      
     if ( OrderProfit ()+ OrderSwap ()+ OrderCommission () > 0 ) break ;

    PosCnt++;
  }

   return (PosCnt);
}
 
sile :

고맙습니다.

항상 수익이 나지 않는 포지션의 수를 세는 기능이 있습니다.

무엇으로 변경   오늘 연속으로 마감된 수익성 없는 포지션의 수를 알아보세요.



int GetLastNegativeOrdersCount()
{
   int PosCnt = 0 ;
   int cnt = HistoryTotal ();
   for ( int i = cnt- 1 ; i >= 0 ; i--) {
    
     if (! OrderSelect (i, SELECT_BY_POS , MODE_HISTORY )) continue ;
     if ( OrderSymbol () != Symbol ()) continue ;
     if ( OrderMagicNumber () != Magic) continue ;

      
     int type = OrderType ();
     if (type != OP_BUY && type != OP_SELL ) continue ;
      
     if ( OrderProfit ()+ OrderSwap ()+ OrderCommission () > 0 ) break ;

    PosCnt++;
  }

   return (PosCnt);
}
조건을 하나 더 추가하십시오. 주문 마감 시간 이 현재 촛불 D1의 시작 시간 보다 짧으면 계속 ;
 
Artyom Trishkin :
조건을 하나 더 추가하십시오. 주문 마감 시간 이 현재 촛불 D1의 시작 시간 보다 짧으면 계속 ;

고맙습니다.

if ( iTime ( Symbol (), 1440 , 0 )> OrderCloseTime ()) continue ;
 
sile :

고맙습니다.

if ( iTime ( Symbol (), 1440 , 0 )> OrderCloseTime ()) continue ;


확실히 그런 방식은 아닙니다.

이와 같이 - OrderSymbol()

if ( iTime ( OrderSymbol (), PERIOD_D1 , 0 )>= OrderCloseTime ()) continue ;

또는 다음과 같이:

if ( OrderCloseTime ()< iTime ( OrderSymbol (), PERIOD_D1 , 0 )) continue ;
 
Artyom Trishkin :

확실히 그런 방식은 아닙니다.

이와 같이 - OrderSymbol()


덕분에.

 
에게. Expert Advisor의 입력 매개변수 창에 텍스트를 추가하는 방법을 알려주세요.
 
Mikhail Goryunov :
에게. Expert Advisor의 입력 매개변수 창에 텍스트를 추가하는 방법을 알려주세요.
input int     MetaQuotes = 30 ;
input bool    MetaQuotes = true ;
input double MetaQuotes = 20.3 ;
input string MetaQuotes = "Corp" ;
 
Vitaly Muzichenko :
input int     MetaQuotes = 30 ;
input bool    MetaQuotes = true ;
input double MetaQuotes = 20.3 ;
input string MetaQuotes = "Corp" ;

감사합니다 + 순무. 나는 그것을 알아 냈고 약간의 설명 과 함께 외부 입력 변수 에 대한 자습서를 읽었습니다. 예가 더 명확하고 명확합니다.

sinput string MetaQuotes = "бла бла текс" ;
 
Mikhail Goryunov :

감사합니다 + 순무. 나는 그것을 알아 냈고 약간의 설명 과 함께 외부 입력 변수 에 대한 자습서를 읽었습니다. 예가 더 명확하고 명확합니다.

sinput string MetaQuotes = "бла бла текс" ;

각 줄에 주석을 추가하면 더 재미있을 것입니다.

input     int       MetaQuotes1    =   30 ;         // Описание входного параметра 1
input     bool      MetaQuotes2    =   true ;       // Описание входного параметра 2
input     double    MetaQuotes3    =   20.3 ;       // Описание входного параметра 3
input     string    MetaQuotes4    =   "Corp" ;     // Описание входного параметра 4

다른 열거를 만들고 bool 대신 사용하면 훨씬 더 흥미로울 것입니다.

enum enumYN
  {
   enYes =   1 ,     // Да
   enNo  =   0 ,     // Нет
  };

input     int       MetaQuotes1    =   30 ;         // Описание входного параметра 1
input     enumYN   MetaQuotes2    =  enYes;       // Описание входного параметра 2
input     double    MetaQuotes3    =   20.3 ;       // Описание входного параметра 3
input     string    MetaQuotes4    =   "Corp" ;     // Описание входного параметра 4

그리고 sinput 을 사용하면 최적화를 위해 변수 목록에서 변수를 제외할 수 있습니다. 예를 들어 이 컨텍스트의 MetaQuotes4 변수는 최적화에 필요하지 않으며 제외할 수 있습니다.

enum enumYN
  {
   enYes =   1 ,     // Да
   enNo  =   0 ,     // Нет
  };

input      int       MetaQuotes1    =   30 ;         // Описание входного параметра 1
input     enumYN   MetaQuotes2    =  enYes;       // Описание входного параметра 2
input      double    MetaQuotes3    =   20.3 ;       // Описание входного параметра 3
sinput    string    MetaQuotes4    =   "Corp" ;     // Описание входного параметра 4