1_Советник на несколько стратегий МТ4

 

Добрый день!

Начал изучать язык программирования  MQL для МТ4 восемь дней назад  и уже написал весьма прибыльный советник, и я решил пойди дальше.

Возможно ли в 1 советник поставить несколько стратегий ? даже если у них похожие стратегий?.

Я сейчас покажу примерно как я себе это представляю, а Вы подскажите пожалуйста правильно ли моя логика и каковы последствия "подводные камни" ?

Также я понимаю что в большинства случаях придется делать дубликат функций для каждой стратегий.  

Код не выкладывается (ошибка ПК или сайта не знаю), вылаживаю скриншот.

 

 

 

 
Я могу конечно проверить через Принт можно ли, но в случае успеха хотелось бы узнать о последствиях.
 
Можно, но в этом маловато смысла, если честно. Проще написать два отдельных советника и поставить их на один символ с разными маджиками. Если, конечно, логика одного не зависит от логики другого. В таком случе это имеет смысл.
С дубликатами тоже всё не обязательно. Если хочешь кодить "по-взрослому", можешь использовать свои классы для каждой из стратейгий. Будет у тебя что-то вроде "Стратегия1.ОтправитьОрдер" и "Стратегия2.ОтправитьОрдер". Разные имена объектов и значения переменных, проще контролировать.
Можно, конечно, и копи-пастом заняться, но тут главное не запутаться в переменных.
 
Leanid Aladzyeu:

Добрый день!

Начал изучать язык программирования  MQL для МТ4 восемь дней назад  и уже написал весьма прибыльный советник, и я решил пойди дальше.

Возможно ли в 1 советник поставить несколько стратегий ? даже если у них похожие стратегий?.

Я сейчас покажу примерно как я себе это представляю, а Вы подскажите пожалуйста правильно ли моя логика и каковы последствия "подводные камни" ?

Также я понимаю что в большинства случаях придется делать дубликат функций для каждой стратегий.  

Код не выкладывается (ошибка ПК или сайта не знаю), вылаживаю скриншот.

 

 

 

Логика в общем правильная, но если мартин своё не отработал и вы переключитесь на скальп последствия будут не предсказуемые. А так же две стратегии не будут работать одновременно. Лучше сделать отдельными "If`ами" Пока не поставите True в блок другой стратегии не зайдет.
 
Leanid Aladzyeu:

Добрый день!

Начал изучать язык программирования  MQL для МТ4 восемь дней назад  и уже написал весьма прибыльный советник, и я решил пойди дальше.

Возможно ли в 1 советник поставить несколько стратегий ? даже если у них похожие стратегий?.

Я сейчас покажу примерно как я себе это представляю, а Вы подскажите пожалуйста правильно ли моя логика и каковы последствия "подводные камни" ?

Также я понимаю что в большинства случаях придется делать дубликат функций для каждой стратегий.  

Код не выкладывается (ошибка ПК или сайта не знаю), вылаживаю скриншот.

 

 

 

Вы же в курсе, что код с параметрами, указанными на скриншоте, будет отрабатывать ВСЕГДА только первую стратегию?
 

По поводу "только обработки 1 строки" , это из за "else"?       и по поводу  "если мартин своё не отработал и вы переключитесь на скальп последствия будут не предсказуемые" не совсем ясно, 

у них же разные магики как скальп может принять ордера мартина?

и по поводу стратегий, это было так для примера. на самом деле пока задумано  2 режима.( главный принцип сетка)

1) обычный, на 1 ордер в рынке " по тренду".

2) двух сторонняя сетка .

 
Leanid Aladzyeu:

По поводу "только обработки 1 строки" , это из за "else"?       и по поводу  "если мартин своё не отработал и вы переключитесь на скальп последствия будут не предсказуемые" не совсем ясно, 

у них же разные магики как скальп может принять ордера мартина?

и по поводу стратегий, это было так для примера. на самом деле пока задумано  2 режима.( главный принцип сетка)

1) обычный, на 1 ордер в рынке " по тренду".

2) двух сторонняя сетка .

Да, из-за else. Это исключающее условие: Если подходит вариант один - использовать его, иначе если подходит вариант два - использовать его.
Если убрать else будет: Если подходит вариант один - использовать его. Если подходит вариант два - использовать его.
Чтобы совы работали с разными  маджиками надо будет делать проверку на соответствие вродe

for(int i=0,i<OrdersTotal(),i++){
   if(!OrderSelect(i,SELECT_BY_POS)) continue;
   if(OrderMagicNumber()!=YOUR_MAGIC_NUMBER) continue;
   
   //Тут расположена главная логика обработки ордеров
}
 
Ivan Vorontsov:
Да, из-за else. Это исключающее условие: Если подходит вариант один - использовать его, иначе если подходит вариант два - использовать его.
Если убрать else будет: Если подходит вариант один - использовать его. Если подходит вариант два - использовать его.
Чтобы совы работали с разными  маджиками надо будет делать проверку на соответствие вродe

А как быть с Ретурнами? может убрать их? тик зайдет в 1 стратегию выполнит ее и пойдет в Ретурт так и не дойдя до 2 стратегий (это в случаях когда условия совпадают, а они будут совпадать каждую 5-9 сделку)

 

С магиками я думаю так, делать копию всех функции и там вместо магика переменной общей указывать магик той или иной стратегий. Если кто знает вариант по проще буду благодарен

 
Leanid Aladzyeu:

А как быть с Ретурнами? может убрать их? тик зайдет в 1 стратегию выполнит ее и пойдет в Ретурт так и не дойдя до 2 стратегий (это в случаях когда условия совпадают, а они будут совпадать каждую 5-9 сделку)

 

С магиками я думаю так, делать копию всех функции и там вместо магика переменной общей указывать магик той или иной стратегий. Если кто знает вариант по проще буду благодарен

Да, return означает возврат результата работы текущей функции. Чтобы избежать этого перенести return после блоков if() или выдели логику работы каждого сова в отдельную функцию. К примеру

int start(){
  if(Startegy1Enabled) StrategyOne();
  if(Startegy2Enabled) StrategyTwo();
}

void StrategyOne(){
  //Основной код стратегии 1
  return; //По желанию
}

void StrategyTwo(){
  //Основной код стратегии
  return;
}

В таком случае происходит return из вызываемой функции, а сама функция start не завершается. Но тут очень важен порядок вызова функции. Т.к. наш код работает только в 1 поток и работает синхронно, мы будем ждать пока не завершится работа стратегии1, а только потом будет вызывана стратегия2.

Вот тебе хороший вариант, более универсальный

#define STRATEGY1MAGIC 123
#define STRATEGY2MAGIC 456

void CommonFunction(int magic){

}

Есть в программировании принцип DRY, расшифровывается как (do not repeat yourself). А значит это что копировать функции по 10 раз - плохая идея. Да и смысл в функции теряется.

 
Ivan Vorontsov:

Да, return означает возврат результата работы текущей функции. Чтобы избежать этого перенести return после блоков if() или выдели логику работы каждого сова в отдельную функцию. К примеру

В таком случае происходит return из вызываемой функции, а сама функция start не завершается. Но тут очень важен порядок вызова функции. Т.к. наш код работает только в 1 поток и работает синхронно, мы будем ждать пока не завершится работа стратегии1, а только потом будет вызывана стратегия2.

Вот тебе хороший вариант, более универсальный

Есть в программировании принцип DRY, расшифровывается как (do not repeat yourself). А значит это что копировать функции по 10 раз - плохая идея. Да и смысл в функции теряется.

Спс но мне привычнее в старом коде писать. так норм ? Коды не пишутся мать их за ногу

скрин

 

 
Leanid Aladzyeu:

Спс но мне привычнее в старом коде писать. так норм ? Коды не пишутся мать их за ногу

скрин

 

Так норм, стратегии будут корректно и независимо работать.
Причина обращения: