초보자의 질문 MQL5 MT5 MetaTrader 5 - 페이지 723

 

사람들은 내가 무엇을 잘못하고 있는지 알려줍니다. 왜 두 개의 표시기 iRSI, iCCI가 문제를 일으키지 않고 MA와 BB가 경고를 표시합니다(형식 변환 Indicator.mqh로 인한 데이터 손실 가능성 )

//+------------------------------------------------------------------+
//|                                                    Indicator.mqh |
//|                        Copyright 2017, MetaQuotes Software Corp. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2017, MetaQuotes Software Corp."
#property link        "https://www.mql5.com"
// интерфейс к индикаторам.  

class CIndicators
{
public :

   double iRSI ( string symbol, ENUM_TIMEFRAMES tf, int period, ENUM_APPLIED_PRICE applied, int shift);
   double iCCI ( string symbol, ENUM_TIMEFRAMES tf, int period, ENUM_APPLIED_PRICE applied, int shift);  
   double iBands ( string symbol, ENUM_TIMEFRAMES tf, int BBPeriod, int shift, double BBDeviation, ENUM_APPLIED_PRICE BBPrice );  
   double iMA ( string symbol, ENUM_TIMEFRAMES tf, int nMAPeriod, int shift, ENUM_MA_METHOD eMAMethod , ENUM_APPLIED_PRICE MAPrice);
      
};
// -Создадим экземпляр индикатора iRSI
double CIndicators:: iRSI ( string symbol, ENUM_TIMEFRAMES tf, int period, ENUM_APPLIED_PRICE applied, int shift)
{
//---  
   int hRSI = iRSI (symbol, tf, period, applied);
   if (hRSI == INVALID_HANDLE )
       return 0.0 ;
   double rsi[];
   CopyBuffer (hRSI, 0 , shift, 1 , rsi);
   if ( ArraySize (rsi))
       return rsi[ 0 ];
   return 0.0 ;
//--Создадим экземпляр индикатора iCCI
}
//----------------------------------
double CIndicators:: iCCI ( string symbol, ENUM_TIMEFRAMES tf, int period, ENUM_APPLIED_PRICE applied, int shift)
{
   int hCCI = iCCI ( Symbol (), PERIOD_CURRENT , 55 , PRICE_CLOSE );
   if (hCCI == INVALID_HANDLE ) return 0.0 ;
   double cci[];
   ArrayResize (cci, 1 );
   CopyBuffer (hCCI, 0 , 0 , 1 , cci);
   return cci[ 0 ];
}
//--------------------------------------------------
// Создадим экземпляр индикатора ВВ
double CIndicators:: iBands ( string symbol, ENUM_TIMEFRAMES tf, int BBPeriod, int shift, double BBDeviation, ENUM_APPLIED_PRICE BBPrice)
{

   int hBands = iBands ( Symbol (),tf,BBPeriod, 0 ,BBDeviation, PRICE_CLOSE );
   if (hBands== INVALID_HANDLE ) return 0.0 ;
   // Создадим массив значений верхней границы ВВ
   double fBBUpper[];
   ArrayResize (fBBUpper, true );
   CopyBuffer (hBands, UPPER_BAND , 0 , 3 ,fBBUpper);
   return fBBUpper[ 0 ];  
   // Создадим массив значений нижней границы ВВ
   double fBBLower[];
   ArraySetAsSeries (fBBLower, true );
   CopyBuffer (hBands, LOWER_BAND , 0 , 3 ,fBBLower);
   return   fBBLower[ 0 ];
   }
  
// Создадим экземпляр индикатора МА  
double CIndicators:: iMA ( string symbol, ENUM_TIMEFRAMES tf, int nMAPeriod, int shift, ENUM_MA_METHOD eMAMethod , ENUM_APPLIED_PRICE MAPrice)
{
// получим его хэндл
   int hMA= iMA ( Symbol (), PERIOD_CURRENT , nMAPeriod, 0 , MODE_EMA , PRICE_CLOSE );
   if (hMA == INVALID_HANDLE ) return 0.0 ;
// Создадим массив значений МА,заполним тремя последними значениями мувинга.
   double fMA[];
   ArraySetAsSeries (fMA, true );
   CopyBuffer (hMA, 0 , 0 , 3 ,fMA);
   return fMA[ 0 ];

}
 

그리고 나는 또한 묻고 싶었습니다. 거래 요청 에서 변경해야 할 사항, 오류 10030이 나타났습니다, , 1년 전, EA 코드가 문제 없이 작동했는데 이제 다시 MQL5 변경 사항의 혁신을 읽고/검색해야 합니다.


// функция открытия позиции с рынка
bool MarketOrder( const string sSymbol, const ENUM_POSITION_TYPE eType, const double fLot, const int nSL = 0 , const int nTP = 0 , const ulong nMagic = 0 , const uint nSlippage = 1000 )
{
         bool bRetVal = false ;
        
         // запрос
         MqlTradeRequest oRequest = { 0 };
         MqlTradeResult    oResult = { 0 };
        
         double fPoint = SymbolInfoDouble (sSymbol, SYMBOL_POINT );
         int nDigits     = ( int ) SymbolInfoInteger (sSymbol, SYMBOL_DIGITS );

        oRequest.action         = TRADE_ACTION_DEAL ;
        oRequest.symbol         = sSymbol;
        oRequest.volume         = fLot;
        oRequest.stoplimit      = 0 ;
        oRequest.deviation      = nSlippage;
        
         if (eType == POSITION_TYPE_BUY )
        {
                oRequest.type           = ORDER_TYPE_BUY ;
                oRequest.price          = NormalizeDouble ( SymbolInfoDouble (sSymbol, SYMBOL_ASK ), nDigits);
                oRequest.sl                     = NormalizeDouble (oRequest.price - nSL * fPoint, nDigits) * (nSL > 0 );
                oRequest.tp                     = NormalizeDouble (oRequest.price + nTP * fPoint, nDigits) * (nTP > 0 );
        }
        
         if (eType == POSITION_TYPE_SELL )
        {
                oRequest.type           = ORDER_TYPE_SELL ;
                oRequest.price          = NormalizeDouble ( SymbolInfoDouble (sSymbol, SYMBOL_BID ), nDigits);
                oRequest.sl                     = NormalizeDouble (oRequest.price + nSL * fPoint, nDigits) * (nSL > 0 );
                oRequest.tp                     = NormalizeDouble (oRequest.price - nTP * fPoint, nDigits) * (nTP > 0 );
        }
        
         // определим допустимый тип заливки ордера (зависит от типа исполнения - Instant, Market, биржевое и т.д.)
         switch (( int ) SymbolInfoInteger (sSymbol, SYMBOL_FILLING_MODE ))
        {
         case SYMBOL_FILLING_FOK :
                oRequest.type_filling = ORDER_FILLING_FOK ;
                 break ;
         case SYMBOL_FILLING_IOC :
                oRequest.type_filling = ORDER_FILLING_IOC ;
                 break ;
         default :
                oRequest.type_filling = ORDER_FILLING_RETURN ;
        }

        oRequest.magic                          = nMagic;
        
        
         // проверка перед отправкой
         MqlTradeCheckResult oCheckResult= { 0 };
        
         bool bCheck = OrderCheck (oRequest, oCheckResult);

         Print ( "Проверка заявки MarketOrder:" ,
                         " OrderCheck = " ,               bCheck,
                         ", retcode = " ,         oCheckResult.retcode,
                         ", balance = " ,         NormalizeDouble (oCheckResult.balance, 2 ),
                         ", equity = " ,                   NormalizeDouble (oCheckResult.equity, 2 ),
                         ", margin = " ,                   NormalizeDouble (oCheckResult.margin, 2 ),
                         ", margin_free = " ,     NormalizeDouble (oCheckResult.margin_free, 2 ),
                         ", margin_level = " ,     NormalizeDouble (oCheckResult.margin_level, 2 ),
                         ", comment = " ,         oCheckResult.comment);
        
         // если проверка удачная - отправка заявки
         if (bCheck == true && oCheckResult.retcode == 0 )
        {
                 bool bResult = false ;
                
                 // 3 попытки выставления ордера
                 for ( int k = 0 ; k < 3 ; k++)
                {
                        bResult = OrderSend (oRequest, oResult);
                        
                         if (bResult == true && oResult.retcode == TRADE_RETCODE_DONE )
                                 break ;
                        
                         if (k == 2 )
                                 break ;
                                
                         Sleep ( 100 );
                }
        
                 Print ( "Отправка заявки:" ,
                                 " OrderSend = " ,        bResult,
                                 ", retcode = " , oResult.retcode,
                                 ", deal = " ,            oResult.deal,
                                 ", order = " ,           oResult.order,
                                 ", volume = " ,           NormalizeDouble (oResult.volume, 2 ),
                                 ", price = " ,           NormalizeDouble (oResult.price, _Digits ),
                                 ", bid = " ,                     NormalizeDouble (oResult.bid, _Digits ),
                                 ", ask = " ,                     NormalizeDouble (oResult.ask, _Digits ),
                                 ", comment = " , oResult.comment,
                                 ", request_id = " ,oResult.request_id);  
                                
                 if (oResult.retcode == TRADE_RETCODE_DONE )
                        bRetVal = true ;
        }
         else if (oResult.retcode == TRADE_RETCODE_NO_MONEY )
        {
                 Print ( "Недостаточно денег для открытия позиции. Работа эксперта прекращена." );
                 ExpertRemove ();
        }
        
         return (bRetVal);
}
 
Alexander Antoshkin :

그리고 나는 또한 묻고 싶었습니다. 거래 요청 에서 변경해야 할 사항, 오류 10030이 나타났습니다, , 1년 전, EA 코드가 문제 없이 작동했는데 이제 다시 MQL5 변경 사항의 혁신을 읽고/검색해야 합니다.


// функция открытия позиции с рынка
bool MarketOrder( const string sSymbol, const ENUM_POSITION_TYPE eType, const double fLot, const int nSL = 0 , const int nTP = 0 , const ulong nMagic = 0 , const uint nSlippage = 1000 )
{
         bool bRetVal = false ;
        
         // запрос
         MqlTradeRequest oRequest = { 0 };
         MqlTradeResult    oResult = { 0 };
        
         double fPoint = SymbolInfoDouble (sSymbol, SYMBOL_POINT );
         int nDigits     = ( int ) SymbolInfoInteger (sSymbol, SYMBOL_DIGITS );

        oRequest.action         = TRADE_ACTION_DEAL ;
        oRequest.symbol         = sSymbol;
        oRequest.volume         = fLot;
        oRequest.stoplimit      = 0 ;
        oRequest.deviation      = nSlippage;
        
         if (eType == POSITION_TYPE_BUY )
        {
                oRequest.type           = ORDER_TYPE_BUY ;
                oRequest.price          = NormalizeDouble ( SymbolInfoDouble (sSymbol, SYMBOL_ASK ), nDigits);
                oRequest.sl                     = NormalizeDouble (oRequest.price - nSL * fPoint, nDigits) * (nSL > 0 );
                oRequest.tp                     = NormalizeDouble (oRequest.price + nTP * fPoint, nDigits) * (nTP > 0 );
        }
        
         if (eType == POSITION_TYPE_SELL )
        {
                oRequest.type           = ORDER_TYPE_SELL ;
                oRequest.price          = NormalizeDouble ( SymbolInfoDouble (sSymbol, SYMBOL_BID ), nDigits);
                oRequest.sl                     = NormalizeDouble (oRequest.price + nSL * fPoint, nDigits) * (nSL > 0 );
                oRequest.tp                     = NormalizeDouble (oRequest.price - nTP * fPoint, nDigits) * (nTP > 0 );
        }
        
         // определим допустимый тип заливки ордера (зависит от типа исполнения - Instant, Market, биржевое и т.д.)
         switch (( int ) SymbolInfoInteger (sSymbol, SYMBOL_FILLING_MODE ))
        {
         case SYMBOL_FILLING_FOK :
                oRequest.type_filling = ORDER_FILLING_FOK ;
                 break ;
         case SYMBOL_FILLING_IOC :
                oRequest.type_filling = ORDER_FILLING_IOC ;
                 break ;
         default :
                oRequest.type_filling = ORDER_FILLING_RETURN ;
        }

        oRequest.magic                          = nMagic;
        
        
         // проверка перед отправкой
         MqlTradeCheckResult oCheckResult= { 0 };
        
         bool bCheck = OrderCheck (oRequest, oCheckResult);

         Print ( "Проверка заявки MarketOrder:" ,
                         " OrderCheck = " ,               bCheck,
                         ", retcode = " ,         oCheckResult.retcode,
                         ", balance = " ,         NormalizeDouble (oCheckResult.balance, 2 ),
                         ", equity = " ,                   NormalizeDouble (oCheckResult.equity, 2 ),
                         ", margin = " ,                   NormalizeDouble (oCheckResult.margin, 2 ),
                         ", margin_free = " ,     NormalizeDouble (oCheckResult.margin_free, 2 ),
                         ", margin_level = " ,     NormalizeDouble (oCheckResult.margin_level, 2 ),
                         ", comment = " ,         oCheckResult.comment);
        
         // если проверка удачная - отправка заявки
         if (bCheck == true && oCheckResult.retcode == 0 )
        {
                 bool bResult = false ;
                
                 // 3 попытки выставления ордера
                 for ( int k = 0 ; k < 3 ; k++)
                {
                        bResult = OrderSend (oRequest, oResult);
                        
                         if (bResult == true && oResult.retcode == TRADE_RETCODE_DONE )
                                 break ;
                        
                         if (k == 2 )
                                 break ;
                                
                         Sleep ( 100 );
                }
        
                 Print ( "Отправка заявки:" ,
                                 " OrderSend = " ,        bResult,
                                 ", retcode = " , oResult.retcode,
                                 ", deal = " ,            oResult.deal,
                                 ", order = " ,           oResult.order,
                                 ", volume = " ,           NormalizeDouble (oResult.volume, 2 ),
                                 ", price = " ,           NormalizeDouble (oResult.price, _Digits ),
                                 ", bid = " ,                     NormalizeDouble (oResult.bid, _Digits ),
                                 ", ask = " ,                     NormalizeDouble (oResult.ask, _Digits ),
                                 ", comment = " , oResult.comment,
                                 ", request_id = " ,oResult.request_id);  
                                
                 if (oResult.retcode == TRADE_RETCODE_DONE )
                        bRetVal = true ;
        }
         else if (oResult.retcode == TRADE_RETCODE_NO_MONEY )
        {
                 Print ( "Недостаточно денег для открытия позиции. Работа эксперта прекращена." );
                 ExpertRemove ();
        }
        
         return (bRetVal);
}

