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

 
Vladimir Karputov :

터미널이 계속 기록을 다운로드하는 것 같습니다. 따라서 표시기가 지속적으로 다시 계산됩니다. 또는 다른 옵션: 터미널에는 차트에 표시할 매우 많은 수의 막대가 있고 컴퓨터는 매우

도와 주셔서 감사합니다!

다른 날짜를 선택하면 즉시 계산됩니다. 첫 번째 테스트에서 가격에 차이가 있었고 일부 가격이 생략되었을 수 있습니다. 아마도 이것이 문제일 가능성이 큽니다.

 

안녕하세요! MT5 "Grid Builder"에 대한 표시기가 있으며 가격 증분 으로 수평선 을 그립니다. 예를 들어 100p, 200p 등을 선택할 수 있습니다. 그리고 주어진 단계에 따라 수평 그리드가 위아래로 구축됩니다. 그러나 한 가지 문제가 있습니다. 예를 들어 H4 기간에 그래픽 수평 수준을 그리고(터미널의 그리기 도구에서 수평선을 삽입함) 다른 기간으로 전환하면 모든 선이 삭제됩니다. 그리고 표시기의 수평 레벨만 남습니다. 내 코드에서 이 오류를 어떻게 고칠 수 있습니까? 내 수평 수준이 제거되지 않도록. 다음은 표시기 코드입니다. (이 질문은 이미 다른 스레드에 게시되었지만 아직 답변이 없습니다)

 //+------------------------------------------------------------------+
//|                                                  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. Дальнейшие уточнения свойств созданного объекта возможно с помощью функций по работе с графическими объектами.
 
Александр :

안녕하세요! MT5 "Grid Builder"에 대한 표시기가 있으며 가격 증분 으로 수평선 을 그립니다. 예를 들어 100p, 200p 등을 선택할 수 있습니다. 그리고 주어진 단계에 따라 수평 그리드가 위아래로 구축됩니다. 그러나 한 가지 문제가 있습니다. 예를 들어 H4 기간에 그래픽 수평 수준을 그리고(터미널의 그리기 도구에서 수평선을 삽입함) 다른 기간으로 전환하면 모든 선이 삭제됩니다. 그리고 표시기의 수평 레벨만 남습니다. 내 코드에서 이 오류를 어떻게 고칠 수 있습니까? 내 수평 수준이 제거되지 않도록. 다음은 표시기 코드입니다. (이 질문은 이미 다른 스레드에 게시되었지만 아직 답변이 없습니다)

이 코드에 주의하십시오.

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

특히 ObjectsDeleteAll() 에 대해 읽어보십시오. 이유와 해결 방법에 대한 답변이 있습니다.

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

이 코드에 주의하십시오.

특히 ObjectsDeleteAll() 에 대해 읽어보십시오. 이유와 해결 방법에 대한 답변이 있습니다.

감사해요!!! 이해했습니다. 이제 제거하지 않고 작동합니다.

 
테스터에서 SQLite 데이터베이스 작업을 사용할 수 있습니까? 데이터 추가 및 변경에 대해 이야기하고 있습니다.
 
Dmitri Custurov :
테스터에서 SQLite 데이터베이스 작업을 사용할 수 있습니까? 데이터 추가 및 변경에 대해 이야기하고 있습니다.

사용 가능. 기지의 위치를 주시하십시오. 파일과 동일한 방식으로 생성됩니다.

 
Alexey Viktorov :

사용 가능. 기지의 위치를 주시하십시오. 파일과 동일한 방식으로 생성됩니다.

 #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" ;
   }
}

여기 내 코드가 있습니다. 초기화 시 테이블에 하나의 항목을 생성합니다. OnTick 본문에서 동일한 PRIMARY KEY를 사용하여 레코드를 추가하려고 시도하고 그 후에 데이터베이스가 즉시 닫히기 때문에 즉시 오류를 반환해야 합니다. 그러나 동시에 열면 최소한 첫 번째 항목이 표시되어야 하지만 테스터에서 실행하면 거기에 없습니다. 그리고 테이블조차 생성되지 않습니다. 그리고 터미널에서 실행하면 모든 것이 정상입니다. 첫 번째 항목은 입니다.

 
Dmitri Custurov :

여기 내 코드가 있습니다. 초기화 시 테이블에 하나의 항목을 생성합니다. OnTick 본문에서 동일한 PRIMARY KEY를 사용하여 레코드를 추가하려고 시도하고 그 후에 데이터베이스가 즉시 닫히기 때문에 즉시 오류를 반환해야 합니다. 그러나 동시에 열면 최소한 첫 번째 항목이 표시되어야 하지만 테스터에서 실행하면 거기에 없습니다. 그리고 테이블조차 생성되지 않습니다. 그리고 터미널에서 실행하면 모든 것이 정상입니다. 첫 번째 항목은 입니다.

테스터와 단말기 자체가 다른 화신임을 다시 한 번 확신합니다...

 
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 :

TimeCurrent() 에 하루를 추가하는 것이 좋습니다. 바로 지금, 완전히 정확하지 않은 코드에 대한 응답으로 터미널이 조언을 제공합니다.

사유: