Mt4结束支持。 - 页 34

 

回到这个话题上。一两个小时前公布了 "你使用什么平台?" 的调查结果,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:

也许你不知道 "快速 "是什么意思?

我想我是知道的))。
我只是现在没有时间来证明它。
我没有详细研究彼得的代码,但我通过剖析运行了它。整个数据生成周期大约需要1微秒。这是迄今为止最好的结果,假设在代码中不需要进行全局性的修正,就可以使其完全工作。
 
Реter Konow:

你的解决方案运作良好吗?如果它是好的,它是伟大的。

成百上千的工具如何--不会有叠加的情况吗?

正如我马上说的,"这不是一个杰作",它只是一个自学的努力,学习OOP。但它的工作没有任何故障。在这之前,我的mql4-程序在mql5中运行良好,但它没有正常工作。我在某个地方有一个话题--我和一个鼓手进行了长时间的高层讨论......

也许你将不得不为数百种乐器添加另一个变体的功能,但名称将保持不变。而在我看来,这是OOP中最令人愉快的优点。如果你更深入地掌握OOP,你可能会发现更多令人愉快的优势,但...在我的一生中没有...

 
Nikolai Semko:
我想我是知道的))。
我只是现在没有时间来证明它。
我没有详细研究彼得的代码,但我通过剖析运行了它。整个数据生成周期大约需要1微秒。这是迄今为止最好的结果,假设在代码中不需要进行全局性的修正,以使其完全工作。

同样,你已经证明你不知道。

 
Dmitry Fedoseev:

尽管如此,你已经证明了你不知道。

好吧,如你所愿。我不知道。我被打败了,你的脚在我的胸口上。祝贺你!!!。好好享受吧!
 
Dmitry Fedoseev:

你不知道你所表现出来的是什么白痴,这完全是一种不正常的现象。但我不会告诉你具体位置,因为你们都对我的意见不感兴趣)))。

任何人都只对有有效论据的意见感兴趣。

"你必须这样做,因为我也这样做 "的说法没有人感兴趣。

在这种特殊情况下,变量名称与所接受的东西不一致,是一种软弱的说法。这不是为CodeBase写的。

 

有趣的是,你们都坐在这里的十字架上的扑克上。继续坐着,它使你周围的世界更有趣。

 
Dmitry Fedoseev:

有趣的是,你们都坐在这里的十字架上的扑克上。继续坐着,它使你周围的世界更有趣。


干得好,迪米特里!
如果说彼得是煽风点火的高手,那么你就是救火的高手 ))))

 
Alexey Volchanskiy:

到目前为止,甚至MOFT也不支持MT5,这让我很沮丧,因为我一直在削去那里的点差。那么支持是什么意思呢?发布新版本?好吧,如果没有发现关键的错误,也许就不会有任何新的错误。

我已经部分地爬到了MT5上,但正如Dmitiry正确指出的那样,目前MT4上的条件更好。

不是的。MT5中订单执行 的速度和质量创造了一个很好的环境来适应更好的环境(有理智的,而且,事实上,在流动性期间,点差非常低,例子是相同的Robo(MT5))。这反过来又给某些流动性水平的订单限制带来了优势。/*<=,这可以弥补开销(点差和佣金,如果账户有佣金的话),得不偿失。

从这个例子来看/*绿色箭头是我设定的限价水平,红色到蓝色的箭头是实际订单的效果*/。

 

这个函数的变体完全没有New_bar()函数。

这是我提供的最节省资源的选择。此外,它还有另一个优点:在定时器或tick事件上执行用户代码时,新的bar事件都会被保存。

以前,你只能得到这个事件一次,而且这个标志是通过New_bar()清除的。现在,该特殊函数每分钟清除一次 "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)
         {
          //Продать();
         }
       //----------------------------------        
      }
   }
}
//+------------------------------------------------------------------+