Как можно легко писать программы работающие в MT4 и в MT5 кроссплатформенный код , стимул изучать ООП - страница 4
![MQL5 - Язык торговых стратегий для клиентского терминала MetaTrader 5](https://c.mql5.com/i/registerlandings/logo-2.png)
Вы упускаете торговые возможности:
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Регистрация
Вход
Вы принимаете политику сайта и условия использования
Если у вас нет учетной записи, зарегистрируйтесь
Просто курс сейчас взят на портирование разных математических пакетов. Та же секция \Math сейчас активно развивается. Хорошо, что хоть что-то в СБ развивается.
Ну да, получается, как в ресторане. Приносят тебе кучу соусов, приправ разных. А потом спрашивают, - доставайте тарелку
- ???????
- А у нас все посетители приходят приходят со своей посудой
- да вы ***ели???????????
- ну, маленькое неудобство, зато смотрите, сколько разных редких соусов!
3) и главное -- МТ5 сейчас по функционалу полностью перекрывает МТ4 со многими плюсами
Форум по трейдингу, автоматическим торговым системам и тестированию торговых стратегий
Список изменений в билдах MetaTrader 5 Client Terminal
MetaQuotes Software Corp., 2017.01.26 13:30
Новая версия платформы MetaTrader 5 build 1525: Представление истории в виде позиций и улучшение тестера
Вот этого ну очень не хватало, чтобы говорить о полноценном перекрытии
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'ов которые в результате сделают код адски сложным.
А я не вижу в чем проблемы ? Хендл хранится одинаково среди членов класса.
У меня весь код уже давно переносим.
Правда, я думал, что развиваться МТ будет в сторону неттинга, соответственно, интерфейс позиций и торговых действий у меня был неттинг-ориентированный. В данный момент - переписываю код на хедж-ориентированный. После написания переносимых классов - не будет вобще никакой разницы, где писать советник. При необходимости вызова тех или иных инструментов - объявляются соответствующие переносимые объекты, и модуль компилируется в нужной среде - хоть в МТ4, хоть в МТ5-неттинге, хоть в МТ5-хедже.
{
bool res=true;
int ticket;
string action="";
string fmt ="";
//--- action
switch(request.action)
{
case TRADE_ACTION_DEAL:
ticket=OrderSend(request.symbol,request.type,request.volume,request.price,(int)request.deviation,request.sl,request.tp,request.comment,(int)request.magic);
// res=OrderClose((int)request.order,request.volume,request.price,(int)request.deviation);
result.deal = ticket;
result.order =ticket;
result.price = request.price;
break;
case TRADE_ACTION_PENDING:
ticket=OrderSend(request.symbol,request.type,request.volume,request.price,(int)request.deviation,request.sl,request.tp,request.comment,(int)request.magic,request.expiration);
result.deal = ticket;
result.order =ticket;
result.price = request.price;
break;
case TRADE_ACTION_SLTP:
res=OrderModify((int)request.order,request.price,request.sl,request.tp,request.expiration);
break;
case TRADE_ACTION_MODIFY:
res=OrderModify((int)request.order,request.price,request.sl,request.tp,request.expiration);
break;
case TRADE_ACTION_REMOVE:
res = OrderDelete((int)request.order);
break;
default:
break;
}
//--- check
if(res)
{
if(m_log_level>LOG_LEVEL_ERRORS)
printf(__FUNCTION__+": %s [%s]",FormatRequest(action,request),FormatRequestResult(fmt,request,result));
}
else
{
if(m_log_level>LOG_LEVEL_NO)
printf(__FUNCTION__+": %s [%s]",FormatRequest(action,request),FormatRequestResult(fmt,request,result));
}
//--- return the result
return(res);
}
Модернизация класса <Trade\Trade.mqh>
<терминал>\MQL4\Include\Trade
после чего заработал механизм
trade.Result(result);
ticket=result.deal;