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

 
Vladimir Karputov :

Görünüşe göre terminal geçmişi indirmeye devam ediyor - buna göre gösterge sürekli olarak yeniden hesaplanıyor. Veya başka bir seçenek: terminalde, çizelgede görüntülenecek ÇOK fazla sayıda çubuk var ve bilgisayarınız ÇOK

Yardım için teşekkürler!

Başka bir tarih seçerseniz, hesaplama hemen gerçekleşir. İlk test sırasında fiyatta bir boşluk vardı, bazı fiyatların atlanmış olması mümkündür - büyük olasılıkla sorun budur.

 

Merhaba! MT5 "Grid Builder" için bir gösterge var, fiyat artışlarıyla yatay çizgiler çiziyor. Örneğin 100p, 200p vb. seçebilirsiniz. Ve belirli bir adımla yukarı ve aşağı yatay bir ızgara oluşturulur. Ancak bir sorunu var, örneğin H4 zaman diliminde grafik yatay seviyelerimi çizdiğimde (terminaldeki çizim araçlarından yatay çizgiler koyuyorum) ve başka bir zaman dilimine geçtiğimde tüm satırlarım siliniyor. Ve göstergenin sadece yatay seviyeleri kalır. Kodumdaki bu hatayı nasıl düzeltebilirim? Böylece yatay seviyelerim asla kaldırılmaz. İşte gösterge kodu. (Bu soru daha önce başka bir başlıkta paylaşılmıştı ama henüz cevap yok)

 //+------------------------------------------------------------------+
//|                                                  GridBuilder.mq5 |
//|                                              Copyright 2015, AM2 |
//|                                     https://www.forexsystems.biz |
//+------------------------------------------------------------------+
#property copyright "Copyright 2015, AM2"
#property link       "https://www.forexsystems.biz"
#property version   "1.00"
#property indicator_chart_window

//---- для расчёта и отрисовки индикатора использовано ноль буферов
#property indicator_buffers 0
//---- использовано всего ноль графических построений
#property indicator_plots   0
//--- входные параметры 
input int count = 50 ;       //количество линий вверх вниз от цены
input int step  = 333 ;     //шаг линий 
input double pr = 1.4622 ;   //цена от которой пляшем
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- indicator buffers mapping
   ObjectsDeleteAll( 0 , 0 ,OBJ_HLINE);
