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

 
Реter Konow:

その負担は、開発者が機構の一貫性に対して怠慢な態度をとることによって、コンピュータにかかるものである。システムを改善するエネルギーを節約したいという思い。仕事をしやすくするという名目で、コンピュータの資源を不当に消費していること。

非効率に書かれたコードにコンピュータがうまく対処する限り、開発者は処理能力に「寄生」し続けることになる。これは行き止まりの道です。

遅かれ早かれ、非効率な機構は進化を止め、より良い対応策に取って代わられるでしょう。

人間の時間と労力は無駄になり、彼の発案したものはゴミ箱行きになる。

競争の世界では、このリスクは常に存在する。

機構を設計する場合、第一に性能を考え、第二に作業時間の快適性や利便性を考える必要があります)。

新しいバーを手続き型で定義する関数がまだ書かれていませんね。

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

Mt4 サポート終了。

アルチョム・トリシキン さん 2017.09.10 23:21

彼の手続き型コードの最終結果には、このようなループで動くという目標がありました。

   ENUM_TIMEFRAMES array_timeframes[]=
      {
      PERIOD_M1,PERIOD_M2,PERIOD_M3,PERIOD_M4,PERIOD_M5,PERIOD_M6,PERIOD_M10,PERIOD_M12,PERIOD_M15,PERIOD_M30,
      PERIOD_H1,PERIOD_H2,PERIOD_H3,PERIOD_H4,PERIOD_H6,PERIOD_H8,PERIOD_H12,PERIOD_D1,PERIOD_W1,PERIOD_MN1
      };
   int total=SymbolsTotal(true), total_tf=ArraySize(array_timeframes);
   for(int i=0; i<total; i++){
      string symbol_name=SymbolName(i,true);
      for(int j=0; j<total_tf; j++){
         if(IsNewBar(symbol_name,array_timeframes[j])){
            Print("Новый бар на ",symbol_name," ",EnumToString(array_timeframes[j]));
            }
         }
      }

 
Реter Konow:

はい、昨日も話し合いました。

以前、別のプラットフォームを扱っていたのですが、そこでは相場が来るのと関係なく、時間によってバーが形成されていました(TWSで見てください)。

MTではそのようなことはないと聞きました。

新しいバーの発生イベントを確認するために、見積もり到着チェックを追加する予定です。

ずっと見ていたんです。面白いプラットフォームだが、さすがに無料ではないし、儲かるかどうかわからないなら、お金を払っておもちゃを使うのはもったいない...。

 

どうやら独学で説明しようとした実験は失敗したようだ...。

 
Vladimir:

原則的に、そのような例は あるのでしょうか?自分のものでなくとも?深い疑問があります。2000年代初頭、私は自分が書いたコードのうち、デバッグされ動作する行数を数えるのをやめました。なぜなら、それが100万行を超えると面白くなくなるからです。

初歩的な例としては、EAに別の入力パラメータを持つn個の入力系列を追加することが考えられる。
そしてもちろん、このn個のポジションを、別々のパラメータで、閉じるまで維持する。

...そして、ほとんどの場合(OOPを使用して)コードの行は、あなたがより少ないだろう。ただし、OOPコードの肥大化には長けている)

 
Aleksey Altukhov:

誰かが提案したのか知りませんが、MT4の全てをMT5に移したらどうでしょう、そうすれば皆移動しますよ。


そして、この山のように蓄積されたEA、インジケーター、スクリプトを誰が移管するのか?

 

OOPの 使い勝手の原始的な例を見つけたような気がします。ここでは、配列に指定した値を入れる関数を紹介します。アレイの種類によって8種類あります。

例えば、あるパラメータを渡す必要がある関数を書き、次に別のパラメータを渡し、さらに3番目のパラメータを渡す必要があるとします。アルゴリズムによるアプローチでは、N個の異なる関数名を得ることができます。ArrayInitializeInt()ArrayInitializeDouble() などの8つの関数を書いても問題ないように思えます。でも、配列の種類を考えずに、とにかく1つの関数を使えばいいし、どの配列を入れたら安全なのか...。

Документация по MQL5: Операции с массивами / ArrayInitialize
Документация по MQL5: Операции с массивами / ArrayInitialize
  • www.mql5.com
Операции с массивами / ArrayInitialize - справочник по языку алгоритмического/автоматического трейдинга для MetaTrader 5
 

新しいバー 機能のソリューションを開発。よりシンプルに、より簡潔になりました。これは、市場概要で利用可能な任意のシンボルで、任意のプリセットタイムフレームの新しいバーイベントに関する通知を受信する可能性を持っています。

エラーを発見された方は、コメントをお願いします。

//+------------------------------------------------------------------+
//|                                                  Новый бар 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                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- 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] == Символ)
      {
       for(int a2 = 0; a2 < Всех_таймфреймов; a2++)
         {
          if(Таймфреймы[a2] == Таймфрейм)
            {
             Новый_бар  = События_нового_бара[a1][a2];
             if(Новый_бар)События_нового_бара[a1][a2] = 0;
             return(Новый_бар);
            }
         }
      }
   }
 //-----------------------
 return(false);
}
//+------------------------------------------------------------------+
 
Реter Konow:

新しいバー 機能のソリューションを開発。よりシンプルに、より簡潔になりました。これは、市場概要で利用可能な任意のシンボルで、任意のプリセットタイムフレームの新しいバーイベントに関する通知を受信する可能性を持っています。

エラーを発見された方は、コメントをお願いします。


4サイクルはクールですね? マーケットオーバービューの600シンボルでは、毎分ターミナルが死ぬでしょう....

 
Реter Konow:

新バー 機能のソリューションを開発。よりシンプルに、より簡潔になりました。これは、市場概要で利用可能な任意のシンボルで、任意のプリセットタイムフレームの新しいバーイベントに関する通知を受信する可能性を持っています。

エラーを発見された方は、コメントをお願いします。

この関数がOnTimer()に飛び込んでくるとは思っていませんし、私の考えは既にコメント済みです

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

Mt4エンド対応。

アレクセイ・ビクトロフ さん 2017.09.11 10:09

どうやら独学で説明しようとした実験は失敗したようだ...。


 
Реter Konow:

新しいバー 機能のソリューションを開発。よりシンプルに、より簡潔になりました。これは、市場概要で利用可能な任意のシンボルで、任意のプリセットタイムフレームの新しいバーイベントに関する通知を受信する可能性を持っています。

エラーを発見された方は、コメントをお願いします。

コードへのコメントについてですが現在の期間のオープニングを定義する必要があり、プログラム内に1つのシンボルしかない場合はどうでしょうか?全構造が全ループするのか?合理的ではないのです。

ps;また、なぜミリ秒タイマーを起動する必要があるのでしょうか?セカンドタイマーで十分ではないか?