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

 
fxsaber :

Ve nasıl kullanırsın?

Bütün fikir, diyelim ki "..\MQL5\Files\00\dir_01" adresinde işlenecek dosyaların bulunduğu dizinlerim var, harika kodunuzu kullanarak bu klasörlerin yolunu bir dizide alıyorum ve Hangi dosyaları işlemem gerektiğini açıkça bilerek daha da ileri gitmek istiyorum, bu dosyalara atıfta bulunun ve bunun için onlara yolu yazmanız gerekiyor, örneğin, bu "MQL5\\Files\\00\\dir_01\ \A\\test.csv" ve kod böyle bir yol döndürüyor "MQL5\Files\00\dir_01\A\", bu yüzden daha sonra kullanıma uygun bir yolu en iyi şekilde döndürmek için değiştirilip değiştirilemeyeceğini soruyorum kod.

 
Aleksey Vyazmikin :

Ve nasıl kullanırsın?

Bütün fikir, diyelim ki "..\MQL5\Files\00\dir_01" adresinde işlenecek dosyaların bulunduğu dizinlerim var, harika kodunuzu kullanarak bu klasörlerin yolunu bir dizide alıyorum ve Hangi dosyaları işlemem gerektiğini açıkça bilerek daha da ileri gitmek istiyorum, bu dosyalara atıfta bulunun ve bunun için onlara yolu yazmanız gerekiyor, örneğin, bu "MQL5\\Files\\00\\dir_01\ \A\\test.csv" ve kod böyle bir yol döndürüyor "MQL5\Files\00\dir_01\A\", bu yüzden daha sonra kullanıma uygun bir yolu en iyi şekilde döndürmek için değiştirilip değiştirilemeyeceğini soruyorum kod.

Çift eğik çizginin ne olduğunu anlamıyorsunuz - sözdiziminde iki ile gösterilen bir karakter: ilk eğik çizgi komutu, ikincisi - hangisi.

\n, \r, \t, \" ve \\ bu kurala göre belirtilen karakterlerdir. Yani, yolda her zaman bir eğik çizgi vardır.

 
fxsaber :

Çift eğik çizginin ne olduğunu anlamıyorsunuz - sözdiziminde iki ile gösterilen bir karakter: ilk eğik çizgi komutu, ikincisi - hangisi.

\n, \r, \t, \" ve \\ bu kurala göre belirtilen karakterlerdir. Yani, yolda her zaman bir eğik çizgi vardır.

Bir şeyi anlamadığımı ekarte etmiyorum, ancak dosyanın yolunu oluşturmak için bir değil iki eğik çizgiye ihtiyacım var.

 
Aleksey Vyazmikin :

Bir şeyi anlamadığımı ekarte etmiyorum, ancak dosyanın yolunu oluşturmak için bir değil iki eğik çizgiye ihtiyacım var.

İki eğik çizgiye ihtiyacınız yok.

 void OnStart ()
{
   uchar Array[ 1 ] = {'\\'};
  
   Print ( CharArrayToString (Array));
}
Print aracılığıyla bir, iki, üç eğik çizgi kaydetmeyi deneyin. Belki o zaman anlarsın.
 
fxsaber :

İki eğik çizgiye ihtiyacınız yok.

Yazdır'ı kullanarak bir, iki, üç eğik çizgi kaydetmeyi deneyin. Belki o zaman anlarsın.

Evet, eğik çizginin bir komut olduğunu anlıyorum ama yolu yazmam gerekiyor ve bunun için çift eğik çizgi kullanıyorum.

İşte geçerli bir yol

 int zz= FileOpen ( " 00\\dir_01\\A\\ZZ_Analiz_Open.bin", FILE_BIN | FILE_READ );

Klasörler[0] dizisinde bir dize aldım:

 00 \dir_01\A\

Dizini değiştirerek aynı ada sahip ancak farklı dizinlerde bulunan bir dosyaya erişmek istiyorum, sanırım bunu yapmanız gerekiyor

 int zz= FileOpen (Folders[0]+"ZZ_Analiz_Open.bin", FILE_BIN | FILE_READ );

ama böyle bir komut bir hataya neden olur, değil mi?

 
Ve ana dosyada, dahil edilen dosya sınıfının объект класса oluşturulur ve yöntemlerden biri çağrılır.

Boşuna.

 

Tünaydın!

MQL4'ten MQL5'e geçmeye çalışıyorum ve son kapalı pozisyonu bulamıyorum.
MQL5'te emir gönderdiğimizde emirdir, açıldığında pozisyon olmuştur ve mantıksal olarak kapandıktan sonra pozisyon geçmişine gitmeli ve silinmiş bekleyen emirler emir geçmişinde olmalıdır. , ancak yalnızca anlaşmalardan gelen geçmiş siparişleri görüyorum - bu nedenle kapalı bir pozisyonun nerede aranacağı net değil.

Bu şekilde denedim:

 ulong GetLastCloseTicket()
{
     datetime to= TimeCurrent ();
     datetime from=to- 3 * PeriodSeconds ( PERIOD_D1 );
     HistorySelect (from,to);    
     int Htotal= HistoryOrdersTotal ();
     ulong lastOrders[ 2 ];
     ulong ticket;
     ArrayInitialize (lastOrders, 0 );
 
     for ( uint j = 0 ; j < Htotal; j++)
    {           
         if (ticket= HistoryOrderGetTicket (j)) {            
             if ( HistoryOrderGetInteger (ticket, ORDER_TYPE )== ORDER_TYPE_BUY || HistoryOrderGetInteger (ticket, ORDER_TYPE )== ORDER_TYPE_SELL ) {
                 Print ( "ticket = " +ticket+ ";" );
                 Print ( "ORDER_TYPE = " + ORDER_TYPE + ";" );                
                 // хранить самый последний (недавно закрытый) ордер в lastOrders[1]
                 // а предпоследний в lastOrders[0]
                 if (ticket > lastOrders[ 0 ]) {
                     if (ticket > lastOrders[ 1 ]) {
                        lastOrders[ 0 ] = lastOrders[ 1 ];
                        lastOrders[ 1 ] = ticket;                   
                    } else {
                        lastOrders[ 0 ] = ticket;
                    }
                }
            }
        }
    }
     Print ( "lastOrders[1] = " +lastOrders[ 1 ]+ ";" );
     return (lastOrders[ 1 ]);   
} 

Ancak hem açık hem de kapalı pozisyonların numaralarını gösterir. ORDER_TYPE her zaman 4 çıktı verir ve bu da net değildir.

SİPARİŞ'i DEAL olarak değiştirmeye çalıştım ama o da çalışmıyor.
Söyle bana, lütfen, sorun ne?

 
vladzeit :

Vladimir'e teşekkür ederim. RefreshRates tırnak güncelleme işleviyle sınıftan   CSymbolInfo Ben zaten biraz tanıştım. Eserlerinde gördüm, işte astarda okudum.

OnTick'te bu işlevi çağırmak ve Yorum'da fiyat değerlerini göstermek de örnekten bana açık.   OnInit'teki mevcut karakteri kontrol etme prosedürü de benim için açık.

Yeni bir bar ile örnek beklerken sizin örneğiniz ile pratik yapacağım, henüz pratikte uygulamadım. Deneyeceğim.


Yani, yalnızca yeni bir barın doğuşu sırasında çalışan bir örnek.

Bu örnek, PrevBars , prev_ask ve prev_bid statik değişkenlerini kullanır. Statik değişkenlerin özü -

Statik anahtar kelime ile bildirilen yerel değişkenler , işlevin ömrü boyunca değerlerini korur . İşleve yapılan sonraki her çağrıda, bu tür yerel değişkenler önceki çağrı sırasında sahip oldukları değerleri içerir.

Böylece üç statik değişkenimiz ( PrevBars , prev_ask ve prev_bid ) OnTick fonksiyonu içinde bildirilen yerel değişkenlerdir ve OnTick fonksiyonuna bir önceki girişlerinde sahip oldukları değerlerini korurlar.

PrevBars , önceki çubuğun zamanını saklar. Bu süre, geçerli çubuğun zamanı olan time_0 ile karşılaştırılır. PrevBars time_0'a eşitken - mevcut çubuktayız ve OnTick işlevinden çıkıyoruz. Bir önceki çubuğun fiyatlarını saklayan değişkenlere benzer şekilde: önce önceki ve güncel fiyatları gösteririz, ardından mevcut fiyatları prev_ask değişkenlerine yazarız. ve   prev_bid .

 //+------------------------------------------------------------------+
//|                                      Display previous prices.mq5 |
//|                              Copyright © 2018, Vladimir Karputov |
//|                                           http://wmua.ru/slesar/ |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2018, Vladimir Karputov"
#property link        "http://wmua.ru/slesar/"
#property version    "1.000"
//---
#include <Trade\SymbolInfo.mqh>  
CSymbolInfo    m_symbol;                     // symbol info object
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit ()
  {
//---
   if (!m_symbol.Name( Symbol ())) // sets symbol name
       return ( INIT_FAILED );
   RefreshRates ();
//---
   return ( INIT_SUCCEEDED );
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit ( const int reason)
  {
//---

  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick ()
  {
//--- we work only at the time of the birth of new bar
   static datetime PrevBars = 0 ;
   datetime time_0= iTime (m_symbol.Name(), Period (), 0 );
   if (time_0==PrevBars)
       return ;
   PrevBars=time_0;
   if (! RefreshRates ())
     {
      PrevBars= 0 ;
       return ;
     }
//---
   static double prev_ask = 0.0 ;
   static double prev_bid = 0.0 ;
   Comment ( "       Previous | Current" , "\n" ,
           "Ask: " , DoubleToString (prev_ask,m_symbol. Digits ()), " | " , DoubleToString (m_symbol. Ask (),m_symbol. Digits ()), "\n" ,
           "Bid:  " , DoubleToString (prev_bid,m_symbol. Digits ()), " | " , DoubleToString (m_symbol. Bid (),m_symbol. Digits ()));
   prev_ask=m_symbol. Ask ();
   prev_bid=m_symbol. Bid ();
  }
//+------------------------------------------------------------------+
//| Refreshes the symbol quotes data                                 |
//+------------------------------------------------------------------+
bool RefreshRates ( void )
  {
//--- refresh rates
   if (!m_symbol. RefreshRates ())
     {
       Print ( "RefreshRates error" );
       return ( false );
     }
//--- protection against the return value of "zero"
   if (m_symbol. Ask ()== 0 || m_symbol. Bid ()== 0 )
       return ( false );
//---
   return ( true );
  }
//+------------------------------------------------------------------+
Dosyalar:
 

Ticaret, otomatik ticaret sistemleri ve ticaret stratejilerinin test edilmesi hakkında forum

Yeni başlayanlardan sorular MQL5 MT5 MetaTrader 5

Alexey Vyazmikin , 2018.12.05 00:39

Evet, eğik çizginin bir komut olduğunu anlıyorum ama yolu yazmam gerekiyor ve bunun için çift eğik çizgi kullanıyorum.

İşte geçerli bir yol

 int zz= FileOpen ( " 00\\dir_01\\A\\ZZ_Analiz_Open.bin", FILE_BIN | FILE_READ );

Klasörler[0] dizisinde bir dize aldım:

 00 \dir_01\A\

Dizini değiştirerek aynı ada sahip ancak farklı dizinlerde bulunan bir dosyaya erişmek istiyorum, sanırım bunu yapmanız gerekiyor

 int zz= FileOpen (Folders[0]+"ZZ_Analiz_Open.bin", FILE_BIN | FILE_READ );

ama böyle bir komut bir hataya neden olur, değil mi?


Hata olmayacak. Çift eğik çizginin ne olduğunu asla anlamadın.

 
Aleksey Vyazmikin :

Evet, eğik çizginin bir komut olduğunu anlıyorum ama yolu yazmam gerekiyor ve bunun için çift eğik çizgi kullanıyorum.

İşte geçerli bir yol

Klasörler[0] dizisinde bir dize aldım:

Dizini değiştirerek aynı ada sahip ancak farklı dizinlerde bulunan bir dosyaya erişmek istiyorum, sanırım bunu yapmanız gerekiyor

ama böyle bir komut bir hataya neden olur, değil mi?

Alexey, belgelerden bir örnek al

 //+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart ()
  {
//--- неправильный способ открытия файла
   string terminal_data_path = TerminalInfoString ( TERMINAL_DATA_PATH );
   string filename =terminal_data_path+ "\\MQL5\\Files\\" + "fractals.csv" ;
   int filehandle= FileOpen (filename, FILE_WRITE | FILE_CSV );
   if (filehandle< 0 )
     {
       Print ( "Неудачная попытка открыть файл по абсолютному пути" );
       Print ( "Код ошибки " , GetLastError ());
     }
//--- правильный способ работы в "файловой песочнице"
   ResetLastError ();
   filehandle= FileOpen ( "fractals.csv" , FILE_WRITE | FILE_CSV );
   if (filehandle!= INVALID_HANDLE )
     {
       FileWrite (filehandle, TimeCurrent (), Symbol (), EnumToString ( _Period ));
       FileClose (filehandle);
       Print ( "FileOpen OK" );
     }
   else Print ( "Операция FileOpen неудачна, ошибка " , GetLastError ());
//--- еще один пример с созданием вложенной директории в MQL5\Files\
   string subfolder= "Research" ;
   filehandle= FileOpen (subfolder+ "\\fractals.txt" , FILE_WRITE | FILE_CSV );
       if (filehandle!= INVALID_HANDLE )
     {
       FileWrite (filehandle, TimeCurrent (), Symbol (), EnumToString ( _Period ));
       FileClose (filehandle);
       Print ( "Файл должен быть создан в папке " +terminal_data_path+ "\\" +subfolder);
     }
   else Print ( "Операция FileOpen неудачна, ошибка " , GetLastError ());
  }

ve örnek kodda vurgulanan iki dize değişkenini yazdırın. Farkları bulun ve çift eğik çizginin yalnızca program kodunda yazıldığını, ancak derlendiğinde yalnızca birinin kaldığını ve dosya yolunda kullanıldığını anlayın.

Документация по MQL5: Файловые операции / FileOpen
Документация по MQL5: Файловые операции / FileOpen
  • www.mql5.com
[in]  Имя открываемого файла, может содержать подпапки. Если файл открывается для записи, то указанные подпапки будут созданы в случае их отсутствия. [in]  значение, используемое в качестве разделителя в txt или csv-файле. Если для csv-файла разделитель не указан, то по умолчанию используется символ табуляции. Если для txt-файла разделитель не...