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

 
Обязательно сделаю в ближайшее время, идея отличная!
 

Ок)

Как пример http://codebase.mql4.com/ru/7212

 

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

Для любителей экстрима вариант с MoneyManagement

Код советника ниже.

#property copyright "Scam Laboratory 2012" 
#property link      "http://www.forex4you.org/?affid=bdbda7b"
//=============== Меню ===============================================
extern string Name="BeerGodEA (27.06.12)";
extern string MoneyManagement = "ММ от FreeMargin + DecreaseFactor";
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.1;                // начальный лот
extern int TimeBarOpen = 15;             // время свечи для принятия решения
extern int Period_MA=20;                 // Период МА
extern int Slippage = 3;                 // Допустимое проскальзование цены
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("PA=",PA, " MA_1_t=",MA_1_t," MA_1_p=",MA_1_p," Sv_close=",sv_close," TimeBar_t=",TimeBar_t);    // Комментарий в угол окна  
   }
}//5
// =====================================================================
   return(0);
  }//0
// ================= Функции ==========================================
//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. 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)
      {
         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)
      {
         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)
      {
         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)
      {
         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:
Способ ММ нашел на каком то форуме, в открытом доступе
Ошибок рассогласования много, как бы это не с играло злую шутку.
 
с ММ прям чудеса творит...
 
BeerGod, какие настройки советника у вас ? и на каком тф ? И еще вопрос, я тестирую вашего советника на демке на нескольких парах... и он бывает открывает и тут же закрывает позы по нескольку раз... в чем причина ?
 
dimasik:
BeerGod, какие настройки советника у вас ? и на каком тф ? И еще вопрос, я тестирую вашего советника на демке на нескольких парах... и он бывает открывает и тут же закрывает позы по нескольку раз... в чем причина ?

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

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