Доработка ботов (советников, индикаторов) vol. 2

coler

Интересующийся
create ea with indi

hello friend. replace plasse beforex.mq4 on ea Zig_dan_Zag_Danu_Ultimate_Investment_Long_Term. THX
 

Вложения

  • beforex.mq4
    7,7 КБ · Просмотры: 85
  • Zig_dan_Zag_Danu_Ultimate_Investment_Long_Term.mq4
    88,9 КБ · Просмотры: 107

gek

Элитный участник
Завтра посмотрю на свежую голову, голова уже не варит :)
Можно вынести эти значения в настройки, оставив там минимальные

Посмотри пожалуйста,как можно тейк,стоп и трал у него регулировать.
Довольно интересный советник.:)
 

cros84

Местный житель
Уважаемые программисты . если возможно сделайте индикатор MTF
 

Вложения

  • METRO.mq4
    3,2 КБ · Просмотры: 41

MAYORZ

Местный знаток
Здравствуйте! Обозначьте пожалуйста появление ступеньки алертом и звуком.
 

Вложения

  • XO clean.mq4
    2,7 КБ · Просмотры: 38

trium

Местный житель
Уважаемые специалисты!
Очень нужно, чтобы вы совместили два индикатора в одном. На вскидку, даёт очень неплохие результаты!
Спасибо! ;)
 

Вложения

  • DPO.mq4
    1,5 КБ · Просмотры: 67
  • MACD Color 1.mq4
    2,9 КБ · Просмотры: 67

djasper

Интересующийся
Помогите исправит фунцию мартина в сове
Код:
//------------------------------------------------------------------
#property copyright "www.forex-tsd.com"
//------------------------------------------------------------------
//
//-----------------------условия марина------------------------
extern double LotSize = 1.0;                	// Величина торгуемого лота
extern bool MM = true;                    // использовать ли мартингейл
extern double LotExponent = 7;            // на сколько умножать убыточный лот
extern int LotExponentStart = 1;          // после какой по счёту убыточной сделки включать мартингейл
extern int LotExponentMax = 3;            // сколько раз умножать лот
//-------------------------------------------------------------------
extern int ma1per=5;
extern int ma2per=20;
extern int ma3per=50;
extern int ma4per=50;

extern string Name_Expert       = "Rsi Trader";
extern bool   UseAutoMagic      = true;
extern int    ManualMagic       = 28282828;  
extern double StopLoss         = 100;
extern double TakeProfit       = 100;
extern int    Slippage          = 5;
extern double Lots              = 0.1;
extern double MaximumRisk       = 0;
extern double DecreaseFactor    = 3;
//
bool dummyResult;
string s_symbol;

int    MAGIC;
int digit,STOPLEVEL; 

double point = 1;

//
int init() 
{
  s_symbol = Symbol();
  
  digit = MarketInfo(s_symbol,MODE_DIGITS);
  if (digit==2 || digit==4) point = 1;
  if (digit==3 || digit==5) point = 10;
  if (digit==6)             point = 100;
  
  if (UseAutoMagic) MAGIC = ManualMagic;
              else  MAGIC = ManualMagic;  
              
return(0);
}

//
//

int start()
{
  double ma1 = iMA (NULL,0,ma1per,0,MODE_EMA,PRICE_CLOSE,1);
  double ma2 = iMA (NULL,0,ma2per,0,MODE_EMA,PRICE_CLOSE,1);
  double ma3 = iMA (NULL,0,ma3per,0,MODE_EMA,PRICE_CLOSE,1);
  double ma4 = iMA (NULL,0,ma4per,0,MODE_EMA,PRICE_CLOSE,1);
   //
   if (!ExistPositions())
   {
      
     if(ma1<ma2 && ma2>ma3 && ma3>ma4 )  
     {
       OpenBuy();
       return(0);
     }

     if(ma1>ma2 && ma2<ma3 && ma3<ma4 )
     {
       OpenSell();
       return(0);
     }
      
   }
  
return (0);
}

//
bool ExistPositions() {
	for (int i=0; i<OrdersTotal(); i++) {
		if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {
			if (OrderSymbol() == s_symbol && OrderMagicNumber() == MAGIC) {
				return(true);
			}
		} 
   }
return(false);
}

//
void OpenBuy() 
{ 
    
   double lbStop = 0; if (StopLoss>0)   lbStop = NormalizeDouble(Ask-StopLoss  *Point*point,digit);
   double lbTake = 0; if (TakeProfit>0) lbTake = NormalizeDouble(Ask+TakeProfit*Point*point,digit);
  
    dummyResult = OrderSend(s_symbol,OP_BUY,LotsOptimized(StopLoss),NormalizeDouble(Ask,Digits),Slippage,lbStop,lbTake,Name_Expert,MAGIC,0); 
  
    }		       

void OpenSell() 
{ 
   double lsStop = 0; if (StopLoss>0)   lsStop = NormalizeDouble(Bid+StopLoss  *Point*point,digit);
   double lsTake = 0; if (TakeProfit>0) lsTake = NormalizeDouble(Bid-TakeProfit*Point*point,digit);
   
   dummyResult = OrderSend(s_symbol,OP_SELL,LotsOptimized(StopLoss),NormalizeDouble(Bid,Digits),Slippage,lsStop,lsTake,Name_Expert,MAGIC,0); 
   
} 


//
double LotsOptimized(double stopLoss)
{
   double lot_min  = MarketInfo(s_symbol,MODE_MINLOT);
   double lot_max  = MarketInfo(s_symbol,MODE_MAXLOT);
   double lot_step = MarketInfo(s_symbol,MODE_LOTSTEP);
   double contract = MarketInfo(s_symbol,MODE_LOTSIZE);
   double lot      = Lots;
   int    orders   = HistoryTotal();     // history orders total
   int    losses   = 0;                  // number of losses orders without a break
   
   //
   //
   //
   //
   //
   
   if(lot_min < 0.0 || lot_max <= 0.0 || lot_step <= 0.0) 
   {
      Print("CalculateVolume: invalid MarketInfo() results [",lot_min,",",lot_max,",",lot_step,"]");
      return(0);
   }
   if(AccountLeverage()<=0)
   {
      Print("CalculateVolume: invalid AccountLeverage() [",AccountLeverage(),"]");
      return(0);
   }
   
   //
   //
   //
   //
   //
   
   if (MaximumRisk > 0 && stopLoss>0)
   {
      double pipMultiplier=1;
      int tdigit  = MarketInfo(s_symbol,MODE_DIGITS);
         if (tdigit==2 || tdigit==4) pipMultiplier = 1;
         if (tdigit==3 || tdigit==5) pipMultiplier = 10;
         if (tdigit==6)              pipMultiplier = 100;
      double _point = MarketInfo(s_symbol,MODE_POINT);
         lot = AccountFreeMargin()*(MaximumRisk/100.0)/(stopLoss*pipMultiplier*MarketInfo(s_symbol,MODE_TICKVALUE));
   }
   
   //+++++++++++++++++++++++++++++++++мартин надо исправить +++++++++++++++++++++++++++++++++++++++++++
   if (MM)
  {
     lots = LotSize;
     int ct = 0;
     for (int c=1;c<=OrdersTotal();c++)
     {
        OrderSelect(OrdersTotal()-c,SELECT_BY_POS,MODE_TRADES);
        if (OrderMagicNumber() != MAGIC) continue;
        ct+=1; break;
     }

     if (ct == 0)
     {
        int clt = 0;
        for (int co=1;co<=OrdersHistoryTotal();co++)
        {
           OrderSelect(OrdersHistoryTotal()-co,SELECT_BY_POS,MODE_HISTORY);
           if (OrderMagicNumber() != MAGIC) continue;
           if (OrderProfit() < 0) { clt+=1; if (clt < LotExponentStart+LotExponentMax) { lot = OrderLots(); } } else break;
        }

        if (clt >= LotExponentStart && LotExponentMax != 0)
        {
           clt = 0;
           int mult = 0;
           for (int co2=1;co2<=OrdersHistoryTotal();co2++)
           {
              OrderSelect(OrdersHistoryTotal()-co2,SELECT_BY_POS,MODE_HISTORY);
              if (OrderMagicNumber() != MAGIC) continue;
              if (OrderProfit() < 0) { clt+=1; if (clt >= LotExponentStart) { lot*=LotExponent; mult+=1; } }
              if (OrderProfit() >= 0) break;
           }
           if (mult <= LotExponentMax) lots = lot;
        }
     }
  }
  //+++++++++++++++++ конец мартина ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
   
   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()!= s_symbol || OrderType() > OP_SELL) continue;
      
        //
        //
        //
        //
        //
      
        if(OrderProfit() > 0) break;
        if(OrderProfit() < 0) losses++;
        }
        if(losses>1) lot=NormalizeDouble(lot - lot * losses/DecreaseFactor,2);
   }
   
   //
   //
   //
   //
   //
   
   lot=NormalizeDouble(lot/lot_step,0)*lot_step;
   if(lot<lot_min) lot=lot_min;
   if(lot>lot_max) lot=lot_max;
return(lot);
} 

//*******************************************
 

MrGreen86

Гуру форума
Уважаемые специалисты!
Очень нужно, чтобы вы совместили два индикатора в одном. На вскидку, даёт очень неплохие результаты!
Спасибо! ;)

чем они вас по отдельности не устраивают? оО
что вы хотите получить соеденив их?
 

trium

Местный житель
чем они вас по отдельности не устраивают? оО
что вы хотите получить соеденив их?
Совершенно верно! Они чуть-чуть расходятся относительно друг друга. Хотелось-бы устранить эту проблему сделав один индикатор на основе этих двух. ;)
 

djasper

Интересующийся
Это шаблон совы к которому надо прикрепить функцию мартина: Посмотреть вложение martin rsi.mq4
Вот сама функция которую хочу вставить в сову:
HTML:
extern bool MM = true;                    // использовать ли мартингейл
extern double LotExponent = 7;            // на сколько умножать убыточный лот
extern int LotExponentStart = 1;          // после какой по счёту убыточной сделки включать мартингейл
extern int LotExponentMax = 3;            // сколько раз умножать лот

extern bool uplot = true;					// вкл/выкл изменение величины лота
extern double lotmin = 0.1;					// начальное значение
extern double lotmax = 0.7;					// потолок
extern double lotstep = 0.1;				// приращение лота 
extern int lastprofit = 1; 					// принимает значения -1/1. 
											// -1 - увеличение лота после минусовой сделки до первой плюсовой.
											// 1 - увеличение лота после плюсовой сделки до первой минусовой.
//--------------------------------------------------------
double GetLots() { 
  if (MM)
  {
     lots = LotSize;
     int ct = 0;
     for (int c=1;c<=OrdersTotal();c++)
     {
        OrderSelect(OrdersTotal()-c,SELECT_BY_POS,MODE_TRADES);
        if (OrderMagicNumber() != Magic) continue;
        ct+=1; break;
     }

     if (ct == 0)
     {
        int clt = 0;
        for (int co=1;co<=OrdersHistoryTotal();co++)
        {
           OrderSelect(OrdersHistoryTotal()-co,SELECT_BY_POS,MODE_HISTORY);
           if (OrderMagicNumber() != Magic) continue;
           if (OrderProfit() < 0) { clt+=1; if (clt < LotExponentStart+LotExponentMax) { lot = OrderLots(); } } else break;
        }

        if (clt >= LotExponentStart && LotExponentMax != 0)
        {
           clt = 0;
           int mult = 0;
           for (int co2=1;co2<=OrdersHistoryTotal();co2++)
           {
              OrderSelect(OrdersHistoryTotal()-co2,SELECT_BY_POS,MODE_HISTORY);
              if (OrderMagicNumber() != Magic) continue;
              if (OrderProfit() < 0) { clt+=1; if (clt >= LotExponentStart) { lot*=LotExponent; mult+=1; } }
              if (OrderProfit() >= 0) break;
           }
           if (mult <= LotExponentMax) lots = lot;
        }
     }
  }
  else
  {
     lots = lots;
     if (!uplot) return (lots);
  
     int ticket = GetLastOrderHist();
     if (ticket == -1) return (lots);
  
     if (!OrderSelect(ticket, SELECT_BY_TICKET, MODE_HISTORY)) return (lots);
     if (OrderProfit()*lastprofit < 0) return (lots);
  
     lots = MathMin(OrderLots() + lotstep, lotmax);
  }
  return(lots);
}
int GetLastOrderHist(int type = -1) {
  int ticket = -1;
  datetime dt = 0;
  int cnt = HistoryTotal();
    
  for (int i=0; i < cnt; i++) {
    if (!OrderSelect(i, SELECT_BY_POS, MODE_HISTORY)) continue;
//Опционально
    if (OrderSymbol() != Symbol()) continue;
//Опционально
    if (OrderMagicNumber() != Magic) continue;
    if (type != -1 && OrderType() != type) continue;
    
    if (OrderCloseTime() > dt) {
      dt = OrderCloseTime();
      ticket = OrderTicket();
    }
  }
return (ticket);
}

Помогите кто чем может
 

MrGreen86

Гуру форума
Совершенно верно! Они чуть-чуть расходятся относительно друг друга. Хотелось-бы устранить эту проблему сделав один индикатор на основе этих двух. ;)
я могу сделать 100500 вариантов одного индикатора из этиз двух. вам какой по счету?
 

MrGreen86

Гуру форума
Это шаблон совы к которому надо прикрепить функцию мартина: Посмотреть вложение 222592

добавил в ваш советник мартин по настройкам которые были в вашей функции.
в настройке martin_type выбирается тип мартингейла -
m_none - выключен
m_DecreaseFactor - тот который был в советнике
m_simple - тот который добавил я.
пробуйте.
Посмотреть вложение martin rsi.mq4
 

mobidik

-----
Мне много не надо. ;)

Просто совместите у этих индикаторов отметку 0, чтобы она не куда не уходила. :)

Тогда все очень просто, отдельно в каждом индикаторе нужно выставить одинаковое значение закрепления для мак/мин. Тогда уровень "0" у индикаторов совпадет.
 

Вложения

  • Var.png
    Var.png
    102,4 КБ · Просмотры: 173

djasper

Интересующийся
добавил в ваш советник мартин по настройкам которые были в вашей функции.
в настройке martin_type выбирается тип мартингейла -
m_none - выключен
m_DecreaseFactor - тот который был в советнике
m_simple - тот который добавил я.
пробуйте.
Посмотреть вложение 222595
Установил LotExponentMax=3, 2 раза умножил, а 3-й раз лот остался такимже и 4-й тоже а должен если LotExponentMax=3 при лоте 0.1 следующая сделка 0.2 затем 0.4 и 0.8 и вне зависимости от результата после объёма в 0.8 лот должен стать опять 0.1
 

Вложения

  • MetaTrader - EXNESS.png
    MetaTrader - EXNESS.png
    37 КБ · Просмотры: 49

trium

Местный житель
Тогда все очень просто, отдельно в каждом индикаторе нужно выставить одинаковое значение закрепления для мак/мин. Тогда уровень "0" у индикаторов совпадет.
А как определить каждому индикатору значения мин. и макс? Тем более для каждой отдельной пары.
 

mobidik

-----
А как определить каждому индикатору значения мин. и макс? Тем более для каждой отдельной пары.

Набросили индюк на график, в настройках по закреплению уровней выбрать большие из двух значений и его установить для меньшего, при этом не забываем о +/-. Подбирать нужно для каждой пары и ТФ. А вот когда у Вас будет уже система на основании выбранных индюков, тогда имеет смысл их связать, да бы не заморачиваться с этими настройками. А так, для пробы/теста можно и таким образом поработать, имхо.
 

Tovmas

Прохожий
Здравствуйте! У меня проблема с советником, а, может, правильнее сказать, с терминалом, так как советник отлично работает на МТ4 брокера Pepperstone, но не работает на терминале Roboforex. В чём может быть проблема? Прошу помочь. Спасибо!
 
Верх