Как можно легко писать программы работающие в MT4 и в MT5 кроссплатформенный код , стимул изучать ООП - страница 3
Вы упускаете торговые возможности:
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Регистрация
Вход
Вы принимаете политику сайта и условия использования
Если у вас нет учетной записи, зарегистрируйтесь
Посмотрел я код англицкий, похоже, там в хеш-таблице простой перебор при поиске, у Соколова все быстрее
То, что предлагается вообще не вариант. Единственным выходом видится, имхо, писать стратегии на уровне кросплатформенного фреймворка, что-то вроде такого:
//+------------------------------------------------------------------+
//| Работа с отложенными ордерами 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.
Такой фреймворк можно и продавать в качестве либы ))
на самом деле -- мне известен только один, кто готов биться "за" МТ5 и "против" МТ4 с любым трейдером и даже с любой преградой каждой клеточкой своего тела и сознания.
То, что предлагается вообще не вариант. Единственным выходом видится, имхо, писать стратегии на уровне кросплатформенного фреймворка, что-то вроде такого:
//+------------------------------------------------------------------+
//| Работа с отложенными ордерами 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
Там если внимательно прочитать, что предлагает автор - понимаешь, что как математик он хороший, но вот опыта в программировании не хватает. Имхо, то что предлагается там явно не вариант.
Такой фреймворк можно и продавать в качестве либы ))
Без вариантов. Для продажи такого нужно как минимум профессиональное комьюнити, которого у нас практически нет. Плюс необходима хорошая документация и поддержка.
Самый лучший вариант публиковать как OpenSource в виде статей, чем собственно я и занимаюсь.
Василий, а почему в MQL СБ нет хеш-таблицы, ваше мнение выскажете. Ведь инструмент из серии необходимых. Почему бы ваш вариант не вставить, я его уже рекомендовал 100500 раз.
СБ в части алгоритмов перестала развиваться еще в 2009-2010, тогда же, когда была опубликована. Объективно спрос на нее практически отсутствует. Лишь единицы научились более менее писать Trade.Buy(), вместо заполнения торгового запроса. Про стандартные алгоритмы, вроде динамических массивов CArray я вообще молчу. В общем не надо это никому, вот поэтому воз и ныне там.
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'ов которые в результате сделают код адски сложным.
Тут не согласен. Почему тогда вставляют всякие FuzzyLogic, которые реально нужны одному из 10000 разрабов, а хеш-таблицы нет. Просто такое чувство, что СБ развивается полностью бессистемно, по воле ветра.