В конце прошлой недели редакция Forex Magnates провела среди пользователей ресурса опрос на тему «Какой платформой вы пользуетесь?». Сегодня мы опубликуем результаты и выясним, какой торговой платформе отдают предпочтение розничные участники внебиржевого рынка Форекс. Итак, по результатам голосования, с существенным преимуществом побеждает...
//+------------------------------------------------------------------+//| Новый бар 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)
{
//Продать();
}
//----------------------------------
}
}
}
//+------------------------------------------------------------------+
スレッドの話題に戻ります。1~2時間前に「どのようなプラットフォームを使っていますか」というアンケート結果が発表されましたhttp://ru.forexmagnates.com/rezultatyi-oprosa-kakoy-platformoy-vyi-polzuetes/。
「投票結果によると、MetaQuotes社のMetaTrader 4プラットフォームが、参加者の63%から支持され、大きな優位性を持っています。同プロバイダーの主力製品である「MetaTrader 5」は19%の票を獲得した。同時に、投票した人の21%が、リストに明記されていない「その他」の取引プラットフォームを利用しています。"
もしかして、「速い」の意味がわからない?
あなたのソリューションはうまく機能していますか?良いものであれば、最高です。
何百ものツールはどうでしょうか。オーバーレイはないのでしょうか?
すぐに「傑作ではない」と言ったように、OOPを学ぶための独学に過ぎません。でも、不具合もなく使えています。これ以前は、mql4がmql5でうまく動作していたのですが、うまく動作しないのです。どこかにトピックがあるはずなんですが......ドラえもんと長々とハイレベルな議論をしているようで。
おそらく、何百もの楽器のために、関数に別のバリエーションを追加する必要があるでしょうが、名前は変わりません。そして、これこそがOOPの最も嬉しいプラス要素だと私は考えています。OOPをもっと深く極めれば、もっと嬉しいメリットがあるかもしれませんが......。まさか
でも、わかる気がする))
同じように、あなたは知らないということを証明したのです。
それでも、知らないことを証明したことになります。
自分がどんなバカを発揮したのか、全くわかっていない、異常としか言いようがない。でも、皆さんは私の意見に興味がないので、具体的にどこかは示しません)))
有効な論拠がある意見だけに、誰でも興味を持つものです。
私がやるからにはやらなければならない」という主張は、誰の興味も引きません。
この特殊なケースでは、変数名が対応していないのは、弱い議論と認められます。これはCodeBase用に書かれたものではありません。
ここで皆さんが十字架の上のポーカーに座るのはおかしいですね。座り続けることで、周りが楽しくなる。
ここで皆さんが十字架の上のポーカーに座るのはおかしいですね。座り続けることで、周りが楽しくなる。
よくやった、Dimitri!
ピーターが火をあおる名人なら、あなたは火を消す名人です ))))
今のところMOFTでもMT5をサポートしていないので、そこのスプレッドを削っている私としては悔しいです。また、サポートとはどのようなものですか?新バージョンのリリース?まあ、致命的なバグが見つからなければ、新しいバグは出ないかもしれませんね。
一部MT5に移行しましたが、Dmitiryさんのご指摘の通り、今のところMT4の方が条件が良いです。
違うんです。MT5の注文執行の 速度と品質は、より良い(正気と、実際には、流動性の期間中に非常に低いスプレッドがあり、例では同じRobo(MT5))に慣れるために良い環境を作成します。その結果、特定の流動性レベルにおけるオーダーリミットに利点がもたらされるのです。/*<= そして、これはオーバーヘッド(スプレッドと、口座に手数料がある場合は手数料)を補って余りあるものです。
この例から /*緑の矢印は設定したリミットレベル、赤から青の矢印は実際の注文がどうなったか*/です。
この変種はNew_bar()関数を全く持っていない。
これは、私が提供した中で最も省資源なオプションです。さらに、もう一つの利点があります。新しいバーイベントは、ユーザーコードがタイマーまたはティックイベントで実行されるときは常に保存されます。
以前は、このイベントは一度しか取得できず、New_bar()でフラグがクリアされました。この特別な関数は、1分間に1回、"event_new_bar[][]"配列をクリアし、カスタムコードの実行後にのみ呼び出されるようになりました。
カスタム関数は、タイマやティックイベントでコードが実行 されるたびに、配列に直接アクセスして新しいバーイベント情報を取得することができます。
資源をさらに節約することができます。