Вопросы от начинающих MQL5 MT5 MetaTrader 5 - страница 837

 
Aleksey Vyazmikin:


Всё верно, мне нужно при тестировании держать одну сумму на балансе, снимать прирост, робот без реинвестирования, и торгует сеткой по мартингейлу, поэтому в рынке постоянно открытые сделки

 
Denis Pershin:

Всё верно, мне нужно при тестировании держать одну сумму на балансе, снимать прирост, робот без реинвестирования, и торгует сеткой по мартингейлу, поэтому в рынке постоянно открытые сделки

Ну, в любом случае логика не меняется, запомнили начальный баланс и мониторим прирост и просадку, потом снимаем... по коду нужно что-то?

 
Aleksey Vyazmikin:

   Если вам не сложно,помогите дописать код:

// dep=нач.депозит, growth=прирост %, _dd=допустимая просадка %
void Withdraw(double _dep=500, double _growth=10, double _dd=5) {
  double _bal=AccountInfoDouble(ACCOUNT_BALANCE);
  double _eq=AccountInfoDouble(ACCOUNT_EQUITY);
  double _ldd="что сюда?";
  
   if(_ldd < _dd) TesterWithdrawal(_bal-dep); // Снимаем: баланс - нач.депозит
 }
 
Denis Pershin:

   Если вам не сложно,помогите дописать код:

В расчёт нужно брать свободную маржу, а не эквити!

Может получится ситуация, когда по средствам позволяет просадка снять прибыль с баланса, но при этом задействована большая маржа, и после снятия просадка будет больше ваших 5%

Формулами в коде сейчас не помогу, может кто другой подключится и напишет вам код, здесь не долго, но нужно немного помыслить)
 
Denis Pershin:

   Если вам не сложно,помогите дописать код:

Я не понимаю... Вам нужна формула для вычисления процента средств от баланса?

_ldd=100-_eq/_bal*100;
 
Denis Pershin:

   Если вам не сложно,помогите дописать код:

Вот, держите. Логика та, которую Я предложил, если что не так - исправим:

//===============================================================================================
//--------------------------------- Снимает прибыль в тестере ----------------------------------+
//===============================================================================================
void Withdraw(double _dep=500, double _growth=10, double _dd=5) {
 double _now_bal=0,_now_mg=0,_now_pr=0,_surplus=0,_GR=0,_DR=0;
 _now_bal= AccountInfoDouble(ACCOUNT_BALANCE);
 _now_mg = AccountInfoDouble(ACCOUNT_MARGIN_FREE);
 _now_pr = _now_bal-_dep; // Сумма к снятию
 _surplus= _now_mg-_now_pr; // Считаем остаток после снятия
 _GR = (_now_bal-_dep)/_dep*100; // Прирост %
 _DR = (_surplus-_dep)/_dep*100; // Просадка %
 //Comment(DTS(_GR,2)," = ",DTS(_DR,2));
  if(_GR>_growth && _DR<_dd) TesterWithdrawal(_now_pr); // Снимаем
 }
 
Vitaly Muzichenko:


Спасибо,то что нужно)
 
Nilog:

Есть файл индикатора только в ex5. 

Можно ли с помощью функции iCustom сделать из него мультитаймфреймный индикатор? Ну, чтобы он брал значения из ex5 с других периодов и рисовал их на текущем графике?

Можно.

 

В mql4 я с помощью iCustom спокойно делал индикаторы, использующие чьи-то готовые индикаторы, хоть и ничего не понимаю в программировании... хватало интуиции. А в mql5 ничего не получается, как ни пытаюсь разобраться. Помогите, пожалуйста.

Есть вот этот индикатор в ex5. Положил его в папку Downloads. Хочу брать обе его линии и рисовать на графике в других периодах, ну, то есть, сделать его мультитаймфреймным с помощью iCustom.

Поскольку с нуля написать индикатор не могу, взял код простого индикатора Bears Power. Ничего там особо не менял, кроме того, что поменял indicator_chart_window и DRAW_LINE, а также строчку, которая, в моем понимании, должна вытаскивать данные первого буфера с параметрами по умолчанию на текущем ТФ:

ExtBearsBuffer[i]=iCustom(NULL,0,"Downloads\\RSI Analytics");

Все компилируется, ничего не рисуется. Чего ему еще надо? :( 

#property copyright   "2009, MetaQuotes Software Corp."
#property link        "http://www.mql5.com"
#property description "Bears Power"
//--- indicator settings
#property indicator_chart_window                      //---------------------------------
#property indicator_buffers 2
#property indicator_plots   1
#property indicator_type1   DRAW_LINE                 //---------------------------------------
#property indicator_color1  Silver
#property indicator_width1  2
//--- input parameters
input int InpBearsPeriod=13; // Period
//--- indicator buffers
double    ExtBearsBuffer[];
double    ExtTempBuffer[];
//--- handle of EMA 
int       ExtEmaHandle;
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
void OnInit()
  {
//--- indicator buffers mapping
   SetIndexBuffer(0,ExtBearsBuffer,INDICATOR_DATA);
   SetIndexBuffer(1,ExtTempBuffer,INDICATOR_CALCULATIONS);
//---
   IndicatorSetInteger(INDICATOR_DIGITS,_Digits+1);
//--- sets first bar from what index will be drawn
   PlotIndexSetInteger(0,PLOT_DRAW_BEGIN,InpBearsPeriod-1);
//--- name for DataWindow and indicator subwindow label
   IndicatorSetString(INDICATOR_SHORTNAME,"Bears("+(string)InpBearsPeriod+")");
//--- get MA handle
   ExtEmaHandle=iMA(NULL,0,InpBearsPeriod,0,MODE_EMA,PRICE_CLOSE);
//--- initialization done
  }
//+------------------------------------------------------------------+
//| Average True Range                                               |
//+------------------------------------------------------------------+
int OnCalculate(const int rates_total,
                const int prev_calculated,
                const datetime &Time[],
                const double &Open[],
                const double &High[],
                const double &Low[],
                const double &Close[],
                const long &TickVolume[],
                const long &Volume[],
                const int &Spread[])
  {
   int i,limit;
//--- check for bars count
   if(rates_total<InpBearsPeriod)
      return(0);// not enough bars for calculation   
//--- not all data may be calculated
   int calculated=BarsCalculated(ExtEmaHandle);
   if(calculated<rates_total)
     {
      Print("Not all data of ExtEmaHandle is calculated (",calculated,"bars ). Error",GetLastError());
      return(0);
     }
//--- we can copy not all data
   int to_copy;
   if(prev_calculated>rates_total || prev_calculated<0) to_copy=rates_total;
   else
     {
      to_copy=rates_total-prev_calculated;
      if(prev_calculated>0) to_copy++;
     }
//---- get ma buffers
   if(IsStopped()) return(0); //Checking for stop flag
   if(CopyBuffer(ExtEmaHandle,0,0,to_copy,ExtTempBuffer)<=0)
     {
      Print("getting ExtEmaHandle is failed! Error",GetLastError());
      return(0);
     }
//--- first calculation or number of bars was changed
   if(prev_calculated<InpBearsPeriod)
      limit=InpBearsPeriod;
   else limit=prev_calculated-1;
//--- the main loop of calculations
   for(i=limit;i<rates_total && !IsStopped();i++)
     {
      ExtBearsBuffer[i]=iCustom(NULL,0,"Downloads\\RSI Analytics"); \\--------------------------------------------
     }
//--- return value of prev_calculated for next call
   return(rates_total);
  }
//+------------------------------------------------------------------+
Технический индикатор RSI ANALYTICS
Технический индикатор RSI ANALYTICS
  • отзывов: 5
  • 2013.11.01
  • STRAT ANALYTICS
  • www.mql5.com
Зачем нам RSI в отдельном окне, если его можно построить в основном окне графика, что гораздо более понятно? RSI ANALYTICS - это индикатор, следящий за рынком, созданный на основе той же идеи, что и традиционный RSI (индекс относительной силы). При этом он строится не в отдельном подокне, а в том же окне, что и график цены финансового...
 
Nilog:

В mql4 я с помощью iCustom спокойно делал индикаторы, использующие чьи-то готовые индикаторы, хоть и ничего не понимаю в программировании... хватало интуиции. А в mql5 ничего не получается, как ни пытаюсь разобраться. Помогите, пожалуйста.

Есть вот этот индикатор в ex5. Положил его в папку Downloads. Хочу брать обе его линии и рисовать на графике в других периодах, ну, то есть, сделать его мультитаймфреймным с помощью iCustom.

Поскольку с нуля написать индикатор не могу, взял код простого индикатора Bears Power. Ничего там особо не менял, кроме того, что поменял indicator_chart_window и DRAW_LINE, а также строчку, которая, в моем понимании, должна вытаскивать данные первого буфера с параметрами по умолчанию на текущем ТФ:

Все компилируется, ничего не рисуется. Чего ему еще надо? :( 

В mql5 работа с пользовательскими, да и стандартными индикаторами организована иначе чем в mql4. Если в mql4 посредством iCustom можно было получить только одно значение индикатора, то в mql5 можно получить значения индикатора на всю глубину истории в массив. Второе основное отличие, это направление индексации в буферах индикаторов.

Весь код смотреть и сверять с оригиналом утомительно, поэтому я укажу только на основные:

Файл должен находиться в папке Indicators или подпапке находящейся в той-же Indicators.

Вот строка получения хендла индикатора МА

ExtEmaHandle=iMA(NULL,0,InpBearsPeriod,0,MODE_EMA,PRICE_CLOSE);

и вот строка получения значения индикатора МА

if(CopyBuffer(ExtEmaHandle,0,0,to_copy,ExtTempBuffer)<=0)

в данном случае в дополнительный буфер или массив.

Получается что получить данные пользовательского индикатора

ExtBearsHandle=iCustom(NULL,0,"RSI Analytics");
CopyBuffer(ExtBearsHandle,0,0,to_copy,ExtTempBuffer)

И потом получив из этого дополнительного буфера значения индикатора можно их обработать каким-то образом, или не трогая ставить в индикаторный буфер не забывая о направлении индексации.