Еще о кроссплатформенном коде. Вызов индикатора

 

Классы для вызова iMA:

//+------------------------------------------------------------------+
//|                                                     CMT45_MA.mqh |
//|                        Copyright 2016, MetaQuotes Software Corp. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2016, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"

class CMT45_IndMA{
   protected:
      int m_handle;
      //---
      int m_period;
      int m_shift;
      ENUM_MA_METHOD m_method;
      ENUM_APPLIED_PRICE m_price;  
   public:
   virtual bool Value(double & val,CMT45_IndMA * & z,int shift){
      return(true);
   }
   void SetHandle(int h,int period,int shift,ENUM_MA_METHOD method,ENUM_APPLIED_PRICE price){
      m_handle=h;
      m_period=period;
      m_shift=shift;
      m_method=method;
      m_price=price;        
   }
};

class CMT45_IndMA_Load:public CMT45_IndMA{
   private:
   public:
   void CMT45_IndMA_Load(int period,int shift,ENUM_MA_METHOD method,ENUM_APPLIED_PRICE price){
      m_period=period;
      m_shift=shift;
      m_method=method;
      m_price=price;  
   }
   bool Value(double & val,CMT45_IndMA * & z,int shift){
      int m_tmph;
      #ifdef __MQL5__
         m_handle=iMA(Symbol(),Period(),m_period,m_shift,m_method,m_price);
         if(m_handle==INVALID_HANDLE)return(false);
         m_tmph=m_handle;
      #endif  
      
int m_tmp_period=m_period;
      int m_tmp_shift=m_shift;
      ENUM_MA_METHOD m_tmp_method=m_method;
      ENUM_APPLIED_PRICE m_tmp_price=m_price;        
      //---
      delete (z);
      z=new CMT45_IndMA_Val();
      z.SetHandle(m_tmph,m_tmp_period,m_tmp_shift,m_tmp_method,m_tmp_price);
      return(z.Value(val,z,shift));
   }
};

class CMT45_IndMA_Val:public CMT45_IndMA{
   private:
      double m_ar[1];
   public:
   bool Value(double & val,CMT45_IndMA * & z,int shift){
      #ifdef __MQL5__
         if(CopyBuffer(m_handle,0,shift,1,m_ar)==-1)return(false);
         val=m_ar[0];  
      #endif
      
#ifdef __MQL4__
         val=iMA(Symbol(),Period(),m_period,m_shift,m_method,m_price,shift);    
      #endif  
      
return(true);
   }
   void ~CMT45_IndMA_Val(){
      #ifdef __MQL5__
         if(m_handle!=INVALID_HANDLE){
            IndicatorRelease(m_handle);
         }
      #endif
  
}
};

class CMT45_MA{
   private:
      CMT45_IndMA * m_ma;
   public:
   void CMT45_MA(int period,int shift,ENUM_MA_METHOD method,ENUM_APPLIED_PRICE price){
      m_ma=new CMT45_IndMA_Load(period,shift,method,price);
   }
   bool Value(double & val,int shift){
      return(m_ma.Value(val,m_ma,shift));
   }
   void ~CMT45_MA(){
      delete(m_ma);
   }  
};

Использование:

#include <CMT45_MA.mqh>

CMT45_MA ma(15,0,MODE_SMA,PRICE_CLOSE);

//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart(){

  
   Alert("== Start ==");
  
   double v=0;
   if(ma.Value(v,0)){
      Alert("v1=",v);
   }
   else{
      Alert("er1");
   }

   if(ma.Value(v,0)){
      Alert("v2=",v);
   }
   else{
      Alert("er2");
   }


}
//+------------------------------------------------------------------+

От необходимости загружать индикатор удалось избавиться, но все равно надо объект создавать. Параметры МА передаются в конструктор при создании объекта.

Из-за того, что в МТ5 надо проверять результаты загрузки индикатора и результаты работы CopyBufer()  то получилось скорее МТ4 подогнать под МТ5, а не наоборот. Разве что в МТ4 можно не проверять результаты вызова ma.Value(). Значение индикатора возвращается по ссылке в переменной v. Что касается МТ4 - ведь проще один раз создать объект с передачей ему параметров, а потом обращаться к методу объекта передавая ему всего два параметра (переменную для значения и шифт).

Но стоит ли этим пользоваться... вот вопрос... 

---

Сварганил все это на скоряк, так что, если какие ошибочки, извиняйте. 


 

 
Dmitry Fedoseev:

Классы для вызова iMA:


От необходимости загружать индикатор удалось избавиться, но все равно надо объект создавать. Параметры МА передаются в конструктор при создании объекта.

Из-за того, что в МТ5 надо проверять результаты загрузки индикатора и результаты работы CopyBufer()  то получилось скорее МТ4 подогнать под МТ5, а не наоборот. Разве что в МТ4 можно не проверять результаты вызова ma.Value(). Значение индикатора возвращается по ссылке в переменной v. Что касается МТ4 - ведь проще один раз создать объект с передачей ему параметров, а потом обращаться к методу объекта передавая ему всего два параметра (переменную для значения и шифт).

Но стоит ли этим пользоваться... вот вопрос... 

---

Сварганил все это на скоряк, так что, если какие ошибочки, извиняйте. 

К сожалению без функции IndicatorCreate в МТ4 дальше велосипеда в этом направлении продвинутся не удастся. Проблема в том, что без этой функции невозможно создать универсальный механизм создания индикатора, а он необходим если мы хотим платформонезависимый код.
 

А сделать так, чтобы MT4-индикатор заработал после вставки только инклудника в исходник, нереально?