//---
   return (INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit( const int reason)
  {
   Comment( "" );
   ObjectsDeleteAll( 0 , 0 ,OBJ_HLINE);
  }
//+------------------------------------------------------------------+ 
//| Создает горизонтальную линию                                     | 
//+------------------------------------------------------------------+ 
bool HLine( const string name= "HLine" , double price= 0 )
  {
//--- создадим горизонтальную линию 
   if (!ObjectCreate( 0 ,name,OBJ_HLINE, 0 , 0 ,price))
     {
      Print(__FUNCTION__,
             ": не удалось создать горизонтальную линию! Код ошибки = " ,GetLastError());
       return ( false );
     }
//--- установим цвет линии 
   ObjectSetInteger( 0 ,name,OBJPROP_COLOR,clrGreen);
   ObjectSetInteger( 0 ,name,OBJPROP_WIDTH, 1 );
   return ( true );
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int OnCalculate( const int rates_total,
                 const int prev_calculated,
                 const datetime &time[],
                 const double &open[],
                 const double &high[],
                 const double &low[],
                 const double &close[],
                 const long &tick_volume[],
                 const long &volume[],
                 const int &spread[])
  {
   double price=pr;
//--- создадим горизонтальную линию 
   for ( int i= 0 ;i<=count;i++)
     {
      HLine( "HLine" +( string )i,price+step*i*_Point);
      HLine( "HLine" +( string )(i+count+ 1 ),price-step*i*_Point);
     }
//--- return value of prev_calculated for next call
   return (rates_total);
  }
//+------------------------------------------------------------------+
Документация по MQL5: Константы, перечисления и структуры / Константы объектов / Типы объектов
Документация по MQL5: Константы, перечисления и структуры / Константы объектов / Типы объектов
  • www.mql5.com
При создании графического объекта функцией ObjectCreate() необходимо указать тип создаваемого объекта, который может принимать одно из значений перечисления ENUM_OBJECT. Дальнейшие уточнения свойств созданного объекта возможно с помощью функций по работе с графическими объектами.
 
Александр :

Merhaba! MT5 "Grid Builder" için bir gösterge var, fiyat artışlarıyla yatay çizgiler çiziyor. Örneğin 100p, 200p vb. seçebilirsiniz. Ve belirli bir adımla yukarı ve aşağı yatay bir ızgara oluşturulur. Ancak bir sorunu var, örneğin H4 zaman diliminde grafik yatay seviyelerimi çizdiğimde (terminaldeki çizim araçlarından yatay çizgiler koyuyorum) ve başka bir zaman dilimine geçtiğimde tüm satırlarım siliniyor. Ve göstergenin sadece yatay seviyeleri kalır. Kodumdaki bu hatayı nasıl düzeltebilirim? Böylece yatay seviyelerim asla kaldırılmaz. İşte gösterge kodu. (Bu soru daha önce başka bir başlıkta paylaşılmıştı ama henüz cevap yok)

Bu koda dikkat edin:

 //+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit( const int reason)
  {
   Comment( "" );
   ObjectsDeleteAll( 0 , 0 ,OBJ_HLINE);
  }
//+------------------------------------------------------------------+ 

Özellikle, ObjectsDeleteAll() hakkında bilgi edinin - nasıl düzeltileceğinin hem nedeni hem de cevabı vardır.

Документация по MQL5: Графические объекты / ObjectsDeleteAll
Документация по MQL5: Графические объекты / ObjectsDeleteAll
  • www.mql5.com
[in]  Префикс, по которому будут удалены все объекты, чьи имена начинаются с данного набора символов. Префикс можно указывать как 'name' или 'name*' – оба варианта работают одинаково. Если в качестве префикса указана пустая строка, то будут удалены объекты с любым именем. Функция использует синхронный вызов – это...
 
Artyom Trishkin :

Bu koda dikkat edin:

Özellikle, ObjectsDeleteAll() hakkında bilgi edinin - nasıl düzeltileceğinin hem nedeni hem de cevabı vardır.

Teşekkürler!!! Anlaşıldı, artık kaldırmadan çalışıyor.

 
SQLite veritabanı ile işlemler test cihazından alınabilir mi? Veri eklemek ve değiştirmekten bahsediyorum.
 
Dmitri Custurov :
SQLite veritabanı ile işlemler test cihazından alınabilir mi? Veri eklemek ve değiştirmekten bahsediyorum.

Mevcut. Sadece üssün konumuna dikkat edin. Dosyalarla aynı şekilde oluşturulurlar.

 
Alexey Viktorov :

Mevcut. Sadece üssün konumuna dikkat edin. Dosyalarla aynı şekilde oluşturulurlar.

 #define DB_NAME "OHLC_DB"

int db_handle;
string TableName;
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit (){
   db_handle = DatabaseOpen (DB_NAME, DATABASE_OPEN_READWRITE | DATABASE_OPEN_CREATE ); 

   if (db_handle != INVALID_HANDLE ){
       Print ( StringFormat ( "Database %s was opened" , DB_NAME));
      
      TableName = Symbol () + "_" + enumTimeFrameToString( Period ());
       if ( DatabaseTableExists (db_handle, TableName)){
         Print ( StringFormat ( "Table %s is exist" , TableName));
      } else {
         if ( DatabaseExecute (db_handle, "CREATE TABLE " + TableName + "("
                             "TIME TEXT PRIMARY KEY  NOT NULL,"
                             "OPEN              REAL NOT NULL,"
                             "HIGH              REAL NOT NULL,"
                             "LOW               REAL NOT NULL,"
                             "CLOSE             REAL NOT NULL );" )){
             Print ( StringFormat ( "Table %s was created" , TableName));
             string time = "'" + TimeToString ( iTime ( Symbol (), PERIOD_CURRENT , 0 )) + "'" ;
             double open = iOpen ( Symbol (), PERIOD_CURRENT , 0 );
             double high = iHigh ( Symbol (), PERIOD_CURRENT , 0 );
             double low = iLow ( Symbol (), PERIOD_CURRENT , 0 );
             double close = iClose ( Symbol (), PERIOD_CURRENT , 0 );

             if (! DatabaseExecute (db_handle, "INSERT INTO " + TableName + " (TIME,OPEN,HIGH,LOW,CLOSE) "
                                           "VALUES (" + StringFormat ( "%s,%.5f,%.5f,%.5f,%.5f" , time, open, high, low, close) + ");" )){
               Print ( "Table: " , TableName, " insert failed with code " , GetLastError ());
               DatabaseClose (db_handle);
               return ( INIT_FAILED );
            } else
               Print ( "New table started:" );   
         } else {
             Print ( StringFormat ( "Could not create %s table. Error is: %d" , TableName, GetLastError ()));
             DatabaseClose (db_handle);
             return ( INIT_FAILED ); 
         }
      }
      
       return ( INIT_SUCCEEDED );
   } else {
       Print ( "Could not open db. Error is: " , GetLastError ());
       return ( INIT_FAILED ); 
   }     
}
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit ( const int reason){
   DatabaseClose (db_handle);
}
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick (){
   string time = "'" + TimeToString ( iTime ( Symbol (), PERIOD_CURRENT , 0 )) + "'" ;
   double open = iOpen ( Symbol (), PERIOD_CURRENT , 0 );
   double high = iHigh ( Symbol (), PERIOD_CURRENT , 0 );
   double low = iLow ( Symbol (), PERIOD_CURRENT , 0 );
   double close = iClose ( Symbol (), PERIOD_CURRENT , 0 );
   if (! DatabaseExecute (db_handle, "INSERT INTO " + TableName + " (TIME,OPEN,HIGH,LOW,CLOSE) "
                                   "VALUES (" + StringFormat ( "%s,%.5f,%.5f,%.5f,%.5f" , time, open, high, low, close) + ");" )){
       Print ( "Table: " , TableName, " insert failed with code " , GetLastError ());
       DatabaseClose (db_handle);
   }   
}
//+------------------------------------------------------------------+
string enumTimeFrameToString( ENUM_TIMEFRAMES frame){
   switch (frame){
       case PERIOD_M1 :   return "M1" ;
       case PERIOD_M2 :   return "M2" ;
       case PERIOD_M3 :   return "M3" ;
       case PERIOD_M4 :   return "M4" ;
       case PERIOD_M5 :   return "M5" ;
       case PERIOD_M6 :   return "M6" ;
       case PERIOD_M10 : return "M10" ;
       case PERIOD_M12 : return "M12" ;
       case PERIOD_M15 : return "M15" ;
       case PERIOD_M20 : return "M20" ;
       case PERIOD_M30 : return "M30" ;
       case PERIOD_H1 :   return "H1" ;
       case PERIOD_H2 :   return "H2" ;
       case PERIOD_H3 :   return "H3" ;
       case PERIOD_H4 :   return "H4" ;
       case PERIOD_H6 :   return "H6" ;
       case PERIOD_H8 :   return "H8" ;
       case PERIOD_D1 :   return "D1" ;
       case PERIOD_W1 :   return "W1" ;
       default :         return "MN1" ;
   }
}

İşte kodum. Başlatmada, tabloda bir giriş oluşturur. OnTick gövdesinde, aynı PRIMARY KEY ile bir kayıt eklemeye çalıştığım için hemen bir hata döndürmesi gerekir ve bundan sonra veritabanı hemen kapatılır. Ama aynı zamanda, açtığımda, en azından ilk girişi görmeliydim, ancak test cihazında çalıştırdığımda orada değil. Ve masa bile oluşturulmadı. Ve sadece terminalde çalıştırırsam, her şey yolunda. İlk giriştir.

 
Dmitri Custurov :

İşte kodum. Başlatmada, tabloda bir giriş oluşturur. OnTick gövdesinde, aynı PRIMARY KEY ile bir kayıt eklemeye çalıştığım için hemen bir hata döndürmesi gerekir ve bundan sonra veritabanı hemen kapatılır. Ama aynı zamanda, açtığımda, en azından ilk girişi görmeliydim, ancak test cihazında çalıştırdığımda orada değil. Ve masa bile oluşturulmadı. Ve sadece terminalde çalıştırırsam, her şey yolunda. İlk giriştir.

Test cihazının ve terminalin kendisinin farklı enkarnasyonlar olduğuna bir kez daha ikna oldum...

 
HistorySelect(xxx,TimeCurrent()) miss the latest history order / deal sometimes. Now you have to use HistorySelect(xxx,TimeCurrent()+1) To get a more accurate result.

 
tickfenix :

Uzun zamandır TimeCurrent() öğesine bir gün eklenmesi tavsiye ediliyor. Az önce, tamamen doğru olmayan kodunuza yanıt olarak, terminal size tavsiyede bulunuyor.