//+------------------------------------------------------------------+//| Новый бар 2.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 Всех_символов;
int Таймфреймы[7] = {PERIOD_M1,PERIOD_M5,PERIOD_M15,PERIOD_M30,PERIOD_H1,PERIOD_H4,PERIOD_D1};
int Всех_таймфреймов = 7;
int Количество_баров[][7];
bool События_нового_бара[][7];
string Символы[];
//+------------------------------------------------------------------+//| 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;
}
//-----------------------------------------------
}
//+------------------------------------------------------------------+//---------------------------------------------------------------------//Функция Новый_бар() принимает наименование символа и таймфрейм.//Она делает цикл по массиву символов, находит совпадение наименований и //с запрашиваемым символом, и далее ищет нужный таймфрейм для получения//индекса ячейки массива в которой он находится. //Найдя индекс ячейки имени нужного символа и индекс ячейки нужного//таймфрейма, функция обращается к массиву "События_нового_бара" и //возвращает факт события нового бара или его отсутствие.//После возврата флага события, функция снимает этот флаг.//Следовательно, флаг события можно получить только один раз за бар.//---------------------------------------------------------------------bool Новый_бар(string Символ, int Таймфрейм)
{
bool Новый_бар;
//-----------------------for(int a1 = 0; a1 < Всех_символов; a1++)
{
if(Символы[a1] == Символ)
{
for(int a2 = 0; a2 < Всех_таймфреймов; a2++)
{
if(Таймфреймы[a2] == Таймфрейм)
{
Новый_бар = События_нового_бара[a1][a2];
if(Новый_бар)События_нового_бара[a1][a2] = 0;
return(Новый_бар);
}
}
}
}
//-----------------------return(false);
}
//+------------------------------------------------------------------+
その負担は、開発者が機構の一貫性に対して怠慢な態度をとることによって、コンピュータにかかるものである。システムを改善するエネルギーを節約したいという思い。仕事をしやすくするという名目で、コンピュータの資源を不当に消費していること。
非効率に書かれたコードにコンピュータがうまく対処する限り、開発者は処理能力に「寄生」し続けることになる。これは行き止まりの道です。
遅かれ早かれ、非効率な機構は進化を止め、より良い対応策に取って代わられるでしょう。
人間の時間と労力は無駄になり、彼の発案したものはゴミ箱行きになる。
競争の世界では、このリスクは常に存在する。
機構を設計する場合、第一に性能を考え、第二に作業時間の快適性や利便性を考える必要があります)。
新しいバーを手続き型で定義する関数がまだ書かれていませんね。
トレーディング、自動売買システム、トレーディング戦略のテストに関するフォーラム
Mt4 サポート終了。
アルチョム・トリシキン さん 2017.09.10 23:21
彼の手続き型コードの最終結果には、このようなループで動くという目標がありました。
はい、昨日も話し合いました。
以前、別のプラットフォームを扱っていたのですが、そこでは相場が来るのと関係なく、時間によってバーが形成されていました(TWSで見てください)。
MTではそのようなことはないと聞きました。
新しいバーの発生イベントを確認するために、見積もり到着チェックを追加する予定です。
ずっと見ていたんです。面白いプラットフォームだが、さすがに無料ではないし、儲かるかどうかわからないなら、お金を払っておもちゃを使うのはもったいない...。
どうやら独学で説明しようとした実験は失敗したようだ...。
原則的に、そのような例は あるのでしょうか?自分のものでなくとも?深い疑問があります。2000年代初頭、私は自分が書いたコードのうち、デバッグされ動作する行数を数えるのをやめました。なぜなら、それが100万行を超えると面白くなくなるからです。
初歩的な例としては、EAに別の入力パラメータを持つn個の入力系列を追加することが考えられる。
そしてもちろん、このn個のポジションを、別々のパラメータで、閉じるまで維持する。
...そして、ほとんどの場合(OOPを使用して)コードの行は、あなたがより少ないだろう。ただし、OOPコードの肥大化には長けている)
誰かが提案したのか知りませんが、MT4の全てをMT5に移したらどうでしょう、そうすれば皆移動しますよ。
そして、この山のように蓄積されたEA、インジケーター、スクリプトを誰が移管するのか?
OOPの 使い勝手の原始的な例を見つけたような気がします。ここでは、配列に指定した値を入れる関数を紹介します。アレイの種類によって8種類あります。
例えば、あるパラメータを渡す必要がある関数を書き、次に別のパラメータを渡し、さらに3番目のパラメータを渡す必要があるとします。アルゴリズムによるアプローチでは、N個の異なる関数名を得ることができます。ArrayInitializeInt()ArrayInitializeDouble() などの8つの関数を書いても問題ないように思えます。でも、配列の種類を考えずに、とにかく1つの関数を使えばいいし、どの配列を入れたら安全なのか...。
新しいバー 機能のソリューションを開発。よりシンプルに、より簡潔になりました。これは、市場概要で利用可能な任意のシンボルで、任意のプリセットタイムフレームの新しいバーイベントに関する通知を受信する可能性を持っています。
エラーを発見された方は、コメントをお願いします。
新しいバー 機能のソリューションを開発。よりシンプルに、より簡潔になりました。これは、市場概要で利用可能な任意のシンボルで、任意のプリセットタイムフレームの新しいバーイベントに関する通知を受信する可能性を持っています。
エラーを発見された方は、コメントをお願いします。
4サイクルはクールですね? マーケットオーバービューの600シンボルでは、毎分ターミナルが死ぬでしょう....
新バー 機能のソリューションを開発。よりシンプルに、より簡潔になりました。これは、市場概要で利用可能な任意のシンボルで、任意のプリセットタイムフレームの新しいバーイベントに関する通知を受信する可能性を持っています。
エラーを発見された方は、コメントをお願いします。
この関数がOnTimer()に飛び込んでくるとは思っていませんし、私の考えは既にコメント済みです
トレーディング、自動売買システム、ストラテジーテストに関するフォーラム
Mt4エンド対応。
アレクセイ・ビクトロフ さん 2017.09.11 10:09
どうやら独学で説明しようとした実験は失敗したようだ...。
新しいバー 機能のソリューションを開発。よりシンプルに、より簡潔になりました。これは、市場概要で利用可能な任意のシンボルで、任意のプリセットタイムフレームの新しいバーイベントに関する通知を受信する可能性を持っています。
エラーを発見された方は、コメントをお願いします。
コードへのコメントについてですが現在の期間のオープニングを定義する必要があり、プログラム内に1つのシンボルしかない場合はどうでしょうか?全構造が全ループするのか?合理的ではないのです。
ps;また、なぜミリ秒タイマーを起動する必要があるのでしょうか?セカンドタイマーで十分ではないか?