Советники: BeerGodEA - страница 3

 

Интересный советник! Автору спасибо!

Пару вопросов.

1. Откуда взялся такой необычный алгоритм для открытия позиций? Наверное это какая-то особенность данной пары..... на других парах действительно результат неуд.

2.

BeerGod:

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

А можно немного подправить код для проверки мейджика? Куда и какую строчку вставить? А то он действительно цепляет ордера даже других пар, что не вери гуд.

Поставил на реал, версия с ММ и я вполне доволен, только период МА лучше 19 (согласно тестера). Надо бы только проверку мейджика сделать.......

 
dimasik:
а вы могли бы сделать его, чтобы он работал на нескольких парах без глюков ? на тесте получаются интересные результаты на нефти, s&p 500 и др. ... хочется проверить несколько инструментов.... рез-ты выложу


Присоединяюсь к просьбе о нескольких парах. Интересно будет также глянуть на результаты других инструментов......

Кстати когда в тестере гонял его, то ставил оптимизацию MaximumRisk, DecreaseFactor и balans. В результате можно подогнать ММ более рисковый или менее...., короче все просто и интересно! А еще пробовал оптить TimeBarOpen и самый лучший параметр для него это 15.

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

Отправил в личном сообщении.
 
dimasik:
BeerGod:
dimasik:
BeerGod, какие настройки советника у вас ? и на каком тф ? И еще вопрос, я тестирую вашего советника на демке на нескольких парах... и он бывает открывает и тут же закрывает позы по нескольку раз... в чем причина ?

Настройки по умолчанию, использую вариант с ММ, только на EUR-USD H1, на других парах и таймфреймах результат неудовлетворительный, на нескольких парах одновременно работать не планировалось и поэтому при закрытии ордера не проверяется мейджик номер.
а вы могли бы сделать его, чтобы он работал на нескольких парах без глюков ? на тесте получаются интересные результаты на нефти, s&p 500 и др. ... хочется проверить несколько инструментов.... рез-ты выложу


Добавил проверку мейджика при закрытии ордера, проверил работает на нескольких парах теперь корректно, для каждой пары нужно указывать своё "магическое число" и оптимизировать Period_MA и TimeBarOpen, а также уменьшить Slippage в случае четырехзначных котировок. Код ниже.

