Es sieht so aus, als ob das Terminal die Historie immer wieder aufpumpt, so dass der Indikator immer wieder neu berechnet wird. Oder eine andere Variante: Sie haben im Terminal eine SEHR große Anzahl von Balken für die Anzeige im Diagramm eingestellt, und Ihr Computer hat eine SEHR große Anzahl von Balken im Diagramm.
Vielen Dank für die Hilfe!
Wenn Sie ein anderes Datum wählen, wird die Berechnung sofort durchgeführt. Beim ersten Test gab es eine Preislücke, möglicherweise fehlten einige Preise - das ist höchstwahrscheinlich das Problem.
Hallo! Es gibt einen MT5-Indikator "Grid Builder", derhorizontale Linien in Kursabstufungenzeichnet. Sie können z.B. 100p, 200p usw. auswählen. Und es baut ein horizontales Gitter auf und ab mit einem bestimmten Schritt. Aber es hat ein Problem, zum Beispiel, wenn ich zeichnen horizontale Ebenen auf Zeitrahmen H4 (ich setzen horizontale Linien aus Zeichnung Werkzeuge im Terminal) und wechseln Sie zu einem anderen Zeitrahmen, alle meine Linien werden entfernt. Es verbleiben nur horizontale Anzeigeebenen. Wie kann ich diesen Fehler im Code korrigieren? Um sicherzustellen, dass meine horizontalen Ebenen niemals gelöscht werden. Hier ist der Indikator-Code (ich schrieb diese Frage in einem anderen Thread, aber es gibt noch keine Antwort)
//+------------------------------------------------------------------+//| 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. Дальнейшие уточнения свойств созданного объекта возможно с помощью функций по работе с графическими объектами.
Hallo! Es gibt einen MT5-Indikator "Grid Builder", derhorizontale Linien in Kursabstufungenzeichnet. Sie können z.B. 100p, 200p usw. auswählen. Und es baut ein horizontales Gitter auf und ab mit einem bestimmten Schritt. Aber es hat ein Problem, zum Beispiel, wenn ich zeichnen horizontale Ebenen auf Zeitrahmen H4 (ich setzen horizontale Linien aus Zeichnung Werkzeuge im Terminal) und wechseln Sie zu einem anderen Zeitrahmen, alle meine Linien werden entfernt. Es verbleiben nur horizontale Anzeigeebenen. Wie kann ich diesen Fehler im Code korrigieren? Um sicherzustellen, dass meine horizontalen Ebenen niemals gelöscht werden. Hier ist der Code des Indikators (ich schrieb diese Frage in einem anderen Thema, aber es gibt keine Antwort)
[in] Префикс, по которому будут удалены все объекты, чьи имена начинаются с данного набора символов. Префикс можно указывать как 'name' или 'name*' – оба варианта работают одинаково. Если в качестве префикса указана пустая строка, то будут удалены объекты с любым именем. Функция использует синхронный вызов – это...
Verfügbar. Behalten Sie einfach den Standort der Basis im Auge. Sie werden genau wie die Dateien erstellt.
#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";
}
}
Hier ist mein Code. Bei der Initialisierung wird ein Datensatz in der Tabelle erstellt. Im OnTick-Body sollte sofort ein Fehler zurückgegeben werden, weil ich versuche, einen Datensatz mit demselben PRIMARY KEY hinzuzufügen, und danach wird die Basis sofort geschlossen. Aber gleichzeitig sollte ich zumindest den ersten Datensatz sehen, wenn ich ihn öffne, aber wenn ich ihn im Testprogramm ausführe, ist er nicht da. Und auch die Tabelle wird nicht erstellt. Wenn ich es einfach im Terminal öffne, ist alles normal. Der erste Datensatz ist da.
Hier ist mein Code. Bei der Initialisierung wird ein Datensatz in der Tabelle erstellt. Im OnTick-Body sollte sofort ein Fehler zurückgegeben werden, weil ich versuche, einen Datensatz mit demselben PRIMARY KEY hinzuzufügen, und danach wird die Basis sofort geschlossen. Aber gleichzeitig sollte ich zumindest den ersten Datensatz sehen, wenn ich ihn öffne, aber wenn ich ihn im Testprogramm ausführe, ist er nicht da. Und auch die Tabelle wird nicht erstellt. Wenn ich es einfach im Terminal öffne, ist alles normal. Der erste Datensatz ist da.
Einmal mehr bin ich davon überzeugt, dass das Prüfgerät und das Terminal selbst unterschiedliche Hypostasen sind...
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.
Es wird seit langem empfohlen,TimeCurrent() um einen Tag zu verlängern. Es ist nur so, dass das Terminal Ihnen jetzt als Reaktion auf Ihren nicht ganz korrekten Code Ratschläge gibt.
Es sieht so aus, als ob das Terminal die Historie immer wieder aufpumpt, so dass der Indikator immer wieder neu berechnet wird. Oder eine andere Variante: Sie haben im Terminal eine SEHR große Anzahl von Balken für die Anzeige im Diagramm eingestellt, und Ihr Computer hat eine SEHR große Anzahl von Balken im Diagramm.
Vielen Dank für die Hilfe!
Wenn Sie ein anderes Datum wählen, wird die Berechnung sofort durchgeführt. Beim ersten Test gab es eine Preislücke, möglicherweise fehlten einige Preise - das ist höchstwahrscheinlich das Problem.
Hallo! Es gibt einen MT5-Indikator "Grid Builder", derhorizontale Linien in Kursabstufungenzeichnet. Sie können z.B. 100p, 200p usw. auswählen. Und es baut ein horizontales Gitter auf und ab mit einem bestimmten Schritt. Aber es hat ein Problem, zum Beispiel, wenn ich zeichnen horizontale Ebenen auf Zeitrahmen H4 (ich setzen horizontale Linien aus Zeichnung Werkzeuge im Terminal) und wechseln Sie zu einem anderen Zeitrahmen, alle meine Linien werden entfernt. Es verbleiben nur horizontale Anzeigeebenen. Wie kann ich diesen Fehler im Code korrigieren? Um sicherzustellen, dass meine horizontalen Ebenen niemals gelöscht werden. Hier ist der Indikator-Code (ich schrieb diese Frage in einem anderen Thread, aber es gibt noch keine Antwort)
Hallo! Es gibt einen MT5-Indikator "Grid Builder", derhorizontale Linien in Kursabstufungenzeichnet. Sie können z.B. 100p, 200p usw. auswählen. Und es baut ein horizontales Gitter auf und ab mit einem bestimmten Schritt. Aber es hat ein Problem, zum Beispiel, wenn ich zeichnen horizontale Ebenen auf Zeitrahmen H4 (ich setzen horizontale Linien aus Zeichnung Werkzeuge im Terminal) und wechseln Sie zu einem anderen Zeitrahmen, alle meine Linien werden entfernt. Es verbleiben nur horizontale Anzeigeebenen. Wie kann ich diesen Fehler im Code korrigieren? Um sicherzustellen, dass meine horizontalen Ebenen niemals gelöscht werden. Hier ist der Code des Indikators (ich schrieb diese Frage in einem anderen Thema, aber es gibt keine Antwort)
Achten Sie auf diesen Code:
Lesen Sie insbesondere über ObjectsDeleteAll() - dort finden Sie die Ursache und die Lösung zur Behebung des Problems.
Achten Sie auf diesen Code:
Lesen Sie insbesondere über ObjectsDeleteAll() - dort finden Sie den Grund und die Antwort auf die Frage, wie Sie es optimieren können.
Ich danke Ihnen!!! Ich habe das Problem behoben, und jetzt funktioniert es ohne Löschung.
Sind SQLite-Datenbankoperationen vom Prüfgerät aus verfügbar? Ich meine das Hinzufügen und Ändern von Daten.
Verfügbar. Behalten Sie einfach den Standort der Basis im Auge. Sie werden auf die gleiche Weise wie die Dateien erstellt.
Verfügbar. Behalten Sie einfach den Standort der Basis im Auge. Sie werden genau wie die Dateien erstellt.
Hier ist mein Code. Bei der Initialisierung wird ein Datensatz in der Tabelle erstellt. Im OnTick-Body sollte sofort ein Fehler zurückgegeben werden, weil ich versuche, einen Datensatz mit demselben PRIMARY KEY hinzuzufügen, und danach wird die Basis sofort geschlossen. Aber gleichzeitig sollte ich zumindest den ersten Datensatz sehen, wenn ich ihn öffne, aber wenn ich ihn im Testprogramm ausführe, ist er nicht da. Und auch die Tabelle wird nicht erstellt. Wenn ich es einfach im Terminal öffne, ist alles normal. Der erste Datensatz ist da.
Hier ist mein Code. Bei der Initialisierung wird ein Datensatz in der Tabelle erstellt. Im OnTick-Body sollte sofort ein Fehler zurückgegeben werden, weil ich versuche, einen Datensatz mit demselben PRIMARY KEY hinzuzufügen, und danach wird die Basis sofort geschlossen. Aber gleichzeitig sollte ich zumindest den ersten Datensatz sehen, wenn ich ihn öffne, aber wenn ich ihn im Testprogramm ausführe, ist er nicht da. Und auch die Tabelle wird nicht erstellt. Wenn ich es einfach im Terminal öffne, ist alles normal. Der erste Datensatz ist da.
Einmal mehr bin ich davon überzeugt, dass das Prüfgerät und das Terminal selbst unterschiedliche Hypostasen sind...
Es wird seit langem empfohlen,TimeCurrent() um einen Tag zu verlängern. Es ist nur so, dass das Terminal Ihnen jetzt als Reaktion auf Ihren nicht ganz korrekten Code Ratschläge gibt.