Как можно легко писать программы работающие в MT4 и в MT5 кроссплатформенный код , стимул изучать ООП - страница 3

 
Alexey Volchanskiy:

Посмотрел я код англицкий, похоже, там в хеш-таблице простой перебор при поиске, у Соколова все быстрее  

Там если внимательно прочитать, что предлагает автор - понимаешь, что как математик он хороший, но вот опыта в программировании не хватает. Имхо, то что предлагается там явно не вариант.
 
Vasiliy Sokolov:

То, что предлагается вообще не вариант. Единственным выходом видится, имхо, писать стратегии на уровне кросплатформенного фреймворка, что-то вроде такого:

...
//+------------------------------------------------------------------+
//| Работа с отложенными ордерами BuyStop для открытия длинной       |
//| позиции                                                          |
//+------------------------------------------------------------------+
void CImpulse::InitBuy(const MarketEvent &event)
{
   if(!IsTrackEvents(event))return;                      
   if(positions.open_buy > 0) return;                    
   int buy_stop_total = 0;
   ENUM_ORDER_TASK task;
   double target = WS.Ask() + WS.Ask()*(m_percent/100.0);
   if(target < Moving.OutValue(0))                    // Цена срабатывания ордера должна быть выше скользящей средней
      task = ORDER_TASK_DELETE;
   else
      task = ORDER_TASK_MODIFY;
   for(int i = PendingOrders.Total()-1; i >= 0; i--)
   {
      CPendingOrder* Order = PendingOrders.GetOrder(i);
      if(Order == NULL || !Order.IsMain(ExpertSymbol(), ExpertMagic()))
         continue;
      if(Order.Type() == ORDER_TYPE_BUY_STOP)
      {
         if(task == ORDER_TASK_MODIFY)
         {
            buy_stop_total++;
            Order.Modify(target);
         }
         else
            Order.Delete();
      }
   }
   if(buy_stop_total == 0 && task == ORDER_TASK_MODIFY)
      Trade.BuyStop(MM.GetLotFixed(), target, ExpertSymbol(), 0, 0, NULL);
}
...

Т.е. что бы в коде советника вообще не было вызовов платформо-специфических функций вроде OrderSend, Ask() или iCustom.
 

Такой фреймворк можно и продавать в качестве либы ))

 
Andrey F. Zelinsky:
на самом деле -- мне известен только один, кто готов биться "за" МТ5 и "против" МТ4 с любым трейдером и даже с любой преградой каждой клеточкой своего тела и сознания.
Когда-то несколько терминалов на одном компе он называл зоопарком терминалов, но прошло какое-то время и он публично признался что ошибался. Пройдёт ещё немного он и это поймёт. Может быть.:)))
 
Vasiliy Sokolov:

То, что предлагается вообще не вариант. Единственным выходом видится, имхо, писать стратегии на уровне кросплатформенного фреймворка, что-то вроде такого:

...
//+------------------------------------------------------------------+
//| Работа с отложенными ордерами BuyStop для открытия длинной       |
//| позиции                                                          |
//+------------------------------------------------------------------+
void CImpulse::InitBuy(const MarketEvent &event)
{
   if(!IsTrackEvents(event))return;                      
   if(positions.open_buy > 0) return;                    
   int buy_stop_total = 0;
   ENUM_ORDER_TASK task;
   double target = WS.Ask() + WS.Ask()*(m_percent/100.0);
   if(target < Moving.OutValue(0))                    // Цена срабатывания ордера должна быть выше скользящей средней
      task = ORDER_TASK_DELETE;
   else
      task = ORDER_TASK_MODIFY;
   for(int i = PendingOrders.Total()-1; i >= 0; i--)
   {
      CPendingOrder* Order = PendingOrders.GetOrder(i);
      if(Order == NULL || !Order.IsMain(ExpertSymbol(), ExpertMagic()))
         continue;
      if(Order.Type() == ORDER_TYPE_BUY_STOP)
      {
         if(task == ORDER_TASK_MODIFY)
         {
            buy_stop_total++;
            Order.Modify(target);
         }
         else
            Order.Delete();
      }
   }
   if(buy_stop_total == 0 && task == ORDER_TASK_MODIFY)
      Trade.BuyStop(MM.GetLotFixed(), target, ExpertSymbol(), 0, 0, NULL);
}
...

Т.е. что бы в коде советника вообще не было вызовов платформо-специфических функций вроде OrderSend, Ask() или iCustom.
 

Понимаю, о чем Вы. Но это (выделил) плохое решение, ИМХО.

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

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

fxsaber, 2016.08.09 08:35

Когда в руки попадается MQ4-советник, то довольно легко понять по коду, что и где он делает. Внести изменения. Помочь человеку, если он спрашивает по коду и т.п. Так, например, обстоят дела практически с любым советником из кодобазы. И причина не в том, что почти все они написаны в процедурном стиле (ООП MQ4-советники, кстати, осознаются легче).

