안녕하세요! 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( constint reason)
{
Comment( "" );
ObjectsDeleteAll( 0 , 0 ,OBJ_HLINE);
}
//+------------------------------------------------------------------+ //| Создает горизонтальную линию | //+------------------------------------------------------------------+ bool HLine( conststring 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( constint rates_total,
constint prev_calculated,
const datetime &time[],
constdouble &open[],
constdouble &high[],
constdouble &low[],
constdouble &close[],
constlong &tick_volume[],
constlong &volume[],
constint &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 callreturn (rates_total);
}
//+------------------------------------------------------------------+
При создании графического объекта функцией ObjectCreate() необходимо указать тип создаваемого объекта, который может принимать одно из значений перечисления ENUM_OBJECT. Дальнейшие уточнения свойств созданного объекта возможно с помощью функций по работе с графическими объектами.
안녕하세요! MT5 "Grid Builder"에 대한 표시기가있으며 가격 증분으로 수평선 을 그립니다. 예를 들어 100p, 200p 등을 선택할 수 있습니다. 그리고 주어진 단계에 따라 수평 그리드가 위아래로 구축됩니다. 그러나 한 가지 문제가 있습니다. 예를 들어 H4 기간에 그래픽 수평 수준을 그리고(터미널의 그리기 도구에서 수평선을 삽입함) 다른 기간으로 전환하면 모든 선이 삭제됩니다. 그리고 표시기의 수평 레벨만 남습니다. 내 코드에서 이 오류를 어떻게 고칠 수 있습니까? 내 수평 수준이 제거되지 않도록. 다음은 표시기 코드입니다. (이 질문은 이미 다른 스레드에 게시되었지만 아직 답변이 없습니다)
[in] Префикс, по которому будут удалены все объекты, чьи имена начинаются с данного набора символов. Префикс можно указывать как 'name' или 'name*' – оба варианта работают одинаково. Если в качестве префикса указана пустая строка, то будут удалены объекты с любым именем. Функция использует синхронный вызов – это...
#define DB_NAME "OHLC_DB"int db_handle;
string TableName;
//+------------------------------------------------------------------+//| Expert initialization function |//+------------------------------------------------------------------+intOnInit (){
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 );
} elsePrint ( "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 |//+------------------------------------------------------------------+voidOnDeinit ( constint reason){
DatabaseClose (db_handle);
}
//+------------------------------------------------------------------+//| Expert tick function |//+------------------------------------------------------------------+voidOnTick (){
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){
casePERIOD_M1 : return"M1" ;
casePERIOD_M2 : return"M2" ;
casePERIOD_M3 : return"M3" ;
casePERIOD_M4 : return"M4" ;
casePERIOD_M5 : return"M5" ;
casePERIOD_M6 : return"M6" ;
casePERIOD_M10 : return"M10" ;
casePERIOD_M12 : return"M12" ;
casePERIOD_M15 : return"M15" ;
casePERIOD_M20 : return"M20" ;
casePERIOD_M30 : return"M30" ;
casePERIOD_H1 : return"H1" ;
casePERIOD_H2 : return"H2" ;
casePERIOD_H3 : return"H3" ;
casePERIOD_H4 : return"H4" ;
casePERIOD_H6 : return"H6" ;
casePERIOD_H8 : return"H8" ;
casePERIOD_D1 : return"D1" ;
casePERIOD_W1 : return"W1" ;
default : return"MN1" ;
}
}
여기 내 코드가 있습니다. 초기화 시 테이블에 하나의 항목을 생성합니다. OnTick 본문에서 동일한 PRIMARY KEY를 사용하여 레코드를 추가하려고 시도하고 그 후에 데이터베이스가 즉시 닫히기 때문에 즉시 오류를 반환해야 합니다. 그러나 동시에 열면 최소한 첫 번째 항목이 표시되어야 하지만 테스터에서 실행하면 거기에 없습니다. 그리고 테이블조차 생성되지 않습니다. 그리고 터미널에서 실행하면 모든 것이 정상입니다. 첫 번째 항목은 입니다.
여기 내 코드가 있습니다. 초기화 시 테이블에 하나의 항목을 생성합니다. 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.
터미널이 계속 기록을 다운로드하는 것 같습니다. 따라서 표시기가 지속적으로 다시 계산됩니다. 또는 다른 옵션: 터미널에는 차트에 표시할 매우 많은 수의 막대가 있고 컴퓨터는 매우
도와 주셔서 감사합니다!
다른 날짜를 선택하면 즉시 계산됩니다. 첫 번째 테스트에서 가격에 차이가 있었고 일부 가격이 생략되었을 수 있습니다. 아마도 이것이 문제일 가능성이 큽니다.
안녕하세요! MT5 "Grid Builder"에 대한 표시기가 있으며 가격 증분 으로 수평선 을 그립니다. 예를 들어 100p, 200p 등을 선택할 수 있습니다. 그리고 주어진 단계에 따라 수평 그리드가 위아래로 구축됩니다. 그러나 한 가지 문제가 있습니다. 예를 들어 H4 기간에 그래픽 수평 수준을 그리고(터미널의 그리기 도구에서 수평선을 삽입함) 다른 기간으로 전환하면 모든 선이 삭제됩니다. 그리고 표시기의 수평 레벨만 남습니다. 내 코드에서 이 오류를 어떻게 고칠 수 있습니까? 내 수평 수준이 제거되지 않도록. 다음은 표시기 코드입니다. (이 질문은 이미 다른 스레드에 게시되었지만 아직 답변이 없습니다)
안녕하세요! MT5 "Grid Builder"에 대한 표시기가 있으며 가격 증분 으로 수평선 을 그립니다. 예를 들어 100p, 200p 등을 선택할 수 있습니다. 그리고 주어진 단계에 따라 수평 그리드가 위아래로 구축됩니다. 그러나 한 가지 문제가 있습니다. 예를 들어 H4 기간에 그래픽 수평 수준을 그리고(터미널의 그리기 도구에서 수평선을 삽입함) 다른 기간으로 전환하면 모든 선이 삭제됩니다. 그리고 표시기의 수평 레벨만 남습니다. 내 코드에서 이 오류를 어떻게 고칠 수 있습니까? 내 수평 수준이 제거되지 않도록. 다음은 표시기 코드입니다. (이 질문은 이미 다른 스레드에 게시되었지만 아직 답변이 없습니다)
이 코드에 주의하십시오.
특히 ObjectsDeleteAll() 에 대해 읽어보십시오. 이유와 해결 방법에 대한 답변이 있습니다.
이 코드에 주의하십시오.
특히 ObjectsDeleteAll() 에 대해 읽어보십시오. 이유와 해결 방법에 대한 답변이 있습니다.
감사해요!!! 이해했습니다. 이제 제거하지 않고 작동합니다.
테스터에서 SQLite 데이터베이스 작업을 사용할 수 있습니까? 데이터 추가 및 변경에 대해 이야기하고 있습니다.
사용 가능. 기지의 위치를 주시하십시오. 파일과 동일한 방식으로 생성됩니다.
사용 가능. 기지의 위치를 주시하십시오. 파일과 동일한 방식으로 생성됩니다.
여기 내 코드가 있습니다. 초기화 시 테이블에 하나의 항목을 생성합니다. OnTick 본문에서 동일한 PRIMARY KEY를 사용하여 레코드를 추가하려고 시도하고 그 후에 데이터베이스가 즉시 닫히기 때문에 즉시 오류를 반환해야 합니다. 그러나 동시에 열면 최소한 첫 번째 항목이 표시되어야 하지만 테스터에서 실행하면 거기에 없습니다. 그리고 테이블조차 생성되지 않습니다. 그리고 터미널에서 실행하면 모든 것이 정상입니다. 첫 번째 항목은 입니다.
여기 내 코드가 있습니다. 초기화 시 테이블에 하나의 항목을 생성합니다. OnTick 본문에서 동일한 PRIMARY KEY를 사용하여 레코드를 추가하려고 시도하고 그 후에 데이터베이스가 즉시 닫히기 때문에 즉시 오류를 반환해야 합니다. 그러나 동시에 열면 최소한 첫 번째 항목이 표시되어야 하지만 테스터에서 실행하면 거기에 없습니다. 그리고 테이블조차 생성되지 않습니다. 그리고 터미널에서 실행하면 모든 것이 정상입니다. 첫 번째 항목은 입니다.
테스터와 단말기 자체가 다른 화신임을 다시 한 번 확신합니다...
TimeCurrent() 에 하루를 추가하는 것이 좋습니다. 바로 지금, 완전히 정확하지 않은 코드에 대한 응답으로 터미널이 조언을 제공합니다.