Особенности языка mql5, тонкости и приёмы работы - страница 125

 
Nikita Chernyshov:

Спасибо!

А это более старый код, но зато в картинках: TrailingStop

 
EventSetTimer в OnInit в Тестере ведет отсчет не от начала суток первого тика, а от начальной даты интервала тестирования - балансовая сделка.
 
fxsaber:
EventSetTimer в OnInit в Тестере ведет отсчет не от начала суток первого тика, а от начальной даты интервала тестирования - балансовая сделка.
EventSetTimer всегда начинает отсчёт таймера от момента вызова EventSetTimer. Что в тестере, что в терминале
 

Форум по трейдингу, автоматическим торговым системам и тестированию торговых стратегий

Особенности языка mql4, тонкости и приёмы работы

fxsaber, 2019.02.12 13:12

Особенности ArrayResize для многомерных массивов
void OnStart()
{
  int Array[][2];
  
  Print(ArrayResize(Array, 7)); // MQL5 - 7, MQL4 - 14
  Print(ArraySize(Array));      // 14
}
 

Как бы было хорошо увидеть функции Кима для пятерки. Подскажите, пожалуйста. Была вот такая функция у Кима

//+------------------------------------------------------------------+
//|  Проверяет был ли открыт последний ордер на этой же свече        |
//|  Checks whether the opened last the order on the same candle     |
//+------------------------------------------------------------------+
bool IfOrdOpClSelfBar(int magik = 0, int bar = 0, int typ = -1,string sy = "",int per = 0){
   if(sy == ""){sy = Symbol();}
   if(per==0){per=Period();}
   for(int i = OrdersTotal(); i>=0; i--){
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)){
         if(OrderSymbol()!=sy){continue;}
         if(OrderType()==typ||typ==-1){
            if(OrderMagicNumber()==magik||magik==0){
               if(OrderOpenTime()>=iTime(sy,per,bar)){return(true);}
            }
         }
      }
   }
   for(i = OrdersHistoryTotal(); i>=0; i--){
      if(OrderSelect(i,SELECT_BY_POS,MODE_HISTORY)){
         if(OrderSymbol()!=sy){continue;}
         if(OrderType()==typ||typ==-1){
            if(OrderMagicNumber()==magik||magik==0){
               if(OrderOpenTime()>=iTime(sy,per,bar)){return(true);}
            }
         }
      }
   }   
   return(false);
}

Пытаюсь переписать ее на mql5. Но не хочет работать. Как ее принудить? :)

//+------------------------------------------------------------------+
//|  Проверяет был ли открыт последний ордер на этой же свече        |
//|  Checks whether the opened last the order on the same candle     |
//+------------------------------------------------------------------+
bool IfOrdOpClSelfBar(ENUM_ORDER_TYPE type)
{

   for(int i = OrdersTotal(); i>=0; i--){
      if(OrderSelect(OrderGetTicket(i)) >0)
        {
         if(OrderGetString(ORDER_SYMBOL)!=_Symbol){continue;}
         if(OrderGetInteger(ORDER_TYPE)==type)
           {
            if(OrderGetInteger(ORDER_MAGIC) == magicN)
             {
               if(OrderGetInteger(ORDER_TIME_SETUP) >= iTime(NULL,Period(),0)){return(true);}
             }
           }
        }
      }
      
   for(int i = HistoryOrdersTotal(); i>=0; i--){
     if(HistoryOrderSelect(OrderGetTicket(i)) >0)
          {
         if(OrderGetString(ORDER_SYMBOL)!=_Symbol){continue;}
         if(OrderGetInteger(ORDER_TYPE)==type)
           {
            if(OrderGetInteger(ORDER_MAGIC) == magicN)
             {
               if(OrderGetInteger(ORDER_TIME_SETUP) >= iTime(NULL,Period(),0)){return(true);}
             }
           }
          }
    }
   
   return(false);
}
 
Nikita Chernyshov:

Как бы было хорошо увидеть функции Кима для пятерки. Подскажите, пожалуйста. Была вот такая функция у Кима

Пытаюсь переписать ее на mql5. Но не хочет работать. Как ее принудить? :)

Форум по трейдингу, автоматическим торговым системам и тестированию торговых стратегий

Библиотеки: MT4Orders

fxsaber, 2019.01.13 17:23

Кимовские функции под MT4 довольно популярны, поэтому скачал все исходники с его сайта и написал для них простой  "конвертер" под MT5.
#include <KimIVToMT5.mqh> // https://c.mql5.com/3/263/KimIVToMT5.mqh

#include "e-Trailing.mq4" // http://www.kimiv.ru/index.php?option=com_remository&Itemid=13&func=fileinfo&id=14

void OnTick() { start(); }
 
fxsaber:

Спасибо за костылек, годно очень :) Но я учу пятерку для понимания, вникания в это дело, поэтому важно ручками, фундаментально разобрать по костяшкам.

 

Во время парсинга миллионов тиков решил периодически смотреть на потребление памяти.

Заметил, что после внесения изменений скорость выполнения упала в разы.


Причина: некоторые варианты использования TerminalInfoInteger выполняются очень долго

#define BENCH(A)                                                              \
{                                                                             \
  const ulong StartTime = GetMicrosecondCount();                              \
  A;                                                                          \
  Print("Time[" + #A + "] = " + (string)(GetMicrosecondCount() - StartTime)); \
}  

void OnStart()
{
  BENCH(TerminalInfoInteger(TERMINAL_MEMORY_USED)); // 28220
}
Будьте аккуратны.
 
TerminalInfoInteger(TERMINAL_MEMORY_USED)

Ооочень дорогая функция.

Ещё TERMINAL_MEMORY_AVAILABLE

TERMINAL_MEMORY_PHYSICAL и TERMINAL_MEMORY_TOTAL после первого запроса кешируются. При последующих запросах отдаются кешированные значения

 
Некоторые (*.bat и т.д.) файлы FileIsExists не видит, но FileFindNext их находит.
Причина обращения: