Yeni başlayanlardan sorular MQL5 MT5 MetaTrader 5 - sayfa 728

 

Merhaba. MetaTraider 4'te bir danışmanın yazdığı gibi. Daha doğrusu yazmayı öğrendi. Bilmediğim ve hala bilmediğim çok şey var. Ve her şeyin biraz farklı olduğu MetaTrader 5'e aktarmaya karar verdim. Genel olarak, başka bir danışman aldım. Onu ayrıştırdım. Bahisleri açmak için kodu kopyaladım. Genel olarak, hata yoktur, ancak olması gerektiği gibi çalışmıyor. Lütfen doğru hareket etmeme yardım et.

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


Ve işte bunu MetaTrader 5'e nasıl aktardım:

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 :

Merhaba. MetaTraider 4'te bir danışmanın yazdığı gibi. Daha doğrusu yazmayı öğrendi. Bilmediğim ve hala bilmediğim çok şey var. Ve her şeyin biraz farklı olduğu MetaTrader 5'e aktarmaya karar verdim. Genel olarak, başka bir danışman aldım. Onu ayrıştırdım. Bahisleri açmak için kodu kopyaladım. Genel olarak, hata yoktur, ancak olması gerektiği gibi çalışmıyor. Lütfen doğru hareket etmeme yardım et.


Kod şöyle görünecektir (ancak dikkatli olun - ticaret hesabındaki toplam pozisyon sayısını kontrol eder ( PositionsTotal ):

   if ( PositionsTotal ()== 0 )

yani, belirli bir sembol ve verilen Magic için tam olarak kaç pozisyonun kontrolü yoktur (bu arada, Magic hiç ayarlanmamıştır))

//+------------------------------------------------------------------+
//|                                                       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 ;
  }
//+------------------------------------------------------------------+

Ayrıca OrderSend işleminin sonucu bool türündedir.

Bakiyeyi saklamak için statik bir değişken uyguladım

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

- yani, "Balance" değişkeni, OnTick()'e yapılan sonraki çağrılarda yeniden oluşturulmayacak, ancak önceki onay değerinden değerini hatırlayacaktır.

Dosyalar:
TestEA.mq5  10 kb
 

Her ne kadar şöyle yazsam da:

//+------------------------------------------------------------------+
//|                                                       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);
  }
//+------------------------------------------------------------------+

Burada:

  1. Stop Loss "dört" noktada ayarlanmıştır - yani hem EURUSD hem de USDJPY üzerinde doğru şekilde çalışacaktır.
  2. fiyatları almak için CSymbolInfo ticaret sınıfının "m_symbol" nesnesi kullanılır
  3. verilen sembol ve verilen Magic için toplam pozisyon sayısını kontrol eder
  4. parti değişirse, önceden kontrol edilir ve "LotCheck" de düzeltilir.
  5. alım satım işlemleri, CTrade alım satım sınıfının "m_trade" nesnesinin yöntemleri kullanılarak gerçekleştirilir.
  6. alım satım işlemlerinin sonucu kontrol edilir (iki aşama - temel kontrol ve yerleştirme sonucu)

Katma:

strateji test cihazında tek bir çalıştırmanın çok ilginç bir sonucunu aldık:

test cihazı


Dosyalar:
TestEA.mq5  14 kb
 
Vladimir Karputov :

Her ne kadar şöyle yazsam da:

Şu anda m_symbol.RefreshRates() işlevini kullanmanızı önermem, çünkü SymbolInfoTick(), taze olmayan verileri döndürebilir. Ve geliştiriciler bu konuyu okurlarsa, lütfen bir kez daha dikkatlerini SymbolInfoTick () öğesinin ortalığı karıştırdığına, ancak bunun SB sınıflarında kullanıldığına çekin!
 
Merhaba! Kendi kendine eğitim için MQL5'e dayalı çok para birimi Yeşil-Kırmızı Mum stratejisi EA yapmaya karar verdim.
Temel işlevsellik uygulanıyor, ancak "Geçersiz fiyat" gibi hatalar sürekli görünüyor. Olası nedenlerini ortadan kaldırmak ve buna göre bunları bilinen doğru değerlere ayarlamak için ek kontroller eklendi, ancak hatalar ortadan kalkmadı. Artık hangi yöne gideceğimi bilmiyorum. Söyle bana, nerede hata yaptım? Kaynak kodunu ekliyorum.
Dosyalar:
 
NickWelder :
Merhaba! Kendi kendine eğitim için MQL5'e dayalı çok para birimi Yeşil-Kırmızı Mum stratejisi EA yapmaya karar verdim.
Temel işlevsellik uygulanıyor, ancak "Geçersiz fiyat" gibi hatalar sürekli görünüyor. Olası nedenlerini ortadan kaldırmak ve buna göre bunları bilinen doğru değerlere ayarlamak için ek kontroller eklendi, ancak hatalar ortadan kalkmadı. Artık hangi yöne gideceğimi bilmiyorum. Söyle bana nerede hata yaptım? Kaynak kodları ektedir.

Bir alım satım işlemi yapmadan önce, CSymbolInfo alım satım sınıfı nesnesindeki fiyatları güncellemeniz gerekir. Mono projelerimde (sadece bir karaktere sahip) bu işlevi kullanıyorum:

//+------------------------------------------------------------------+
//| 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 );
  }

ve kullanın - fiyatları güncellemeyi başardıysak, o zaman çıkın, fiyatlar başarıyla güncellendiyse, bir ticaret işlemi olacaktır:

//--- 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 Teşekkürler! Her şey piyasa emirleriyle çalıştı.
 

Bana bu yapıyı değiştirmekten daha güzel ve "kolay" bir çözüm söyleyin:

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

Şimdi bu var, ama bana gelince - çok "ağır" bir çözüm:

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 :

Bana bu yapıyı değiştirmekten daha güzel ve "kolay" bir çözüm söyleyin:

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

Şimdi bu var, ama bana gelince - çok "ağır" bir çözüm:

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 );
}
Yani bir şekilde ( @fxsaber 'dan gelen çözüm):

//+------------------------------------------------------------------+
//| Возвращает смещение бара по времени                              |
//+------------------------------------------------------------------+
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);
}
//+------------------------------------------------------------------+
Burada birisi seçili satırda bunu yapmanız gerektiğini yazmıştı: if (time>=last_bar) res= 0 ;

Dürüst olmak gerekirse kontrol etmedim - her zaman ulaşmıyor. Lütfen kontrol edip sonucu yazınız.
 
Vitaly Muzichenko :

Bana bu yapıyı değiştirmekten daha güzel ve "kolay" bir çözüm söyleyin:

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

Şimdi bu var, ama bana gelince - çok "ağır" bir çözüm:

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 );
}
Çözümümün ne kadar "kolay" olduğunu bilmiyorum ama şunu deneyin: https://www.mql5.com/en/forum/160945#comment_4053382
Как получить номер бара по времени входа в позицию?
Как получить номер бара по времени входа в позицию?
  • www.mql5.com
Приветствую! Пишу трейлинг, который проходится по барам начиная от времени входа в позицию...