Preguntas de los principiantes MQL5 MT5 MetaTrader 5 - página 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();}

No entiendo por qué los datos de la barra de cero no se corresponden con la realidad.

Obtengo este resultado

2013.10.27 17:45:26 Core 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 Núcleo 1 2013.01.01 00:00:00 369878

Me olvidé de contarlo todo en el experto.

O, en otras palabras, al probar el EA desde la fecha XXX hasta la fecha YYY, hasta qué profundidad de los datos de XXX se puede descargar?????????????????

 

Necesito consejo sobre el código: tomé un asesor de la base de datos, lo probé, lo agregué, lo resté, cambié los coeficientes para obtener una buena imagen, la imagen parece salir, pero nada funciona en la demostración, es el otro Al revés, es como el mal, ajusto todo según los artículos enseñados y los gráficos buenos durante un mes aumentan en un 100%. Entonces, ¿es solo para el probador y es adecuado o debería probarse de alguna manera diferente? También me gustaría rehacer TreilingParabolikSAR para que no se detengan las pérdidas , pero los legos a una cierta distancia del precio, tal vez alguien le diga dónde conseguirlo, hasta ahora no se ha encontrado. Aquí está uno de los códigos resultantes con buenos gráficos: dígame qué está mal, qué arreglar, aunque todo puede estar mal aquí...

 //+------------------------------------------------------------------+
//|                                                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(); // обрабатываем торговое событие
  }
//+------------------------------------------------------------------+
 

Probando un determinado valor, por encima del cual se abre una operación.

Parámetros de entrada:

bool Sell_Condition = (signal >= sgl);

Elijo el valor de la variable sgl en el probador:

input double sgl=0.003;

variable tipo "señal" doble.

Al ejecutar una sola prueba veo que con sgl=0,003 la entrada se realiza a 0,0024, 0,0027, 0,0015, etc.

La lógica de activación es correcta, pero la precisión de la ejecución no lo es.

¿Cómo puedo mejorar la precisión de la ejecución?

 
forexman77:

...

¿Cómo mejorar la precisión de su actuación?

Pruébalo:

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

¿Existe una forma relativamente fácil de convertir una fecha de un formato de cadena "no estándar" a datetime o al menos a un formato de cadena fácilmente convertible?

En particular, si el mes en la cadena es Ene/Jeb/..., ¿cómo lo introduzco en el script? Es decir, ¿sólo escogiendo manualmente el mes de la cadena, sustituyéndolo por el número apropiado en 12 variaciones? ¿O me he perdido en alguna parte cómo especificar el formato de StringToTime, etc.?

Tengo una construcción como esta manejándola ahora mismo:

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;

...pero de alguna manera no me gusta, aunque funciona convencionalmente.

 
Hice un EA basado en tres medias móviles.

MA_1_t - período pequeño, MA_2_t - período medio, MA_3_t - período grande.

Si hago las siguientes condiciones:

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

entonces se abren las operaciones.

Las condiciones se invierten:

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

Ni una sola operación. ¿Cuál podría ser la razón?

Código 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 - período pequeño, MA_2_t - período medio, MA_3_t - período grande.

Si hago las siguientes condiciones:

entonces se abren las operaciones.

Las condiciones se invierten:

Ni una sola operación. ¿Cuál podría ser la razón?

Código EA:

Para obtener el valor de un indicador, es necesario crear un manejador de indicador en OnInit, y luego copiar el valor en una matriz usando CopyBuffer en OnTick. El artículo Operaciones de trading en MQL5 sólo muestra cómo escribir un código más sencillo para abrir/cerrar una posición/orden.
 
paladin800:
Para obtener el valor del indicador es necesario crear un handle del indicador en OnInit, y luego en OnTick se copia el valor en un array usando CopyBuffer. El artículo Operaciones de trading en MQL5 sólo muestra cómo escribir un código más sencillo para abrir/cerrar una posición/orden.
Gracias. Es bastante diferente en MQL4, es más simple. Pero MQL5 es más rápido y preciso, en mi opinión.
 

¿Pueden decirme cómo cerrar una orden pendiente que no se ha abierto? Estoy tratando de hacerlo de esta manera:

.......................
    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);                      // отсылаем ордер
     }
  }
  
O en la línea mrequest.price=NormalizeDouble(Bid-(SL-45) *_Point,_Digits); ¿debo escribir otra información? Gracias.
 
Crucian:

¿Pueden decirme cómo cerrar una orden pendiente que no se ha abierto? Estoy tratando de hacerlo de esta manera:

O en la línea mrequest.price=NormalizeDouble(Bid-(SL-45) *_Point,_Digits); ¿debo escribir otra información? Gracias.
Sólo hay que leer "Modificar y eliminar órdenes" en MQL5. Puede que encuentres la respuesta allí. Le recomiendo que lea el artículo completo.
Razón de la queja: