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

 

안녕하세요. 고문이 MetaTraider 4에 썼던 것처럼, 그는 글 쓰는 법을 배웠습니다. 아직 모르는 것도 많고 모르는 것도 많다. 그리고 모든 것이 약간 다른 것으로 판명된 MetaTrader 5로 전송하기로 결정했습니다. 일반적으로 다른 조언자를 데려갔습니다. 구문 분석했습니다. 나는 내기를 열기 위해 코드를 복사했다. 일반적으로 오류는 없지만 정상적으로 작동하지 않습니다. 올바르게 이동할 수 있도록 도와주세요.

메타 트레이더 4:

int  err = 0 ;            
double Lot = 0.01 ;       // Лот
double CoofLot = 0 ;
double Ballance = AccountBalance ();
double loss = 100 ;    
bool nap = true ;       //true  - 1
                       //false - 0
int start()
  {  
     if ( OrdersTotal ()== 0 )                                
    {
       if (Ballance != AccountBalance ())                
       {
         if ( AccountBalance () < Ballance )                
        {
            CoofLot++;
            Lot = pow ( 2 , CoofLot) * 0.01 ;
             if (nap == true )                            
               {
                nap = false ;
               }
             else
               {
                nap = true ;
               }
         }
         if ( AccountBalance () > Ballance)                
           {
             Lot = 0.01 ;
             CoofLot = 0 ;
           }
       }
    Ballance = AccountBalance ();
    
     int order;
     if (nap == true )                                      
      {
       order = OrderSend ( Symbol (), OP_BUY ,Lot, Ask , 1 * Point , Ask -loss* Point , Ask +loss* Point );   // Вверх
      }                  
     else
      {
       order = OrderSend ( Symbol (), OP_SELL ,Lot, Bid , 1 * Point , Bid +loss* Point , Bid -loss* Point );     // Вниз
      }
  
       if (order< 0 )                                
         {
           if ( GetLastError ()== 134 )
             {
               err= 1 ;
               Print ( "NOT ENOGUGHT MONEY!!" );
             }
           return (- 1 );
         }
       }
   return ( 0 );
  }


MetaTrader 5로 전송한 방법은 다음과 같습니다.

double Lot = 0.01 ;      
double CoofLot = 0 ;

double Ballance = ACCOUNT_BALANCE ;
double loss = 100 ;    
bool nap = true ;       //true  - 1
                       //false - 0



void OnTick ()
{
   MqlTick latest_price;       // Будет использоваться для текущих котировок
   MqlTradeRequest mrequest;   // Будет использоваться для отсылки торговых запросов
   MqlTradeResult mresult;  
   if ( OrdersTotal ()== 0 )                                
      {
       if (! SymbolInfoTick ( _Symbol ,latest_price))
         {
             Alert ( "Ошибка получения последних котировок - ошибка:" , GetLastError (), "!!" );
             return ;
         }
        
       if (Ballance != ACCOUNT_BALANCE )                
       {
         if ( ACCOUNT_BALANCE < Ballance )                
        {
            CoofLot++;
            Lot = pow ( 2 , CoofLot) * 0.01 ;
             if (nap == true )                            
               {
                nap = false ;
               }
             else
               {
                nap = true ;
               }
         }
         if ( ACCOUNT_BALANCE > Ballance)                
           {
             Lot = 0.01 ;
             CoofLot = 0 ;
           }
       }
    Ballance = ACCOUNT_BALANCE ;
     int order;
     if (nap == true )                                      
      {
         mrequest.action = TRADE_ACTION_DEAL ;                                   // немедленное исполнение
         mrequest.price = NormalizeDouble (latest_price.ask, _Digits );           // последняя цена ask
         mrequest.sl = NormalizeDouble (latest_price.ask - 100 * _Point , _Digits ); // Stop Loss
         mrequest.tp = NormalizeDouble (latest_price.ask + 100 * _Point , _Digits ); // Take Profit
         mrequest.symbol = _Symbol ;                                             // символ
         mrequest.volume = Lot;                                                 // количество лотов для торговли
         mrequest.type = ORDER_TYPE_BUY ;                                       // ордер на покупку
         mrequest.type_filling = ORDER_FILLING_FOK ;                             // тип исполнения ордера - все или ничего
         mrequest.deviation= 100 ;                                               // проскальзывание от текущей цены
         //--- отсылаем ордер

         order = OrderSend (mrequest,mresult);
      }                  
     else
      {
         mrequest.action = TRADE_ACTION_DEAL ;                                   // немедленное исполнение
         mrequest.price = NormalizeDouble (latest_price.bid, _Digits );           // последняя цена Bid
         mrequest.sl = NormalizeDouble (latest_price.bid + 100 * _Point , _Digits ); // Stop Loss
         mrequest.tp = NormalizeDouble (latest_price.bid - 100 * _Point , _Digits ); // Take Profit
         mrequest.symbol = _Symbol ;                                             // символ
         mrequest.volume = Lot;                                                 // количество лотов для торговли
         mrequest.type= ORDER_TYPE_SELL ;                                       // ордер на продажу
         mrequest.type_filling = ORDER_FILLING_FOK ;                             // тип исполнения ордера - все или ничего
         mrequest.deviation= 100 ;                                               // проскальзывание от текущей цены
         //--- отсылаем ордер

         order = OrderSend (mrequest,mresult);  
      }
      }
   return ;
  }
 
DenZell :

안녕하세요. 고문이 MetaTraider 4에 썼던 것처럼, 그는 글 쓰는 법을 배웠습니다. 아직 모르는 것도 많고 모르는 것도 많다. 그리고 모든 것이 약간 다른 것으로 판명된 MetaTrader 5로 전송하기로 결정했습니다. 일반적으로 다른 조언자를 데려갔습니다. 구문 분석했습니다. 나는 내기를 열기 위해 코드를 복사했다. 일반적으로 오류는 없지만 정상적으로 작동하지 않습니다. 올바르게 이동할 수 있도록 도와주세요.


코드는 다음과 같이 보일 것입니다(그러나 주의하십시오. 거래 계정( PositionsTotal )의 총 포지션 수를 확인합니다.

   if ( PositionsTotal ()== 0 )

즉, 주어진 기호와 주어진 Magic에 대해 정확히 몇 개의 위치가 있는지 확인하지 않습니다(그런데 Magic은 전혀 설정되지 않음))

//+------------------------------------------------------------------+
//|                                                       TestEA.mq5 |
//|                              Copyright © 2016, Vladimir Karputov |
//|                                           http://wmua.ru/slesar/ |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2016, Vladimir Karputov"
#property link        "http://wmua.ru/slesar/"
#property version    "1.00"
//---
double          Lot            = 0.01 ;
double          CoofLot        = 1.0 ;
double          loss           = 100.0 ;
bool            nap            = true ;
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit ()
  {
   CoofLot  = 1.0 ;
   loss     = 100.0 ;
   nap      = true ;
//---
   return ( INIT_SUCCEEDED );
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick ()
  {
   static double          Balance= 0.0 ;
   if (Balance== 0.0 )
      Balance= AccountInfoDouble ( ACCOUNT_BALANCE );

   if ( PositionsTotal ()== 0 )
     {
       MqlTick latest_price;                         // Будет использоваться для текущих котировок
       if (! SymbolInfoTick ( _Symbol ,latest_price))
        {
         Alert ( "Ошибка получения последних котировок - ошибка:" , GetLastError (), "!!" );
         return ;
        }

       if (Balance!= AccountInfoDouble ( ACCOUNT_BALANCE ))
        {
         if ( AccountInfoDouble ( ACCOUNT_BALANCE )<Balance)
           {
            CoofLot++;
            Lot= pow ( 2 ,CoofLot)* 0.01 ;
             if (nap== true )
              {
               nap= false ;
              }
             else
              {
               nap= true ;
              }
           }
         if ( AccountInfoDouble ( ACCOUNT_BALANCE )>Balance)
           {
            Lot= 0.01 ;
            CoofLot= 1.0 ;
           }
        }
      Balance= AccountInfoDouble ( ACCOUNT_BALANCE );

       MqlTradeRequest mrequest;   // Будет использоваться для отсылки торговых запросов
       MqlTradeResult mresult;
       ZeroMemory (mrequest);
       ZeroMemory (mresult);

       bool order= false ;
       if (nap== true )
        {
         mrequest.action = TRADE_ACTION_DEAL ;                                   // немедленное исполнение
         mrequest.price = NormalizeDouble (latest_price.ask, _Digits );           // последняя цена ask
         mrequest.sl = NormalizeDouble (latest_price.bid - 100 * _Point , _Digits ); // Stop Loss
         mrequest.tp = NormalizeDouble (latest_price.bid + 100 * _Point , _Digits ); // Take Profit
         mrequest.symbol = _Symbol ;                                             // символ
         mrequest.volume = Lot;                                                 // количество лотов для торговли
         mrequest.type = ORDER_TYPE_BUY ;                                       // ордер на покупку
         mrequest.type_filling = ORDER_FILLING_FOK ;                             // тип исполнения ордера - все или ничего
         mrequest.deviation= 100 ;                                               // проскальзывание от текущей цены
         //--- отсылаем ордер

         order= OrderSend (mrequest,mresult);
        }
       else
        {
         mrequest.action = TRADE_ACTION_DEAL ;                                   // немедленное исполнение
         mrequest.price = NormalizeDouble (latest_price.bid, _Digits );           // последняя цена Bid
         mrequest.sl = NormalizeDouble (latest_price.ask + 100 * _Point , _Digits ); // Stop Loss
         mrequest.tp = NormalizeDouble (latest_price.ask - 100 * _Point , _Digits ); // Take Profit
         mrequest.symbol = _Symbol ;                                             // символ
         mrequest.volume = Lot;                                                 // количество лотов для торговли
         mrequest.type= ORDER_TYPE_SELL ;                                       // ордер на продажу
         mrequest.type_filling = ORDER_FILLING_FOK ;                             // тип исполнения ордера - все или ничего
         mrequest.deviation= 100 ;                                               // проскальзывание от текущей цены
         //--- отсылаем ордер

         order= OrderSend (mrequest,mresult);
        }
     }
   return ;
  }
//+------------------------------------------------------------------+

또한 OrderSend 작업의 결과는 bool 유형입니다.

잔액을 저장하기 위해 정적 변수를 적용했습니다.

   static double          Balance= 0.0 ;
   if (Balance== 0.0 )
      Balance= AccountInfoDouble ( ACCOUNT_BALANCE );

- 즉, "Balance" 변수는 OnTick()에 대한 후속 호출에서 다시 생성되지 않지만 이전 틱의 값을 기억합니다.

파일:
TestEA.mq5  10 kb
 

나는 다음과 같이 쓸 것입니다.

//+------------------------------------------------------------------+
//|                                                       TestEA.mq5 |
//|                              Copyright © 2017, Vladimir Karputov |
//|                                           http://wmua.ru/slesar/ |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2017, Vladimir Karputov"
#property link        "http://wmua.ru/slesar/"
#property version    "1.001"
#include <Trade\PositionInfo.mqh>
#include <Trade\Trade.mqh>
#include <Trade\SymbolInfo.mqh>  
#include <Trade\AccountInfo.mqh>
CPositionInfo  m_position;                   // trade position object
CTrade         m_trade;                       // trading object
CSymbolInfo    m_symbol;                     // symbol info object
CAccountInfo   m_account;                     // account info wrapper
//---
double          Lot            = 0.01 ;
double          CoofLot        = 1.0 ;
double          Loss           = 100.0 ;
bool            nap            = true ;
//---
ulong           m_magic        = 15489 ;       // magic number
ulong           m_slippage     = 10 ;           // slippage
double          m_adjusted_point;             // point value adjusted for 3 or 5 points
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit ()
  {
   m_symbol.Name( Symbol ());                   // sets symbol name
   if (! RefreshRates ())
     {
       Print ( "Error RefreshRates. Bid=" , DoubleToString (m_symbol. Bid (), Digits ()),
             ", Ask=" , DoubleToString (m_symbol. Ask (), Digits ()));
       return ( INIT_FAILED );
     }
   m_symbol.Refresh();
//---
   m_trade.SetExpertMagicNumber(m_magic);
//---
   m_trade.SetDeviationInPoints(m_slippage);
//--- tuning for 3 or 5 digits
   int digits_adjust= 1 ;
   if (m_symbol. Digits ()== 3 || m_symbol. Digits ()== 5 )
      digits_adjust= 10 ;
   m_adjusted_point=m_symbol. Point ()*digits_adjust;
//---
   CoofLot  = 1.0 ;
   Loss     = 100.0 ;
   nap      = true ;
//---
   return ( INIT_SUCCEEDED );
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick ()
  {
   static double          static_Balance= 0.0 ;
   if (static_Balance== 0.0 )
      static_Balance=m_account.Balance();

   double balance=m_account.Balance();             // локальная переменная для хранения баланса на время OnTick

//--- считаем позиции по символу и по Magic
   int total= 0 ;
   for ( int i= PositionsTotal ()- 1 ;i>= 0 ;i--) // returns the number of open positions
       if (m_position.SelectByIndex(i))     // selects the position by index for further access to its properties
         if (m_position. Symbol ()==m_symbol.Name() && m_position.Magic()==m_magic)
            total++;

   if (total== 0 )
     {
       //--- попытка обновить цены
       if (! RefreshRates ())
         return ;                           // есил не удалось обновить цены - просто выходим

       if (static_Balance!=balance)
        {
         if (balance<static_Balance)
           {
            CoofLot++;
             double lots= pow ( 2 ,CoofLot)* 0.01 ;       // локальная переменная для временных расчётов лота
             //--- проверка корректности лота
            Lot=LotCheck(lots);
             if (Lot== 0.0 )
               return ;
             if (nap)
               nap= false ;
             else
               nap= true ;
           }
         if (balance>static_Balance)
           {
            Lot= 0.01 ;
            CoofLot= 1.0 ;
           }
        }
      static_Balance=balance;

       if (nap== true )
        {
         double sl=m_symbol.NormalizePrice(m_symbol. Bid () - Loss*m_adjusted_point); // Stop Loss
         double tp=m_symbol.NormalizePrice(m_symbol. Bid () + Loss*m_adjusted_point); // Take Profit

         if (m_trade.Buy(Lot, NULL ,m_symbol. Ask (),sl,tp))
           {
             if (m_trade.ResultDeal()== 0 )
               Print ( "Buy -> false. Result Retcode: " ,m_trade.ResultRetcode(),
                     ", description of result: " ,m_trade.ResultRetcodeDescription());
             else
               Print ( "Buy -> true. Result Retcode: " ,m_trade.ResultRetcode(),
                     ", description of result: " ,m_trade.ResultRetcodeDescription());
           }
         else
             Print ( "Buy -> false. Result Retcode: " ,m_trade.ResultRetcode(),
                   ", description of result: " ,m_trade.ResultRetcodeDescription());
        }
       else
        {
         double sl=m_symbol.NormalizePrice(m_symbol. Ask ()+Loss*m_adjusted_point); // Stop Loss
         double tp=m_symbol.NormalizePrice(m_symbol. Ask ()-Loss*m_adjusted_point); // Take Profit

         if (m_trade.Sell(Lot, NULL ,m_symbol. Ask (),sl,tp))
           {
             if (m_trade.ResultDeal()== 0 )
               Print ( "Sell -> false. Result Retcode: " ,m_trade.ResultRetcode(),
                     ", description of result: " ,m_trade.ResultRetcodeDescription());
             else
               Print ( "Sell -> true. Result Retcode: " ,m_trade.ResultRetcode(),
                     ", description of result: " ,m_trade.ResultRetcodeDescription());
           }
         else
             Print ( "Sell -> false. Result Retcode: " ,m_trade.ResultRetcode(),
                   ", description of result: " ,m_trade.ResultRetcodeDescription());
        }
     }
   return ;
  }
//+------------------------------------------------------------------+
//| Refreshes the symbol quotes data                                 |
//+------------------------------------------------------------------+
bool RefreshRates ()
  {
//--- refresh rates
   if (!m_symbol. RefreshRates ())
       return ( false );
//--- protection against the return value of "zero"
   if (m_symbol. Ask ()== 0 || m_symbol. Bid ()== 0 )
       return ( false );
//---
   return ( true );
  }
//+------------------------------------------------------------------+
//| Lot Check                                                        |
//+------------------------------------------------------------------+
double LotCheck( double lots)
  {
//--- calculate maximum volume
   double volume= NormalizeDouble (lots, 2 );
   double stepvol=m_symbol.LotsStep();
   if (stepvol> 0.0 )
      volume=stepvol* MathFloor (volume/stepvol);
//---
   double minvol=m_symbol.LotsMin();
   if (volume<minvol)
      volume= 0.0 ;
//---
   double maxvol=m_symbol.LotsMax();
   if (volume>maxvol)
      volume=maxvol;
   return (volume);
  }
//+------------------------------------------------------------------+

여기:

  1. 손절매는 "4" 포인트로 설정됩니다. 즉, EURUSD 및 USDJPY 모두에서 올바르게 작동합니다.
  2. 가격을 얻기 위해 무역 클래스 CSymbolInfo의 "m_symbol" 개체가 사용됩니다 .
  3. 주어진 기호와 주어진 Magic에 대한 총 위치 수를 확인합니다.
  4. 로트가 변경되면 "LotCheck"에서 사전 확인 및 수정됩니다.
  5. 거래 작업은 CTrade 거래 클래스의 "m_trade" 개체의 메서드를 사용하여 수행됩니다.
  6. 매매거래 결과 확인(기본 확인 및 배치결과 2단계)

추가됨:

우리는 전략 테스터에서 한 번의 실행으로 매우 흥미로운 결과를 얻었습니다.

시험 장치


파일:
TestEA.mq5  14 kb
 
Vladimir Karputov :

나는 다음과 같이 쓸 것입니다.

현재로서는 m_symbol.RefreshRates() 함수를 사용하지 않는 것이 좋습니다. SymbolInfoTick()은 신선하지 않은 데이터를 반환할 수 있습니다. 그리고 개발자들이 이 주제를 읽는다면 SymbolInfoTick() 이 엉망 이지만 SB 클래스에서 사용된다는 사실에 다시 한 번 주의를 기울이십시오!
 
안녕하세요! 나는 독학을 위해 MQL5를 기반으로 다중 통화 Green-Red Candle 전략 EA를 만들기로 결정했습니다.
기본 기능은 구현되어 있지만 "Invalid price"와 같은 오류가 지속적으로 나타납니다. 가능한 원인을 제거하고 그에 따라 알려진 올바른 값으로 설정하기 위해 추가 검사를 추가했지만 오류는 사라지지 않았습니다. 더 이상 어떤 방향으로 나아가야 할지 모르겠습니다. 내가 어디서 실수를 했는지 말해줘? 소스 코드가 첨부되어 있습니다.
파일:
 
NickWelder :
안녕하세요! 독학을 위해 MQL5 기반의 다중 통화 Green-Red Candle 전략 EA를 만들기로 결정했습니다.
기본 기능은 구현되어 있지만 "Invalid price"와 같은 오류가 지속적으로 나타납니다. 가능한 원인을 제거하고 그에 따라 알려진 올바른 값으로 설정하기 위해 추가 검사를 추가했지만 오류는 사라지지 않았습니다. 더 이상 어떤 방향으로 나아가야 할지 모르겠습니다. 말해봐, 내가 어디에서 실수를 했니? 소스코드를 첨부합니다.

거래 작업을 수행 하기 전에 CSymbolInfo 거래 클래스 개체에서 가격을 업데이트해야 합니다. 내 모노 프로젝트(하나의 문자만 포함)에서 다음 기능을 사용합니다.

//+------------------------------------------------------------------+
//| Refreshes the symbol quotes data                                 |
//+------------------------------------------------------------------+
bool RefreshRates ()
  {
//--- refresh rates
   if (!m_symbol. RefreshRates ())
       return ( false );
//--- protection against the return value of "zero"
   if (m_symbol. Ask ()== 0 || m_symbol. Bid ()== 0 )
       return ( false );
//---
   return ( true );
  }

사용 - 가격을 업데이트한 다음 종료합니다. 가격이 성공적으로 업데이트되면 거래 작업이 수행됩니다.

//--- refresh rates
   if (!m_symbol. RefreshRates ())
       return ;

   if (m_trade.Buy(lots, NULL ,m_symbol. Ask (),sl,tp))
     {
       if (m_trade.ResultDeal()== 0 )
         Print ( "Buy -> false. Result Retcode: " ,m_trade.ResultRetcode(),
               ", description of result: " ,m_trade.ResultRetcodeDescription());
       else
         Print ( "Buy -> true. Result Retcode: " ,m_trade.ResultRetcode(),
               ", description of result: " ,m_trade.ResultRetcodeDescription());
     }
   else
       Print ( "Buy -> false. Result Retcode: " ,m_trade.ResultRetcode(),
             ", description of result: " ,m_trade.ResultRetcodeDescription(
 
@Vladimir Karputov 감사합니다! 모든 것이 시장 주문으로 해결되었습니다.
 

이 구성을 대체하는 것보다 아름답고 "쉬운"솔루션을 알려주십시오.

if ( iBarShift ( _Symbol , _Period , TimeLast)== 3 ) {...}

이제 이것이 있지만 저에게는 너무 "무거운"솔루션이 있습니다.

int iBarShift ( string symbol, ENUM_TIMEFRAMES tf, datetime time, bool exact= false ) {
   if (time< 0 ) return (- 1 );
   datetime Arr[],time1;
   CopyTime (symbol,tf, 0 , 1 ,Arr);
   time1=Arr[ 0 ];
   if ( CopyTime (symbol,tf,time,time1,Arr)> 0 ) {
       if ( ArraySize (Arr)> 2 ) return ( ArraySize (Arr)- 1 );
       if (time<time1) return ( 1 );
       else return ( 0 );
     }
   else return (- 1 );
}
 
Vitaly Muzichenko :

이 구성을 대체하는 것보다 아름답고 "쉬운"솔루션을 알려주십시오.

if ( iBarShift ( _Symbol , _Period , TimeLast)== 3 ) {...}

이제 이것이 있지만 저에게는 너무 "무거운"솔루션이 있습니다.

int iBarShift ( string symbol, ENUM_TIMEFRAMES tf, datetime time, bool exact= false ) {
   if (time< 0 ) return (- 1 );
   datetime Arr[],time1;
   CopyTime (symbol,tf, 0 , 1 ,Arr);
   time1=Arr[ 0 ];
   if ( CopyTime (symbol,tf,time,time1,Arr)> 0 ) {
       if ( ArraySize (Arr)> 2 ) return ( ArraySize (Arr)- 1 );
       if (time<time1) return ( 1 );
       else return ( 0 );
     }
   else return (- 1 );
}
그래서 어떻게 든 ( @fxsaber 의 솔루션 ):

//+------------------------------------------------------------------+
//| Возвращает смещение бара по времени                              |
//+------------------------------------------------------------------+
int GetBarShift( const string symbol_name, const ENUM_TIMEFRAMES timeframe, const datetime time) {
   int res=- 1 ;
   datetime last_bar;
   if ( SeriesInfoInteger (symbol_name,timeframe, SERIES_LASTBAR_DATE ,last_bar)) {
       if (time>last_bar) res= 0 ;
       else {
         const int shift= Bars (symbol_name,timeframe,time,last_bar);
         if (shift> 0 ) res=shift- 1 ;
         }
      }
   return (res);
}
//+------------------------------------------------------------------+
여기 어딘가에 누군가가 선택한 행에서 다음을 수행해야 한다고 썼습니다. if (time>=last_bar) res= 0 ;

나는 그것을 확인하지 않았습니다. 솔직히 말해서 - 항상 도달하지는 않습니다. 결과를 확인하고 게시하십시오.
 
Vitaly Muzichenko :

이 구성을 대체하는 것보다 아름답고 "쉬운"솔루션을 알려주십시오.

if ( iBarShift ( _Symbol , _Period , TimeLast)== 3 ) {...}

이제 이것이 있지만 저에게는 너무 "무거운"솔루션이 있습니다.

int iBarShift ( string symbol, ENUM_TIMEFRAMES tf, datetime time, bool exact= false ) {
   if (time< 0 ) return (- 1 );
   datetime Arr[],time1;
   CopyTime (symbol,tf, 0 , 1 ,Arr);
   time1=Arr[ 0 ];
   if ( CopyTime (symbol,tf,time,time1,Arr)> 0 ) {
       if ( ArraySize (Arr)> 2 ) return ( ArraySize (Arr)- 1 );
       if (time<time1) return ( 1 );
       else return ( 0 );
     }
   else return (- 1 );
}
내 솔루션이 얼마나 "더 쉬운"지 모르겠지만 다음을 시도하십시오. https://www.mql5.com/en/forum/160945#comment_4053382
Как получить номер бара по времени входа в позицию?
Как получить номер бара по времени входа в позицию?
  • www.mql5.com
Приветствую! Пишу трейлинг, который проходится по барам начиная от времени входа в позицию...
사유: