Структура рулит. Учимся структурировать программы, изучаем возможности, ошибки, решения и т.п. - страница 16

 
Как и следовало ожидать, у каждого своя структура и понимание, как должно быть. ))
 
tol64:
Как и следовало ожидать, у каждого своя структура и понимание, как должно быть. ))
Именно, поэтому предлагаю забить на этот спор, т.к. все равно ни к какому консенсусу не придем. Предлагаю снова перейти к обсуждению общих принципов программирования больших проектов.
 
C-4:
Нет, нет и еще раз нет!!!!!!!!!!!!!!!! По этой логике простой переворот стратегии на скользящей средней - это тоже MM. А что, был +1 контракт, а стал -1.

:)

Коллега попытался вам объяснить как можно с удобством структурировать советник.  (Названия модулей конечно же условны.)  Вместо того чтоб играться с терминологией (которая неважна) попробуйте заценить такой структурное разделение.  Оно вполне удобно и продуктивно.

Картинко.  Стрелки показывают движение информации:


 
C-4:
Именно, поэтому предлагаю забить на этот спор, т.к. все равно ни к какому консенсусу не придем. Предлагаю снова перейти к обсуждению общих принципов программирования больших проектов.
Таки вроде и обсуждается как раз один из таких принципов.  Применительно к трейдинговым проектам (к базовой логике их построения).
 
MetaDriver:

...

Картинко. Стрелки показывают движение информации:

Вот так намного понятнее мысли рассматривать. Всё понятно даже без слов. А то эти бесконечные бла-бла-бла очень трудно усваиваться иногда. )) А после схемы можно уже и уточняющие вопросы задавать. У меня пока их нет. ))

 
MetaDriver:

:)

Коллега попытался вам объяснить как можно с удобством структурировать советник.  (Названия модулей конечно же условны.)  Вместо того чтоб играться с терминологией (которая неважна) попробуйте заценить такой структурное разделение.  Оно вполне удобно и продуктивно.

Картинко.  Стрелки показывают движение информации:

Ага, вижу. Только сложность никуда не далась, а делегировалась корректору рекомендаций и драйверу рынка. По этой схеме корректор должен копать историю торговли ТС и понимать за нее, в каком же состоянии она на самом деле. Драйвер же рынка по-прежнему должен правильно определить текущую позицию стратегии и скорректировать ее, а в неттинге, это ой как не просто.
Документация по MQL5: Стандартные константы, перечисления и структуры / Константы графиков / Позиционирование графика
Документация по MQL5: Стандартные константы, перечисления и структуры / Константы графиков / Позиционирование графика
  • www.mql5.com
Стандартные константы, перечисления и структуры / Константы графиков / Позиционирование графика - Документация по MQL5
 
tol64:

Вот так намного понятнее мысли рассматривать. Всё понятно даже без слов. А то эти бесконечные бла-бла-бла очень трудно усваиваться иногда. )) А после схемы можно уже и уточняющие вопросы задавать. У меня пока их нет. ))

Вот вам и ответ нужно ли рисовать картинкО для понимания задачи :)

MetaDriver:

:)

Коллега попытался вам объяснить как можно с удобством структурировать советник.  (Названия модулей конечно же условны.)  Вместо того чтоб играться с терминологией (которая неважна) попробуйте заценить такой структурное разделение.  Оно вполне удобно и продуктивно.

Картинко.  Стрелки показывают движение информации:


А хде там трал? так понимаю что в блоке ММ? ведь для него нужен прогнозатор направления

или всё же в драйвере рынка? ведь для трала нужна текущая поза.

Я бы ввёл ещё прогнозатор волатильности и пиханул ещё один блочёк корректор защитных стопов, именно защитных тк (имхо) выход по ТП или СЛ для нормальной ТС это форсмажор.

 
Urain:

Вот вам и ответ нужно ли рисовать картинкО для понимания задачи :)

А хде там трал? так понимаю что в блоке ММ? ведь для него нужен прогнозатор направления

или всё же в драйвере рынка? ведь для трала нужна текущая поза.

Я бы ввёл ещё прогнозатор волатильности и пиханул ещё один блочёк корректор защитных стопов, именно защитных тк (имхо) выход по ТП или СЛ для нормальной ТС это форсмажор.

А потом еще и еще несколько блоков и понесется стратегия по кочкам... Если в самом начале возникают совершенно обоснованные вопросы в каком блоке описать одну часть стратегии, а какую в другом, то значит схема не однозначна, а это ведет известно к каким проблемам.
 

Раз уж начали рисовать схемы, вот вам моя улучшенная схемка. Надеюсь она будет понятней предыдущей:

 

ПРЕИМУЩЕСТВА 

  • Модулей всего два.
  • Связи четко определены и однозначны
  • Торговой стратегией может быть любой класс, описывающий 4 метода
  • Описание всех правил всегда хранится в одном месте: классе торговой стратегии. Не надо бегать по всему проекту в поисках какого-нибудь "модуля волатильности"
  • Количество состояний стратегии является константой. Ни при каких правилах ТС, оно не может быть больше. Ни каких дополнительных модулей быть не может и они просто не нужны
  • Все общие сущности могут и должны быть описаны в базовом классе управления*.

 *Так универсальное для всех стратегий правило "выход в конце торговой сессии" может быть описано в базовом классе. И если это правило установлено, то вместо того что бы в очередной раз вызвать метод сопровождения открытой позиции, описанной в классе стратегии, базовый класс вызовет метод сопровождения закрытие позиции в конце дня. И позиция принудительно закроется в нужное время, даже если базовая стратегия в своих правилах это не подразумевает.
 
C-4:

Ага, вижу. Только сложность никуда не далась, а делегировалась корректору рекомендаций и драйверу рынка.

Это нормально.  Цель была не в устранении объективных сложностей, а несоздавании новых.


По этой схеме корректор должен копать историю торговли ТС и понимать за нее, в каком же состоянии она на самом деле.

Мы же вроде выяснили уже что у ТС нет никакого состояния (памяти).  Корректор тоже не обязан копать историю. Его вообще специально по вашей же просьбе  воткнули в схему - я и без него прекрасно обхожусь.. ))


Драйвер же рынка по-прежнему должен правильно определить текущую позицию стратегии и скорректировать ее, а в неттинге, это ой как не просто.

:)

Мне надо на слово верить?

double CMarketDriver::GetCurrentPos(string Sym)
  {
   if(!PosInfo.Select(Sym)) return 0; // DBL_MIN;
   double v=PosInfo.Volume();
   return(PosInfo.PositionType()==POSITION_TYPE_SELL) ? -v : v;
  }
bool CMarketDriver::Synhronize(const SymbolPos  &sp,int  &Err)
  {
   Err=0;
   bool res=true;
     {
      SymInfo.Name(sp.Sym);
      SymInfo.Refresh();
      double fp= TranslateLots(sp.Pos);  // Приводит рекомендованную в процентах от депо позу к рыночным лотам для данного инструмента
      double cp=GetCurrentPos(sp.Sym);
      double pos=fp-cp;   // вычисляет разницу текущей и рекомендованной позы
      if(pos>0.000001)
         res=Trade.Buy(NolrmalizeLots(pos),sp.Sym);  // "обналичивает разницу"
      if(pos<-0.000001)
         res=Trade.Sell(NolrmalizeLots(pos),sp.Sym);  // "обналичивает разницу"   
     }
   return res;
  }
Причина обращения: