Mt4 Fim do apoio. - página 34

 

Voltando ao tópico da linha. Os resultados da pesquisa "Que plataforma você usa?" foram publicados há uma ou duas horas atrás http://ru.forexmagnates.com/rezultatyi-oprosa-kakoy-platformoy-vyi-polzuetes/:

"Assim, de acordo com os resultados da votação, a plataforma MetaTrader 4 do fornecedor de software de negociação MetaQuotes ganha com uma vantagem significativa, a preferência de 63% dos participantes. O principal produto do mesmo fornecedor, MetaTrader 5, recebeu 19% dos votos. Ao mesmo tempo, 21% dos que votaram usam "outras" plataformas comerciais, não listadas na lista".

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

Talvez você não saiba o que significa "rápido"?

Acho que sei, no entanto))
Só não tenho tempo para provar isso agora mesmo.
Eu não estudei o código de Peter em detalhes, mas o analisei através do perfil. Todo o ciclo de geração de dados levou cerca de 1 microssegundo. Esse é o melhor resultado até agora com a suposição de que nenhuma correção global será necessária no código para que ele funcione plenamente.
 
Реter Konow:

Sua solução funciona bem? Se é bom, é ótimo.

Que tal centenas de ferramentas - não haverá uma sobreposição?

Como eu disse imediatamente "não é uma obra-prima", é apenas um esforço autodidata para aprender o OOP. Mas funciona sem qualquer falha. Antes deste, meu programa de mql4 funcionava bem em mql5, mas não funcionava corretamente. Tenho um tópico em algum lugar - tenho tido uma longa discussão de alto nível com um baterista...

Talvez você tenha que adicionar outra variante à função para centenas de instrumentos, mas o nome permanecerá o mesmo. E esta é, em minha opinião, a mais agradável vantagem no OOP. Se você dominar mais profundamente o OOP, poderá encontrar vantagens ainda mais agradáveis, mas... não em minha vida...

 
Nikolai Semko:
Acho que sei, no entanto))
Só não tenho tempo para provar isso agora mesmo.
Eu não estudei o código de Peter em detalhes, mas o analisei através do perfil. Todo o ciclo de geração de dados levou cerca de 1 microssegundo. Esse é o melhor resultado até agora com a suposição de que nenhuma correção global será necessária no código para que ele funcione plenamente.

Mesmo assim, você já provou que não sabe.

 
Dmitry Fedoseev:

Mesmo assim, você já provou que não sabe.

Tudo bem, como você desejar. Eu não sei. Estou derrotado e seu pé está sobre meu peito. Parabéns!!! Aproveite!
 
Dmitry Fedoseev:

Você não tem idéia da idiotice que você demonstrou, é apenas uma completa anormalidade. Mas eu não vou mostrar exatamente onde, porque todos vocês não estão interessados na minha opinião))))

Qualquer pessoa está interessada em uma opinião apenas com argumentos válidos.

O argumento, "você tem que fazê-lo porque eu o faço" não interessa a ninguém.

Neste caso particular, os nomes das variáveis não correspondem ao que é aceito é um argumento fraco. Isto não foi escrito para a CodeBase.

 

É engraçado como todos vocês se sentam no pôquer na cruz aqui. Continue sentado, isso torna o mundo ao seu redor mais divertido.

 
Dmitry Fedoseev:

É engraçado como todos vocês se sentam no pôquer na cruz aqui. Continue sentado, isso torna o mundo ao seu redor mais divertido.


Muito bem, Dimitri!
Se Peter é um mestre em fogos de artifício, então você é um mestre em apagá-los ))))

 
Alexey Volchanskiy:

Até agora nem mesmo o MOFT suporta o MT5, o que é frustrante para mim, já que eu tenho estado lascando as espátulas lá. E o que significa apoio? Lançamento de novas versões? Bem, se não forem encontrados bugs críticos, talvez não haja nenhum novo.

Rastejei em parte para o MT5, mas, como corretamente apontado pela Dmitiry, as condições são melhores no MT4, por enquanto.

Não é. A velocidade e a qualidade daexecução de pedidos no MT5 criam um ambiente agradável para se acostumar ao melhor (há spreads sãos e, na verdade, muito baixos durante os períodos de liquidez, o exemplo é o mesmo Robo(MT5)). O que, por sua vez, dá vantagens ao limite do pedido em certos níveis de liquidez. /*<= e isto pode mais do que compensar as despesas gerais (spread e comissão se a conta tiver uma comissão).

A partir de exemplos disto /* as setas verdes são os níveis limite que eu estabeleço, e as setas vermelhas a azuis são como a ordem real funcionou*/:

 

Esta variante da função não tem nenhuma função New_bar();

Esta é a opção que mais economiza recursos que já proporcionei. Além disso, tem outra vantagem: o novo evento de barra é salvo todo o tempo em que o código do usuário é executado em um timer ou evento de tick.

Anteriormente, só se podia obter este evento uma vez e a bandeira era liberada com New_bar(). A função especial agora limpa a matriz "event_new_bar[][]" uma vez por minuto e é chamada somente após a execução do código personalizado.

Funções personalizadas podem acessar diretamente a matriz e recuperar novas informações de eventos de barra todo o tempo em que o código é executado em um timer ou evento de tick.

Os recursos são economizados ainda mais.

//+------------------------------------------------------------------+
//|                                                  Новый бар 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)
         {
          //Продать();
         }
       //----------------------------------        
      }
   }
}
//+------------------------------------------------------------------+
Razão: