"So gewinnt nach den Abstimmungsergebnissen die Plattform MetaTrader 4 des Handelssoftware-Anbieters MetaQuotes mit deutlichem Vorsprung die Präferenz von 63% der Teilnehmer. Das Flaggschiffprodukt desselben Anbieters, MetaTrader 5, erhielt 19 % der Stimmen. Gleichzeitig nutzen 21 % derjenigen, die abgestimmt haben, "andere" Handelsplattformen, die nicht in der Liste aufgeführt sind.
В конце прошлой недели редакция Forex Magnates провела среди пользователей ресурса опрос на тему «Какой платформой вы пользуетесь?». Сегодня мы опубликуем результаты и выясним, какой торговой платформе отдают предпочтение розничные участники внебиржевого рынка Форекс. Итак, по результатам голосования, с существенным преимуществом побеждает...
Vielleicht wissen Sie nicht, was "schnell" bedeutet?
Ich glaube, ich weiß es aber))
Ich habe im Moment einfach keine Zeit, das zu beweisen.
Ich habe den Code von Peter nicht im Detail studiert, aber ich habe ihn durch das Profiling laufen lassen. Der gesamte Datenerzeugungszyklus dauerte etwa 1 Mikrosekunde. Das ist das bisher beste Ergebnis, wenn man davon ausgeht, dass keine globalen Korrekturen im Code erforderlich sind, damit es vollständig funktioniert.
Funktioniert Ihre Lösung gut? Wenn es gut ist, ist es großartig.
Wie sieht es mit Hunderten von Werkzeugen aus - wird es da nicht eine Überlagerung geben?
Wie ich schon sagte: "Es ist kein Meisterwerk", sondern nur ein autodidaktischer Versuch, OOP zu lernen. Aber es funktioniert einwandfrei. Vor diesem Programm funktionierte mein mql4-Programm gut in mql5, aber es funktionierte nicht richtig. Ich habe irgendwo ein Thema - ich habe eine lange Diskussion auf hohem Niveau mit Drummer geführt...
Vielleicht müssen Sie der Funktion für Hunderte von Instrumenten eine weitere Variante hinzufügen, aber der Name bleibt derselbe. Und das ist meiner Meinung nach der angenehmste Vorteil von OOP. Wenn Sie OOP tiefer beherrschen, finden Sie vielleicht noch mehr angenehme Vorteile, aber... nicht zu meinen Lebzeiten...
Ich habe im Moment einfach keine Zeit, das zu beweisen.
Ich habe den Code von Peter nicht im Detail studiert, aber ich habe ihn durch das Profiling laufen lassen. Der gesamte Datenerzeugungszyklus dauerte etwa 1 Mikrosekunde. Das ist das bisher beste Ergebnis, wenn man davon ausgeht, dass keine globalen Korrekturen im Code erforderlich sind, damit es vollständig funktioniert.
Trotzdem haben Sie bewiesen, dass Sie keine Ahnung haben.
Sie haben keine Ahnung, was für eine Idiotie Sie da an den Tag legen, das ist einfach eine völlige Abnormität. Aber ich werde euch nicht zeigen, wo genau, denn ihr seid alle nicht an meiner Meinung interessiert)))
Jeder ist nur an einer Meinung mit stichhaltigen Argumenten interessiert.
Das Argument, "du musst es tun, weil ich es tue", interessiert niemanden.
In diesem speziellen Fall entsprechen die Variablennamen nicht dem, was als schwaches Argument akzeptiert wird. Dies wurde nicht für CodeBase geschrieben.
Bislang unterstützt nicht einmal MOFT den MT5, was für mich frustrierend ist, da ich die Spreads dort immer weiter reduziert habe. Und was bedeutet Unterstützung? Veröffentlichung neuer Versionen? Nun, wenn keine kritischen Fehler gefunden werden, wird es vielleicht auch keine neuen geben.
Ich bin teilweise auf MT5 umgestiegen, aber wie Dmitiry richtig bemerkte, sind die Bedingungen auf MT4 im Moment besser.
Das ist es nicht. Die Geschwindigkeit und die Qualität derAuftragsausführung in MT5 schaffen eine schöne Umgebung, um die besser zu gewöhnen (es gibt vernünftig, und in der Tat, sehr niedrige Spreads während der Liquidität Zeiten, das Beispiel ist das gleiche Robo(MT5)). Dies wiederum verschafft dem Auftragslimit bei bestimmten Liquiditätsniveaus Vorteile. /*<= und dies kann den Overhead (Spread und Provision, wenn das Konto eine Provision hat) mehr als ausgleichen.
Die grünen Pfeile sind die Grenzwerte, die ich festgelegt habe, und die roten bis blauen Pfeile zeigen, wie der Auftrag tatsächlich ausgeführt wurde*/:
Diese Variante der Funktion hat überhaupt keine Funktion New_bar();
Dies ist die ressourcenschonendste Option, die ich angeboten habe. Darüber hinaus hat es einen weiteren Vorteil: Das neue Bar-Ereignis wird immer dann gespeichert, wenn der Benutzercode auf ein Timer- oder Tick-Ereignis ausgeführt wird.
Zuvor konnte dieses Ereignis nur einmal ausgelöst werden, und das Kennzeichen wurde mit New_bar() gelöscht. Die spezielle Funktion löscht nun das Array "event_new_bar[][]" einmal pro Minute und wird nur nach der Ausführung von benutzerdefiniertem Code aufgerufen.
Benutzerdefinierte Funktionen können direkt auf das Array zugreifen und jedes Mal, wenn der Code bei einem Timer- oder Tick-Ereignis ausgeführt wird, neue Bar-Event-Informationen abrufen.
Dadurch werden noch mehr Ressourcen eingespart.
//+------------------------------------------------------------------+//| Новый бар 3.mq4 |//| Peter Konow |//| https://www.mql5.com |//+------------------------------------------------------------------+#property copyright"Peter Konow"#property link"https://www.mql5.com"#property version"1.00"#property strict//+------------------------------------------------------------------+datetime Время_последнего_бара;
int Частота_таймера = 25;
int Всех_символов;
string Символы[];
int Таймфреймы[7] = {PERIOD_M1,PERIOD_M5,PERIOD_M15,PERIOD_M30,PERIOD_H1,PERIOD_H4,PERIOD_D1};
int Всех_таймфреймов = 7;
int Количество_баров[][7];
bool События_нового_бара[][7];
//+------------------------------------------------------------------+#define M1 0#define M5 1#define M15 2#define M30 3#define H1 4#define H4 5#define D1 6//+------------------------------------------------------------------+//| Expert initialization function |//+------------------------------------------------------------------+intOnInit()
{
//--- create timerEventSetMillisecondTimer(25);
//-------------------------------------------------------------//Записываем время последнего бара на момент загрузки эксперта. //Для корректного начала работы, робота нужно запустить на М1. //-------------------------------------------------------------
Время_последнего_бара = Time[0];
//------------------------------------------------------------- //Узнаем сколько символов есть в обзоре рынка.//---------------------------------------------------------
Всех_символов = SymbolsTotal(true);
//--------------------------------------------------------- //Устанавливаем размер массива Символы. Внутри него будут записаны//имена всех символов, которые есть в окне обзоре рынка.//---------------------------------------------------------ArrayResize(Символы,Всех_символов);
//---------------------------------------------------------//Устанавливаем размеры массивов "Количество_баров[]" и "События_нового_бара[]".//В массиве "Количество_баров[]" будет записыватся текущее количество баров каждого символа//и каждого таймфрейма. А в массиве "События_нового_бара[]" устанавливаться флаги//события нового бара для каждого символа и каждого таймфрейма. //---------------------------------------------------------ArrayResize(Количество_баров,Всех_символов);
ArrayResize(События_нового_бара,Всех_символов);
//---------------------------------------------------------//Записываем наименования символов обзора рынка в массив "Символы[]".//---------------------------------------------------------for(int a1 = 0; a1 < Всех_символов; a1++)
{
Символы[a1] = SymbolName(a1 + 1,true);
//Возможно, нумерация символов в обзора рынка идет с нуля.//Тогда: Символы[a1] = SymbolName(a1,true);
}
//---------------------------------------------------------return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+//| Expert deinitialization function |//+------------------------------------------------------------------+voidOnDeinit(constint reason)
{
//--- destroy timerEventKillTimer();
}
//+------------------------------------------------------------------+//| Expert tick function |//+------------------------------------------------------------------+voidOnTick()
{
}
//+------------------------------------------------------------------+//| Timer function |//+------------------------------------------------------------------+voidOnTimer()
{
staticbool Начало_отсчета;
staticint Минута;
//---------------------------//Нам нужен корректный старт отсчета. Это должно быть время начала бара.//---------------------------if(!Начало_отсчета && Время_последнего_бара != Time[0])Начало_отсчета = true;
//--------------------------- if(Начало_отсчета)Минута++;
//--------------------------- //В следующем цикле, мы будем обращатся к функции iBars для получения количества баров на //каждом из символов и таймфреймов, которые будем проходить в цикле.//Далее, будем сравнивать записанное количество баров с текущим и при //наличии разницы установим флаг события нового бара в массив "События_нового_бара[]".//---------------------------if(Минута*Частота_таймера >= 60000)
{
for(int a1 = 0; a1 < Всех_символов; a1++)
{
string Этот_символ = Символы[a1];
//---------------------------------for(int a2 = 0; a2 < Всех_таймфреймов; a2++)
{
int Этот_таймфрейм = Таймфреймы[a2];
//------------------------------------------int Текущее_количество_баров = iBars(Этот_символ,Этот_таймфрейм);
//------------------------------------------if(Текущее_количество_баров > Количество_баров[a1][a2])
{
//------------------------------------------------------------//Если это не самая первая запись в массив Количества баров,//то фиксируем событие нового бара.//------------------------------------------------------------if(Количество_баров[a1][a2])
{
События_нового_бара[a1][a2] = true;
}
//------------------------------------------------------------//Устанавливаем новое значение текущего количества баров.//------------------------------------------------------------
Количество_баров [a1][a2] = Текущее_количество_баров;
}
//------------------------------------------
}
}
//---------
Минута = 0;
}
//-----------------------------------------------//Здесь наш код...//Здесь наш код...//Здесь наш код...//-----------------------------------------------//После завершения всех вызовов на этом событии таймера//снимаем флаги событий нового бара.if(!Минута)Снять_событие_нового_бара();
//-----------------------------------------------
}
//+------------------------------------------------------------------+//Функция снимает флаги событий нового бара.//Эта процедура осуществляется после выполнения всего пользовательского//кода один раз в минуту. Вплоть до момента очищения массива флагов //новых баров, все функции могут их видеть обращаясь к массиву напрямую.//+------------------------------------------------------------------+void Снять_событие_нового_бара()
{
for(int a1 = 0; a1 < Всех_символов; a1++)
{
for(int a2 = 0; a2 < Всех_таймфреймов; a2++)
{
События_нового_бара[a1][a2] = false;
}
}
}
//+------------------------------------------------------------------+//+------------------------------------------------------------------+//Пример использования событий нового бара в пользовательском функционал.//Просто обращаемся к глобальному массиву "События_нового_бара[a1][a2]" напрямую//и используем событие в наших торговых алгоритмах.//+------------------------------------------------------------------+void Моя_стратегия_торговли_на_новых_барах()
{
for(int a1 = 0; a1 < Всех_символов; a1++)
{
string Этот_символ = Символы[a1];
//----------------------------------for(int a2 = 0; a2 < Всех_таймфреймов; a2++)
{
bool Новый_бар = События_нового_бара[a1][a2];
int Этот_таймфрейм = Таймфреймы[a2];
//----------------------------------if(Новый_бар && Этот_символ == "EURUSD" && Этот_таймфрейм == PERIOD_M15)
{
//Купить();
}
//---------------------------------- if(Новый_бар && Этот_символ == "AUDUSD" && Этот_таймфрейм == PERIOD_M30)
{
//Продать();
}
//----------------------------------
}
}
}
//+------------------------------------------------------------------+
Wenn Sie kein Benutzerkonto haben, registrieren Sie sich
Erlauben Sie die Verwendung von Cookies, um sich auf der Website MQL5.com anzumelden.
Bitte aktivieren Sie die notwendige Einstellung in Ihrem Browser, da Sie sich sonst nicht einloggen können.
Sie sind angemeldet. Die Zwei-Faktor-Authentifizierung wurde deaktiviert. Richten Sie sie erneut ein und scannen Sie einen neuen QR-Code oder fahren Sie mit deaktivierter Zwei-Faktor-Authentifizierung fort.
Um auf das Thema des Threads zurückzukommen. Die Ergebnisse der Umfrage "Welche Plattform nutzen Sie? " wurden vor ein oder zwei Stunden veröffentlicht http://ru.forexmagnates.com/rezultatyi-oprosa-kakoy-platformoy-vyi-polzuetes/:
"So gewinnt nach den Abstimmungsergebnissen die Plattform MetaTrader 4 des Handelssoftware-Anbieters MetaQuotes mit deutlichem Vorsprung die Präferenz von 63% der Teilnehmer. Das Flaggschiffprodukt desselben Anbieters, MetaTrader 5, erhielt 19 % der Stimmen. Gleichzeitig nutzen 21 % derjenigen, die abgestimmt haben, "andere" Handelsplattformen, die nicht in der Liste aufgeführt sind.
Vielleicht wissen Sie nicht, was "schnell" bedeutet?
Funktioniert Ihre Lösung gut? Wenn es gut ist, ist es großartig.
Wie sieht es mit Hunderten von Werkzeugen aus - wird es da nicht eine Überlagerung geben?
Wie ich schon sagte: "Es ist kein Meisterwerk", sondern nur ein autodidaktischer Versuch, OOP zu lernen. Aber es funktioniert einwandfrei. Vor diesem Programm funktionierte mein mql4-Programm gut in mql5, aber es funktionierte nicht richtig. Ich habe irgendwo ein Thema - ich habe eine lange Diskussion auf hohem Niveau mit Drummer geführt...
Vielleicht müssen Sie der Funktion für Hunderte von Instrumenten eine weitere Variante hinzufügen, aber der Name bleibt derselbe. Und das ist meiner Meinung nach der angenehmste Vorteil von OOP. Wenn Sie OOP tiefer beherrschen, finden Sie vielleicht noch mehr angenehme Vorteile, aber... nicht zu meinen Lebzeiten...
Ich glaube, ich weiß es aber))
Trotzdem haben Sie bewiesen, dass Sie keine Ahnung haben.
Dennoch haben Sie bewiesen, dass Sie keine Ahnung haben.
Sie haben keine Ahnung, was für eine Idiotie Sie da an den Tag legen, das ist einfach eine völlige Abnormität. Aber ich werde euch nicht zeigen, wo genau, denn ihr seid alle nicht an meiner Meinung interessiert)))
Jeder ist nur an einer Meinung mit stichhaltigen Argumenten interessiert.
Das Argument, "du musst es tun, weil ich es tue", interessiert niemanden.
In diesem speziellen Fall entsprechen die Variablennamen nicht dem, was als schwaches Argument akzeptiert wird. Dies wurde nicht für CodeBase geschrieben.
Es ist schon komisch, wie ihr hier alle auf dem Schürhaken sitzt. Bleiben Sie sitzen, das macht die Welt um Sie herum lustiger.
Es ist schon komisch, wie ihr hier alle auf dem Schürhaken sitzt. Bleiben Sie sitzen, das macht die Welt um Sie herum lustiger.
Gut gemacht, Dimitri!
Wenn Peter ein Meister darin ist, Feuer zu schüren, dann bist du ein Meister darin, sie zu löschen ))))
Bislang unterstützt nicht einmal MOFT den MT5, was für mich frustrierend ist, da ich die Spreads dort immer weiter reduziert habe. Und was bedeutet Unterstützung? Veröffentlichung neuer Versionen? Nun, wenn keine kritischen Fehler gefunden werden, wird es vielleicht auch keine neuen geben.
Ich bin teilweise auf MT5 umgestiegen, aber wie Dmitiry richtig bemerkte, sind die Bedingungen auf MT4 im Moment besser.
Das ist es nicht. Die Geschwindigkeit und die Qualität derAuftragsausführung in MT5 schaffen eine schöne Umgebung, um die besser zu gewöhnen (es gibt vernünftig, und in der Tat, sehr niedrige Spreads während der Liquidität Zeiten, das Beispiel ist das gleiche Robo(MT5)). Dies wiederum verschafft dem Auftragslimit bei bestimmten Liquiditätsniveaus Vorteile. /*<= und dies kann den Overhead (Spread und Provision, wenn das Konto eine Provision hat) mehr als ausgleichen.
Die grünen Pfeile sind die Grenzwerte, die ich festgelegt habe, und die roten bis blauen Pfeile zeigen, wie der Auftrag tatsächlich ausgeführt wurde*/:
Diese Variante der Funktion hat überhaupt keine Funktion New_bar();
Dies ist die ressourcenschonendste Option, die ich angeboten habe. Darüber hinaus hat es einen weiteren Vorteil: Das neue Bar-Ereignis wird immer dann gespeichert, wenn der Benutzercode auf ein Timer- oder Tick-Ereignis ausgeführt wird.
Zuvor konnte dieses Ereignis nur einmal ausgelöst werden, und das Kennzeichen wurde mit New_bar() gelöscht. Die spezielle Funktion löscht nun das Array "event_new_bar[][]" einmal pro Minute und wird nur nach der Ausführung von benutzerdefiniertem Code aufgerufen.
Benutzerdefinierte Funktionen können direkt auf das Array zugreifen und jedes Mal, wenn der Code bei einem Timer- oder Tick-Ereignis ausgeführt wird, neue Bar-Event-Informationen abrufen.
Dadurch werden noch mehr Ressourcen eingespart.