Продумывал такой вариант, особых подводных камней не заметил, но веточку создал. 

Автоматический конвертер MQL4 -&gt; MQL5
Автоматический конвертер MQL4 -&gt; MQL5
  • www.mql5.com
Идея запуска MQL4-кода в MT5 через добавление в начале одного инклудника. Т.е. сделать все MQL4-работы рабочими в MT5 через добавление одной строки...
 
fxsaber:

А сделать так, чтобы MT4-индикатор заработал после вставки только инклудника в исходник, нереально?

Нереально, т.к. приходится property править, а их макросами не заменить автоматически.
 
fxsaber:

А сделать так, чтобы MT4-индикатор заработал после вставки только инклудника в исходник, нереально?

Продумывал такой вариант, особых подводных камней не заметил, но веточку создал. 

Считаю переопределение стандартных функций ересью адской.

Есть вариант, надо по набору параметров искать хэндл. Какие бы удивительных хэш таблицы вы не использовали при этом, это будут тормоза, в отличие от прямого использования хэндла. Не имеет смысла.  

К тому же, как уже писал здесь много раз, возможность прямой конвертации кода отсутствует, потому-что в МТ5 нужно проверять успешность копирования данных из буфера, т.е. конвертация требует доработки алгоритма.

 
Stanislav Korotky:
Нереально, т.к. приходится property править, а их макросами не заменить автоматически.

Ну даже если не обойти это, то все, что понадобится, это поправить ручками property. Куда уж лучше, чем править что-то остальное.

А придумывать кроссплатформенную библу - мертвый проект, которым пользоваться будет только автор.

Dmitry Fedoseev:

Считаю переопределение стандартных функций ересью адской.

Так какая разница, ересь это адская или яблоки райские? Главное - работает или нет. Не вопрос же вкуса, а, скорее, целесообразности.

Есть вариант, надо по набору параметров искать хэндл. Какие бы удивительных хэш таблицы вы не использовали при этом, это будут тормоза, в отличие от прямого использования хэндла. Не имеет смысла.  

Так MT4 именно так во внутренностях своих и делает. У него хэш-таблица хэндлов, которые просто в потрохах сидят и не доступны пользователю. Поэтому реализовать это на MQL5 - не должно быть сильно медленней, чем сам MT4. 

К тому же, как уже писал здесь много раз, возможность прямой конвертации кода отсутствует, потому-что в МТ5 нужно проверять успешность копирования данных из буфера, т.е. конвертация требует доработки алгоритма.

Опять же, MT4 делает эту проверку сам. В MT5 эту же проверку и мы можем делать.

Т.е. MT4 много сложнее устроен, чем MT5, т.к. куча всего скрыто от глаз. Но это все делается, просто написано самими разработчиками. Надо написать все то же самое, но на MQL5, и будет работать не хуже. 

ЗЫ MT4 медленней MT5 только из-за этой огромной скрытой работы в MT4, которая из-за своей универсальности не может быть эффективной. Разработчики в MT5 и отдали все это дело в руки пользователей - используй только то, что тебе реально надо. Правда, перед использованием, потрудись это написать.

 
fxsaber:

ЗЫ MT4 медленней MT5 только из-за этой огромной скрытой работы в MT4, которая из-за своей универсальности не может быть эффективной. Разработчики в MT5 и отдали все это дело в руки пользователей - используй только то, что тебе реально надо. Правда, перед использованием, потрудись это написать.

Вот поэтому и не стоит подгонять МТ5 под МТ4 (превращать MT5 в MT4), а надо извлекать все преимущества из МТ5.

 
Dmitry Fedoseev:

Вот поэтому и не стоит подгонять МТ5 под МТ4 (превращать MT5 в MT4), а надо извлекать все преимущества из МТ5.

Ну что касается ордерной системы, то, по-моему, очень и очень оправдано. Особенно с учетом нового представления истории в терминале, которое будут 99% людей на хэдж-счетах использовать, но которое будет не доступно в таком виде из MQL5 без спец. библиотек.
 
fxsaber:
Ну что касается ордерной системы, то, по-моему, очень и очень оправдано. Особенно с учетом нового представления истории в терминале, которое будут 99% людей на хэдж-счетах использовать, но которое будет не доступно в таком виде из MQL5 без спец. библиотек.
Ордерную систему можно сделать значительно совершенней чем сейчас у вас, особенно при работе с историей. Можно даже сделать абсолютно совершенной: удобной и максимально быстрой.
 
Dmitry Fedoseev:
Ордерную систему можно сделать значительно совершенней чем сейчас у вас, особенно при работе с историей. Можно даже сделать абсолютно совершенной.

У меня она не совершенная, а просто MT4. С удовольствием выслушал бы предложения по этой теме.

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

Новая версия платформы MetaTrader 5 build 1525: Представление истории в виде позиций и улучшение тестера

fxsaber, 2017.01.27 19:20

ЗЫ Если логику скрипта написать под MT5 через СБ, то работать корректно скрипт не сможет. В общем, даже сложно сказать, как на MT5 написать такую простую MQL4-логику.

 
fxsaber:

У меня она не совершенная, а просто MT4. С удовольствием выслушал бы предложения по этой теме.

Вот и как тут с вами вести разговор? Мне есть что ответить, а вы в бане, надеюсь не на вечно, поэтому отвечу. 

Имеется ввиду именно то, что она у вас не совершенна (в той библиотеке, на которую ссылка выше). В частности - работа с историей в вашей библиотеке не то, что несовершенная, она вообще никакая, практически не применимая.

Давать советы? Да нафик надо. Потом еще от стада тролей отмахиваться.