Когда же берете MQ5-советник (см. небогатую кодобазу), то понимание его частей торговых алгоритмов требует более серьезного умственного напряжения. Я бы даже сказал, ощущается дискомфорт. И именно с ОЯС. Понимание всегда приходит, но требуется затратить гораздо больше времени и сил.

Безусловно, если читать/править/дописывать исключительно свой код, то практически никаких существенных различий между MT4 и MT5-ОЯС ощущаться не будет: написали свою универсальную библиотеку и делов. Но это только для себя любимого. Стоит столкнуться с чужим кодом - холодный душ обеспечен. И стандартная библиотека от разработчиков, к сожалению, не помогает выйти из дискомфортной зоны.

Из-за этого крайне сложно конструктивно обсуждать/дорабатывать совместно торговую идею на MQL5, как это давно практикуется в различных трейдерских сообществах на MQL4. И желание переходить на MT5 в этой связи не блещет мотивацией.

 
Vasiliy Sokolov:
Там если внимательно прочитать, что предлагает автор - понимаешь, что как математик он хороший, но вот опыта в программировании не хватает. Имхо, то что предлагается там явно не вариант.
Василий, а почему в MQL СБ нет хеш-таблицы, ваше мнение выскажете. Ведь инструмент из серии необходимых. Почему бы ваш вариант не вставить, я его уже рекомендовал 100500 раз.
 
Alexey Volchanskiy:

Такой фреймворк можно и продавать в качестве либы ))

Без вариантов. Для продажи такого нужно как минимум профессиональное комьюнити, которого у нас практически нет. Плюс необходима хорошая документация и поддержка.

Самый лучший вариант публиковать как OpenSource в виде статей, чем собственно я и занимаюсь

 
Alexey Volchanskiy:
Василий, а почему в MQL СБ нет хеш-таблицы, ваше мнение выскажете. Ведь инструмент из серии необходимых. Почему бы ваш вариант не вставить, я его уже рекомендовал 100500 раз.
СБ в части алгоритмов перестала развиваться еще в 2009-2010, тогда же, когда была опубликована. Объективно спрос на нее практически отсутствует. Лишь единицы научились более менее писать Trade.Buy(), вместо заполнения торгового запроса. Про стандартные алгоритмы, вроде динамических массивов CArray я вообще молчу. В общем не надо это никому, вот поэтому воз и ныне там.
 
Vasiliy Sokolov:
СБ в части алгоритмов перестала развиваться еще в 2009-2010, тогда же, когда была опубликована. Объективно спрос на нее практически отсутствует. Лишь единицы научились более менее писать Trade.Buy(), вместо заполнения торгового запроса. Про стандартные алгоритмы, вроде динамических массивов CArray я вообще молчу. В общем не надо это никому, вот поэтому воз и ныне там.
Тут не согласен. Почему тогда вставляют всякие FuzzyLogic, которые реально нужны одному из 10000 разрабов, а хеш-таблицы нет. Просто такое чувство, что СБ развивается полностью бессистемно, по воле ветра.
 
// к примеру
   CTrade            trade;
...
dBid = SymbolInfoDouble(_Symbol,SYMBOL_BID);
dAsk = SymbolInfoDouble(_Symbol,SYMBOL_ASK);


   trade.Sell(0.1,_Symbol,dBid ,dAsk +0.0020,dBid -0.0010,""); // и в MQL5 и MQL4 работает

с индикаторами примерно так
...
#ifdef __MQL4__
      ValMA[1]=iMA(NULL,PERIOD_CURRENT,14,0,MODE_EMA,PRICE_CLOSE,1);
#endif
#ifdef __MQL5__
      CopyBuffer(ind_handleMA,0,1,2,ValMA);
#endif
...

и все чудесно работает на обоих платформах

С макросами условной компиляции нужно вообще быть очень осторожным, как и с любыми другими макросами. В качестве эксперимента, попробуйте скомпилировать более менее крупный проект на C++. 9 из 10 что получите ошибку (ошибок 100-150) undefined reference to или что-нибудь в этом роде. Нет конечно, без условной компиляции не обойтись, но сама по себе это не поноцея.

Вот к примеру в Вашем коде CopyBuffer использует уже созданный хендл индикатора. А ведь его где-то надо хранить, как-то надо его создать. И все это кроссзависимый код, поэтому одним #ifdef здесь будет не обойтись, а нужно будет массу #ifdef'ов которые в результате сделают код адски сложным.

 
Alexey Volchanskiy:
Тут не согласен. Почему тогда вставляют всякие FuzzyLogic, которые реально нужны одному из 10000 разрабов, а хеш-таблицы нет. Просто такое чувство, что СБ развивается полностью бессистемно, по воле ветра.
Просто курс сейчас взят на портирование разных математических пакетов. Та же секция \Math сейчас активно развивается. Хорошо, что хоть что-то в СБ развивается.