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

 
DanilaMactep :
그리고 이것은 order send를 사용하여 주문을 열려고 하는 시도가 있는 각 줄 뒤에 쓰여져야 합니다, 맞죠?

모든 거래 작업OrderSend(), OrderClose(), OrderCloseBy(), OrderModify(), OrderDelete()

 
MakarFX :

모든 거래 작업OrderSend(), OrderClose(), OrderCloseBy(), OrderModify(), OrderDelete()

Expert Advisor가 차트에서 제거되면 수동으로 다시 드롭할 때까지 작동하지 않습니다. 자동으로 작업을 재개하는 방법은 무엇입니까?
 
DanilaMactep :
그리고 이것은 order send를 사용하여 주문을 열려고 하는 시도가 있는 각 줄 뒤에 쓰여져야 합니다, 맞죠?

관련된 오류를 제외하고

MODE_STOPLEVEL, MODE_TRADEALLOWED, MODE_MINLOT , MODE_LOTSTEP , MODE_MAXLOT

그러면 올빼미가 서버를 망치지 않을 것입니다.

 
DanilaMactep :
Expert Advisor가 차트에서 제거되면 수동으로 다시 드롭할 때까지 작동하지 않습니다. 자동으로 작업을 재개하는 방법은 무엇입니까?
자동이 아니라 오류를 수정하기 위한 것입니다.
 
DanilaMactep :

그리고 이것은 order send를 사용하여 주문을 열려고 하는 시도가 있는 각 줄 뒤에 쓰여져야 합니다, 맞죠?

"이 경우"라 함 은 거래 의 최소 및 최대 허용량을 확인하는 것을 의미한다면 거래량 단계, 최대 허용 거래량 + 주문, 여유 증거금의 충분성(이들은 검증인이 가장 자주 확인하는 주요 사항입니다. 스래싱 제공), 예를 들어 OrderCheck라는 이름을 지정하여 Once A 함수를 작성 하는 것이 더 합리적입니다.
그런 다음 새로운 거래를 열기 전에 거래량을 확인하십시오.
다음과 같이 다소:

Lot= OrderCheck (OP_BUY,Lot);
// или
Lot= OrderCheck (OP_SELL,Lot);
 

좋은 하루, 친애하는 프로그래머! 나는 지금 하루 동안 같은 작업으로 고심하고 있는데, 나는 그것을 이해할 수 없다. 결정을 도와주세요.

결론은 다음과 같습니다.

도구: 퓨전 RTS; M5 차트 기간;

알고리즘은 시간에 따라 SL 및 TP 매개변수를 변경해야 합니다.또한 오픈 포지션 은 TP(request.tp = ....)가 아니라 특정 조건에 도달했을 때 카운터 시장 주문에 의해 마감되는 것이 중요합니다.

세 가지 시간 간격이 제공됩니다. 1) (stm.hour>=12 && stm.sec>=1 && stm.hour<=12 && stm.min<=03) // 12:00:01 - 12:03: 00

2) (stm.hour>=16 && stm.min>=05 && stm.sec>=1) && (stm.hour<=16 && stm.min<=09) // 16:05:01 - 16: 09:00

3) (stm.hour>=20 && stm.sec>=11 && stm.hour<=20 && stm.min<=04) // 20:00:11 - 20:04:00


간격 "1)"에서 매개변수 SL 및 TP = 200 및 200

간격 "2)" 및 "3)"에서 매개변수 SL 및 TP = 100 및 100


문제: 알고리즘은 현재 양초에서만 이익을 얻습니다. 그러나 n개의 추가 양초 동안 이익을 취하는 조건이 유지되어야 합니다. (최소 10-15)
M5 차트 기간

 //+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
datetime some_time= TimeCurrent ();
#define EXPERT_MAGIC 1010    // MagicNumber эксперта 
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit ()
  {
//---

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

  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+


//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void OnTick ()
  {

   double   Ask = SymbolInfoDouble ( NULL , SYMBOL_ASK );
   double   Bid = SymbolInfoDouble ( NULL , SYMBOL_BID );

   double SL= 0 ;
   double TP= 0 ;

   datetime     tm= TimeCurrent ();
   MqlDateTime stm;
   TimeToStruct (tm,stm);

   bool is_siesta= false ;

   if (stm.hour>= 12 && stm.sec>= 1 && stm.hour<= 12 && stm.min<= 03 )     // Условия SL и TP работают только в этом интервале времени
     {
       SL= 200 / _Point ;
      TP= 200 / _Point ;
      is_siesta= true ;
     }
   else
     {


       if (((stm.hour>= 16 && stm.min>= 05 && stm.sec>= 1 ) && (stm.hour<= 16 && stm.min<= 09 )) || (stm.hour>= 20 && stm.sec>= 11 && stm.hour<= 20 && stm.min<= 04 ))     // Условия SL и TP работают только в этих интервалах времени
        {
         SL= 100 / _Point ;
         TP= 100 / _Point ; // тейк профит закрывается кодом
         is_siesta= true ;
        }
       else
        {
         return ;
        }
     }

   double Lots= 1 ;

   datetime timeBar = iTime ( NULL , PERIOD_CURRENT , 0 ); // период можно поставить по своему усмотрению
   datetime static timeOpen = 0 ;


   if ( (is_siesta== true )&& (timeBar > timeOpen) && (( int ) NormalizeDouble ( MathAbs (Ask-Bid)/ _Point , 0 )<= 50 ))   // Открывает при условии: - Интервал времени соответствует; - не далее текущей свечи; - спред не более 50пт
     {

       MqlTradeRequest request= { 0 };
       MqlTradeResult   result= { 0 };

      request.action   = TRADE_ACTION_DEAL ;
      request.symbol   = Symbol ();
      request.volume   =Lots;
      request.type     = ORDER_TYPE_BUY ;
      request.price    = SymbolInfoDouble ( Symbol (), SYMBOL_ASK );
      request.deviation= 5 ;
      request.sl    = NormalizeDouble (Ask-SL* _Point , _Digits );
      request.magic    = 1010 ;

       if (! OrderSend (request,result))
         PrintFormat ( "OrderSend error %d" , GetLastError ());     // если отправить запрос не удалось, вывести код ошибки
      timeOpen = timeBar;
     }


   if ( (is_siesta== true ) && (timeBar > timeOpen) && (( int ) NormalizeDouble ( MathAbs (Ask-Bid)/ _Point , 0 )<= 50 )) // Открывает при условии: - Интервал времени соответствует; - не далее текущей свечи; - спред не более 50пт
     {
       MqlTradeRequest request= { 0 };
       MqlTradeResult   result= { 0 };

      request.action   = TRADE_ACTION_DEAL ;
      request.symbol   = Symbol ();
      request.volume   =Lots;
      request.type     = ORDER_TYPE_SELL ;
      request.price    = SymbolInfoDouble ( Symbol (), SYMBOL_BID );
      request.deviation= 5 ;
      request.sl    = NormalizeDouble (Bid+SL* _Point , _Digits );
      request.magic    = 1010 ;

       if (! OrderSend (request,result))
         PrintFormat ( "OrderSend error %d" , GetLastError ());     // если отправить запрос не удалось, вывести код ошибки
      timeOpen = timeBar;
     }
///////////////////////////////////////////////////////////////////////////////////////////////////////////////Блок закрытия позиции без тейк-профита request.tp (для SELL)

   if (( AccountInfoDouble ( ACCOUNT_PROFIT )>=TP)&&(( int ) NormalizeDouble ( MathAbs (Bid-Ask)/ _Point , 0 )<= 10 ))   // Закрывает встречным ордером при достижении условий: -прибыль соответствует тейк-профиту; - спред не более 10пт.
     {


       MqlTradeRequest request= { 0 };
       MqlTradeResult   result= { 0 };
       int total= PositionsTotal (); // количество открытых позиций
       //--- перебор всех открытых позиций
       for ( int i=total- 1 ; i>= 0 ; i--)
        {
         //--- параметры ордера
         ulong   position_ticket= PositionGetTicket (i);                                       // тикет позиции
         string position_symbol= PositionGetString ( POSITION_SYMBOL );                         // символ
         int     digits=( int ) SymbolInfoInteger (position_symbol, SYMBOL_DIGITS );               // количество знаков после запятой
         double volume= PositionGetDouble ( POSITION_VOLUME );                                 // объем позиции
         ulong   magic= PositionGetInteger ( POSITION_MAGIC );
         ENUM_POSITION_TYPE type=( ENUM_POSITION_TYPE ) PositionGetInteger ( POSITION_TYPE );     // тип позиции

         if ((type== POSITION_TYPE_SELL )&& (magic== 1010 )) // если позиция тип BUY и соотв. магику
           {
            request.action   = TRADE_ACTION_DEAL ;
            request.symbol   = Symbol ();
            request.volume   =Lots;
            request.type     = ORDER_TYPE_BUY ;
            request.price    = SymbolInfoDouble ( Symbol (), SYMBOL_ASK ); 

             if (! OrderSend (request,result))
               PrintFormat ( "OrderSend error %d" , GetLastError ());     // если отправить запрос не удалось, вывести код ошибки
           }
        }
     }
///////////////////////////////////////////////////////////////////////////////////////////////////////////////Блок закрытия позиции без тейк-профита request.tp

///////////////////////////////////////////////////////////////////////////////////////////////////////////////Блок закрытия позиции без тейк-профита request.tp (для BUY)

   if (( AccountInfoDouble ( ACCOUNT_PROFIT )>=TP)&&(( int ) NormalizeDouble ( MathAbs (Bid-Ask)/ _Point , 0 )<= 10 ))   // Закрывает встречным ордером при достижении условий: -прибыль соответствует тейк-профиту; - спред не более 10пт.
     {
       MqlTradeRequest request= { 0 };
       MqlTradeResult   result= { 0 };
       int total= PositionsTotal (); // количество открытых позиций
       //--- перебор всех открытых позиций
       for ( int i=total- 1 ; i>= 0 ; i--)
        {
         //--- параметры ордера
         ulong   position_ticket= PositionGetTicket (i);                                       // тикет позиции
         string position_symbol= PositionGetString ( POSITION_SYMBOL );                         // символ
         int     digits=( int ) SymbolInfoInteger (position_symbol, SYMBOL_DIGITS );               // количество знаков после запятой
         double volume= PositionGetDouble ( POSITION_VOLUME );                                 // объем позиции
         ulong   magic= PositionGetInteger ( POSITION_MAGIC );
         ENUM_POSITION_TYPE type=( ENUM_POSITION_TYPE ) PositionGetInteger ( POSITION_TYPE );     // тип позиции

         if ((type== POSITION_TYPE_BUY )&& (magic== 1010 )) // если позиция тип BUY и соотв. магику
           {
            request.action   = TRADE_ACTION_DEAL ;
            request.symbol   = Symbol ();
            request.volume   =Lots;
            request.type     = ORDER_TYPE_SELL ;
            request.price    = SymbolInfoDouble ( Symbol (), SYMBOL_BID );

             if (! OrderSend (request,result))
               PrintFormat ( "OrderSend error %d" , GetLastError ());     // если отправить запрос не удалось, вывести код ошибки
           }
        }
     }
///////////////////////////////////////////////////////////////////////////////////////////////////////////////Блок закрытия позиции без тейк-профита request.tp
  }

Совершение сделок - Торговые операции - Справка по MetaTrader 5
Совершение сделок - Торговые операции - Справка по MetaTrader 5
  • www.metatrader5.com
Торговая деятельность в платформе связана с формированием и отсылкой рыночных и отложенных ордеров для исполнения брокером, а также с управлением...
 

Alexey Belyakov :

문제: 알고리즘은 현재 양초에서만 이익을 얻습니다. 그러나 n개의 추가 양초 동안 이익을 얻는 조건이 유지되어야 합니다. (최소 10-15)

M5 차트 기간

코드에서 SL과 TP의 동작은 시간에 의해 제한되며, 낮잠은 별도로 하고 SL과 TP는 별도로 수행합니다.

 
Alexey Belyakov :

좋은 하루, 친애하는 프로그래머! 나는 지금 하루 동안 같은 작업으로 고심하고 있는데, 나는 그것을 이해할 수 없다. 결정을 도와주세요.

영업시간과 수를 변경할 수 있습니다.

 //+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
datetime some_time= TimeCurrent ();
#define EXPERT_MAGIC 1010    // MagicNumber эксперта 
input string TimeStart_1= "12:00:01" ; 
input string TimeStop_1 = "12:03:00" ;
input string TimeStart_2= "16:05:01" ;
input string TimeStop_2 = "16:09:00" ;
input string TimeStart_3= "20:00:11" ; 
input string TimeStop_3 = "20:04:00" ;
input int     BarTrade   = 10 ;
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit ()
  {
//---

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

  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+


//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void OnTick ()
  {

   double   Ask = SymbolInfoDouble ( NULL , SYMBOL_ASK );
   double   Bid = SymbolInfoDouble ( NULL , SYMBOL_BID );

   double SL= 0 ;
   double TP= 0 ;

   datetime     tm= TimeCurrent ();
   MqlDateTime stm;
   TimeToStruct (tm,stm);

   int TimeBarTrade=BarTrade* Period ()* 60 ;
   bool is_siesta= false ;

   if (( TimeCurrent ()>= StringToTime (TimeStart_1) && TimeCurrent ()<= StringToTime (TimeStop_1))||    
      ( TimeCurrent ()>= StringToTime (TimeStart_2) && TimeCurrent ()<= StringToTime (TimeStop_2))||    
      ( TimeCurrent ()>= StringToTime (TimeStart_3) && TimeCurrent ()<= StringToTime (TimeStop_3)))    
     {is_siesta= true ;}
   else
     {is_siesta= false ;}

   if ( TimeCurrent ()>= StringToTime (TimeStart_1) && TimeCurrent ()<=( StringToTime (TimeStop_1)+TimeBarTrade))    
        {
         SL= 200 / _Point ;
         TP= 200 / _Point ;
        }
   if (( TimeCurrent ()>= StringToTime (TimeStart_2) && TimeCurrent ()<=( StringToTime (TimeStop_2)+TimeBarTrade))||    
      ( TimeCurrent ()>= StringToTime (TimeStart_3) && TimeCurrent ()<=( StringToTime (TimeStop_3)+TimeBarTrade)))    
        {
         SL= 100 / _Point ;
         TP= 100 / _Point ; 
        }

   double Lots= 1 ;

   datetime timeBar = iTime ( NULL , PERIOD_CURRENT , 0 ); // период можно поставить по своему усмотрению
   datetime static timeOpen = 0 ;


   if ( (is_siesta== true )&& (timeBar > timeOpen) && (( int ) NormalizeDouble ( MathAbs (Ask-Bid)/ _Point , 0 )<= 50 ))   // Открывает при условии: - Интервал времени соответствует; - не далее текущей свечи; - спред не более 50пт
     {

       MqlTradeRequest request= { 0 };
       MqlTradeResult   result= { 0 };

      request.action   = TRADE_ACTION_DEAL ;
      request.symbol   = Symbol ();
      request.volume   =Lots;
      request.type     = ORDER_TYPE_BUY ;
      request.price    = SymbolInfoDouble ( Symbol (), SYMBOL_ASK );
      request.deviation= 5 ;
      request.sl    = NormalizeDouble (Ask-SL* _Point , _Digits );
      request.magic    = 1010 ;

       if (! OrderSend (request,result))
         PrintFormat ( "OrderSend error %d" , GetLastError ());     // если отправить запрос не удалось, вывести код ошибки
      timeOpen = timeBar;
     }


   if ( (is_siesta== true ) && (timeBar > timeOpen) && (( int ) NormalizeDouble ( MathAbs (Ask-Bid)/ _Point , 0 )<= 50 )) // Открывает при условии: - Интервал времени соответствует; - не далее текущей свечи; - спред не более 50пт
     {
       MqlTradeRequest request= { 0 };
       MqlTradeResult   result= { 0 };

      request.action   = TRADE_ACTION_DEAL ;
      request.symbol   = Symbol ();
      request.volume   =Lots;
      request.type     = ORDER_TYPE_SELL ;
      request.price    = SymbolInfoDouble ( Symbol (), SYMBOL_BID );
      request.deviation= 5 ;
      request.sl    = NormalizeDouble (Bid+SL* _Point , _Digits );
      request.magic    = 1010 ;

       if (! OrderSend (request,result))
         PrintFormat ( "OrderSend error %d" , GetLastError ());     // если отправить запрос не удалось, вывести код ошибки
      timeOpen = timeBar;
     }
///////////////////////////////////////////////////////////////////////////////////////////////////////////////Блок закрытия позиции без тейк-профита request.tp (для SELL)

   if (( AccountInfoDouble ( ACCOUNT_PROFIT )>=TP)&&(( int ) NormalizeDouble ( MathAbs (Bid-Ask)/ _Point , 0 )<= 10 ))   // Закрывает встречным ордером при достижении условий: -прибыль соответствует тейк-профиту; - спред не более 10пт.
     {


       MqlTradeRequest request= { 0 };
       MqlTradeResult   result= { 0 };
       int total= PositionsTotal (); // количество открытых позиций
       //--- перебор всех открытых позиций
       for ( int i=total- 1 ; i>= 0 ; i--)
        {
         //--- параметры ордера
         ulong   position_ticket= PositionGetTicket (i);                                       // тикет позиции
         string position_symbol= PositionGetString ( POSITION_SYMBOL );                         // символ
         int     digits=( int ) SymbolInfoInteger (position_symbol, SYMBOL_DIGITS );               // количество знаков после запятой
         double volume= PositionGetDouble ( POSITION_VOLUME );                                 // объем позиции
         ulong   magic= PositionGetInteger ( POSITION_MAGIC );
         ENUM_POSITION_TYPE type=( ENUM_POSITION_TYPE ) PositionGetInteger ( POSITION_TYPE );     // тип позиции

         if ((type== POSITION_TYPE_SELL )&& (magic== 1010 )) // если позиция тип BUY и соотв. магику
           {
            request.action   = TRADE_ACTION_DEAL ;
            request.symbol   = Symbol ();
            request.volume   =Lots;
            request.type     = ORDER_TYPE_BUY ;
            request.price    = SymbolInfoDouble ( Symbol (), SYMBOL_ASK ); 

             if (! OrderSend (request,result))
               PrintFormat ( "OrderSend error %d" , GetLastError ());     // если отправить запрос не удалось, вывести код ошибки
           }
        }
     }
///////////////////////////////////////////////////////////////////////////////////////////////////////////////Блок закрытия позиции без тейк-профита request.tp

///////////////////////////////////////////////////////////////////////////////////////////////////////////////Блок закрытия позиции без тейк-профита request.tp (для BUY)

   if (( AccountInfoDouble ( ACCOUNT_PROFIT )>=TP)&&(( int ) NormalizeDouble ( MathAbs (Bid-Ask)/ _Point , 0 )<= 10 ))   // Закрывает встречным ордером при достижении условий: -прибыль соответствует тейк-профиту; - спред не более 10пт.
     {
       MqlTradeRequest request= { 0 };
       MqlTradeResult   result= { 0 };
       int total= PositionsTotal (); // количество открытых позиций
       //--- перебор всех открытых позиций
       for ( int i=total- 1 ; i>= 0 ; i--)
        {
         //--- параметры ордера
         ulong   position_ticket= PositionGetTicket (i);                                       // тикет позиции
         string position_symbol= PositionGetString ( POSITION_SYMBOL );                         // символ
         int     digits=( int ) SymbolInfoInteger (position_symbol, SYMBOL_DIGITS );               // количество знаков после запятой
         double volume= PositionGetDouble ( POSITION_VOLUME );                                 // объем позиции
         ulong   magic= PositionGetInteger ( POSITION_MAGIC );
         ENUM_POSITION_TYPE type=( ENUM_POSITION_TYPE ) PositionGetInteger ( POSITION_TYPE );     // тип позиции

         if ((type== POSITION_TYPE_BUY )&& (magic== 1010 )) // если позиция тип BUY и соотв. магику
           {
            request.action   = TRADE_ACTION_DEAL ;
            request.symbol   = Symbol ();
            request.volume   =Lots;
            request.type     = ORDER_TYPE_SELL ;
            request.price    = SymbolInfoDouble ( Symbol (), SYMBOL_BID );

             if (! OrderSend (request,result))
               PrintFormat ( "OrderSend error %d" , GetLastError ());     // если отправить запрос не удалось, вывести код ошибки
           }
        }
     }
///////////////////////////////////////////////////////////////////////////////////////////////////////////////Блок закрытия позиции без тейк-профита request.tp
  }
 
MakarFX에 감사드립니다! 이제 제대로 작동합니다!
 
Alexey Belyakov :
MakarFX에 감사드립니다! 이제 제대로 작동합니다!

물론이죠)