Mt4 サポート終了。 - ページ 32

 
Vitaly Muzichenko:

入れて、テストして、動作しない

常に偽を表示している。
効果があったのか、まだなのか?
 
Реter Konow:
明らかにコードを読み取れない。))どこで食べているのだろう?

カラガンダにて。

 
Dmitry Fedoseev:

唐衣

混乱はないのでしょうか?ウランウデとか?
 
George Merts:

本当にそんなに持っている人がいるのだろうか。

16個なんですが......もう、荷が重すぎるのでは?

最低でもM15という時間軸があるのですが・・・。それにしても、端末の負荷が致命的になるのはいつからなんでしょうね?

クライアントから、サーバー上の全シンボルを毎ティック ごとにチェックし、スキャンするよう依頼されています。そして、その数は多くもなく少なくもなく、10 230・・・。そこに問題があるのでは...。

 
Artyom Trishkin:

お客様から、サーバー上の全キャラクターのチェックとスキャンを1ティック ごとに行うよう依頼されています。そして、その数は多くもなく少なくもなく、10,230...。それが問題なんだ...。

そういえば、Market Watchのウィンドウに表示されるシンボルの最大数は1024個までという制限がありましたね。今は存在しないのでしょうか?1万円でいいですか?
 
Alexey Viktorov:
混乱はないのでしょうか?もしかして、ウランウデにあるのかな?

もし、本当に600もの商品をマーケットオーバービューに登録している人が、1ティック ごとに各商品、各タイムフレームの新しいバーの到着をチェックするとしたら、高くつくかもしれないな...と思っていたんです。

私自身はトレードをしないので、この関数が実際に何回呼ばれるべきかは正確にはわかりません。

new bar 関数のシンボルとタイムフレームの二重ループは、シンボルとタイムフレームの数が非常に多く、数百のシンボルの各ティックで関数が呼び出される場合にのみ、負荷が増加する可能性があります。それならば、ドミトリーの言うとおりかもしれない。

関数内のループを1つ短くしました。

 
Vladimir:
そういえば、Market Watchのウィンドウに表示されるシンボルの最大数は1024個までという制限がありましたね。今は存在しないのでしょうか?1万でもいいんですか?

トレーディング、自動売買システム、トレーディング戦略のテストに関するフォーラム

Mt4 サポート終了のお知らせ。

アルチョム・トリシキン さん 2017.09.11 14:37

お客様から、サーバー上の 全シンボルを毎ティック ごとにチェックし、スキャンするように依頼されています。そして、その数は多くもなく少なくもなく、10,230...。そこに問題があるのでは...。

注意...;)
 

こちらが新バージョンです。最終的なものではありません。

//+------------------------------------------------------------------+
//|                                                  Новый бар 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 Всех_символов;

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                                   |
//+------------------------------------------------------------------+
int OnInit()
  {Alert("!!!");
//--- create timer
   EventSetMillisecondTimer(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                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//--- destroy timer
   EventKillTimer();
      
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
   
  }
//+------------------------------------------------------------------+
//| Timer function                                                   |
//+------------------------------------------------------------------+
void OnTimer()
{
 static bool Начало_отсчета;
 static int  Минута;
 //---------------------------
 //Нам нужен корректный старт отсчета. Это должно быть время начала бара.
 //---------------------------
 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] == Символ)
      {
       Новый_бар  = События_нового_бара[a1][Таймфрейм];
       if(Новый_бар)События_нового_бара[a1][Таймфрейм] = 0;
       return(Новый_бар);  
      }
   }
 //-----------------------
 return(false);
}
//--------------------------
//+------------------------------------------------------------------+
 
Реter Konow:
成功したのか、まだなのか?

ピーター、私もうまくいかないんです。アルゴリズムはかなり高速ですが、時間の無駄です。でも、まだうまくいっていない。理解する時間がない。
あなたのプログラミングスタイルはおかしい。OnInitやOnTimerの変数やループを含めて、このようなものを1つのプロシージャにまとめてもよいでしょう。使いたい人がいても、こんなものでは邪魔になる。同じ内容のプロシージャーが20個以上ある場合はどうするのですか?ここに 実装されています。

 
Реter Konow:

もし、本当に600もの商品をマーケットオーバービューに登録している人が、1ティック ごとに各商品、各タイムフレームの新しいバーの到着をチェックするとしたら、高くつくかもしれないな...と思っていたんです。

私自身はトレードをしないので、この関数が実際に何回呼ばれるべきかは正確にはわかりません。

new bar 関数のシンボルとタイムフレームの二重ループは、シンボルとタイムフレームの数が非常に多く、数百のシンボルの各ティックで関数が呼び出される場合にのみ、負荷が増加する可能性があります。それならば、ドミトリーの言うとおりかもしれない。

機能で1サイクル短くしました。

Galinaのコードを見て、あなたのコードで改善できる点を確認してみてください。

敬具