Ставь лайки и следи за новостями
Поставь на него ссылку - пусть другие тоже оценят
Оцени его работу в терминале MetaTrader 5
- Просмотров:
- 5109
- Рейтинг:
- Опубликован:
- 2008.12.25 07:08
- Обновлен:
- 2016.11.22 07:33
-
Нужен робот или индикатор на основе этого кода? Закажите его на бирже фрилансеров Перейти на биржу
Время от времени у меня появляется идея о разработке какой-нибудь новой стратегии и проверке ее результатов в тестере стратегий. Раньше я копировал существующий советник, удалял все ненужное мне и добавлял новое, в итоге получался новый эксперт. Некоторое время назад я нашел для себя способ получше. Я разработал шаблон или схему для большинства моих будущих советников. Это произошло, когдя я размышлял об увеличении количества стратегий в одном советнике и переключении между ними в зависимости от периода (трендовый, неустойчивый,...). Мне была необходима схема, которая позволила бы мне объединить весь "действующий код" и весь "код стратегий". Таким образом я пришел к данной схеме, которой хочу поделиться с вами сегодня.
Основные структуры данного советника:
ActionCode - содержит код, не зависящий от стратегии, внедренной в советника
StrategyCode - целиком содержит код стратегии
Все, что часть ActionCode должна сделать, запрашивается частью StrategyCode, которая возвращает результат, который может быть еще раз исполнен универсальной частью ActionCode.
Часть ActionCode
int _STRATEGY_NUMBER = 1; #define _OPEN_LONG 1 #define _OPEN_SHORT 2 #define _CLOSE_LONG 3 #define _CLOSE_SHORT 4 #define _GET_LONG_STOPLOSS_PRICE 5 #define _GET_SHORT_STOPLOSS_PRICE 6 #define _GET_LONG_TAKEPROFIT_PRICE 7 #define _GET_SHORT_TAKEPROFIT_PRICE 8 #define _GET_LOTS 9 #define _GET_TRAILED_STOPLOSS_PRICE 10 #define _GET_TRAILED_TAKEPROFIT_PRICE 11 #define _GET_TRADED_TIMEFRAME 12 #define _OPEN_PENDING_BUY_STOP 13 #define _OPEN_PENDING_SELL_STOP 14 #define _OPEN_PENDING_BUY_LIMIT 15 #define _OPEN_PENDING_SELL_LIMIT 16 #define _GET_PENDING_BUY_STOP_PRICE 17 #define _GET_PENDING_SELL_STOP_PRICE 18 #define _GET_PENDING_ORDER_EXPIRATION 19 int start() { double Stoploss = 0; double TakeProfit = 0; if(LastBarTraded()) return(0); if(OrdersTotal() > 0) { Stoploss = Strategy(_STRATEGY_NUMBER, _GET_TRAILED_STOPLOSS_PRICE); TakeProfit = Strategy(_STRATEGY_NUMBER, _GET_TRAILED_TAKEPROFIT_PRICE); if(Stoploss != 0 || TakeProfit != 0) ModifyAllPositions(_MAGICNUMBER, Stoploss, TakeProfit); if(Strategy(_STRATEGY_NUMBER, _CLOSE_LONG) == 1) CloseAllLongPositions(_MAGICNUMBER); if(Strategy(_STRATEGY_NUMBER, _CLOSE_SHORT) == 1) CloseAllShortPositions(_MAGICNUMBER); } if(!TradeAllowed(1)) return(0); if(Strategy(_STRATEGY_NUMBER, _OPEN_LONG) == 1) OpenPosition(false, Strategy(_STRATEGY_NUMBER, _GET_LOTS), Strategy(_STRATEGY_NUMBER, _GET_LONG_STOPLOSS_PRICE), Strategy(_STRATEGY_NUMBER, _GET_LONG_TAKEPROFIT_PRICE), 3, _MAGICNUMBER); if(Strategy(_STRATEGY_NUMBER, _OPEN_SHORT) == 1) OpenPosition(true, Strategy(_STRATEGY_NUMBER, _GET_LOTS), Strategy(_STRATEGY_NUMBER, _GET_SHORT_STOPLOSS_PRICE), Strategy(_STRATEGY_NUMBER, _GET_SHORT_TAKEPROFIT_PRICE), 3, _MAGICNUMBER); if(Strategy(_STRATEGY_NUMBER, _OPEN_PENDING_BUY_STOP) == 1) OpenPendingPosition(false, Strategy(_STRATEGY_NUMBER, _GET_LOTS), Strategy(_STRATEGY_NUMBER, _GET_PENDING_BUY_STOP_PRICE), Strategy(_STRATEGY_NUMBER, _GET_LONG_STOPLOSS_PRICE), Strategy(_STRATEGY_NUMBER, _GET_LONG_TAKEPROFIT_PRICE), 3, _MAGICNUMBER, Strategy(_STRATEGY_NUMBER, _GET_PENDING_ORDER_EXPIRATION)); if(Strategy(_STRATEGY_NUMBER, _OPEN_PENDING_SELL_STOP) == 1) OpenPendingPosition(true, Strategy(_STRATEGY_NUMBER, _GET_LOTS), Strategy(_STRATEGY_NUMBER, _GET_PENDING_SELL_STOP_PRICE), Strategy(_STRATEGY_NUMBER, _GET_SHORT_STOPLOSS_PRICE), Strategy(_STRATEGY_NUMBER, _GET_SHORT_TAKEPROFIT_PRICE), 3, _MAGICNUMBER, Strategy(_STRATEGY_NUMBER, _GET_PENDING_ORDER_EXPIRATION)); return(0); }
Часть StrategyCode
double Strategy(int STRATEGY, int COMMAND) { switch(STRATEGY) { // Небольшое описание стратегии case 1: { return(Strategy_001(COMMAND)); } // Небольшое описание стратегии case 2: { return(Strategy_002(COMMAND)); } //... // Небольшое описание стратегии case 99: { return(Strategy_099(COMMAND)); } } return(0); } double Strategy_001(int COMMAND) { string _SYMBOL = Symbol(); int _TIMEFRAME = getStrategyTimeframeByNumber(_STRATEGY_TIMEFRAME); double result = 0; int i; switch(COMMAND) { case _OPEN_LONG: { // break; // if(!OpenNewBar()) // break; if(Open long condition is true) result = 1; break; } case _OPEN_SHORT: { // break; // if(!OpenNewBar()) // break; if(Open short condition is true) result = 1; break; } case _CLOSE_LONG: { // break; if(Close long condition is true) result = 1; break; } case _CLOSE_SHORT: { // break; if(Close short condition is true) result = 1; break; } case _GET_LONG_STOPLOSS_PRICE: { // break; result = Long SL price break; } case _GET_SHORT_STOPLOSS_PRICE: { // break; result = Short SL price break; } case _OPEN_PENDING_BUY_STOP: { break; } case _OPEN_PENDING_SELL_STOP: { break; } case _GET_PENDING_BUY_STOP_PRICE: { break; } case _GET_PENDING_SELL_STOP_PRICE: { break; } case _GET_LONG_TAKEPROFIT_PRICE: { break; } case _GET_SHORT_TAKEPROFIT_PRICE: { break; } case _GET_TRAILED_STOPLOSS_PRICE: { break; } case _GET_TRAILED_TAKEPROFIT_PRICE: { break; } case _GET_LOTS: { result = Lot amount; break; } case _GET_TRADED_TIMEFRAME: { result = _TIMEFRAME; break; } case _GET_PENDING_ORDER_EXPIRATION: { break; } } return(result); }
Как видите, внедрить новую стратегию в данной схеме очень просто. Просто добавьте новую функцию CASE in Strategy() и новую функцию Strategy_NNN() с правилами стратегии.
Данная схема не подходит для всех стратегий, можно использовать только те, которые открывают только одну позицию в момент времени и имеют стандартный "поток операций".
В качестве примера я прикрепил готовый код с несколькими встроенными сливающими стратегиями (см. прикрепленный код).
Я надеюсь, многие из вас будут вдохновлены и, возможно, к вам придут какие-то новые идеи по улучшению этой концепции.
Перевод с английского произведен MetaQuotes Ltd.
Оригинальная публикация: https://www.mql5.com/en/code/8625

Индикатор ставит стрелки при пересечении ма и пересечении rsi уровня 50.

To jest tabela sygnałów którą stworzyłem w oparciu o popularne wskaźniki rynkowe... myślę, że każdemu może się przydać.

Новая версия известного и простого индикатора созданного Джоном ДиНаполи. Он отличается от других индикаторов подобного типа тем, что умеет просчитывать и отображать уровни перекупленности и перепроданности.

Эксперт использует определенный рисунок свеч и стохастик.