初学者的问题 MQL5 MT5 MetaTrader 5 - 页 147

 
   MqlRates rates[];
   ArraySetAsSeries(rates,true);
   
   int copied=CopyRates(_Symbol,PERIOD_M1,D'2008.01.01 00:00:00',(datetime)TimeCurrent(),rates);
   Print(Bars(_Symbol,PERIOD_M1,D'2008.01.01',TimeCurrent()));
   if(copied>0)
     {
      Print(copied,"       ",rates[0].time,"  ",rates[copied-1].time);
      ExpertRemove();
     }
     else {Print("Требуется синхронизация с сервером !!!");ExpertRemove();}

我不明白为什么零条上的数据与现实不相符。

我得到这样的结果

2013.10.27 17:45:26 核心 1 2013.01.01 00:00:00 369878 2012.12.31 19:00:00 2012.01.02 00:00:00

2013.10.27 17:45:26 核心 1 2013.01.01 00:00:00 369878

我忘了在专家那里讲述整个事情。

或者换句话说,当测试EA 从XXX日期到YYY日期时,从XXX数据可以下载到什么深度?????????????????

 

我需要有关代码的建议:我从数据库中获取了一个顾问,对其进行了测试,添加了它,减去了它,更改了系数以获得良好的图像,图像似乎变成了,但在演示中没有任何效果,这是另一个一路走来,这就像邪恶一样,我正在根据所教授的文章和图表调整一切,一个月的图表增加了 100%。所以它只适用于测试人员,它是合适的,还是应该以不同的方式进行测试???我还想重新制作 TreilingParabolikSAR,这样就不会止损沿着它移动,而是在离价格给定距离的外行人,也许有人会告诉你从哪里得到它,到目前为止它还没有遇到。这是带有良好图表的结果代码之一 - 告诉我哪里出了问题,要修复什么,尽管这里的一切都可能是错误的......

 //+------------------------------------------------------------------+
//|                                                EA_CCIT3_1-01.mq5 |
//|                                Copyright © 2012.08.19, Alexander |
//|                        https://www.mql5.com/en/users/Im_hungry |
//|ICQ: 609928564 | email: I-m-hungree@yandex.ru | skype:i_m_hungree |
//Эксперт построен на модифицированных индикаторах CCIT3_Simple_v_2-01 и CCIT3_noReCalc_v_3-01. /
//Открытие позиции на покупку при пересечении нулевой цены снизу-вверх, 
//продажа при пересечении сверху-вниз. Значения индикатора для определения 
//сигнала берутся за предыдущий бар.

//CCIT3_Simple_v_2-01 - модифицированный индикатор CCIT3 1.01, основа 
//расчетов которого базируется на индикаторе CCI с коэффициентом расчета, 
//просчитанным с начала истории. Индикатор имеет ограничение по количеству 
//рассчитываемых баров (Max_bars_calc).
//CCIT3_noReCalc_v_3-01 - упрощенный CCIT3_Simple_v_2-01 - формула 
//расчета которого не учитывает коэффициент пересчитываемого на каждом 
//баре с начала истории. Также имеет ограничение по количеству рассчитываемых 
//баров (Max_bars_calc).
//
//
//+------------------------------------------------------------------+
#property copyright "Copyright © 2012"
#property link        "EA_CCIT3_1-01"

#include <Sample_TrailingStop.mqh> // подключение класса трейлинг стопа

CParabolicStop Trailing; // создание экземпляра класса 

//---
input    string                section_1             =                     "===== Trade options" ;
input    double                Lots                  = 2 ;                 // Lots
input    double                TP                    = 31 ;               // TP
input    double                SL                    = 16 ;                   // SL
input    int                   Slippage               = 65 ;                 // Slippage
input    int                   magic                  = 2012081921 ;           // magic
input    int                   N_modify_sltp= 3 ;                   // N_modify_sltp
input    int                   trail                  = 45 ;                   // trail
input    int                   Max_drawdown           = 10000 ;                   // Max_drawdown
input    bool                  Trade_overturn= true ;               // Trade_overturn
//---
input    string                section_3             =                     "===== Simple CCIT3" ;
input    bool                  use_Simple_CCIT3      = true ;               // use_Simple_CCIT3_Smpl
input    int                   CCI_Period_Smpl       = 285 ;                 // CCI_Period_Smpl
input    ENUM_APPLIED_PRICE    CCI_Price_Type_Smpl   = PRICE_TYPICAL ;       // CCI_Price_Type_Smpl
input    int                   T3_Period_Smpl        = 60 ;                 // T3_Period_Smpl
input    double                Koeff_B_Smpl          = 0.618 ;               // Koeff_B_Smpl
//---
input    string                section_4             =                     "===== noReCalc CCIT3" ;
input    bool                  use_noReCalc_CCIT3    = false ;               // use_noReCalc_CCIT3
input    int                   CCI_Period_OtRng      = 230 ;                 // CCI_Period_OtRng
input    ENUM_APPLIED_PRICE    CCI_Price_Type_OtRng  = PRICE_TYPICAL ;       // CCI_Price_Type_OtRng
input    int                   T3_Period_OtRng       = 170 ;                 // T3_Period_OtRng
input    double                Koeff_B_OtRng         = 1.618 ;               // Koeff_B_OtRng
input double TrailingSARStep    =   0.02 ; // Шаг Parabolic
input double TrailingSARMaximum =   0.2 ; // Максимум Parabolic

//+------------------------------------------------------------------+
//| global parameters                                                |
//+------------------------------------------------------------------+
double CCIT3[ 2 ],Trail_stop; int handle_CCIT3; datetime _time;
int STP,TKP;

#include <ExpertAdvisor.mqh>
#include <Trade\DealInfo.mqh>

input double LotKoef= 1 ; // множитель для лота при убытке
input int Dist= 60 ;       // расстояние до стоплоса и тейкпрофита
//---
class CMartiEA : public CExpertAdvisor
  {
protected :
   double             m_lots;       // Лот
   double             m_lotkoef;     // множитель для лота при убытке
   int                m_dist;       // расстояние до стоплоса и тейкпрофита
   CDealInfo         m_deal;       // последняя сделка
   bool               m_first;       // флаг открытия первой сделки

public :
   void CMartiEA() { }
   void ~CMartiEA() { }
   virtual bool       Init( string smb, ENUM_TIMEFRAMES tf); // инициализация
   virtual void       OpenPosition();
   virtual void       CheckPosition();
  };
//------------------------------------------------------------------    Init
bool CMartiEA::Init( string smb, ENUM_TIMEFRAMES tf)
  {
   if (!CExpertAdvisor::Init( 0 ,smb,tf)) return ( false ); // инициализация родительского класса
   m_lots=Lots; m_lotkoef=LotKoef; m_dist=Dist;       // скопировали параметры
   m_deal.Ticket( 0 ); m_first= true ;
   m_bInit= true ; return ( true );                         // "торговля разрешена"
  }
//------------------------------------------------------------------    OnTrade
void CMartiEA::OpenPosition()
  {
   if (!CExpertAdvisor::Main()) return ;                       // вызов родительской функции
   if (!m_first) return ;                                       // если уже открывали начальную позицию
   ulong deal=DealOpen( ORDER_TYPE_BUY ,m_lots,m_dist,m_dist)|| // открыли начальную позицию
              DealOpen( ORDER_TYPE_SELL ,m_lots,m_dist,m_dist); // открыли начальную позицию

   if (deal> 0 ) { m_deal.Ticket(deal); m_first= false ; }         // если позиция существует
  }
//------------------------------------------------------------------    OnTrade
void CMartiEA::CheckPosition()
  {
   if (!CExpertAdvisor::Main()) return ; // вызов родительской функции
   if (m_first) return ;                 // если еще не открыли начальную позицию
   if ( PositionSelect (m_smb)) return ;   // если позиция существует

                                       // проферяем профит предыдущей позиции
   double lot=m_lots;                       // начальный лот
   long dir=m_deal.Type();                   // предыдущее направление
   if (CountProfitByDeal(m_deal.Ticket())< 0 ) // если был убыток
     {                                     //здесь убрал строку умножения все равно умножает и не переварачивает
      dir=ReversType(m_deal.Ticket());             // перевернули позицию
     }
   ulong deal=DealOpen(dir,lot,m_dist,m_dist); // открыли позицию
   if (deal> 0 ) m_deal.Ticket(deal);             // запомнили тикет
  }

CMartiEA ea; // экземпляр объекта
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit ()
  {
   ea.Init( Symbol (), Period ()); // инициализируем эксперт
//--- Инициализация (установка основных параметров)
   Trailing.Init( _Symbol , PERIOD_CURRENT , true , true , false );
//--- Установка параметров используемого типа трейлинг стопа
   if (!Trailing.SetParameters(TrailingSARStep,TrailingSARMaximum))
     {
       Alert ( "trailing error" );
       return (- 1 );
     }
   Trailing.StartTimer(); // Запуск таймера
   Trailing.On();         // Включение


   if ((use_Simple_CCIT3 && use_noReCalc_CCIT3) || (!use_Simple_CCIT3 && !use_noReCalc_CCIT3))
     {
       Alert ( "Wrong Settings : choose one of use_Simple_CCIT3/use_noReCalc_CCIT3" );
       Alert ( "Expert Removed" );
       ExpertRemove ();
     }
   if (use_Simple_CCIT3)
     {
      handle_CCIT3= iCustom ( Symbol (), NULL , "CCIT3_Simple_v_2-01" ,CCI_Period_Smpl,CCI_Price_Type_Smpl,T3_Period_Smpl,Koeff_B_Smpl, 100000 );
       if (handle_CCIT3== INVALID_HANDLE )
        {
         Print ( "Error in loading CCIT3_Simple_v_2-01. Error : " , GetLastError ());
         return (- 1 );
        }
     }
   if (use_noReCalc_CCIT3)
     {
      handle_CCIT3= iCustom ( Symbol (), NULL , "CCIT3_noReCalc_v_3-01" ,CCI_Period_OtRng,CCI_Price_Type_OtRng,T3_Period_OtRng,Koeff_B_OtRng, 100000 );
       if (handle_CCIT3== INVALID_HANDLE )
        {
         Print ( "Error in loading Outrunning CCIT3_noReCalc_v_3-01. Error : " , GetLastError ());
         return (- 1 );
        }
     }
//---
   return ( 0 );
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void OnTimer ()
  {
   Trailing.Refresh();
  }
//+------------------------------------------------------------------+
//| deinitialization function                                        |
//+------------------------------------------------------------------+
void OnDeinit ( const int reason)
  {
   IndicatorRelease (handle_CCIT3);
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick ()
  {
   ea.OpenPosition(); // обрабатываем тик - открываем первый одрера
   Trailing.DoStoploss();

   datetime Now_time[ 1 ];
   int coptTime= CopyTime ( Symbol (), NULL , 0 , 1 ,Now_time);
   if (Now_time[ 0 ]>_time && coptTime!=- 1 )
     {
      _time=Now_time[ 0 ];
       int copy1= CopyBuffer (handle_CCIT3, 0 , 1 , 2 ,CCIT3);
       if (copy1<= 0 ) return ;
       if (! PositionSelect ( Symbol ()))
        {
         if (CCIT3[ 0 ]<= 0 && CCIT3[ 1 ]> 0 ) open( 0 );
         if (CCIT3[ 0 ]>= 0 && CCIT3[ 1 ]< 0 ) open( 1 );
        }
       else
        {
         if (Trade_overturn)
           {
             int type=( int ) PositionGetInteger ( POSITION_TYPE );
             if (type== 0 && CCIT3[ 0 ]>= 0 && CCIT3[ 1 ]< 0 )
               if (close()) open( 1 );
             if (type== 1 && CCIT3[ 0 ]<= 0 && CCIT3[ 1 ]> 0 )
               if (close()) open( 0 );
           }
        }
     }
   if (trail> 0 )
     {
       if ( PositionSelect ( Symbol ()) && PositionGetDouble ( POSITION_PROFIT )> 0 )
        {
         int type=( int ) PositionGetInteger ( POSITION_TYPE );
         double Price= 0 ;
         if (type== 0 )
           {
            Price= SymbolInfoDouble ( Symbol (), SYMBOL_BID )-trail* Point ();
           }
         if (type== 1 )
           {
            Price= SymbolInfoDouble ( Symbol (), SYMBOL_ASK )+trail* Point ();
           }
        }
     }
  }
//+------------------------------------------------------------------+
//| Open trade function                                              |
//+------------------------------------------------------------------+
void open( int type)
  {
   double pr_open= 0.0 ,_sl= 0.0 ,_tp= 0.0 ,_nLt=Lots;
   if (Max_drawdown> 0 )
     {
      _nLt= NormalizeDouble ((Lots* AccountInfoDouble ( ACCOUNT_BALANCE )/Max_drawdown), 2 );
       if ( SymbolInfoDouble ( Symbol (), SYMBOL_VOLUME_MAX )<_nLt)
        {
         _nLt= SymbolInfoDouble ( Symbol (), SYMBOL_VOLUME_MAX );
         Alert ( "Exceed the maximum Lot Volume. Will be installed the limit: " ,_nLt);
        }
     }
   MqlTradeRequest mrequest; MqlTradeResult mresult;
   ZeroMemory (mrequest);
   mrequest.action    = TRADE_ACTION_DEAL ;
   mrequest.symbol    = Symbol ();
   mrequest.volume    = _nLt;
   mrequest.magic     = magic;
   mrequest.deviation = Slippage;
   if (type== 0 )
     {
      mrequest.type= ORDER_TYPE_BUY ;
      mrequest.price= SymbolInfoDouble ( Symbol (), SYMBOL_ASK );
       if (SL> 0 ) _sl=mrequest.price-(SL* Point ());
       if (TP> 0 ) _tp=mrequest.price+(TP* Point ());
     }
   if (type== 1 )
     {
      mrequest.type= ORDER_TYPE_SELL ;
      mrequest.price= SymbolInfoDouble ( Symbol (), SYMBOL_BID );
       if (SL> 0 ) _sl=mrequest.price+(SL* Point ());
       if (TP> 0 ) _tp=mrequest.price-(TP* Point ());
     }
//---
   if (! OrderSend (mrequest,mresult))
       Print ( "error Opened order    __FUNCTION__" , __FUNCTION__ , ": " ,mresult.comment, " answer code " ,mresult.retcode);
   else
     {
      Trail_stop= 0 ;
       if (SL> 0 || TP> 0 )
        {
         for ( int k= 0 ; k<=N_modify_sltp; k++)
           {
             int minD=( int ) SymbolInfoInteger ( Symbol (), SYMBOL_TRADE_STOPS_LEVEL );
             MqlTradeRequest          prequest;
             MqlTradeResult           presult;
             ZeroMemory (prequest);
            prequest.action       = TRADE_ACTION_SLTP ;
            prequest.symbol       = Symbol ();
            prequest.sl           = NormalizeDouble (_sl, Digits ());
            prequest.tp           = NormalizeDouble (_tp, Digits ());
             if (! OrderSend (prequest,presult))
              {
               Print ( "error modif order = " , __FUNCTION__ , ": " ,presult.comment, " answer code " ,presult.retcode);
               Sleep ( 1000 );
              }
             else
              {
               Print ( "successful modify order = " , __FUNCTION__ , ": " ,presult.comment, " answer code " ,presult.retcode);
               return ;
              }
           }
        }
     }
  }
//+------------------------------------------------------------------+
//| Close trade function                                             |
//+------------------------------------------------------------------+
bool close()
  {
   MqlTradeRequest mrequest;
   MqlTradeResult mresult;
   ZeroMemory (mrequest);
   if ( PositionSelect ( Symbol ()))
     {
      mrequest.action= TRADE_ACTION_DEAL ;
       if ( PositionGetInteger ( POSITION_TYPE )== POSITION_TYPE_BUY )
         mrequest.price= SymbolInfoDouble ( Symbol (), SYMBOL_BID );
       if ( PositionGetInteger ( POSITION_TYPE )== POSITION_TYPE_SELL )
         mrequest.price= SymbolInfoDouble ( Symbol (), SYMBOL_ASK );
      mrequest.symbol  = Symbol ();
      mrequest.volume  = PositionGetDouble ( POSITION_VOLUME );
      mrequest.magic   = PositionGetInteger ( POSITION_MAGIC );
       if ( PositionGetInteger ( POSITION_TYPE )== POSITION_TYPE_BUY )
         mrequest.type= ORDER_TYPE_SELL ;
       if ( PositionGetInteger ( POSITION_TYPE )== POSITION_TYPE_SELL )
         mrequest.type= ORDER_TYPE_BUY ;
      mrequest.deviation=Slippage;
       if (! OrderSend (mrequest,mresult)) { GetLastError (); return ( false );}
       else return ( true );
     }
   return ( false );
  }
//------------------------------------------------------------------    OnTrade
void OnTrade ()
  {
   ea.CheckPosition(); // обрабатываем торговое событие
  }
//+------------------------------------------------------------------+
 

测试一个特定的值,超过这个值就开仓交易。

输入的参数。

bool Sell_Condition = (signal >= sgl);

我在测试器中选择变量sgl的值。

input double sgl=0.003;

变量类型 "信号 "双。

当运行单个测试时,我看到在sgl=0.003 的情况下,在0.0024、0.0027、0.0015 等位置进行输入

触发逻辑是正确的,但执行精度却不正确。

如何提高执行的准确性?

 
forexman77:

...

你如何提高你的表现的准确性?

试试吧。

bool Sell_Condition = (signal >= sgl)? true : false;
 

有没有一种相对简单的方法可以将日期从 "非标准 "的字符串格式转换为日期时间,或者至少是一种容易转换的字符串格式?

特别是,如果字符串中的月份是Jan/Jeb/......,我如何将其送入脚本?我的意思是,只有通过手动从字符串中挑选出月份,通过在12种变化中替换成适当的数字?或者我是不是在哪里错过了如何指定StringToTime 等的格式?

我现在已经有一个这样的建筑在处理。

int nmonth = buff[1]=="Jan"?01:buff[1]=="Feb"?02:buff[1]=="Mar"?03:buff[1]=="Apr"?04:buff[1]=="May"?05:buff[1]=="Jun"?06:
             buff[1]=="Jul"?07:buff[1]=="Aug"?08:buff[1]=="Sep"?09:buff[1]=="Oct"?10:buff[1]=="Nov"?11:buff[1]=="Dec"?12:01;

...但不知何故,我不喜欢它,尽管它在传统上是有效的。

 
制作了一个基于三条移动平均线的EA。

MA_1_t - 小周期,MA_2_t - 中周期,MA_3_t - 大周期。

如果我做到以下条件。

bool Buy_Condition_1=(MA_1_t < MA_2_t && MA_2_t < MA_3_t);

那么交易就开始了。

条件是相反的。

bool Buy_Condition_1=(MA_1_t > MA_2_t && MA_2_t > MA_3_t);

没有一笔交易。可能的原因是什么?

EA代码。

#property copyright ""
#property link      ""
#property version   "1.00"
//--- input parameters
input ushort      StopLoss=600;
input ushort      TakeProfit=450;
input int      EA_Magic=12345;   // Magic Number советника
input uchar ma_period_1=5;
input uchar ma_period_2=15;
input uchar ma_period_3=30;
input double   Lot=0.01;
//--- глобальные переменные
int STP,TKP;    // будут использованы для значений Stop Loss и Take Profit
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- Для работы с брокерами, использующими 5-ти значные котировки,
//--- умножаем на 10 значения SL и TP
   STP = StopLoss;
   TKP = TakeProfit;   
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
double MA_1_t = iMA(NULL,0,ma_period_1,0,MODE_EMA,PRICE_CLOSE);
double MA_2_t = iMA(NULL,0,ma_period_2,0,MODE_EMA,PRICE_CLOSE);
double MA_3_t = iMA(NULL,0,ma_period_3,0,MODE_EMA,PRICE_CLOSE);
//---
MqlTick latest_price;       // Будет использоваться для текущих котировок
MqlTradeRequest mrequest;    // Будет использоваться для отсылки торговых запросов
MqlTradeResult mresult;      // Будет использоваться для получения результатов выполнения торговых запросов
MqlRates mrate[];           // Будет содержать цены, объемы и спред для каждого бара
ZeroMemory(mrequest);       // Инициализация полей структуры mrequest
//--- Получить текущее значение котировки в структуру типа MqlTick
   if(!SymbolInfoTick(_Symbol,latest_price))
     {
      Alert("Ошибка получения последних котировок - ошибка:",GetLastError(),"!!");
      return;
     }
//--- есть ли открытые позиции?
   bool Buy_opened=false;  // переменные, в которых будет храниться информация 
   bool Sell_opened=false; // о наличии соответствующих открытых позиций

   if(PositionSelect(_Symbol)==true) // есть открытая позиция
     {
      if(PositionGetInteger(POSITION_TYPE)==POSITION_TYPE_BUY)
        {
         Buy_opened=true;  //это длинная позиция
        }
      else if(PositionGetInteger(POSITION_TYPE)==POSITION_TYPE_SELL)
        {
         Sell_opened=true; // это короткая позиция
        }
     }
bool Buy_Condition_1=(MA_1_t > MA_2_t && MA_2_t > MA_3_t);
//--- собираем все вместе
if(Buy_Condition_1)
        {
           // есть ли в данный момент открытая позиция на покупку?
         if(Buy_opened)
           {
            Alert("Уже есть позиция на продажу!!!");
            return;    // не добавлять к открытой позиции на продажу
           }
         mrequest.action = TRADE_ACTION_DEAL;                                  // немедленное исполнение
         mrequest.price = NormalizeDouble(latest_price.ask,_Digits);           // последняя цена ask
         mrequest.sl = NormalizeDouble(latest_price.ask - STP*_Point,_Digits); // Stop Loss
         mrequest.tp = NormalizeDouble(latest_price.ask + TKP*_Point,_Digits); // Take Profit
         mrequest.symbol = _Symbol;                                            // символ
         mrequest.volume = Lot;                                                // количество лотов для торговли
         mrequest.magic = EA_Magic;                                            // Magic Number
         mrequest.type = ORDER_TYPE_BUY;                                       // ордер на покупку
         mrequest.type_filling = ORDER_FILLING_FOK;                            // тип исполнения ордера - все или ничего
         mrequest.deviation=100;                                               // проскальзывание от текущей цены
         //--- отсылаем ордер
         OrderSend(mrequest,mresult);
         // анализируем код возврата торгового сервера
         if(mresult.retcode==10009 || mresult.retcode==10008) //запрос выполнен или ордер успешно помещен
           {
            Alert("Ордер Buy успешно помещен, тикет ордера #:",mresult.order,"!!");
           }
         else
           {
            Alert("Запрос на установку ордера Buy не выполнен - код ошибки:",GetLastError());
            return;
           }
        }
     }
 
forexman77:

MA_1_t - 小周期,MA_2_t - 中周期,MA_3_t - 大周期。

如果我做到以下条件。

那么交易就开始了。

条件则是相反的。

没有一笔交易。可能的原因是什么?

EA代码。

为了获得一个指标值,你需要在OnInit中创建一个指标句柄,然后在OnTick中使用CopyBuffer 将值复制到一个数组中。MQL5中的交易操作 这篇文章只是 告诉你如何写出更简单的代码来打开/关闭一个头寸/订单。
 
paladin800:
为了获得指标的值,你需要在OnInit中创建一个指标句柄,然后在OnTick中使用CopyBuffer 将值复制到一个数组中。MQL5中的交易操作 一文只是 展示了如何写出更简单的代码来开仓/平仓/订单。
谢谢你!这在MQL4中是完全不同的,它更简单。但在我看来,MQL5更快、更准确。
 

你能告诉我如何关闭一个没有开仓的挂单吗?我正在尝试这样做。

.......................
    if((PositionsTotal()<1) && PositionSelect(_Symbol))          // Закрываем отложный ордер Buy
    {                                               
     BuyStopPositionClose();
     }
 
 if((PositionsTotal()<1) && PositionSelect(_Symbol))          // Закрываем отложный ордер Sell
    {                                               
     SellStopPositionClose();
     }
...............................

//+------------------------------------------------------------------+
//| Закрытие Buy stop переворотной позиции                                         |
//+------------------------------------------------------------------+
void BuyStopPositionClose()
  {
 
   ZeroMemory(mrequest);
   ZeroMemory(mresult);

   double Ask = SymbolInfoDouble(_Symbol,SYMBOL_ASK);   // лучшее предложение на покупку
   double Bid = SymbolInfoDouble(_Symbol,SYMBOL_BID);   // лучшее предложение на продажу

 
     {
      mrequest.action = TRADE_ACTION_REMOVE;             // Удаление выставленного ордера
       mrequest.symbol = _Symbol;
         mrequest.volume = Lot*2;
         mrequest.price=NormalizeDouble(Ask+(SL-45) *_Point,_Digits);
         mrequest.sl = NormalizeDouble(mrequest.price - SL2*_Point,_Digits);
         mrequest.tp = NormalizeDouble(mrequest.price + TP2*_Point,_Digits);
         mrequest.deviation=0;
          mrequest.magic = Mag2; 
         mrequest.type=ORDER_TYPE_BUY_STOP;
         mrequest.type_filling=ORDER_FILLING_FOK;
                   
            OrderSend(mrequest,mresult);                  // отсылаем ордер
     }
  }
  
  //+------------------------------------------------------------------+
//| Закрытие Sell stop переворотной позиции                                         |
//+------------------------------------------------------------------+
void SellStopPositionClose()
  {


   ZeroMemory(mrequest);
   ZeroMemory(mresult);

   double Ask = SymbolInfoDouble(_Symbol,SYMBOL_ASK);   // лучшее предложение на покупку
   double Bid = SymbolInfoDouble(_Symbol,SYMBOL_BID);   // лучшее предложение на продажу

 
     {
      mrequest.action = TRADE_ACTION_REMOVE;              // Удаление выставленного ордера
      mrequest.symbol = _Symbol;
         mrequest.volume = Lot*2;
         mrequest.price=NormalizeDouble(Bid-(SL-45) *_Point,_Digits);
         mrequest.sl = NormalizeDouble(mrequest.price + SL2*_Point,_Digits);
         mrequest.tp = NormalizeDouble(mrequest.price - TP2*_Point,_Digits);
         mrequest.deviation=0;
         mrequest.magic = Mag2;
         mrequest.type=ORDER_TYPE_SELL_STOP;
         mrequest.type_filling=ORDER_FILLING_FOK;    
      OrderSend(mrequest,mresult);                      // отсылаем ордер
     }
  }
  
或者在行mrequest.price=NormalizeDouble(Bid-(SL-45) *_Point,_Digits);我是否应该写其他信息?谢谢你。
 
Crucian:

你能告诉我如何关闭一个没有开仓的挂单吗?我正在尝试这样做。

或者在行mrequest.price=NormalizeDouble(Bid-(SL-45) *_Point,_Digits);我是否应该写其他信息?谢谢你。
只需 阅读MQL5 中的 "修改和删除订单"。你可能在那里找到答案。我建议阅读整篇文章。