Любой вопрос новичка, чтоб не захламлять форум. Профи, не проходите мимо. Без вас никуда - 6. - страница 223

 
ALXIMIKS:


У меня было время - на задачу придумал алгоритм, описал ( кажись детально, ну может чуть не коректно для когото - люди ведь разные по доходимости)

сарказм? не знаю мыслей небыло, просто помочь.

код писать кому-то? оптимизировать еще? (да могу, но стоит ли ето делать? )

(п.с. artmedia70, не в обиду, уважаю Ваше отношение и мнение в целом - честно, но на днях вы сами давали код с iCustom-ы мягко говоря не оч оптимизированый.)

что-то типа етого должно работать если вставить в проверку на новый бар.

более оптимальным будет код если сузить kilkict=iBars(sy,tf) после какого-то количества фракталов, чтобы постоянно не перебирать все бары.

Спасибо. По вашему алгоритму я начал писать. Но с флагами мне до вас как до Пекина раком. Еще раз спасибо.
 
gince:
Спасибо. По вашему алгоритму я начал писать. Но с флагами мне до вас как до Пекина раком. Еще раз спасибо.


https://www.mql5.com/ru/forum/131516/page34

Там внизу - ранний Артикул поделился опытом. Именно по этому вопросу.

 
tara:


https://www.mql5.com/ru/forum/131516/page34

Там внизу - ранний Артикул поделился опытом. Именно по этому вопросу.


СПС
 

в чем может быть ошибка ?

иногда при тестированни во время одного теста выдаёт ошибку деление на "О"

double LotsOptimized()
  {
   double lot=Lots;
   double Lot;
   if (isFloatLots == true)          // если флаг true то проводится оптимизация величины лота, иначе лот неизменен
     {  
        int orders=HistoryTotal();  // history orders total
        int losses=0; // number of losses orders without a break
        double loss=0;              
//---- select lot size
        double  lot_min         = MarketInfo( Symbol(), MODE_MINLOT  ); 
        double  lot_max         = MarketInfo( Symbol(), MODE_MAXLOT  ); 
        double  lot_step        = MarketInfo( Symbol(), MODE_LOTSTEP ); 
        double  lotcost         = MarketInfo( Symbol(), MODE_TICKVALUE );       
                
        lot                             = 0.0;
        double  dollarsPerPip   = 0.0;
        
        lot = AccountBalance()*MaxR/100.0;
        dollarsPerPip = lot/SL;
                
        lot = NormalizeDouble( dollarsPerPip/lotcost, 2 );      
        
        lot = NormalizeDouble( lot / lot_step, 0 ) * lot_step;
        
        if ( lot < lot_min ) lot = lot_min;
        if ( lot > lot_max ) lot = lot_max;
        
        if ( AccountFreeMarginCheck( Symbol(), type, lot ) < 10 || GetLastError() == 134 ) 
        { 
                Alert ( "Impossible to open position with lot = ", DoubleToStr( lot, 2 ), ". Not enough money." );
                return(-1);
        }
//---- return lot size
//         if(lot<0.1) lot=0.1;
           
//---- calcuulate number of losses orders without a break
           if(DcF>0)
          {  
        for(int i=orders-1;i>=0;i--)
                  {
                 if(OrderSelect(i,SELECT_BY_POS,MODE_HISTORY)==false) 
                   { 
                        Print("Ошибка в истории!"); 
                        break;
                   }
                if(OrderSymbol()!=Symbol() || OrderType()>OP_SELL) 
                  continue;
                 if(OrderProfit()>0)  break;
                if(OrderProfit()<0) losses++;loss=loss-OrderProfit();
                  }
        if(losses>=losses_orders) {Lot=NormalizeDouble(MathAbs(loss)/FV/MarketInfo(Symbol(),MODE_TICKVALUE)/TakeProfit1,1);
         }
       }
     }  
//---- return lot size
     if (Lot>lot) lot=Lot; 
   
  return(lot);
  }
 
Stells:

в чем может быть ошибка ?

иногда при тестированни во время одного теста выдаёт ошибку деление на "О"


берем поиск знака "/" и смотрим какие переменніе от пользователя берут участия в делении:

SL ;

FV ;

TakeProfit1 .

вот ктото из них бывает 0. Как вариант.

 
Stells:

в чем может быть ошибка ?

иногда при тестированни во время одного теста выдаёт ошибку деление на "О"

Делаем проверку типа:

if(!SL==0)
   {
  dollarsPerPip = lot/SL;
   }
И так далее .
 
ALXIMIKS:


Спасибо вам еще раз. Попробовал разобраться в вашем коде и понаписывал коментариев. Это делал для себя, чтоб понять и может когда нибуть и я что то похоже напишу. Учюсь выясняя логику чуьих работ. Потом пробую сам.

Может найдете время проверить мною написаны коменты и если надо подправить. И еще вопрос.

  if (Bufer0!=EMPTY_VALUE) 

Это имееться в виду, что буффер индикатора уже не пуст или эта переменная означает что то другое ? Буффер индикатора был бы

Bufer0[i]

Весь код с коментами

 int    counted_bars=IndicatorCounted();
//----
   int   a1=0,                               //преведущий фрактал (-1 ->нижний, 1 -> верхний)
         a2,                                 //нынешний фрактал  (-1 ->нижний, 1 -> верхний)
         a3,                                 //сума преведущий + нынешний
         kilkict,
         frac,                               //frac - флаг существования фракталов,
         frac1=0;                            //frac1- счетчик фракталов (+1 или 0 за цикл)
   int i;
   double Bufer0;                            //
   kilkict=iBars(NULL, 0);

   for (i=3; i<kilkict;i++){
      a2=0;frac=0;
      if(iFractals(NULL, 0, MODE_UPPER, i)>0) {            
         if (Bufer0!=EMPTY_VALUE) {          //
            a2+=1;                           //к числу фракталов добовляем 1
            frac=1;                          //флаг - фрактал есть
            frac1++;                         //счечик увеличиваем на 1
         }
      }
      if(iFractals(NULL, 0, MODE_LOWER, i)>0) {            
         if (Bufer0!=EMPTY_VALUE) {          //
            if(a2==0){
               frac1++;                      //счечик увеличиваем на 1 
               frac=1;                       //флаг - фрактал есть
            }
            a2+=-1;                          //к числу фракталов добовляем -1(т. е. уменшаем)
         }
      } 
      if (frac==0){continue;}                // если флага нет (фрактал ненайден)
      if (frac1==1){                         //если счечик равен 1,
         a1=a2; continue;
      }          
      a3=a1+a2;
      if(a3<0)           { a1=a2;continue;}//Два фрактала вниз  подряд найдено// 
      if(a3>0)           { a1=a2; continue;}//Два фрактала вверх подряд найдено //
      if(a3==0 && a1==0) { a1=a2;}// Два фрактала подряд вверх и два фрактала подряд вниз найдено //
   }

 

gince:

if (Bufer0!=EMPTY_VALUE) 

Это имееться в виду, что буффер индикатора уже не пуст или эта переменная означает что то другое ?

Эту строку можно убрать, т.к. iFractals() в качестве отсутствия фрактала возвращает ноль, а не "пустое значение" (EMPTY_VALUE).

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

И последний вопрос: что должно получиться на выходе?

 
artmedia70:

Эту строку можно убрать, т.к. iFractals() в качестве отсутствия фрактала возвращает ноль, а не "пустое значение" (EMPTY_VALUE).

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

И последний вопрос: что должно получиться на выходе?



Пока индикатор, а дальше видно будет. методы поиска в индикаторе и в советнике разные - индикатор рассчитывается от конца к началу - из прошлого в настоящее, а советник просматривает бары из настоящего в прошлое.

for (i=kilkict;i>0;i--)

Результат - два верхних -> продаем(стрелка в низ), два нижних -> покупаем (стрелка в верх). Сигнал появиться +2 бара в право от фрактала. Вот это и хочу по началу посмотреть на истории визуально. И наверное нужен будет фильтр.

 
ALXIMIKS:


...

что-то типа етого...

...


Расскажите, объясните, как так случается, что вместо "этого" пишут "етого"?

1. Вы не знаете, что "это" пишется с буквы "э", а не с "е"?

2. Лень двинуть рукой до буквы "э", проще нажать "е"?

3. На клавиатуре нет клавишы "э"? Если нет, почему ее нет?

4. Какие-то особые понты?

5. Некоторая другая неведомая причина. Какая?

Причина обращения: