Sembra che il terminale continui a pompare la storia - così l'indicatore continua a ricalcolare. O un'altra variante: avete un numero MOLTO grande di barre impostate nel terminale per la visualizzazione sul grafico, e il vostro computer ha un numero MOLTO grande di barre sul grafico.
Grazie per l'aiuto!
Quando si seleziona una data diversa, il calcolo avviene immediatamente. Nel primo test c'era un divario di prezzo, forse mancavano alcuni prezzi - questo è molto probabilmente il problema.
C'è un indicatore MT5 "Grid Builder" che disegnalinee orizzontali in incrementi di prezzo. È possibile selezionare ad esempio 100p, 200p ecc. E costruisce una griglia orizzontale su e giù con un determinato passo. Ma ha un problema, per esempio, quando disegno livelli orizzontali sul timeframe H4 (ho messo linee orizzontali da strumenti di disegno nel terminale) e passo a qualsiasi altro timeframe, tutte le mie linee vengono rimosse. Rimangono solo i livelli orizzontali dell'indicatore. Come posso correggere questo errore nel codice? Per garantire che i miei livelli orizzontali non vengano mai cancellati. Ecco il codice dell'indicatore (ho scritto questa domanda in un altro thread, ma non c'è ancora una risposta)
//+------------------------------------------------------------------+//| 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. Дальнейшие уточнения свойств созданного объекта возможно с помощью функций по работе с графическими объектами.
C'è un indicatore MT5 "Grid Builder" che disegnalinee orizzontali in incrementi di prezzo. È possibile selezionare ad esempio 100p, 200p ecc. E costruisce una griglia orizzontale su e giù con un determinato passo. Ma ha un problema, per esempio, quando disegno livelli orizzontali sul timeframe H4 (metto linee orizzontali da strumenti di disegno nel terminale) e passo a qualsiasi altro timeframe, tutte le mie linee vengono rimosse. Rimangono solo i livelli orizzontali dell'indicatore. Come posso correggere questo errore nel codice? Per garantire che i miei livelli orizzontali non vengano mai cancellati. Ecco il codice dell'indicatore (ho scritto questa domanda in un altro topic, ma non c'è risposta)
[in] Префикс, по которому будут удалены все объекты, чьи имена начинаются с данного набора символов. Префикс можно указывать как 'name' или 'name*' – оба варианта работают одинаково. Если в качестве префикса указана пустая строка, то будут удалены объекты с любым именем. Функция использует синхронный вызов – это...
Disponibile. Basta tenere d'occhio la posizione della base. Sono creati proprio come i file.
#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";
}
}
Ecco il mio codice. Nell'inizializzazione crea un record nella tabella. Nel corpo di OnTick dovrebbe restituire immediatamente un errore, perché cerco di aggiungere un record con la stessa PRIMARY KEY, e dopo questo la base si chiude immediatamente. Ma allo stesso tempo dovrei vedere almeno il primo record quando lo apro, ma quando lo eseguo nel tester non c'è. E anche la tabella non viene creata. Se lo apro solo nel terminale, tutto è normale. Il primo disco è lì.
Ecco il mio codice. Nell'inizializzazione crea un record nella tabella. Nel corpo di OnTick dovrebbe restituire immediatamente un errore, perché cerco di aggiungere un record con la stessa PRIMARY KEY, e dopo questo la base si chiude immediatamente. Ma allo stesso tempo dovrei vedere almeno il primo record quando lo apro, ma quando lo eseguo nel tester non c'è. E anche la tabella non viene creata. Se lo apro solo nel terminale, tutto è normale. Il primo disco è lì.
Ancora una volta sono convinto che il tester e il terminale stesso sono ipostasi diverse...
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.
È stato a lungo raccomandato di aggiungere un giorno aTimeCurrent(). È solo che ora, in risposta al tuo codice non proprio corretto, il terminale ti sta dando dei consigli.
Sembra che il terminale continui a pompare la storia - così l'indicatore continua a ricalcolare. O un'altra variante: avete un numero MOLTO grande di barre impostate nel terminale per la visualizzazione sul grafico, e il vostro computer ha un numero MOLTO grande di barre sul grafico.
Grazie per l'aiuto!
Quando si seleziona una data diversa, il calcolo avviene immediatamente. Nel primo test c'era un divario di prezzo, forse mancavano alcuni prezzi - questo è molto probabilmente il problema.
C'è un indicatore MT5 "Grid Builder" che disegnalinee orizzontali in incrementi di prezzo. È possibile selezionare ad esempio 100p, 200p ecc. E costruisce una griglia orizzontale su e giù con un determinato passo. Ma ha un problema, per esempio, quando disegno livelli orizzontali sul timeframe H4 (ho messo linee orizzontali da strumenti di disegno nel terminale) e passo a qualsiasi altro timeframe, tutte le mie linee vengono rimosse. Rimangono solo i livelli orizzontali dell'indicatore. Come posso correggere questo errore nel codice? Per garantire che i miei livelli orizzontali non vengano mai cancellati. Ecco il codice dell'indicatore (ho scritto questa domanda in un altro thread, ma non c'è ancora una risposta)
C'è un indicatore MT5 "Grid Builder" che disegnalinee orizzontali in incrementi di prezzo. È possibile selezionare ad esempio 100p, 200p ecc. E costruisce una griglia orizzontale su e giù con un determinato passo. Ma ha un problema, per esempio, quando disegno livelli orizzontali sul timeframe H4 (metto linee orizzontali da strumenti di disegno nel terminale) e passo a qualsiasi altro timeframe, tutte le mie linee vengono rimosse. Rimangono solo i livelli orizzontali dell'indicatore. Come posso correggere questo errore nel codice? Per garantire che i miei livelli orizzontali non vengano mai cancellati. Ecco il codice dell'indicatore (ho scritto questa domanda in un altro topic, ma non c'è risposta)
Fate attenzione a questo codice:
In particolare, leggete su ObjectsDeleteAll() - lì la causa e la risposta per la correzione.
Fate attenzione a questo codice:
In particolare leggete su ObjectsDeleteAll() - c'è la ragione e la risposta su come modificarlo.
Grazie!!! L'ho risolto, ora funziona senza cancellazione.
Le operazioni del database SQLite sono disponibili dal tester? Intendo aggiungere e cambiare i dati.
Disponibile. Basta tenere d'occhio la posizione della base. Sono creati nello stesso modo dei file.
Disponibile. Basta tenere d'occhio la posizione della base. Sono creati proprio come i file.
Ecco il mio codice. Nell'inizializzazione crea un record nella tabella. Nel corpo di OnTick dovrebbe restituire immediatamente un errore, perché cerco di aggiungere un record con la stessa PRIMARY KEY, e dopo questo la base si chiude immediatamente. Ma allo stesso tempo dovrei vedere almeno il primo record quando lo apro, ma quando lo eseguo nel tester non c'è. E anche la tabella non viene creata. Se lo apro solo nel terminale, tutto è normale. Il primo disco è lì.
Ecco il mio codice. Nell'inizializzazione crea un record nella tabella. Nel corpo di OnTick dovrebbe restituire immediatamente un errore, perché cerco di aggiungere un record con la stessa PRIMARY KEY, e dopo questo la base si chiude immediatamente. Ma allo stesso tempo dovrei vedere almeno il primo record quando lo apro, ma quando lo eseguo nel tester non c'è. E anche la tabella non viene creata. Se lo apro solo nel terminale, tutto è normale. Il primo disco è lì.
Ancora una volta sono convinto che il tester e il terminale stesso sono ipostasi diverse...
È stato a lungo raccomandato di aggiungere un giorno aTimeCurrent(). È solo che ora, in risposta al tuo codice non proprio corretto, il terminale ti sta dando dei consigli.