#property copyright "Scam Laboratory 2012" 
#property link      "http://www.forex4you.org/?affid=bdbda7b"
//=============== Меню ===============================================
extern string Name="BeerGodEA (29.06.12)";
extern string MoneyManagement = "MoneyManagement";
extern double MaximumRisk = 0.1;         // прогресия лота на каждые 1000 баланса +0.1 лот. например депозит стал 2000 лот =0.2, 3000 лот =0.3 итд
extern double DecreaseFactor = 3.0;      // если будет две убыточные сделки лот уменьшится от предыдущего деленое на DecreaseFactor
extern double balans = 1000;             // шаг баланса, баланс реинвестирования, на каждую 1000 депо будет умножатся лот на риск
extern double Lots = 0.01;               // начальный лот
extern string Indicators="Параметры индикаторов";
extern int Period_MA=20;                 // Период МА
extern int TimeBarOpen = 15;             // время свечи для принятия решения
extern string Server="Параметры сервера";
extern int Slippage = 10;                // Допустимое проскальзование цены
extern string Magic="Магическое число";
extern int mn= 100;                      // Магический номер
//============== Переменные ==========================================
string GetNameOP="BeerGodEA";            // комент в открытом ордере
double TimeBar_t;                        // текущее время свечи
double sv_close;                         // цена закрытия свечи
double PA;                               // текущая цена
double MA_1_t;                           // МА текущая
double MA_1_p;                           // МА предыдущая
double NewBuy;                           // сигнал открытия покупки
double NewSell;                          // сигнал открытия продажи
//+------------------------------------------------------------------+
//| expert initialization function                                   |
//+------------------------------------------------------------------+
int init()
{
   if (!IsTesting())
   {
      if (IsExpertEnabled())
      {
         Comment("Советник будет запущен следующим тиком");
      }
      else 
      {
         Comment("Отжата кнопка \"Разрешить запуск советников\"");
      }
   }
      
   return (0);
}
//+------------------------------------------------------------------+
//| expert deinitialization function                                 |
//+------------------------------------------------------------------+
int deinit()
  {
//----
   
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| expert start function                                            |
//+------------------------------------------------------------------+
int start()
  {//0
//======== получение данных с индикаторов и текущей цены ==============
{//1
MA_1_t=iMA(NULL,0,Period_MA,0,MODE_SMA,PRICE_CLOSE,0); // МА_1 текущая
MA_1_p=iMA(NULL,0,Period_MA,0,MODE_SMA,PRICE_CLOSE,1); // МА_1 предыдущая
TimeBar_t = (TimeCurrent()-Time[0])/60; // время в минутах с открытия свечи
sv_close = iClose(NULL,0,1); // цена закрытия свечи на предыдущем баре
PA = Bid; // получение текущей цены
RefreshRates ();
}//1  
// ================= Обработка сигналов ===============================
{//2
if ((PA < MA_1_t) && (MA_1_t < MA_1_p) && (PA < sv_close) && (TimeBar_t==TimeBarOpen))   NewBuy = 1; else NewBuy = 0; // условие BUY
if ((PA > MA_1_t) && (MA_1_t > MA_1_p) && (PA > sv_close) && (TimeBar_t==TimeBarOpen))   NewSell = 1; else NewSell = 0; // условие SELL
}//2
// ================= Открытие сделки ===================================
{//3
// открытие BUY
if ((NewBuy == 1) && (ExistPositions() == false)) OrderSend(Symbol(),OP_BUY,LotsOptimized(),Ask,Slippage,0,0,GetNameOP,mn,0,LightSkyBlue);
// открытие Sell
if ((NewSell == 1) && (ExistPositions() == false)) OrderSend(Symbol(),OP_SELL,LotsOptimized(),Bid,Slippage,0,0,GetNameOP,mn,0,HotPink);
}//3
// ================= Закрытие сделки ===================================
{//4
if (NewBuy == 1) 
{
ClossAllProfitSell ();
ClossAllLossSell();
Sleep(1000);
}
if (NewSell == 1) 
{
ClossAllProfitBuy ();
ClossAllLossBuy();
Sleep(1000);
}
}//4
// ================= Комментарии ======================================
{//5
  if (!IsTesting())
   {
     Comment("Magic=",mn, " PA=",PA, " MA_t=",MA_1_t," MA_p=",MA_1_p," Sv_close=",sv_close," TimeBar=",TimeBar_t);    // Комментарий в угол окна  
   }
}//5
// ====================================================================
   return(0);
  }//0
// =================== END ============================================
// ================= Функции ==========================================
//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 06.03.2008                                                     |
//|  Описание : Возвращает флаг существования позиций                          |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    sy - наименование инструмента   (""   - любой символ,                   |
//|                                     NULL - текущий символ)                 |
//|    op - операция                   (-1   - любая позиция)                  |
//|    mn - MagicNumber                (-1   - любой магик)                    |
//|    ot - время открытия             ( 0   - любое время открытия)           |
//+----------------------------------------------------------------------------+
bool ExistPositions(string sy="", int op=-1, datetime ot=0) {
  int i, k=OrdersTotal();
 
  if (sy=="0") sy=Symbol();
  for (i=0; i<k; i++) {
    if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {
      if (OrderSymbol()==sy || sy=="") {
        if (OrderType()==OP_BUY || OrderType()==OP_SELL) {
          if (op<0 || OrderType()==op) {
            if (mn<0 || OrderMagicNumber()==mn) {
              if (ot<=OrderOpenTime()) return(True);
            }
          }
        }
      }
    }
  }
  return(False);
}
//END
//+------------------------------------------------------------------+
//|                 Закрыть прибыльные ордера                        |
//+------------------------------------------------------------------+
// ====================== Закрыть BUY в профите ===============================
double ClossAllProfitBuy ()
{
   int Profit1=Slippage;
   int col1=Gold;
   int ask1, bid1, open1;
   double point1;
   for (int i1=OrdersTotal()-1; i1>=0; i1--)
   {
      if (!OrderSelect(i1,SELECT_BY_POS,MODE_TRADES)) break;
      if ((OrderType()==OP_BUY) && (OrderMagicNumber()==mn))
      {
         point1=MarketInfo(Symbol(),MODE_POINT);
         if (point1==0) break;
         bid1=MathRound(MarketInfo(OrderSymbol(),MODE_BID)/point1);
         open1=MathRound(OrderOpenPrice()/point1);
         if (bid1-open1<Profit1) continue;
         OrderClose(OrderTicket(),OrderLots(),bid1*point1,Slippage,col1);
      }
   }
}
// End
// ====================== Закрыть SELL в профите ===============================
double ClossAllProfitSell ()
{
   int Profit2=Slippage;
   int col2=Gold;
   int ask2, bid2, open2;
   double point2;
   for (int i2=OrdersTotal()-1; i2>=0; i2--)
   {
      if (!OrderSelect(i2,SELECT_BY_POS,MODE_TRADES)) break;
      if ((OrderType()==OP_SELL) && (OrderMagicNumber()==mn))
      {
         point2=MarketInfo(Symbol(),MODE_POINT);
         if (point2==0) break;
         ask2=MathRound(MarketInfo(OrderSymbol(),MODE_ASK)/point2);
         open2=MathRound(OrderOpenPrice()/point2);
         if (open2-ask2<Profit2) continue;
         OrderClose (OrderTicket(),OrderLots(),ask2*point2,Slippage,col2) ;
      }
   }
}
// End
//+------------------------------------------------------------------+
//|                 Закрыть убыточные ордера                         |
//+------------------------------------------------------------------+
// ====================== Закрыть BUY в убытке ===============================
double ClossAllLossBuy()
{
   int Stop4=Slippage;
   int ask4, bid4, open4;
   double point4;
   for (int i4=OrdersTotal()-1; i4>=0; i4--)
   {
      if (!OrderSelect(i4,SELECT_BY_POS,MODE_TRADES)) break;
      if ((OrderType()==OP_BUY) && (OrderMagicNumber()==mn))
      {
         point4=MarketInfo(Symbol(),MODE_POINT);
         if (point4==0) break;
         bid4=MathRound(MarketInfo(Symbol(),MODE_BID)/point4);
         open4=MathRound(OrderOpenPrice()/point4);
         if (open4-bid4<Stop4) continue;
         OrderClose(OrderTicket(),OrderLots(),bid4*point4,Slippage,Red);
      }
   }
}
// End
// ====================== Закрыть SELL в убытке ===============================
double ClossAllLossSell()
{
   int Stop5=Slippage;
   int ask5, bid5, open5;
   double point5;
   for (int i5=OrdersTotal()-1; i5>=0; i5--)
   {
      if (!OrderSelect(i5,SELECT_BY_POS,MODE_TRADES)) break;
      if ((OrderType()==OP_SELL) && (OrderMagicNumber()==mn))
      {
         point5=MarketInfo(Symbol(),MODE_POINT);
         if (point5==0) break;
         ask5=MathRound(MarketInfo(Symbol(),MODE_ASK)/point5);
         open5=MathRound(OrderOpenPrice()/point5);
         if (ask5-open5<Stop5) continue;
         OrderClose (OrderTicket(),OrderLots(),ask5*point5,Slippage,Red);
      }
   }
}
// End
//+----------------------------------------------------------------------------------------+
//| ММ Функция работает по принципу наращивания лота при увеличении                        |
//| депозита, и уменьшении лота при серии убыточных сделок лот возвращается                |
//| на начальный лот в данном случае 0.1 если происходит профит то следующий               |
//| лот расчитывается по прогресии.                                                        |
//| К примеру при депозите 500 старт лота будет равен 0.1 далее депозит                    |
//| увеличивается до 5000 лот будет равен 1 если будет две убыточные сделки                |
//| лот уменьшится от предыдущего деленое на DecreaseFactor = 3, если по далее             |
//| две сделки будут убыточные,уменьшится от предыдущего деленое на DecreaseFactor = 3,    |
//| далее если сделка будет прибыльной то следующий лот откроется из расчета               |
//| баланса депозита "баланс/500*0.1"=лот внешние переменные                               |
//+----------------------------------------------------------------------------------------+
double LotsOptimized() {
       double minlot = MarketInfo(Symbol(), MODE_MINLOT);
       double maxlot = MarketInfo(Symbol(), MODE_MAXLOT);       
       double lot = Lots;
       int orders = OrdersHistoryTotal();
       int losses = 0;
       lot = NormalizeDouble((AccountFreeMargin()- AccountCredit()) * MaximumRisk / balans, 2);
       if (DecreaseFactor > 0.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.0) break; 
if (OrderProfit() < 0.0) losses++;
}
if (losses > 1) lot = NormalizeDouble(lot - lot * losses / DecreaseFactor, 2);
}
if(lot < minlot) lot = minlot;
if(lot > maxlot) lot = maxlot; 
return (lot);} 
// End
 
BeerGod, премного благодарен
 
saban:

Интересный советник! Автору спасибо!

Пару вопросов.

1. Откуда взялся такой необычный алгоритм для открытия позиций? Наверное это какая-то особенность данной пары..... на других парах действительно результат неуд.

2.

BeerGod:

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

А можно немного подправить код для проверки мейджика? Куда и какую строчку вставить? А то он действительно цепляет ордера даже других пар, что не вери гуд.

Поставил на реал, версия с ММ и я вполне доволен, только период МА лучше 19 (согласно тестера). Надо бы только проверку мейджика сделать.......

1. Алгоритм взялся ночью под пиво, сам толком не понял как.

2. Код подправил, теперь на нескольких парах работает корректно, если на каждой паре задать свой мейджик, код на этой странице, файл для скачивания не обновляется и не добавляется.

 

 Откуда у вас такие результаты? Вот результат на котировках качества моделирования 99%. Сливает за 2011 год даже.. 

 

на 99% моделировании не идёт ни один советник, (кроме мартина), там урезанные тики.

советник можно существенно укоротить, безпотери результатов.

#property copyright "Scam Laboratory 2012"
#property link "http://www.forex4you.org/?affid=bdbda7b"
//=============== Меню ===============================================

extern string Name="BeerGodEA (25.06.12)";
extern double Lot = 0.1;
extern int TimeBarOpen = 1;
extern int Period_MA=20; // Период МА
extern int Slippage = 1;
extern int mn= 5824;

//============== Переменные ==========================================
string GetNameOP="BeerGodEA"; // комент в открытом ордере
double TimeBar_t; // текущее время свечи
double sv_close; // цена закрытия свечи
double MA_1_t; // МА текущая
double MA_1_p; // МА предыдущая
double NewBuy; // сигнал открытия покупки
double NewSell; // сигнал открытия продажи
//==============
int start()
{//0

//======== получение данных с индикаторов и текущей цены ======================
MA_1_t=iMA(NULL,0,Period_MA,0,MODE_SMA,PRICE_CLOSE,0); // МА_1 текущая
MA_1_p=iMA(NULL,0,Period_MA,0,MODE_SMA,PRICE_CLOSE,1); // МА_1 текущая
TimeBar_t = (TimeCurrent()-Time[0])/60; // время в минутах с открытия свечи
sv_close = iClose(NULL,0,1); // цена закрытия свечи на предыдущем баре

// ================= Обработка сигналов ===============================
if ((Bid < MA_1_t) && (MA_1_t < MA_1_p) && (Bid < sv_close) && (TimeBar_t==TimeBarOpen)) NewBuy = 1; else NewBuy = 0; // условие BUY
if ((Bid > MA_1_t) && (MA_1_t > MA_1_p) && (Bid > sv_close) && (TimeBar_t==TimeBarOpen)) NewSell = 1; else NewSell = 0; // условие BUY

// ================= Открытие сделки ===================================
// открытие BUY
if ((NewBuy == 1) && !(ExistPositions())) OrderSend(Symbol(),OP_BUY,Lot,Ask,Slippage,0,0,GetNameOP,mn,0,LightSkyBlue);
// открытие Sell
if ((NewSell == 1) && !(ExistPositions())) OrderSend(Symbol(),OP_SELL,Lot,Bid,Slippage,0,0,GetNameOP,mn,0,HotPink);


// ================= Закрытие сделки ===================================
if (NewBuy == 1)
{
ClossAllProfitSell();
//ClossAllLossSell();
}

if (NewSell == 1)
{
ClossAllProfitBuy ();
//ClossAllLossBuy();
}
// ================= Комментарии ======================================
Comment("Работаем :)"); // Комментарий в угол окна

// =====================================================================
return(0);
}//0
// ================= Функции ==========================================
//+----------------------------------------------------------------------------+
//| Автор : Ким Игорь В. aka KimIV, http://www.kimiv.ru |
//+----------------------------------------------------------------------------+
//| Версия : 06.03.2008 |
//| Описание : Возвращает флаг существования позиций |
//+----------------------------------------------------------------------------+
//| Параметры: |
//| sy - наименование инструмента ("" - любой символ, |
//| NULL - текущий символ) |
//| op - операция (-1 - любая позиция) |
//| mn - MagicNumber (-1 - любой магик) |
//| ot - время открытия ( 0 - любое время открытия) |
//+----------------------------------------------------------------------------+
bool ExistPositions() {
for (int i=0; i<OrdersTotal(); i++) {OrderSelect(i,0);
if(Symbol()!=OrderSymbol()||OrderMagicNumber()!=mn) continue;
return(True);} return(False);}

//END

//+------------------------------------------------------------------+
//| Закрыть ордера |
//+------------------------------------------------------------------+
// ====================== Закрыть BUY в профите ===============================
double ClossAllProfitBuy ()
{ for (int i=0; i<OrdersTotal(); i++) {OrderSelect(i,0);
if(Symbol()!=OrderSymbol()||OrderMagicNumber()!=mn) continue;
if (OrderType()==OP_BUY)OrderClose(OrderTicket(),OrderLots(),Bid,Slippage,Gold);}
}

// ====================== Закрыть SELL в профите ===============================
double ClossAllProfitSell ()
{ for (int i=0; i<OrdersTotal(); i++) {OrderSelect(i,0);
if(Symbol()!=OrderSymbol()||OrderMagicNumber()!=mn) continue;
if (OrderType()==OP_SELL)OrderClose (OrderTicket(),OrderLots(),Ask,Slippage,Gold);}
}
// End

 
а кто может этот код сделать под mq5 ? говорят там тестер получше...
Причина обращения: