초보자의 질문 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

2013.10.27 17:45:26 코어 1 2013.01.01 00:00:00 369878

전문가에게 모든 것을 말하는 것을 잊었습니다.

즉, XXX 날짜에서 YYY 날짜까지 Expert Advisor를 테스트 할 때 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 ;
 

날짜를 "비표준" 문자열 형식에서 datetime 또는 최소한 쉽게 변환 가능한 문자열 형식으로 변환하는 비교적 쉬운 방법이 있습니까?

특히 월이 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 ;

...하지만 조건부로 일하지만 어떻게 든 그녀는 나에게 예쁘지 않습니다.

 
세 가지 이동 평균을 기반으로 Expert Advisor를 만들었습니다.

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);

단일 거래가 아닙니다. 이유는 무엇입니까?

고문 코드:

 #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 - 큰 기간.

내가 다음 조건을 수행하는 경우:

거래가 열립니다.

반대 조건:

단일 거래가 아닙니다. 이유는 무엇입니까?

고문 코드:

표시기 값을 가져오려면 먼저 OnInit에서 표시기 핸들을 만든 다음 CopyBuffer 를 사용하여 OnTick의 배열에 값을 복사합니다. 그리고 MQL5의 Trade Operations 기사에서 포지션/오더를 열고/닫는 코드를 작성하는 것이 얼마나 쉬운지 설명합니다.
 
paladin800 :
표시기 값을 가져오려면 먼저 OnInit에서 표시기 핸들을 만든 다음 CopyBuffer 를 사용하여 OnTick의 배열에 값을 복사합니다. 그리고 MQL5의 Trade Operations 기사에서 포지션/오더를 열고/닫는 코드를 작성하는 것이 얼마나 쉬운지 설명합니다.
고맙습니다! 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의 거래 작업 기사에서 "주문 수정 및 삭제" 섹션을 읽으십시오. 아마도 거기에서 답을 찾을 수 있을 것입니다. 그리고 일반적으로 전체 기사를 읽는 것이 좋습니다.
사유: