新人对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:
如果EA被从图表中删除,它将无法工作,直到我再次手动上传。我怎样才能自动复位?
你不能自动做到这一点,这是为了纠正错误
 
DanilaMactep:

这个案例必须写在每一行的后面,在这一行中,有一个试图使用ordersend打开一个订单--对吗?

如果我们所说的 "这种情况 "是指检查允许的最小和最大订单量,订单量的阶梯,允许的最大交易数量+订单,自由保证金的充足性(这些都是主要的,验证器最常拒绝的),那么写一个函数 更合理,例如叫它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.sec>=1 && stm.hour<=12 && stm.sec>=1) 。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分开,午休时的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 !现在它可以正常工作了 !

不客气)

原因: