[Архив!] Любой вопрос новичка, чтоб не захламлять форум. Профи, не проходите мимо. Без вас никуда - 2. - страница 520

 
Roger:

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

А как бы я его проверил?
 
demlin:

Приветствую всех!

Прошу подсказать нормальный индикатор для определения флета, заранее благодарен )))


Сам тестирую этот.

Легко добавляется (подключается) в советник через iCustom().

 
Простенькая система на пересечение 2-х машек.
Бай - быстрая пересекает медленную вверх.
Селл - быстрая пересекает медленную вниз.

Закрытие - противоположный сигнал или трал. Подскажите пожалуйста, что нужно изменить в коде, чтобы он ставил при открытии каждой позиции стоп = 50 пунктов?

extern double Lots           =   0; // лот, если 0, то динамический
extern double RiskPercentage =  70; // % от депо на лот, если динамический
extern int    FastPer        =   4;
extern int    SlowPer        =  18;
extern int    magicnumber    = 777;
extern int    TrailingStop   =  20; 
extern bool   PolLots        = true;



int prevtime;
int ticket=0;
//+------------------------------------------------------------------+
//| expert start function                                            |
//+------------------------------------------------------------------+
int start()
  {
//----




   if (!IsDemo())
    {
//     Print ("Эта версия только для демо-счетов");
//     return(0);
    }   


   if(Time[0] == prevtime)
   { 

       return(0);
   }
   prevtime = Time[0];
   if(!IsTradeAllowed()) 
     {
       prevtime = Time[1];
       return(0);
     }




 int Ord=0;
 double ClLot=0;
int LotsCount=0;
   int i=0;  
   int total = OrdersTotal();   
   for(i = 0; i <= total; i++) 
     {
      if(TrailingStop>0)  
       {                 
       OrderSelect(i, SELECT_BY_POS, MODE_TRADES);
       if(OrderMagicNumber() == magicnumber) 
         {
         ticket=OrderTicket(); 
         ClLot=OrderLots();
         if (OrderType()==OP_BUY)
          {
           Ord=1;
          }
         else
          {
           Ord=2;
          }         
          LotsCount ++;
          TrailingStairs(OrderTicket(),TrailingStop);
         }
       }
      }
/*
 
     for(i = 0; i <= OrdersTotal(); i++) 
      {
       OrderSelect(i, SELECT_BY_POS, MODE_TRADES);
       if(OrderMagicNumber() == magicnumber) 
         {
         ticket=OrderTicket(); 
         ClLot=OrderLots();
         if (OrderType()==OP_BUY)
          {
           Ord=1;
          }
         else
          {
           Ord=2;
          }
         }
      } 
*/    
bool SellOp=false;
bool BuyOp=false;

double MAFast1=NormalizeDouble(iMA(NULL,0,FastPer,0,MODE_SMA,PRICE_CLOSE,2),Digits);
double MAFast2=NormalizeDouble(iMA(NULL,0,FastPer,0,MODE_SMA,PRICE_CLOSE,1),Digits);
double MAFast3=NormalizeDouble(iMA(NULL,0,FastPer,0,MODE_SMA,PRICE_CLOSE,0),Digits);
double MASlow1=NormalizeDouble(iMA(NULL,0,SlowPer,0,MODE_SMA,PRICE_CLOSE,2),Digits);
double MASlow2=NormalizeDouble(iMA(NULL,0,SlowPer,0,MODE_SMA,PRICE_CLOSE,1),Digits);
double MASlow3=NormalizeDouble(iMA(NULL,0,SlowPer,0,MODE_SMA,PRICE_CLOSE,0),Digits);


      
if ((MAFast1<MASlow1)&&
    (MAFast2==MASlow2)&&
    (MAFast3>MASlow3))
{
 BuyOp=true;
}

if ((MAFast1>MASlow1)&&
    (MAFast2==MASlow2)&&
    (MAFast3<MASlow3))
{
 SellOp=true;
}



if (BuyOp)
 {
  if (Ord==2)
   {
    OrderClose(ticket,ClLot,Ask,3,Red);
   }
  if (Ord!=1)
   {
    OrderSend(Symbol(),OP_BUY,Lot(),Ask,3,0,0,"MA_Buy",magicnumber,0,Green);
   }
 }

if (SellOp)
 {
  if (Ord==1)
   {
    OrderClose(ticket,ClLot,Bid,3,Green);
   }
  if (Ord!=2)
   {
    OrderSend(Symbol(),OP_SELL,Lot(),Bid,3,0,0,"MA_Sell",magicnumber,0,Red);
   }
 }



   
//----
   return(0);
  }
//+------------------------------------------------------------------+
void TrailingStairs(int ticket,int trldistance)
   { 
    int Spred=Ask - Bid;
    if (OrderType()==OP_BUY)
      {
       if((Bid-OrderOpenPrice())>(Point*trldistance))
         {
          if(OrderStopLoss()<Bid-Point*trldistance || (OrderStopLoss()==0))
            {
             OrderModify(ticket,OrderOpenPrice(),Bid-Point*trldistance,OrderTakeProfit(),0,Green);
             if (PolLots)
             if (NormalizeDouble(OrderLots()/2,1)>MarketInfo(Symbol(), MODE_MINLOT))
               {
               OrderClose(ticket,NormalizeDouble(OrderLots()/2,1),Bid,3,Green);
               }
             else
               {
               OrderClose(ticket,OrderLots(),Bid,3,Green);
               }
            }
         }
       }
     else
       {
        if((OrderOpenPrice()-Ask)>(Point*trldistance))
          {
           if((OrderStopLoss()>(Ask+Point*trldistance)) || (OrderStopLoss()==0))
             {
              OrderModify(OrderTicket(),OrderOpenPrice(),Ask+Point*trldistance,OrderTakeProfit(),0,Red);
             if (PolLots)
             if (NormalizeDouble(OrderLots()/2,1)>MarketInfo(Symbol(), MODE_MINLOT))
               {
               OrderClose(ticket,NormalizeDouble(OrderLots()/2,1),Ask,3,Green);
               }
             else
               {
               OrderClose(ticket,OrderLots(),Ask,3,Green);
               }
             }
          }
        }
    }
    
double Lot()
{
 double LotQ = Lots;

 if (Lots==0)
  {
   double margin = MarketInfo(Symbol(), MODE_MARGINREQUIRED);
   double minLot = MarketInfo(Symbol(), MODE_MINLOT);
   double maxLot = MarketInfo(Symbol(), MODE_MAXLOT);
   double step =   MarketInfo(Symbol(), MODE_LOTSTEP);
   double account = AccountFreeMargin();
   
   double percentage = account*RiskPercentage/100;
   
   LotQ = MathRound(percentage/margin/step)*step;
   
   if(LotQ < minLot)
   {
      LotQ = minLot;
   }
   
   if(LotQ > maxLot)
   {
      LotQ = maxLot;
   }
  } 
  return (LotQ);
  }

 
Roman.:


Сам тестирую этот.

Легко добавляется (подключается) в советник через iCustom().

Интересно, каким образом определяете в советнике экстремально низкие и экстремально высокие его значения? Ведь на одном локальном участке графика 0.3800 (голубая линия) было экстремальным значением и соответствовало временной коррекции, на следующем локальном участке - уже 0.3041 (зелёная линия) стало его экстремальным значением и обозначило разворот...

А как быть с экстремально низким значением 0.4596 на самом первом локальном участке (красная линия), которое вообще ни о чём не сказало?

И как определяете на что именно указывает экстремально низкое значение индикатора - коррекцию или разворот? Ведь значение 0.3800 в первом случае указало на коррекцию (зелёная вертикальная), во втором случае - на окончание тренда (красная вертикальная линии)

И напоследок - таких локальных экстремальных значений - пруд-пруди на графике. Ведь за промежуток 3-5 часов обязательно будет самое низкое значение и оно будет являться экстремально низким для данного промежутка времени. Если же задать конкретный промежуток времени для поиска экстремальных значений индикатора, то оно будет найдено, но... на последующих барах, за пределами выбранного промежутка, может случиться так, что значение индикатора станет ещё ниже (выше) и тогда уже это значение будет экстремально низким (высоким), а что делать с предыдущим найденным? Тем более, что по нему уже советник примет какое-либо решение...

Однако...


 
artmedia70:

Интересно, каким образом определяете в советнике экстремально низкие и экстремально высокие его значения? Ведь на одном локальном участке графика 0.3800 (голубая линия) было экстремальным значением и соответствовало временной коррекции, на следующем локальном участке - уже 0.3041 (зелёная линия) стало его экстремальным значением и обозначило разворот...

А как быть с экстремально низким значением 0.4596 на самом первом локальном участке (красная линия), которое вообще ни о чём не сказало?

И как определяете на что именно указывает экстремально низкое значение индикатора - коррекцию или разворот? Ведь значение 0.3800 в первом случае указало на коррекцию (зелёная вертикальная), во втором случае - на окончание тренда (красная вертикальная линии)

И напоследок - таких локальных экстремальных значений - пруд-пруди на графике. Веди за промежуток 3-5 часов обязательно будет самое низкое значение и оно будет являться экстремально низким для данного промежутка времени. Если же задать конкретный промежуток времени для поиска экстремальных значений индикатора, то оно будет найдено, но... на последующих барах, за пределами выбранного промежутка, может случиться так, что значение индикатора станет ещё ниже (выше) и тогда уже это значение будет экстремально низким (высоким), а что делать с предыдущим найденным? Тем более, что по нему уже советник примет какое-либо решение...

Однако...





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

double iVAR_1 = iCustom (Symbol(),trend_period, "iVAR", n, nBars, 0, 1);                    // расчет индикатора iVAR
   

Значение индикатора ниже 0.5 означает трендовое состояние рынка -

iVAR_1 < 0.5 &&                                                            // тренд на основном ТФ   

Экстремально низкое значение часто предшествует концу (коррекции) текущего тренда - это уже по фигу - здесь работает трал (при нахождении в рынке).


Значение индикатора выше 0.5 означает флэтовое состояние рынка -

iVAR_1 > 0.5 && 

Экстремально высокое значение часто предшествует началу значительных трендов - cм. предыдущую трактовку.

Значение индикатора в районе 0.5 означает неопределенное состояние рынка - здесь возможно использовать некий "уровень" отступа(не исключаю, что это - лишнее, т.е. берем значение 0,5 и все), как ниже - x, так и выше - y значения 0,5 (базового уровня), вбить их во внешние переменные и оптимизировать с шагом 0,02, допустим, равно как и переменную n - старт:2 шаг:1 стоп:7 - это не лишнее, этим занимаюсь - скоро выложу результаты в ветке Лавина (это же трендовая система...:-))), только с ММ по Мартину... и все... :-)))).

 
Roman.:


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

Значение индикатора ниже 0.5 означает трендовое состояние рынка -

Экстремально низкое значение часто предшествует концу (коррекции) текущего тренда - это уже по фигу - здесь работает трал (при нахождении в рынке).


Значение индикатора выше 0.5 означает флэтовое состояние рынка -

Экстремально высокое значение часто предшествует началу значительных трендов - cм. предыдущую трактовку.

Значение индикатора в районе 0.5 означает неопределенное состояние рынка - здесь возможно использовать некий "уровень" отступа(не исключаю, что это - лишнее, т.е. берем значение 0,5 и все), как ниже - x, так и выше - y значения 0,5 (базового уровня), вбить их во внешние переменные и оптимизировать с шагом 0,02, допустим, равно как и переменную n - старт:2 шаг:1 стоп:7 - это не лишнее, этим занимаюсь - скоро выложу результаты в ветке Лавина (это же трендовая система...:-))), только с ММ по Мартину... и все... :-)))).

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

Хотя, спасибо за разъяснения... :) Честно говоря - пой пост выше был камушком в сторону индюшонка... :)

 

Добрый день!

У меня такой вопрос. В эксперте есть функция, которая записывает результаты сделок в файл csv, но обнаружил проблему, которая проявляется при включении/отключении (TRUE/FALSE) опции системы управления капиталом в параметрах эксперта. Например, сразу же после компиляции исходного файла всё работает правильно и сделки в файл записываются так, как задумывалось. На рисунке ниже проиллюстрировано правильно записанные данные:

Затем в тестере я в параметрах эксперта включаю опцию системы управления капиталом, провожу тест, но данные в файл записываются не корректно. На рисунке ниже два варианта для сравнения. Слева правильный (как и выше), справа не правильный:

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

Подскажите в чём может быть проблема?

 
artmedia70:

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

Хотя, спасибо за разъяснения... :) Честно говоря - пой пост выше был камушком в сторону индюшонка... :)


Понятно... Вот, если интересует, подобная штукенция (в прицепе). См. также здесь (всю ветку)-там трактовка выше/ниже 0,6 и здесь(выборочно странички).

Файлы:
 
Roman.:


Сам тестирую этот.

Легко добавляется (подключается) в советник через iCustom().

Спасибо, скачал, буду тестить в советнике
Причина обращения: