MQL4 ve MQL5 ile ilgili herhangi bir acemi sorusu, algoritmalar ve kodlar hakkında yardım ve tartışma - sayfa 1357

 
DanilaMactep :
Ve emir gönderimi ile emir açma girişimi olan her satırdan sonra bu şeyin yazılması gerekiyor, değil mi?

Tüm alım satım işlemlerinden sonra OrderSend(), OrderClose(), OrderCloseBy(), OrderModify(), OrderDelete()

 
MakarFX :

Tüm alım satım işlemlerinden sonra OrderSend(), OrderClose(), OrderCloseBy(), OrderModify(), OrderDelete()

Expert Advisor tablodan kaldırılırsa, tekrar manuel olarak bırakana kadar çalışmayacaktır. Çalışmasına otomatik olarak nasıl devam edilir?
 
DanilaMactep :
Ve emir gönderimi ile emir açma girişimi olan her satırdan sonra bu şeyin yazılması gerekiyor, değil mi?

ile ilgili hatalar dışında

MODE_STOPLEVEL, MODE_TRADEALLOWED, MODE_MINLOT , MODE_LOTSTEP , MODE_MAXLOT

o zaman baykuşlar sunucuyu çekiçlemeyecek

 
DanilaMactep :
Expert Advisor tablodan kaldırılırsa, tekrar manuel olarak bırakana kadar çalışmayacaktır. Çalışmasına otomatik olarak nasıl devam edilir?
Otomatik olarak değil, bu hatayı düzeltmek içindir
 
DanilaMactep :

Ve emir gönderimi ile emir açma girişimi olan her satırdan sonra bu şeyin yazılması gerekiyor, değil mi?

"Bu durum" ile bir işlemin minimum ve maksimum izin verilen hacmini , hacim adımını, bir işlem + emrin izin verilen maksimum miktarını, serbest marjın yeterliliğini kontrol etmeyi kastediyorsak (bunlar, doğrulayıcının en sık kullandığı ana noktalardır). bir thrashing verir), o zaman örneğin OrderCheck olarak adlandırarak Once A işlevini yazmak daha mantıklıdır.
Ardından, herhangi bir yeni işlem açmadan önce hacmi kontrol etmeniz yeterlidir.
Aşağı yukarı şöyle:

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

İyi günler sevgili programcılar! Bir gündür aynı görevle uğraşıyorum, çözemiyorum. Lütfen karar vermeme yardım et.

Alt satırda:

Araç: Füzyon RTS; M5 grafik dönemi;

Algoritma, zamana bağlı olarak SL ve TP parametrelerini değiştirmelidir.Ayrıca, belirli koşullara ulaşıldığında açık pozisyonun TP (request.tp = ....) ile değil, bir karşı piyasa emri ile kapatılması önemlidir.

Üç zaman aralığı verilmiştir: 1) (stm.hour>=12 && stm.sec>=1 && stm.hour<=12 && stm.min<=03) // 12:00:01 - 12:03 arası: 00

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

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


"1)" aralığında SL ve TP parametreleri = 200 ve 200

"2)" ve "3)" parametreleri aralığında SL ve TP = 100 ve 100


Problem: Algoritma YALNIZCA MEVCUT MUMDA kar alıyor, ancak kar alma koşulunun n mum daha için korunması gerekiyor. (en az 10-15)
M5 grafik dönemi

 //+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
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 :

Problem: Algoritma YALNIZCA MEVCUT MUMDA kar alıyor, ancak kar alma koşulunun n mum daha için korunması gerekiyor. (en az 10-15)

M5 grafik dönemi

Kodda, SL ve TP'nin eylemi zamanla sınırlıdır, siesta için ayrı ayrı ve SL ve TP için ayrı ayrı yapın

 
Alexey Belyakov :

İyi günler sevgili programcılar! Bir gündür aynı görevle uğraşıyorum, çözemiyorum. Lütfen karar vermeme yardım et.

Açılış saatlerini ve bar sayısını değiştirebilirsiniz.

 //+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
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
  }
 
Çok teşekkürler MakarFX! Şimdi olması gerektiği gibi çalışıyor!
 
Alexey Belyakov :
Çok teşekkürler MakarFX! Şimdi olması gerektiği gibi çalışıyor!

Rica ederim)