강조 표시된 것을 다음과 같이 작성합니다.

switch (( ENUM_SYMBOL_TRADE_EXECUTION ) SymbolInfoInteger (sSymbol, SYMBOL_TRADE_EXEMODE );
 
안녕하세요. 후행 정지가 있는 조언자를 알려주시겠습니까?
 
Alexey Viktorov :

강조 표시된 것을 다음과 같이 작성합니다.

switch (( ENUM_SYMBOL_TRADE_EXECUTION ) SymbolInfoInteger (sSymbol, SYMBOL_TRADE_EXEMODE );

마음으로...!!! )

도움이 되었습니다, 효과가 있었습니다!

고마워 알렉스!!!!!!!!!

 
안녕하세요. MT5에 대한 어드바이저알려주지 마십시오. 후행 중지가 있는 어드바이저를 알려주지 않습니까? 바람직하게 는 SCALPER 또는 WORKING ON THE NEWS 또는 기타. 미리 감사드립니다
 
Alex2018 :
안녕하세요. MT5에 대한 어드바이저알려주지 마십시오. 후행 중지가 있는 어드바이저를 알려주지 않습니까? 바람직하게 는 SCALPER 또는 WORKING ON THE NEWS 또는 기타. 미리 감사드립니다
검색을 이용하셨나요? 여기에도 링크가 있습니다. 후행 중지가 있는 Expert Advisors
 
구매한 인디케이터 를 단말기에 설치하는 과정을 설명해주세요 구매했는데 활성화가 안되는데 뭐가 문제인가요?
 
act1on :
구매한 인디케이터 를 단말기에 설치하는 과정을 설명해주세요 구매했는데 활성화가 안되는데 뭐가 문제인가요?
지정: 시장 에서 구입?
 
Vladimir Karputov :
지정: 시장 에서 구입?
예 시장: https://www.mql5.com/ru/market/mt5/indicator
구매 후 "터미널에 설치"를 클릭 한 후 거래 터미널에 갔지만 아무 일도 일어나지 않았고 표시기가 나타나지 않았습니다
MQL5 Маркет: Индикаторы
MQL5 Маркет: Индикаторы
  • www.mql5.com
Маркет - магазин программ для MetaTrader 5 и MetaTrader 4
사유: