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

 
snhih:
Ale-xander:
Можно научить советник не закрывать чужие ордеры? Хочется погонять его на реале. Но он закрывает мои ордеры если наши направления не сходятся.

Можно.

Найди в программе процедуры ClossAllProfitSell(), ClossAllLossSell(), ClossAllProfitBuy(), ClossAllLossBuy(). В каждой из них найди строчку, заканчивающуюся на continue. После этой строчки вставь строку:

if (OrderMagicNumber()!=mn) continue;

Точка с запятой в конце строки обязательна!

Сегодня проверил. Работает.


Спасибо, попробую

 
Относительная просадка 96.14% - однозначно подгонка под историю!!!
 
В нынешнем виде этот стейт - фикция. Решение об октрытии ордера принмается ВНУТРИ бара, а не на открытии, а следовательно - на синтетических тиках тестера. Месяц прогонки алгоритма на демо не дал никакого прироста депо, просадки на новостных скачках евры чудовищные. Нужно дорабатывать однозначно.
 
wmlab:
В нынешнем виде этот стейт - фикция. Решение об октрытии ордера принмается ВНУТРИ бара, а не на открытии, а следовательно - на синтетических тиках тестера. Месяц прогонки алгоритма на демо не дал никакого прироста депо, просадки на новостных скачках евры чудовищные. Нужно дорабатывать однозначно.

Не всё так плохо. У меня этот советник стоит на реале с 23 июля. Тест по истории совпадает с реальным стейтом. Это первое.

Второе. Если тестировать советника только на 2012 году, видно, что есть удачные и неудачные месяцы. Угроза слива в январе-феврале, нулевой результат за март-апрель, удачные май-июнь, и снова плохой июль. Как-то так.

А насчёт дорабатывать - есть какие-то мысли на этот счёт? Что можно добавить или переделать? Я не автор, но мне этот советник нравится. Хочется, чтобы он и доход приносил.

 

Подводим итоги.

Июль - закрылся в ноль почти (примерно минус 1 процент). Гонял версию со СЛ, часто срабатывали.

Посмотрим на август.

 
johndk:

Подводим итоги.

Июль - закрылся в ноль почти (примерно минус 1 процент). Гонял версию со СЛ, часто срабатывали.

Посмотрим на август.


Кто может изменить последний код, что бы советник работал отложенными ордерами (sell limit bailimit), алгоритм оставить тот же, растояние в пунктах до отложенного ордера вынести в настройки для тестирования, просадки можно будет уменьшить намного, пусть некоторые ордера не сработают, зато просабдок меньше будет?
 

Последняя версия с учетом пожеланий, с лимитниками поэкспериментирую. Настройки для пятизначных ДЦ.

#property copyright "Scam Laboratory 2012" 
#property link      "http://www.forex4you.org/?affid=bdbda7b"
//=============== Меню ===============================================
extern string Name="BeerGodEA (08.08.2012)";
extern string MoneyManagement = "MoneyManagement";
extern double MaximumRisk = 0.1;         // прогресия лота на каждые 1000 баланса +0.1 лот. например депозит стал 2000 лот =0.2, 3000 лот =0.3 итд
extern double DecreaseFactor = 10.0;     // если будет две убыточные сделки лот уменьшится от предыдущего деленое на DecreaseFactor
extern double balans = 1000;             // шаг баланса, баланс реинвестирования, на каждую 1000 депо будет умножатся лот на риск
extern double Lots = 0.1;                // начальный лот
extern string Indicators="Параметры индикаторов";
extern int Period_MA=20;                 // Период МА
extern int TimeBarOpen = 15;             // время свечи для принятия решения
extern string TradeManagement="Управление торговлей";
extern bool BUY = true;                  // разрешить BUY
extern bool SELL = true;                 // разрешить SELL
extern int TakeProfit = 1650;            // фиксированный профит
extern int StopLoss = 950;               // фиксированный стоп
extern int MinTP = 50;                   // минимальный тейк профит 
extern int MinSL = 50;                   // минимальный стоп лосс
extern string TradeTime="Время торговли (по ДЦ)";
extern int MondayStart = 0;              // (8)(9) открытие первой сделки не раньше этого времени по ДЦ
extern int FridayStop = 20;
extern int FridayClose = 22;
extern string Server="Параметры сервера";
extern int Slippage = 10;                // Допустимое проскальзование цены
extern int Pause = 1000;                 // пауза между запросами на сервер
extern string Magic="Магическое число";
extern int MagicNumber = 0;              // Магический номер
//============== Переменные ==========================================
string GetNameOP="BeerGodEA";            // комент в открытом ордере
double TimeBar_t;                        // текущее время свечи
double sv_close;                         // цена закрытия свечи
double PA;                               // текущая цена
double MA_1_t;                           // МА текущая
double MA_1_p;                           // МА предыдущая
double NewBuy;                           // сигнал открытия покупки
double NewSell;                          // сигнал открытия продажи
double Trade;                            // разрешение или запрет работы
int mn;                                  // мейджик в зависимости от валютной пары
int timeplus;                            // время для валютной пары
int stoplevel;                           // текущий уровень стопов
int spread;
//+------------------------------------------------------------------+
//| 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
//======== Magic в зависимости от валютной пары ==============================
{ //1
if(Symbol()=="EURUSD") 
   {
      mn=(100+MagicNumber);
      timeplus=0;
   }
if(Symbol()=="GBPUSD")
   {
      mn=(200+MagicNumber);
      timeplus=1;
   }
if(Symbol()=="AUDUSD")
   {
      mn=(300+MagicNumber);
      timeplus=2;
   }
if(Symbol()=="USDCAD")
   {
      mn=(400+MagicNumber);
      timeplus=3;
   }
if(Symbol()=="USDCHF")
   {
      mn=(500+MagicNumber);
      timeplus=4;
   }
if(Symbol()=="USDJPY")
   {
      mn=(600+MagicNumber);
      timeplus=5;
   }
        
} //1
//======== получение данных с индикаторов и текущей цены ======================
{//2
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; // получение текущей цены
spread =  MarketInfo(Symbol(),MODE_SPREAD);
stoplevel =  MarketInfo(Symbol(),MODE_STOPLEVEL); // уровень стопов
RefreshRates ();
}//2  
// ================= Обработка сигналов ===============================
{//3
if ((PA < MA_1_t) && (MA_1_t < MA_1_p) && (PA < sv_close) && (TimeBar_t==(TimeBarOpen+timeplus)))   NewBuy = 1; else NewBuy = 0; // условие BUY
if ((PA > MA_1_t) && (MA_1_t > MA_1_p) && (PA > sv_close) && (TimeBar_t==(TimeBarOpen+timeplus)))   NewSell = 1; else NewSell = 0; // условие SELL
// ======= вычисляем время торговли ======
// (воскресенье-0,1,2,3,4,5,6)
if((DayOfWeek() == 1 && Hour() >= MondayStart) ||DayOfWeek() == 2 || DayOfWeek() == 3 || DayOfWeek() == 4 || (DayOfWeek() == 5 && Hour() < FridayStop)) Trade = 1; else Trade = 0;
}//3
// ================= Открытие сделки ===================================
{//4
// открытие BUY
if ((NewBuy == 1) && (ExistPositions() == false) && (Trade == 1) && (BUY==true))
   {
      OrderSend(Symbol(),OP_BUY,LotsOptimized(),Ask,Slippage,0,0,GetNameOP,mn,0,Blue);
      Sleep (Pause);
      OrderModify(GetTicketLastPos(),OrderOpenPrice(),(Ask-Point*StopLoss),(Ask+Point*TakeProfit),0,Red);
   }
// открытие Sell
if ((NewSell == 1) && (ExistPositions() == false) && (Trade == 1) && (SELL==true))
   {
      OrderSend(Symbol(),OP_SELL,LotsOptimized(),Bid,Slippage,0,0,GetNameOP,mn,0,OrangeRed);
      Sleep (Pause);
      OrderModify(GetTicketLastPos(),OrderOpenPrice(),(Bid+Point*StopLoss),(Bid-Point*TakeProfit),0,Red);
   }
}//5
// ================= Закрытие сделки ===================================
{//6
if (NewBuy == 1) 
   {
      ClossAllProfitSell ();
      ClossAllLossSell();
      Sleep(Pause);
   }
if (NewSell == 1) 
   {
      ClossAllProfitBuy ();
      ClossAllLossBuy();
      Sleep(Pause);
   }
if (DayOfWeek() == 5 && Hour() >= FridayClose) // закрываем в пятницу вечером все прибыльные ордера
   {
      ClossAllProfitBuy ();
      ClossAllProfitSell ();
      Sleep(Pause);
   }
}//6
// ================= Комментарии ======================================
{//7
if (!IsTesting())
   {
     Comment("Magic=",mn, " PA=",PA, " MA_t=",MA_1_t," MA_p=",MA_1_p," Sv_close=",sv_close," TimeBar=",TimeBar_t," Spread=",spread," StopLevel=",stoplevel);    // Комментарий в угол окна  
   }
}//7
// =====================================================================
   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=MinTP;
   int col1=Lime;
   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=MinTP;
   int col2=Lime;
   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=MinSL;
   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=MinSL;
   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);} 
//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 19.02.2008                                                     |
//|  Описание : Возвращает тикет последней открытой позиции или -1             |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    sy - наименование инструмента   (""   - любой символ,                   |
//|                                     NULL - текущий символ)                 |
//|    op - операция                   (-1   - любая позиция)                  |
//|    mn - MagicNumber                (-1   - любой магик)                    |
//+----------------------------------------------------------------------------+
int GetTicketLastPos(string sy="", int op=-1) {
  datetime o;
  int      i, k=OrdersTotal(), r=-1;
  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 (o<OrderOpenTime()) {
                o=OrderOpenTime();
                r=OrderTicket();
              }
            }
          }
        }
      }
    }
  }
  return(r);
}
// END
 

Приветствую! Читал эмоции по поводу советника! Они удалены. "Умников" много.Кто кидается терминами, в итоги знает только верхушки.А вообще смотрю, на этом сайте только обхаить могут, а предложить, очень мало. Поэтому предлагаю ниже. Прогнал за 3 месяца. Сделки открывает редко. На GBPUSD. Все урезаное и навалом. Грамотные люди распишут. Код вообще не трогал.Хотя и так работает.Только ZUP надо найти.

int Balans =AccountBalance();
double TP=Bid - tp * Point;
//---- Для оптимизации убираем "пустые" варианты
if (Time[0] == prevtime) return(0);
prevtime = Time[0];

if (! IsTradeAllowed()) {
prevtime = Time[1];
MathSrand(TimeCurrent());
Sleep(30000 + MathRand());
}
datetime some_time;
int bigshift, i;
//======== получение данных с индикаторов и текущей цены ======================
{//1
for( i=0; i<=12-1; i++)
{
int tp = 100;
int total=0;
bool Buy_on;
bool Sell_on;
Buy_on = FALSE;
Sell_on = FALSE;
int timef = 12;
some_time=iTime(NULL,0,i);
bigshift=iBarShift(NULL,1440,some_time);
double P3;
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; // получение текущей цены
P3=iClose(Symbol(),1440,2) - iCustom(NULL,240,"ZUP",5,0,bigshift);
total= OrdersTotal();
Sell_on=NewSell;

//---
RefreshRates ();
}}//1
static datetime sd;
if ( CurTime()-sd>timef*60*Period() )
{
// ================= Обработка сигналов ===============================
{//2
if ((PA < MA_1_t) && (MA_1_t < MA_1_p) && (PA < sv_close) && (TimeBar_t==TimeBarOpen)&& P3<-0.1 && P3<0) NewBuy = 1; else NewBuy = 0; // && P3<0.1 && P3>0
if ((PA > MA_1_t) && (MA_1_t > MA_1_p) && (PA > sv_close) && (TimeBar_t==TimeBarOpen)&& P3<0.1 && P3>0) NewSell = 1; else NewSell = 0; // && P3<-0.1 && P3<0
}//2

// ================= Открытие сделки ===================================
{//3
if (total<5){Sell_on = FALSE;}
if (OrdersProfitSell()>Balans){NewSell = 1;}
if ((NewBuy == 1) && (ExistPositions() == false)) OrderSend(Symbol(),OP_BUY,Lot,Ask,Slippage,0,0,GetNameOP,mn,0,LightSkyBlue);
// открытие Sell
if ((NewSell == 1) && (ExistPositions() == false)) OrderSend(Symbol(),OP_SELL,Lot,Bid,Slippage,0,TP,GetNameOP,mn,0,HotPink);

}}
Comment("Работаем :)",
"\n P3 =",P3,
"\n Oрдер =",total,
"\n Прибыль Sell =",OrdersProfitSell()
); // Комментарий в угол окна
// ================= Закрытие сделки ===================================

{//4

if (NewBuy == 1)
{
ClossAllProfitSell ();
ClossAllLossSell();
}

if (NewSell == 1)
{
ClossAllProfitBuy ();
ClossAllLossBuy();
}

}//4
// ================= Комментарии ======================================

{//5

Comment("Работаем :)",
"\n P3 =",P3,
"\n Oрдер =",total,
"\n Прибыль Sell =",OrdersProfitSell()
); // Комментарий в угол окна


}//5
// =====================================================================
return(0);
}//0
double OrdersProfitSell()
{

double rezultSymb=0;
string SYM=Symbol();
int i;
for (i=OrdersTotal()-1;i>=0;i--)
{
if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES) == true)
{
if(OrderSymbol()!= SYM) continue;
if(OrderType()==OP_SELL)
{
rezultSymb+=OrderProfit();
}
}
}
return(rezultSymb);


}

 
villy:

Приветствую! Читал эмоции по поводу советника! Они удалены. "Умников" много.Кто кидается терминами, в итоги знает только верхушки.А вообще смотрю, на этом сайте только обхаить могут, а предложить, очень мало. Поэтому предлагаю ниже. Прогнал за 3 месяца. Сделки открывает редко. На GBPUSD. Все урезаное и навалом. Грамотные люди распишут. Код вообще не трогал.Хотя и так работает.Только ZUP надо найти.

Не поделитесь ссылкой на ZUP, который вы используете?)
 

Спасибо администраторам!!! Кое-что забыл. NewSell у меня и близко нет,меня подкоректировали. Забыл, честное слово.

int NewBuy = TotalBuy(Magic555);
int NewSell= TotalSell(Magic666);

int TotalBuy(int magic_R) {
int A = 0;
for (int position = 0; position < OrdersTotal(); position++) {
if (!(OrderSelect(position, SELECT_BY_POS, MODE_TRADES))) break;
if (OrderSymbol() == Symbol() && OrderMagicNumber() == magic_R && OrderType() == OP_BUY) A++;
}
return (A);
}

int TotalSell(int magic_R) {
int B = 0;
for (int position = 0;position < OrdersTotal(); position++) {
if (!(OrderSelect(position, SELECT_BY_POS, MODE_TRADES))) break;
if (OrderSymbol() == Symbol() && OrderMagicNumber() == magic_R && OrderType() == OP_SELL) B++;
}
return (B);
}

Точно будет работать.

Также немножко изменить, можно применить и к BUYSTOP и к BUYLIMIT .

А ZUP, брал на этом сайте, ZUP_V60.