Переделал немного код, чтобы возможно было за один раз передать более одного сигнала, например закрыть короткую позицию и открыть длинную.
Чтобы сигналы можно было комбинировать, определил их так:
#define SIG_NO 0 #define SIG_BUY 1 #define SIG_SELL 2 #define SIG_BUYLIMIT 4 #define SIG_SELLLIMIT 8 #define SIG_BUYSTOP 16 #define SIG_SELLSTOP 32 #define SIG_BUYCLOSE 64 #define SIG_SELLCLOSE 128
И чтобы открыть длинную и закрыть короткую позиции, код должен выглядеть так:
int res = SIG_NO; if (...) res = res | SIG_BUY; if (...) res = res | SIG_SELLCLOSE;Функция GetSignal из советника-примера теперь выглядит так:
int GetSignal() { int res = SIG_NO; // your code double prevValue = iStochastic(Symbol(),NULL,Kperiod,Dperiod,slowPeriod,MODE_SMA,0,MODE_SIGNAL,2); double currValue = iStochastic(Symbol(),NULL,Kperiod,Dperiod,slowPeriod,MODE_SMA,0,MODE_SIGNAL,1); if (currValue>DownLevel && prevValue<DownLevel) res = res | OP_BUY; if (currValue<UpLevel && prevValue>UpLevel) res = res | OP_SELL; //---- return (res); }
Дальнейшая модификация.
Добавил сигналов для полноты
#define SIG_NO 0 #define SIG_BUY 1 #define SIG_SELL 2 #define SIG_BUYLIMIT 4 #define SIG_SELLLIMIT 8 #define SIG_BUYSTOP 16 #define SIG_SELLSTOP 32 #define SIG_BUYCLOSE 64 #define SIG_SELLCLOSE 128 #define SIG_BUYLIMITCLOSE 256 #define SIG_SELLLIMITCLOSE 512 #define SIG_BUYSTOPCLOSE 1024 #define SIG_SELLSTOPCLOSE 2048Добавил функций под каждый сигна
void OrderBuy() { trSignal = trSignal | SIG_BUY; } void OrderSell() { trSignal = trSignal | SIG_SELL; } void OrderBuyLimit() { trSignal = trSignal | SIG_BUYLIMIT; } void OrderSellLimit() { trSignal = trSignal | SIG_SELLLIMIT; } void OrderBuyStop() { trSignal = trSignal | SIG_BUYSTOP; } void OrderSellStop() { trSignal = trSignal | SIG_SELLSTOP; } void OrderBuyClose() { trSignal = trSignal | SIG_BUYCLOSE; } void OrderSellClose() { trSignal = trSignal | SIG_SELLCLOSE; } void OrderBuyLimitClose() { trSignal = trSignal | SIG_BUYLIMITCLOSE; } void OrderSellLimitClose() { trSignal = trSignal | SIG_SELLLIMITCLOSE; } void OrderBuyStopClose() { trSignal = trSignal | SIG_BUYSTOPCLOSE; } void OrderSellStopClose() { trSignal = trSignal | SIG_SELLSTOPCLOSE; }Советник, который использует модуль "Common" выглядит так
//---- input parameters extern int Kperiod=5; extern int Dperiod=3; extern int slowPeriod=3; extern int UpLevel=90; extern int DownLevel=10; //-- Подключаемые модули -- #include "Common.mq4" //+----------------------------------------------------------------------------+ //| Формирует торговые сигналы. | //+----------------------------------------------------------------------------+ void GetSignal() { // your code double prevValue = iStochastic(Symbol(),NULL,Kperiod,Dperiod,slowPeriod,MODE_SMA,0,MODE_SIGNAL,2); double currValue = iStochastic(Symbol(),NULL,Kperiod,Dperiod,slowPeriod,MODE_SMA,0,MODE_SIGNAL,1); if (currValue>DownLevel && prevValue<DownLevel) OrderBuy(); if (currValue<UpLevel && prevValue>UpLevel) OrderSell(); //---- } //+------------------------------------------------------------------+ //| expert start function | //+------------------------------------------------------------------+ int start() { if (AllowSignal()) { GetSignal(); Start(); } //---- return(0); } //+------------------------------------------------------------------+ //| expert initialization function | //+------------------------------------------------------------------+ int init() { int res = Init(); //---- //your code //---- return(res); } //+------------------------------------------------------------------+ //| expert deinitialization function | //+------------------------------------------------------------------+ int deinit() { int res = Deinit(); //---- //your code //---- return(res); }Минимум кода требуется для написания советника, практически все общие функции находятся в модуле "Common".
А вы не могли бы какой нибудь советник записать сюда для примера, и оригинал тоже выложить из чего что получилось и как это делается?
В качестве учебного пособия для первоклашек...
А вы не могли бы какой нибудь советник записать сюда для примера, и оригинал тоже выложить из чего что получилось и как это делается?
В качестве учебного пособия для первоклашек...
Последняя вставка кода (со стохастиком) и есть пример советника. Разве нет?
Вместо стохастика попробуйте какой другой индикатор прописать.
т.е. нужно только условия входа выхода в модуле менять, а модуль Common.mq4", вообще не нужно менять?
Да.
Но есть варианты, например как исполняют покупку/продажу брокеры. Может что-то и нужно поменять под конкретного брокера.
Или если ошибки попали в код общего модуля. Проверяйте на деле.
Конкретно сейчас недоделана работа с отложками, их пока нельзя применять.
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Вы принимаете политику сайта и условия использования
Есть статья от Rosh "MetaEditor: Опираясь на силу шаблонов" по линку https://www.mql5.com/ru/articles/1514
Я взял оттуда советник-пример "Osc_test.mq4" и разбил его на два модуля. Один модуль назвал "Common.mq4", где будут находится все общие функции, которые достаточно написать один раз и возможно иногда лишь править при необходимости. Во второй модуль я перенёс тот код, который связан с применением индикаторов, и который каждый раз будет разным.
Приведу этот код:
Как видите, достаточно всего лишь заполнить функцию "GetSignal" да задать входные параметры сверху.
В модуле "Common" определил добавочно к OP_BALANCE две константы OP_BUYCLOSE и OP_SELLCLOSE.
Желающие могут проверить приведённые модули в деле. Если имеются ошибки, то и поправить код.