Скачать MetaTrader 5
Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий
Часто выкладываешь исходный код? Узнай, как это делать правильно!
MetaQuotes Software Corp.
Модератор
180305
MetaQuotes Software Corp. 2014.03.17 12:36 

советник MA:

Старый добрый советник, встроенный по умолчанию в метатрейдер

Author: Vyacheslav

Vyacheslav
21
Vyacheslav 2014.03.18 17:32  

Кому интересна сама стратегия, то могу описать в кратце как я торгую руками на реале:

Время торгов, желательно: вт - чт, понедельник и пятницу нужно торговать очень осторожно!

Берем таймфрейм H1, валютная пара: EURUSD, GBPUSD (шустрая пара, нужно быть внимательным), USDCHF, GBPJPY (как и любой кросс с фунтом очень шустрая, быть внимательным, USDCAD (не советовал бы, сильно реагирует на крупных игроков, новости) все выше перечисленные пары можно торговать по этой стратегии.

Используемые индикаторы:

1) MA (smoothed) 13, 21, 34, 89;

2) Axel-level;

3) ADX;

графики - японские свечи;

ну и по желанию MACD (дивергенции смотреть можно), Stohastic;

Торговать желательно по тренду (смотрим H4, D1 таймфреймы, трендовые индикаторы на старших таймфреймах)

Условия для buy: (нюанс, рынок идет вверх медленне чем падает!)

1) ценовой бар открывается ниже MA 89 и закрывается выше MA 89 - входим по рынку в лонг; стоп лосс выставляем ниже MA 89 на 10-20 пунктов (если младшие машки все еще ниже MA 89), стоп лосс выставляем ниже самого нижнего экстремума свечи + 5-10 пунктов или по фракталу (это если младшие машки уже находятся выше MA 89);

2) MA 34, 21, 13 располагаются выше MA 89 ( не обязательно! то есть младшие машки еще могут находиться ниже MA 89), смотрим таймфрейм H4, D1 - есть тенденция к продолжению тренда вверх - смело бай со стоп лоссом ниже самого нижнего экстремума свечи + 5-10 пунктов, есть признаки разворота, ослабления - тоже ставим бай, но уже с коротким стопом ниже MA 89 на 10-20 пунктов, если на старших таймфреймах противо тренд - внимательно! короткие стопы и профит по линиям индикатора Axel-level, уровням фибо (23, 38, 50% коррекции от всего тренда);

Условия для sell: (нюанс - рынок падает быстрее чем растет, учтите это!)

1) ценовой бар открывается выше MA 89 и закрывается ниже MA 89 - входим по рынку в шорт; стоп лосс выставляем выше MA 89 на 10-20 пунктов (если младшие машки все еще выше MA 89), стоп лосс выставляем выше самого нижнего экстремума свечи + 5-10 пунктов или по фракталу (это если младшие машки уже находятся ниже MA 89);

2) MA 34, 21, 13 располагаются ниже MA 89 ( не обязательно! то есть младшие машки еще могут находиться выше MA 89), смотрим таймфрейм H4, D1 - есть тенденция к продолжению тренда вниз - смело селл со стоп лоссом ниже самого нижнего экстремума свечи + 5-10 пунктов, есть признаки разворота, ослабления - тоже ставим селл, но уже с коротким стопом ниже MA 89 на 10-20 пунктов, если на старших таймфреймах противо тренд - внимательно! короткие стопы и профит по линиям индикатора Axel-level, уровням фибо (23, 38, 50% коррекции от всего тренда);


Сопровождение позиции и фиксация прибыли:

1) Самое главное!!! - появился профит равный стоп лоссу - сразу ставим в безубыток + спред, так Вы уменьшите количество убыточных сделок в своей системе, но и естественно подрежете как часто бывает и прибыль

2) тейк профит выставляем 3/1 к стоп лоссу, не меньше, можно и больше 5/1, 8/1 (смотрим старший таймфрем H4, D1 - если по тренду стоим и нет признаков разворота, коррекции, ослабления, то тейк профит можно поставить 5/1 - 8/1)

3) цена может не дойти до тейк профита (часто происходит, рынок не дает заработать много) и начать разворачиваться на таймфрейме H1 (закрываем сделку, когда ценовой бар закроется ниже MA 34 - для сделок buy; закрываем сделку, когда ценовой бар закроется выше MA 34 - для сделок sell)


MM:

1) Самое главное, риск на сделку должен быть 0,1-0,25%!!!!! не надо использовать большие риски! поверьте, то что пишут что риск на сделку 2% - типа стандарт и просадка 12-20% при таком риске -

ЭТО БОЛЬШОЙ ОБМАН!!

при риске 0,25% уже просадки могут доходить до 5-8%!! (проверено на реале с разными системами торговли), а теперь представьте что будет с 2% - 50-80%, вот поэтому многие и сливаются, ибо системы зачастую у них рабочие, а нервы не выдерживают и Коля приходит снова и снова.

Простая математика: система дает выигрышные сделки 30% / 70% - убыточные, таке профит к стоп лоссу=3/1, например у Вас в месяц выходит 40-50 сделок, это значит что убыточных выходит 28-35 сделок и причем убыточные сделки могут быть подряд и все 28-35 сделок!!! теперь подсчитайте если бы у вас был риск на сделку 2% чтобы вы в итоге лицезрели в терминале: уменьшение счета на 46-70% - никакие нервы у вас бы не выдержали и вы начинаете совершать ошибки - преждевременно фиксируете любую прибыль и.. скоро дядя Коля к вам приходит,

конечно многие скажут что есть система 50/50, 70/30 и тд. и что мол такая большая серия убыточных сделок может встретиться в одном лишь месяце из 12, ну и что - один раз встретится за год и этого будет достаточно!! :-(( чтобы пришел дядя Коля, ибо трейдеры психологически не выдерживают таких просадок и совершают ошибки, не верят в свои системы до конца.

Система торговли с риском 0,1-0,25% на сделку дает в среднем 3-5% прибыли в месяц, в год выходит 36-60% - и вы король Forbes!!!!

Как выжать из тренда максимально большее количество пунктов:

1) доливки на откатах по методу пирамиды по направлению тренда;

2) фиксация прибыли части позиций, а остаток отпускать в рост;


При флете, когда нет сигналов по тренду, неоднозначные участки, прозевали сигналы:

1) торгую по стратегии пробой азиатской сессии ( в 12-00 по МСК рисую горизонтальные линии минимум и максимум азиатской сессии на валютных парах GBPUSD, USDCHF, EURUSD, [по USDCAD в 15-00 по МСК] выставлаю отложенные ордера на 10 пунктов выше/ниже buystop, sellstop, стоп лосс 20 пунктов, тэйк профит 20 пунктов);

2) торговля по паттернам, каналам, пробой, отбой линий поддержки и сопротивления, торговля по axel-level - отбой/пробой;

3) не торгуем;

Evgeniy Inkov
2692
Evgeniy Inkov 2014.03.19 18:32  

Canefis:

.............................................

Условия для buy: (нюанс, рынок идет вверх медленнее, чем падает!)

Условия для sell: (нюанс - рынок падает быстрее, чем растет, учтите это!)

Большое спасибо за стратегию !! Думаю, многим пригодится ! ... В этих двух строчках точно нет противоречия ? В место слова "медленнее" может нужно слово "быстрее" ?
Vyacheslav
21
Vyacheslav 2014.03.19 20:08  
Evgen57:

Canefis:

......... . ......... . .........................

Условия для buy: (нюанс, рынок идет вверх медленнее, чем падает!)

Условия для sell: (нюанс - рынок падает быстрее, чем растет, учтите это!)

Большое спасибо за стратегию !! Думаю, многим пригодится ! ... В этих двух строчках точно нет противоречия ? В место слова "медленнее" может нужно слово "быстрее" ?

Имелось ввиду что когда тренд идет вниз - то цена проходит за одно и тоже время гораздо большее расстояние чем когда тренд идет вверх (то есть можно отрастать, скажем 500 пунктов в неделю, а скорректироваться вниз на 200-300 пунктов за 1-2 дня всего!)


P.S.Помогите подкорректировать код чтобы стоп лосс выставлял ниже/выше MA, а то иногда сделки на селл вообще не открывает, а также прикрутить безубыток, я в программировании не силен... :-((

оеде
Evgeniy Inkov
2692
Evgeniy Inkov 2014.03.20 03:15  
Canefis:

P.S.Помогите подкорректировать код чтобы стоп лосс выставлял ниже/выше MA, а то иногда сделки на селл вообще не открывает, а также прикрутить безубыток

//+------------------------------------------------------------------+
//|                                           Moving_Average_v01.mq4 |
//+------------------------------------------------------------------+
#define MAGICMA  20050610
 
extern double Lots               = 0.01;
extern double MaximumRisk        = 0.0025;
extern double DecreaseFactor     = 10;
extern int    MovingPeriod       = 89;
extern int    MovingPeriod2      = 47;
extern int    MovingShift        = 0;
extern int    MovingShift2       = 0;
extern int    StopLoss           = 50;
extern double WR                 = 3;
                                          // трейлинг-стоп (0 - откл)
extern int    Trail_Stop         = 50;
                                          // шаг трейлинг-стопа
extern int    Step_TS            = 50;
                                          // период торговли
extern int    Period_Torg        = 60;
//+------------------------------------------------------------------+
//| Calculate open positions                                         |
//+------------------------------------------------------------------+
int CalculateCurrentOrders()
{
   int buys=0,sells=0;
//----
   for(int i=0;i<OrdersTotal();i++)
   {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==false) break;
      if(OrderSymbol()==Symbol() && OrderMagicNumber()==MAGICMA)
      {
         if(OrderType()==OP_BUY)  buys++;
         if(OrderType()==OP_SELL) sells++;
      }
   }
//---- return orders volume
   if(buys>0) return(buys);
   return(-sells);
}
//+------------------------------------------------------------------+
//| Calculate optimal lot size                                       |
//+------------------------------------------------------------------+
double LotsOptimized()
  {
   double lot=Lots;
   int    orders=OrdersHistoryTotal();     // history orders total
   int    losses=0;                  // number of losses orders without a break
//---- select lot size
   lot=NormalizeDouble(AccountFreeMargin()*MaximumRisk/1000.0,01);
//---- calcuulate number of losses orders without a break
   if(DecreaseFactor>0)
     {
      for(int i=orders-1;i>=0;i--)
        {
         if(OrderSelect(i,SELECT_BY_POS,MODE_HISTORY)==false) { Print("Error in history!"); break; }
         if(OrderSymbol()!=Symbol() || OrderType()>OP_SELL) continue;
         //----
         if(OrderProfit()>0) break;
         if(OrderProfit()<0) losses++;
        }
      if(losses>1) lot=NormalizeDouble(lot-lot*losses/DecreaseFactor,1);
     }
//---- return lot size
   double min_l=MarketInfo(Symbol(),MODE_MINLOT);
   double max_l=MarketInfo(Symbol(),MODE_MAXLOT);
   //.............................................
   if(lot<min_l) lot=min_l;
   if(lot>max_l) lot=max_l;
   return(lot);
  }
//+------------------------------------------------------------------+
//| Check for open order conditions                                  |
//+------------------------------------------------------------------+
void CheckForOpen()
{
   double ma;
   double lma;
   int    res;
//---- go trading only for first tiks of new bar
   ma =iMA(NULL,Period_Torg,MovingPeriod, MovingShift, MODE_SMMA,PRICE_CLOSE,0);
   lma=iMA(NULL,Period_Torg,MovingPeriod2,MovingShift2,MODE_SMMA,PRICE_CLOSE,0);
 
//---- sell conditions
   if(ma>lma && iOpen(Symbol(),Period_Torg,1)>ma && iClose(Symbol(),Period_Torg,1)<ma)
   {
      RefreshRates();
      res=OrderSend(Symbol(),OP_SELL,LotsOptimized(),Bid,3,0,0,"",MAGICMA,0,Red);
      if (res<0)Comment(GetLastError());
      return;
   }
 
//---- buy conditions
   if(lma>ma && iOpen(Symbol(),Period_Torg,1)<ma && iClose(Symbol(),Period_Torg,1)>ma)  
   {
      RefreshRates();
      res=OrderSend(Symbol(),OP_BUY,LotsOptimized(),Ask,3,0,0,"",MAGICMA,0,Blue);
      if (res<0)Comment(GetLastError());
      return;
}
//----
}
//+------------------------------------------------------------------+
//| Check for close order conditions                                 |
//+------------------------------------------------------------------+
void CheckForClose()
{
   double ma;
   double lma;
//---- get Moving Average 
   ma =iMA(NULL,0,MovingPeriod, MovingShift,MODE_SMMA,PRICE_CLOSE,0);
   lma=iMA(NULL,0,MovingPeriod2,MovingShift,MODE_SMMA,PRICE_CLOSE,0);
//----
   for(int i=0;i<OrdersTotal();i++)
   {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==false)        break;
      if(OrderMagicNumber()!=MAGICMA || OrderSymbol()!=Symbol()) continue;
      //---- check order type 
      if(OrderType()==OP_BUY)
      {
         RefreshRates();
         if(iClose(Symbol(),Period_Torg,1)<lma && iOpen(Symbol(),Period_Torg,1)>lma && lma>ma) OrderClose(OrderTicket(),OrderLots(),Bid,3,White);
         break;            
      }
      if(OrderType()==OP_SELL)
      {
         RefreshRates();
         if(iClose(Symbol(),Period_Torg,1)>lma && iOpen(Symbol(),Period_Torg,1)<lma && ma>lma) OrderClose(OrderTicket(),OrderLots(),Ask,3,White);
         break;         
      }
   }
//----
}
//+------------------------------------------------------------------+
void Check_TP_SL()
{
   double ma =iMA(NULL,0,MovingPeriod, MovingShift,MODE_SMMA,PRICE_CLOSE,0);
   
   double SL;
   double TP;
   for(int i=0;i<OrdersTotal();i++)
   {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==false)        break;
      if(OrderMagicNumber()!=MAGICMA || OrderSymbol()!=Symbol()) continue;
      //---- check order type 
      if(OrderType()==OP_BUY)
      {
         RefreshRates();
         SL=0;
         if (StopLoss>0)SL=ND(ma-StopLoss*Point);
         TP=0;
         if (WR>0)TP=ND(Ask+WR*(OrderOpenPrice()-SL));
         if((WR>0 && OrderTakeProfit()==0) || (StopLoss>0 && OrderStopLoss()==0))
            OrderModify(OrderTicket(),OrderOpenPrice(),SL,TP,0,Green);
         break;            
      }
      if(OrderType()==OP_SELL)
      {
         RefreshRates();
         SL=0;
         if (StopLoss>0)SL=ND(ma+StopLoss*Point);
         TP=0;
         if (WR>0)TP=ND(Ask-WR*(SL-OrderOpenPrice()));
         if((WR>0 && OrderTakeProfit()==0) || (StopLoss>0 && OrderStopLoss()==0))
            OrderModify(OrderTicket(),OrderOpenPrice(),SL,TP,0,Green);
         break;            
      }
   }
//----
}
//+------------------------------------------------------------------+
void Check_Trail_Stop()
{     // трейлинг-стоп
   if (Step_TS<1)Step_TS=1;
   double sl;
   
   RefreshRates();
   double tek_bid=Bid;
   double tek_ask=Ask;
   for(int i=0; i<OrdersTotal(); i++)
   {
      if (!OrderSelect(i,SELECT_BY_POS)==true)continue;
      if (OrderSymbol()!=Symbol())continue;
      if (OrderMagicNumber()!=MAGICMA)continue;
      
      if (OrderType() == OP_BUY)
         if (ND(tek_bid) >= ND(OrderOpenPrice()+Trail_Stop*Point))
         {
            if (ND(OrderStopLoss())==0 || ND(OrderStopLoss()) < ND(OrderOpenPrice()))
               OrderModify(OrderTicket(),OrderOpenPrice(),OrderOpenPrice(),OrderTakeProfit(),0);
            else
            {
               sl=OrderStopLoss()+Step_TS*Point;
               if (ND(sl) <= ND(tek_bid-(Trail_Stop+Step_TS)*Point) && ND(sl)>ND(OrderStopLoss()))
                  OrderModify(OrderTicket(),OrderOpenPrice(),sl,OrderTakeProfit(),0);
            }
         }
      if (OrderType() == OP_SELL)
         if (ND(tek_ask) <= ND(OrderOpenPrice()-Trail_Stop*Point))
         {
            if (ND(OrderStopLoss())==0 || ND(OrderStopLoss()) > ND(OrderOpenPrice()))
               OrderModify(OrderTicket(),OrderOpenPrice(),OrderOpenPrice(),OrderTakeProfit(),0);
            else
            {
               sl=OrderStopLoss()-Step_TS*Point;
               if (ND(sl) >= ND(tek_ask+(Trail_Stop+Step_TS)*Point) && ND(sl)<ND(OrderStopLoss()))
                  OrderModify(OrderTicket(),OrderOpenPrice(),sl,OrderTakeProfit(),0);
            }
         }
   }
}
//-----------------------------------------------
double ND(double n)
{
   return(NormalizeDouble(n,Digits));
}
//+------------------------------------------------------------------+
//| Start function                                                   |
//+------------------------------------------------------------------+
void start()
{
//---- check for history and trading
   if(Bars<100 || IsTradeAllowed()==false) return;
//---- calculate open orders by current symbol
   if(CalculateCurrentOrders()==0) 
      CheckForOpen();
   else
   {
      CheckForClose();
      if (StopLoss>0 || WR>0)Check_TP_SL();
      if (Trail_Stop>0)Check_Trail_Stop();
   }
//----
}
//+------------------------------------------------------------------+
если сделать Step_TS=100000, то получится просто установка безубытка.
MQL4 Comments
16319
MQL4 Comments 2014.03.20 15:22  

А каким образом был сделан первый тест (build 432)?
Ведь известно, что сборки ниже 500 уже давно официально не поддерживаются.

Vyacheslav
21
Vyacheslav 2014.03.20 17:53  
Evgen57:
Canefis:

P.S.Помогите подкорректировать код чтобы стоп лосс выставлял ниже/выше MA, а то иногда сделки на селл вообще не открывает, а также прикрутить безубыток

//+------------------------------------------------------------------+
//|                                           Moving_Average_v01.mq4 |
//+------------------------------------------------------------------+
#define MAGICMA  20050610
 
extern double Lots               = 0.01;
extern double MaximumRisk        = 0.0025;
extern double DecreaseFactor     = 10;
extern int    MovingPeriod       = 89;
extern int    MovingPeriod2      = 47;
extern int    MovingShift        = 0;
extern int    MovingShift2       = 0;
extern int    StopLoss           = 50;
extern double WR                 = 3;
                                          // трейлинг-стоп (0 - откл)
extern int    Trail_Stop         = 50;
                                          // шаг трейлинг-стопа
extern int    Step_TS            = 50;
                                          // период торговли
extern int    Period_Torg        = 60;
//+------------------------------------------------------------------+
//| Calculate open positions                                         |
//+------------------------------------------------------------------+
int CalculateCurrentOrders()
{
   int buys=0,sells=0;
//----
   for(int i=0;i<OrdersTotal();i++)
   {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==false) break;
      if(OrderSymbol()==Symbol() && OrderMagicNumber()==MAGICMA)
      {
         if(OrderType()==OP_BUY)  buys++;
         if(OrderType()==OP_SELL) sells++;
      }
   }
//---- return orders volume
   if(buys>0) return(buys);
   return(-sells);
}
//+------------------------------------------------------------------+
//| Calculate optimal lot size                                       |
//+------------------------------------------------------------------+
double LotsOptimized()
  {
   double lot=Lots;
   int    orders=OrdersHistoryTotal();     // history orders total
   int    losses=0;                  // number of losses orders without a break
//---- select lot size
   lot=NormalizeDouble(AccountFreeMargin()*MaximumRisk/1000.0,01);
//---- calcuulate number of losses orders without a break
   if(DecreaseFactor>0)
     {
      for(int i=orders-1;i>=0;i--)
        {
         if(OrderSelect(i,SELECT_BY_POS,MODE_HISTORY)==false) { Print("Error in history!"); break; }
         if(OrderSymbol()!=Symbol() || OrderType()>OP_SELL) continue;
         //----
         if(OrderProfit()>0) break;
         if(OrderProfit()<0) losses++;
        }
      if(losses>1) lot=NormalizeDouble(lot-lot*losses/DecreaseFactor,1);
     }
//---- return lot size
   double min_l=MarketInfo(Symbol(),MODE_MINLOT);
   double max_l=MarketInfo(Symbol(),MODE_MAXLOT);
   //.............................................
   if(lot<min_l) lot=min_l;
   if(lot>max_l) lot=max_l;
   return(lot);
  }
//+------------------------------------------------------------------+
//| Check for open order conditions                                  |
//+------------------------------------------------------------------+
void CheckForOpen()
{
   double ma;
   double lma;
   int    res;
//---- go trading only for first tiks of new bar
   ma =iMA(NULL,Period_Torg,MovingPeriod, MovingShift, MODE_SMMA,PRICE_CLOSE,0);
   lma=iMA(NULL,Period_Torg,MovingPeriod2,MovingShift2,MODE_SMMA,PRICE_CLOSE,0);
 
//---- sell conditions
   if(ma>lma && iOpen(Symbol(),Period_Torg,1)>ma && iClose(Symbol(),Period_Torg,1)<ma)
   {
      RefreshRates();
      res=OrderSend(Symbol(),OP_SELL,LotsOptimized(),Bid,3,0,0,"",MAGICMA,0,Red);
      if (res<0)Comment(GetLastError());
      return;
   }
 
//---- buy conditions
   if(lma>ma && iOpen(Symbol(),Period_Torg,1)<ma && iClose(Symbol(),Period_Torg,1)>ma)  
   {
      RefreshRates();
      res=OrderSend(Symbol(),OP_BUY,LotsOptimized(),Ask,3,0,0,"",MAGICMA,0,Blue);
      if (res<0)Comment(GetLastError());
      return;
}
//----
}
//+------------------------------------------------------------------+
//| Check for close order conditions                                 |
//+------------------------------------------------------------------+
void CheckForClose()
{
   double ma;
   double lma;
//---- get Moving Average 
   ma =iMA(NULL,0,MovingPeriod, MovingShift,MODE_SMMA,PRICE_CLOSE,0);
   lma=iMA(NULL,0,MovingPeriod2,MovingShift,MODE_SMMA,PRICE_CLOSE,0);
//----
   for(int i=0;i<OrdersTotal();i++)
   {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==false)        break;
      if(OrderMagicNumber()!=MAGICMA || OrderSymbol()!=Symbol()) continue;
      //---- check order type 
      if(OrderType()==OP_BUY)
      {
         RefreshRates();
         if(iClose(Symbol(),Period_Torg,1)<lma && iOpen(Symbol(),Period_Torg,1)>lma && lma>ma) OrderClose(OrderTicket(),OrderLots(),Bid,3,White);
         break;            
      }
      if(OrderType()==OP_SELL)
      {
         RefreshRates();
         if(iClose(Symbol(),Period_Torg,1)>lma && iOpen(Symbol(),Period_Torg,1)<lma && ma>lma) OrderClose(OrderTicket(),OrderLots(),Ask,3,White);
         break;         
      }
   }
//----
}
//+------------------------------------------------------------------+
void Check_TP_SL()
{
   double ma =iMA(NULL,0,MovingPeriod, MovingShift,MODE_SMMA,PRICE_CLOSE,0);
   
   double SL;
   double TP;
   for(int i=0;i<OrdersTotal();i++)
   {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==false)        break;
      if(OrderMagicNumber()!=MAGICMA || OrderSymbol()!=Symbol()) continue;
      //---- check order type 
      if(OrderType()==OP_BUY)
      {
         RefreshRates();
         SL=0;
         if (StopLoss>0)SL=ND(ma-StopLoss*Point);
         TP=0;
         if (WR>0)TP=ND(Ask+WR*(OrderOpenPrice()-SL));
         if((WR>0 && OrderTakeProfit()==0) || (StopLoss>0 && OrderTakeProfit()==0))
            OrderModify(OrderTicket(),OrderOpenPrice(),SL,TP,0,Green);
         break;            
      }
      if(OrderType()==OP_SELL)
      {
         RefreshRates();
         SL=0;
         if (StopLoss>0)SL=ND(ma+StopLoss*Point);
         TP=0;
         if (WR>0)TP=ND(Ask-WR*(SL-OrderOpenPrice()));
         if((WR>0 && OrderTakeProfit()==0) || (StopLoss>0 && OrderTakeProfit()==0))
            OrderModify(OrderTicket(),OrderOpenPrice(),SL,TP,0,Green);
         break;            
      }
   }
//----
}
//+------------------------------------------------------------------+
void Check_Trail_Stop()
{     // трейлинг-стоп
   if (Step_TS<1)Step_TS=1;
   double sl;
   
   RefreshRates();
   double tek_bid=Bid;
   double tek_ask=Ask;
   for(int i=0; i<OrdersTotal(); i++)
   {
      if (!OrderSelect(i,SELECT_BY_POS)==true)continue;
      if (OrderSymbol()!=Symbol())continue;
      if (OrderMagicNumber()!=MAGICMA)continue;
      
      if (OrderType() == OP_BUY)
         if (ND(tek_bid) >= ND(OrderOpenPrice()+Trail_Stop*Point))
         {
            if (ND(OrderStopLoss())==0 || ND(OrderStopLoss()) < ND(OrderOpenPrice()))
               OrderModify(OrderTicket(),OrderOpenPrice(),OrderOpenPrice(),OrderTakeProfit(),0);
            else
            {
               sl=OrderStopLoss()+Step_TS*Point;
               if (ND(sl) <= ND(tek_bid-(Trail_Stop+Step_TS)*Point) && ND(sl)>ND(OrderStopLoss()))
                  OrderModify(OrderTicket(),OrderOpenPrice(),sl,OrderTakeProfit(),0);
            }
         }
      if (OrderType() == OP_SELL)
         if (ND(tek_ask) <= ND(OrderOpenPrice()-Trail_Stop*Point))
         {
            if (ND(OrderStopLoss())==0 || ND(OrderStopLoss()) > ND(OrderOpenPrice()))
               OrderModify(OrderTicket(),OrderOpenPrice(),OrderOpenPrice(),OrderTakeProfit(),0);
            else
            {
               sl=OrderStopLoss()-Step_TS*Point;
               if (ND(sl) >= ND(tek_ask+(Trail_Stop+Step_TS)*Point) && ND(sl)<ND(OrderStopLoss()))
                  OrderModify(OrderTicket(),OrderOpenPrice(),sl,OrderTakeProfit(),0);
            }
         }
   }
}
//-----------------------------------------------
double ND(double n)
{
   return(NormalizeDouble(n,Digits));
}
//+------------------------------------------------------------------+
//| Start function                                                   |
//+------------------------------------------------------------------+
void start()
{
//---- check for history and trading
   if(Bars<100 || IsTradeAllowed()==false) return;
//---- calculate open orders by current symbol
   if(CalculateCurrentOrders()==0) 
      CheckForOpen();
   else
   {
      CheckForClose();
      if (StopLoss>0 || WR>0)Check_TP_SL();
      if (Trail_Stop>0)Check_Trail_Stop();
   }
//----
}
//+------------------------------------------------------------------+
если сделать Step_TS=100000, то получится просто установка безубытка.


Благодарю!!!!!

Класс, протестил за 2 года на GBPUSD H1 2011.01.01 - 2013.01.01 прибыль 120% при просадке 10%

Вот это уже похоже близко к ручной торговле.

Vyacheslav
21
Vyacheslav 2014.03.20 22:26  
Patrol:

А каким образом был сделан первый тест (build 432)?
Ведь известно, что сборки ниже 500 уже давно официально не поддерживаются.


У меня стоит терминал отдельный (build 432) специально для теста стратегий, терминал пропатченный, то есть он запускается и не логинится к серверу, однако в обзоре рынка есть все валютные пары

Вот по этой ссылке я сделал себе, там все подробно описано: http://www.argolab.net/kachestvo-modelirovaniya-99.html

Скачайте себе Tickstory Lite, файл 99.zip (в нем МT4 build 432 с патчем-start_test.bat) из статьи выше.

По поводу программы Tickstory lite:

1) устанавливаете прогу;

2) запускаете, в окне справа выбираете валютную пару правой кнопкой мышки - "Скачать"

3)выбираете дату скачивания, все пошло скачивание тиков с DucasCopy

4) как скачалось, выбираете правой кнопкой мыши все тот же скачанный инструмент и жмете - "Экспорт в МТ4"

5) в появившемся окне "Экспорт данных" выбираете дату, таймфреймы, Важно!: обязательно указывать часовой пояс который Вы используете у Вашего брокера в терминале

6) отмечаем где установлен MT4 для тестов, путь к папкам history, имя вашего брокера определятся сам


7) переходим во вкладку "Информация о метатрейдер" и там по Вашей валютной паре настраиваем обязательно спред!! (реальный спред как у Вашего брокера!), плечо, маржу, 4/5 знаков

8) жмете ок и программа сама раскидает автоматом все тиковые данные в метатрейдер в нужные папки -..."Имя сервера"/history и ...tester/history

Все потом можете запускать терминал: Терминал запускать файлом start_tester.bat

берете совов, валютную пару, тестер стратегий и проверяете, качество моделирования должно быть 99.9%

Удачи и профита!!!

Evgeniy Inkov
2692
Evgeniy Inkov 2014.03.23 06:12  

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

Vyacheslav
21
Vyacheslav 2015.09.23 11:11  
Подкрутите код, чтобы советник когда закрывает ордер по условию тут же открывался по сигналу в противоположную сторону, а то получается что он закрыл ордер по условию на втором баре, сигнал на открытие в другую сторону уже сформирован, но он его пропускает и ждет следующего сигнала. По стратегии получается что для ордера Buy условие закрытие - это условие открытие ордера Cell, но выходит что когда советник закрывает открытый ордер, он это делает на втором баре и автоматом сигнал на открытие пропущен.
19446
5
19446 2017.01.23 20:11  
Выложите, пожалуйста, советник с исправлениями в виде файла
/
Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий