Советники: Мультивалютный советник на основе кластерного индикатора (третья версия) - страница 4

 
genro:

Пытаюсь понять логику работы советника, давайте вместе…,

вот цитаты автора, а в скобках мои пояснения:

 


Принцип работы советника понят правильно... За малым исключением. "( т.е если  CFP пары EURUSD > 0, то открываемся в БАЙ парой EURUSD, и соответственно если CFP пары USDCHF > 0, то открываемся в БАЙ парой USDCHF )". Нет. сравнения с нулем нет. Идет проверка направления. если сигнал на бай - то CFP должен смотреть вверх. Если это так - открываемся.



"Не проще ли тогда просто по CСFр ловить пересечение USD с другими валютами и выявлять сразу  пару, завязанную на USD". Нет, не проще. Насколько всем известно кросс-курсы это синтетические пары. Т.е. фактически они торгуются именно через доллар. Поэтому курс кросс-пары напрямую зависит от движения основных инструментов. И ловить на CCFp движение только бакса - это значило бы пропустить львиную долю потенциально удачных входов. Что собственно и доказывается практикой и наблюдениями. При пересечении самого бакса с другими валютами - естественно тоже будет открываться позиция. Но и кроссы пропускать - нет желания...  Собственно имено из за кроссов и была заварена вся эта каша. Работать только по баксу - это будет уже совсем другой советник и другая песня.


Вобщем то переделать его под работу предложенную вами - дело 5 минут... Просто закоментить кроссы в строках которые раскладывают кроссы на баксопары.
 
evbut:

В предыдущих версиях ордер отрылся по пересечению на паре CC и CCFp, а закрывался в случае ложного входа по обратному пересчению на этой паре. С открытием в этой версии более или менее понятно. Хотелось бы уточнить по какому принципу в этой версии советника закрываются ордера по параметру close? Закрытие будет по пересечению на той паре, по которой открылся ордер, или же по тому кроссу от которого пришел сигнал на открытие? Или по изменениям показаний CFP?



Здесь идет закрытие тоже по противосигналу. 


Т.е. попытаюсь пояснить подоходчивее. На CCFp идет пересечение например по той же EURCHF на покупку. Раскладываем. получаем EURUSD бай и USDCHF бай.


Предположим по CFP - по EURUSD увидели что линия идет вверх. Сигнал подтвержден - можем открываться. Смотрим на уже открытые ордера. И обнаруживаем там одну а может несколько EURUSD в селл (ранее открытые по другим кроссам с еврой... например по EURAUD или EURGPB... неважно). - закрываем их все одним махом. Т.е. если подтвержденный сигнал по какой то баксовой паре - противоречит уже открытым позам по этой же паре - эти позы закрываются.



Вроде понятно объяснил на этот раз:)

 

PS. Функция close - чисто по наблюдениям - неоднократно вытаскивала из серьезных лосей... т.е. если пара болтается очень узко или "пилит" готовясь к серьезному движению - можно несколько раз наоткрываться на ложных сигналах на дребезге.


Пошло движение - словили сигнал и дребезжащие позы которые болтались в районе нуля по профиту, или уже шли в лось но далеко еще не ушли - закрываются и поза пошла в профит в обратную сторону.


Неоднократно наблюдал такое..


Однако, как уже говорил - это дело вкуса. Можно отключить и пробовать подобрать правильные стоп/профиты или трал. Возможно результат будет лучше.

 

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

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


По выложенному стейту отчетливо видно, что есть периоды очень удачные - кривая баланса четко идет вверх, есть периоды болтания туда-сюда...

Хороший ММ здесь был бы явно в тему...


Может у кого то есть какие мысли на эту тему?

 
lexandros:

Вроде понятно объяснил на этот раз:)



Да терь вроде понятно

 
lexandros:

Хороший ММ здесь был бы явно в тему...


Может у кого то есть какие мысли на эту тему?


Может подойдет такой ММ - получили/проиграли n-% от депозита в течение месяца - советник не работает ... огрызок кода из одного советника


int start()
{
   bool AllowTrades = true;
   
   if(EnableMonthlyProfit)       //если модуль контроля месячной прибыли включён
      if(MonthlyProfit() == 0)      //если торги запрещены модулем контроля месячной прибыли
         AllowTrades = false;                    //не торговать
 
   if(AllowTrades == true)
//.....//
int MonthlyProfit()
{
   int ret = 1;
   
   SemaphoreTake("Semaphore_sound_2_MP");
   
      if(GlobalVariableCheck("gAllowed") == false)          //если переменных не было
      {
         GlobalVariableSet("gAllowed", 1);
         GlobalVariableSet("gMonth", Month());
         GlobalVariableSet("gStartingEquity", AccountEquity());
      }
   
      double _Allowed, _Month, _StartingEquity;
      _Month            = GlobalVariableGet("gMonth");
   
      if(RestartProfitCount == true || Month() != _Month)   //если надо начать отсчёт заново или начался новый месяц
      {
         GlobalVariableSet("gAllowed", 1);
         GlobalVariableSet("gMonth", Month());
         GlobalVariableSet("gStartingEquity", AccountEquity());
         RestartProfitCount = false;
      }
      _Month            = GlobalVariableGet("gMonth");
      _Allowed          = GlobalVariableGet("gAllowed");
      _StartingEquity   = GlobalVariableGet("gStartingEquity");
   
      if(_Allowed < 0.0)   ret = 0;
   
   //-------------------------------------------------------
      else
      {
         double EquityNow = AccountEquity();
   
         CommentArray[2] = "Month Starting Equity: " + DoubleToStr(_StartingEquity, 2);
         CommentArray[3] = "Current Equity:           " + DoubleToStr(EquityNow, 2);
   
         if( NormalizeDouble(EquityNow, 2) < NormalizeDouble((MinEquity/100.0)*_StartingEquity,2) )
         {
            Alert("Current Equity Is < ", MinEquity, "% * Starting Equity Of This Month.\nTrades Stopped.");
            CloseAllOrders();
            GlobalVariableSet("gAllowed", -1);                 //торги в этом месяце запрещены
            CommentArray[4] = "Trades Stopped At: " + TimeToStr(TimeCurrent()) + "\n" +
                              "Reason: " + DoubleToStr(EquityNow, 2) + " < " + DoubleToStr(MinEquity/100.0, 2) + "*" + DoubleToStr(_StartingEquity, 2) + "\n" +
                              "Trades Will Recommence At The Beggining Of Next Month";
            ret = 0;
         }
      
         if( NormalizeDouble(EquityNow, 2) > NormalizeDouble((MaxEquity/100.0)*_StartingEquity,2) )
         {
            Alert("Current Equity Is > ", MaxEquity, "% * Starting Equity Of This Month.\nTrades Stopped.");
            CloseAllOrders();
            GlobalVariableSet("gAllowed", -1);                 //торги в этом месяце запрещены
            CommentArray[4] = "Trades Stopped At: " + TimeToStr(TimeCurrent()) + "\n" +
                              "Reason: " + DoubleToStr(EquityNow, 2) + " > " + DoubleToStr(MaxEquity/100.0, 2) + "*" + DoubleToStr(_StartingEquity, 2) + "\n" +
                              "Trades Will Recommence At The Beggining Of Next Month";
            ret = 0;
         }
   
         if(ret!=0)
         {
            CommentArray[4] = "Min Equity:  " + DoubleToStr(MinEquity/100.0, 2) + "*" + DoubleToStr(_StartingEquity, 2) + " = " + DoubleToStr((MinEquity/100.0)*_StartingEquity,2) + "\n" +
                              "Max Equity: " + DoubleToStr(MaxEquity/100.0, 2) + "*" + DoubleToStr(_StartingEquity, 2) + " = " + DoubleToStr((MaxEquity/100.0)*_StartingEquity,2) + "\n" +
                              "Equity OK:  "  + DoubleToStr((MinEquity/100.0)*_StartingEquity,2) + " < " + DoubleToStr(EquityNow, 2) + " < " + DoubleToStr((MaxEquity/100.0)*_StartingEquity,2);
         }                     
      }
      
   SemaphoreReturn("Semaphore_sound_2_MP"); 
   return(ret);

и лучше без мартинов обойтись... ну их нах.. )

 
evbut:
lexandros:

Хороший ММ здесь был бы явно в тему...


Может у кого то есть какие мысли на эту тему?


Может подойдет такой ММ - получили/проиграли n-% от депозита в течение месяца - советник не работает ... огрызок кода из одного советника




Не совсем понимаю целесообразность такого подхода. Проиграли % - отключили советник (возможно пропустили как раз удачный переод). Включили еще проиграли и опять отключили... Где логика? Может я что то не так понял...


Что касается кода... гм... я бы так не наварочал ни в коем случае... вычисления элементарные. Зачем тут приплетены глобальные переменные непонятно...


Уж в крайнем случае - если надо хранить переменные лучше их скидывать в файл... чем засирать общую память машины и плодить потенциальные ошибки с доступом.



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

 

я пока тест виду с отключенным ММ, поэтому на данный момент для меня не актуально. На перспективу - держу этот вопрос в голове.


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

 

Можно реализовать функцию вкл/откл частичного закрытия ордеров при включенном трале, а так получается при хорошем движении иногда теряется до 50% прибыли.

 
Картинка стейта моей модификации советника, в котором вместо CCFP использую СС.
С 17.03 по 24.03

Во время теста полетел комп не было возможности вмешаться в процесс поэтому образовался провал.
А так если без провала - получается топтание на месте.
Да, еще маленькое замечание вместо встроенного трала использую другой - TrailingStopFrCn.mq4 брал где-то здесь
Щас уезжаю в командировку, но тест продолжу с теми же условиями. Надеюсь не будет больше форс-мажоров
Причина обращения: