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

 

スレッドの話題に戻ります。1~2時間前に「どのようなプラットフォームを使っていますか」というアンケート結果が発表されましたhttp://ru.forexmagnates.com/rezultatyi-oprosa-kakoy-platformoy-vyi-polzuetes/

「投票結果によると、MetaQuotes社のMetaTrader 4プラットフォームが、参加者の63%から支持され、大きな優位性を持っています。同プロバイダーの主力製品である「MetaTrader 5」は19%の票を獲得した。同時に、投票した人の21%が、リストに明記されていない「その他」の取引プラットフォームを利用しています。"

Результаты опроса «Какой платформой вы пользуетесь?» | Forex Magnates
Результаты опроса «Какой платформой вы пользуетесь?» | Forex Magnates
  • Vadim Sviderski
  • ru.forexmagnates.com
В конце прошлой недели редакция Forex Magnates провела среди пользователей ресурса опрос на тему «Какой платформой вы пользуетесь?». Сегодня мы опубликуем результаты и выясним, какой торговой платформе отдают предпочтение розничные участники внебиржевого рынка Форекс. Итак, по результатам голосования, с существенным преимуществом побеждает...
 
Dmitry Fedoseev:

もしかして、「速い」の意味がわからない?

でも、わかる気がする))
ただ、今はそれを証明する時間がないんです。
Peterのコードを詳しく調べたわけではないのですが、プロファイリングで動かしてみました。データ生成の全サイクルは、約1マイクロ秒。完全に動作させるために、コードにグローバルな修正は必要ないという前提で、今のところ最高の結果です。
 
Реter Konow:

あなたのソリューションはうまく機能していますか?良いものであれば、最高です。

何百ものツールはどうでしょうか。オーバーレイはないのでしょうか?

すぐに「傑作ではない」と言ったように、OOPを学ぶための独学に過ぎません。でも、不具合もなく使えています。これ以前は、mql4がmql5でうまく動作していたのですが、うまく動作しないのです。どこかにトピックがあるはずなんですが......ドラえもんと長々とハイレベルな議論をしているようで。

おそらく、何百もの楽器のために、関数に別のバリエーションを追加する必要があるでしょうが、名前は変わりません。そして、これこそがOOPの最も嬉しいプラス要素だと私は考えています。OOPをもっと深く極めれば、もっと嬉しいメリットがあるかもしれませんが......。まさか

 
Nikolai Semko:
でも、わかる気がする))
ただ、今はそれを証明する時間がないんです。
Peterのコードを詳しく調べたわけではないのですが、プロファイリングで動かしてみました。データ生成の全サイクルは、約1マイクロ秒。完全に動作させるために、コードにグローバルな修正は必要ないという前提で、今のところ最高の結果です。

同じように、あなたは知らないということを証明したのです。

 
Dmitry Fedoseev:

それでも、知らないことを証明したことになります。

わかりました、お好きなように。どうだろう。私は敗北し、あなたの足は私の胸にある。おめでとうございます!!!お楽しみに
 
Dmitry Fedoseev:

自分がどんなバカを発揮したのか、全くわかっていない、異常としか言いようがない。でも、皆さんは私の意見に興味がないので、具体的にどこかは示しません)))

有効な論拠がある意見だけに、誰でも興味を持つものです。

私がやるからにはやらなければならない」という主張は、誰の興味も引きません。

この特殊なケースでは、変数名が対応していないのは、弱い議論と認められます。これはCodeBase用に書かれたものではありません。

 

ここで皆さんが十字架の上のポーカーに座るのはおかしいですね。座り続けることで、周りが楽しくなる。

 
Dmitry Fedoseev:

ここで皆さんが十字架の上のポーカーに座るのはおかしいですね。座り続けることで、周りが楽しくなる。


よくやった、Dimitri!
ピーターが火をあおる名人なら、あなたは火を消す名人です ))))

 
Alexey Volchanskiy:

今のところMOFTでもMT5をサポートしていないので、そこのスプレッドを削っている私としては悔しいです。また、サポートとはどのようなものですか?新バージョンのリリース?まあ、致命的なバグが見つからなければ、新しいバグは出ないかもしれませんね。

一部MT5に移行しましたが、Dmitiryさんのご指摘の通り、今のところMT4の方が条件が良いです。

違うんです。MT5の注文執行の 速度と品質は、より良い(正気と、実際には、流動性の期間中に非常に低いスプレッドがあり、例では同じRobo(MT5))に慣れるために良い環境を作成します。その結果、特定の流動性レベルにおけるオーダーリミットに利点がもたらされるのです。/*<= そして、これはオーバーヘッド(スプレッドと、口座に手数料がある場合は手数料)を補って余りあるものです。

この例から /*緑の矢印は設定したリミットレベル、赤から青の矢印は実際の注文がどうなったか*/です。

 

この変種はNew_bar()関数を全く持っていない。

これは、私が提供した中で最も省資源なオプションです。さらに、もう一つの利点があります。新しいバーイベントは、ユーザーコードがタイマーまたはティックイベントで実行されるときは常に保存されます。

以前は、このイベントは一度しか取得できず、New_bar()でフラグがクリアされました。この特別な関数は、1分間に1回、"event_new_bar[][]"配列をクリアし、カスタムコードの実行後にのみ呼び出されるようになりました。

カスタム関数は、タイマやティックイベントでコードが実行 されるたびに、配列に直接アクセスして新しいバーイベント情報を取得することができます。

資源をさらに節約することができます。

//+------------------------------------------------------------------+
//|                                                  Новый бар 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                                   |
//+------------------------------------------------------------------+
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;
   }
 //-----------------------------------------------
 //Здесь наш код...
 //Здесь наш код...
 //Здесь наш код...
 //-----------------------------------------------
 //После завершения всех вызовов на этом событии таймера
 //снимаем флаги событий нового бара.
 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)
         {
          //Продать();
         }
       //----------------------------------        
      }
   }
}
//+------------------------------------------------------------------+