Любые вопросы новичков по MQL4 и MQL5, помощь и обсуждение по алгоритмам и кодам - страница 1357

 
DanilaMactep:
И это дело надо пописать после каждой строки в которой есть попытка открыть ордер с помощью ордерсенд- правильно?

После всех торговых операций OrderSend(), OrderClose(), OrderCloseBy(), OrderModify(), OrderDelete()

 
MakarFX:

После всех торговых операций OrderSend(), OrderClose(), OrderCloseBy(), OrderModify(), OrderDelete()

Если эксперт с графика удалиться то пока я его опять вручную не закину он не будет работать. Каким образом возобновить его работу автоматически?
 
DanilaMactep:
И это дело надо пописать после каждой строки в которой есть попытка открыть ордер с помощью ордерсенд- правильно?

Если исключить ошибки связанные с

MODE_STOPLEVEL, MODE_TRADEALLOWED, MODE_MINLOT, MODE_LOTSTEP, MODE_MAXLOT

то сов не будет долбить сервер

 
DanilaMactep:
Если эксперт с графика удалиться то пока я его опять вручную не закину он не будет работать. Каким образом возобновить его работу автоматически?
Автоматически никак, это для того чтоб исправить ошибку
 
DanilaMactep:

И это дело надо пописать после каждой строки в которой есть попытка открыть ордер с помощью ордерсенд- правильно?

Если под "этим делом" имеется в виду проверка минимального и максимально допустимого объема сделки, шага объема, максимально допустимого количества сделки+ордера, достаточность свободной маржи (это основные пункты, по которым валидатор чаще всего дает отлуп), то рациональнее Один Раз написать Одну Функцию, обозвав ее OrderCheck например.
Потом, перед открытием любой новой сделки, просто проверять объем.
Примерно так:

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
  }
 
Cпасибо Большое MakarFX ! Теперь работает как надо!
 
Alexey Belyakov:
Cпасибо Большое MakarFX ! Теперь работает как надо!

Пожалуйста)

Причина обращения: