как самостоятельно освоить mql5 ? - страница 3

 
SanAlex:

расскажу свой метод обучения - так как с детства не люблю читать.

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

И как-же ты его разбирал не читая? С отвёрткой? Или покрепче использовал………

 
Alexey Viktorov:

И как-же ты его разбирал не читая? С отвёрткой? Или покрепче использовал………

начинал с этих мест - менял на другие индикаторы - естественно на форуме подслушивал разговоры и примеры.

//+------------------------------------------------------------------+
//| Initialization of the indicators                                 |
//+------------------------------------------------------------------+
bool CSampleExpert::InitIndicators(void)
  {
//--- create MACD indicator
   if(m_handle_macd==INVALID_HANDLE)
      if((m_handle_macd=iMACD(NULL,0,12,26,9,PRICE_CLOSE))==INVALID_HANDLE)
        {
         printf("Error creating MACD indicator");
         return(false);
        }
//--- create EMA indicator and add it to collection
   if(m_handle_ema==INVALID_HANDLE)
      if((m_handle_ema=iMA(NULL,0,InpMATrendPeriod,0,MODE_EMA,PRICE_CLOSE))==INVALID_HANDLE)
        {
         printf("Error creating EMA indicator");
         return(false);
        }
//--- succeed
   return(true);
  }
//+------------------------------------------------------------------+

в этих местах подбирал что бы открывало закрывало как нужно. 

//--- check for long position (BUY) possibility
   if(m_macd_current<0)
      if(m_macd_current>m_signal_current && m_macd_previous<m_signal_previous)
         if(MathAbs(m_macd_current)>(m_macd_open_level) && m_ema_current>m_ema_previous)
           {

в этом месте тоже что не будь химичил 

//+------------------------------------------------------------------+
//| main function returns true if any position processed             |
//+------------------------------------------------------------------+
bool CSampleExpert::Processing(void)
  {
//--- refresh rates
   if(!m_symbol.RefreshRates())
      return(false);
//--- refresh indicators
   if(BarsCalculated(m_handle_macd)<2 || BarsCalculated(m_handle_ema)<2)
      return(false);
   if(CopyBuffer(m_handle_macd,0,0,2,m_buff_MACD_main)  !=2 ||
      CopyBuffer(m_handle_macd,1,0,2,m_buff_MACD_signal)!=2 ||
      CopyBuffer(m_handle_ema,0,0,2,m_buff_EMA)         !=2)
      return(false);
//   m_indicators.Refresh();
//--- to simplify the coding and speed up access
//--- data are put into internal variables
   m_macd_current   =m_buff_MACD_main[0];
   m_macd_previous  =m_buff_MACD_main[1];
   m_signal_current =m_buff_MACD_signal[0];
   m_signal_previous=m_buff_MACD_signal[1];
   m_ema_current    =m_buff_EMA[0];
   m_ema_previous   =m_buff_EMA[1];
 
SanAlex:

начинал с этих мест - менял на другие индикаторы - естественно на форуме подслушивал разговоры и примеры.

в этих местах подбирал что бы открывало закрывало как нужно. 

в этом месте тоже что не будь химичил 

Ну я уже вообще ничего не понимаю… На форуме вроде-бы не говорят, а пишут… Как можно было подслушивать?

Ааа, я догадался… мама читала а ты подслушивал… )))))

 
Alexey Viktorov:

Ну я уже вообще ничего не понимаю… На форуме вроде-бы не говорят, а пишут… Как можно было подслушивать?

Ааа, я догадался… мама читала а ты подслушивал… )))))

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

я обычный Шофёр! 

\\\\\\\\\\\\\\\\\\\\\\\\\\

правда в

ДОСААФ

- пришлось за пол года выучить наизусть 20 шаблонов по 10 вопросов.

 
SanAlex:

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

я обычный Шофёр! 

Сначала попробуй всё-же определиться, ты пассажир или шофер?

Так я также не люблю читать, но приходится. Ведь это не художественная болтовня. И тем более не исторические измышления кого либо…

 
Konstantin Erin:

Насчет совета прочитать документацию - это лучший способ отбить у человека всякое желание. Много раз лично это наблюдал.

Вы сами то как учили программирование? Прочли всю документацию

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

 

Документация не есть и не должна быть как уроки программирования вообще на любом языке. Документация это напоминание синтаксиса и объяснение что можешь или должен получить при использовании какой либо функции.

Вот тот мой пример, на предыдущей странице… Если вам надо нарисовать какой либо графический объект, то вам достаточно понимать, что в документации есть раздел «Графические объекты» где и надо искать как сделать, как правильно написать и посмотреть пример написания. Как можно по другому чему-то научить? Ну не в документации, так в любом курсе или лекции будет сказано всё что написано в документации… Может всё-же проще почитать документацию? Не вызубрить все функции, а просто прочесть о них, помнить или хотя-бы понимать в каком разделе что может и должно находиться. Я конечно могу допустить, что найдётся такой индивид который для поиска функции ObjectCreate начнёт читать документацию с первой строки… Но такому лучше не браться за программирование. Не царское это дело ……… ковыряться. Прикажу и ……… Ну а если это не царь, можно перефразировать… «Не моё это дело, заплачу и сделают».

 

всего то нужно - выучить или скопировать несколько функции 1.открыть позицию в BUY  2.открыть позицию в SELL  3.закрыть позиции в BUY  4.закрыть позиции в SELL

5. разобраться с функцией Индикатора и также скопировать в коллекцию.

\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\

всё что нужно для открыть и закрыть и это можно во всём использовать

//+------------------------------------------------------------------+
//| Check for open position conditions                               |
//+------------------------------------------------------------------+
bool CheckForOpenBuy(void)
  {
   bool res=false;
//--- check for long position (BUY) possibility
   double price=m_symbol.Ask();
   double tp   =m_symbol.Bid()+m_take_profit;
   double sl   =m_symbol.Bid()-m_stop_loss;
//--- check for free money
   if(m_account.FreeMarginCheck(Symbol(),ORDER_TYPE_BUY,OptimizedBuy(),price)<0.0)
      printf("We have no money. Free Margin = %f",m_account.FreeMargin());
   else
     {
      //--- open position
      if(m_trade.PositionOpen(Symbol(),ORDER_TYPE_BUY,OptimizedBuy(),price,sl,tp))
         printf("Position by %s to be opened",Symbol());
      else
        {
         printf("Error opening BUY position by %s : '%s'",Symbol(),m_trade.ResultComment());
         printf("Open parameters : price=%f,SL=%f,TP=%f",price,sl,tp);
        }
      PlaySound("ok.wav");
     }
//--- in any case we must exit from expert
   res=true;
//--- result
   return(res);
  }
//+------------------------------------------------------------------+
//| Check for open position conditions                               |
//+------------------------------------------------------------------+
bool CheckForOpenSell(void)
  {
   bool res=false;
//--- check for short position (SELL) possibility
   double price=m_symbol.Bid();
   double tp   =m_symbol.Ask()-m_take_profit;
   double sl   =m_symbol.Ask()+m_stop_loss;
//--- check for free money
   if(m_account.FreeMarginCheck(Symbol(),ORDER_TYPE_SELL,OptimizedSell(),price)<0.0)
      printf("We have no money. Free Margin = %f",m_account.FreeMargin());
   else
     {
      //--- open position
      if(m_trade.PositionOpen(Symbol(),ORDER_TYPE_SELL,OptimizedSell(),price,sl,tp))
         printf("Position by %s to be opened",Symbol());
      else
        {
         printf("Error opening SELL position by %s : '%s'",Symbol(),m_trade.ResultComment());
         printf("Open parameters : price=%f,SL=%f,TP=%f",price,sl,tp);
        }
      PlaySound("ok.wav");
     }
//--- in any case we must exit from expert
   res=true;
//--- result
   return(res);
  }
//+------------------------------------------------------------------+
//| Check for close position conditions                              |
//+------------------------------------------------------------------+
void CheckForCloseBuy(void)
  {
//--- close position
   ClosePositions(POSITION_TYPE_BUY);
//---
  }
//+------------------------------------------------------------------+
//| Check for close position conditions                              |
//+------------------------------------------------------------------+
void CheckForCloseSell(void)
  {
//--- close position
   ClosePositions(POSITION_TYPE_SELL);
//---
  }
//+------------------------------------------------------------------+
//| Refreshes the symbol quotes data                                 |
//+------------------------------------------------------------------+
bool RefreshRates()
  {
//--- refresh rates
   if(!m_symbol.RefreshRates())
     {
      return(false);
     }
//--- protection against the return value of "zero"
   if(m_symbol.Ask()==0 || m_symbol.Bid()==0)
     {
      return(false);
     }
//---
   return(true);
  }
//+------------------------------------------------------------------+
//| Check Freeze and Stops levels                                    |
//+------------------------------------------------------------------+
void FreezeStopsLevels(double &freeze,double &stops)
  {
//--- check Freeze and Stops levels
   double coeff=(double)1;
   if(!RefreshRates() || !m_symbol.Refresh())
      return;
//--- FreezeLevel -> for pending order and modification
   double freeze_level=m_symbol.FreezeLevel()*m_symbol.Point();
   if(freeze_level==0.0)
      if(1>0)
         freeze_level=(m_symbol.Ask()-m_symbol.Bid())*coeff;
//--- StopsLevel -> for TakeProfit and StopLoss
   double stop_level=m_symbol.StopsLevel()*m_symbol.Point();
   if(stop_level==0.0)
      if(1>0)
         stop_level=(m_symbol.Ask()-m_symbol.Bid())*coeff;
//---
   freeze=freeze_level;
   stops=stop_level;
//---
   return;
  }
//+------------------------------------------------------------------+
//| Close positions                                                  |
//+------------------------------------------------------------------+
void ClosePositions(const ENUM_POSITION_TYPE pos_type)
  {
   double freeze=0.0,stops=0.0;
   FreezeStopsLevels(freeze,stops);
   for(int i=PositionsTotal()-1; i>=0; i--) // returns the number of current positions
      if(m_position.SelectByIndex(i)) // selects the position by index for further access to its properties
         if(m_position.Symbol()==m_symbol.Name() && m_position.Magic()==UNO_MAGIC)
            if(m_position.PositionType()==pos_type)
              {
               if(m_position.PositionType()==POSITION_TYPE_BUY)
                 {
                  bool take_profit_level=((m_position.TakeProfit()!=0.0 && m_position.TakeProfit()-m_position.PriceCurrent()>=freeze) || m_position.TakeProfit()==0.0);
                  bool stop_loss_level=((m_position.StopLoss()!=0.0 && m_position.PriceCurrent()-m_position.StopLoss()>=freeze) || m_position.StopLoss()==0.0);
                  if(take_profit_level && stop_loss_level)
                     if(!m_trade.PositionClose(m_position.Ticket())) // close a position by the specified m_symbol
                        Print(__FILE__," ",__FUNCTION__,", ERROR: ","BUY PositionClose ",m_position.Ticket(),", ",m_trade.ResultRetcodeDescription());
                 }
               if(m_position.PositionType()==POSITION_TYPE_SELL)
                 {
                  bool take_profit_level=((m_position.TakeProfit()!=0.0 && m_position.PriceCurrent()-m_position.TakeProfit()>=freeze) || m_position.TakeProfit()==0.0);
                  bool stop_loss_level=((m_position.StopLoss()!=0.0 && m_position.StopLoss()-m_position.PriceCurrent()>=freeze) || m_position.StopLoss()==0.0);
                  if(take_profit_level && stop_loss_level)
                     if(!m_trade.PositionClose(m_position.Ticket())) // close a position by the specified m_symbol
                        Print(__FILE__," ",__FUNCTION__,", ERROR: ","SELL PositionClose ",m_position.Ticket(),", ",m_trade.ResultRetcodeDescription());
                 }
               PlaySound("ok.wav");
              }
  }

 
SanAlex:

всего то нужно - выучить или скопировать несколько функции 1.открыть позицию в BUY  2.открыть позицию в SELL  3.закрыть позиции в BUY  4.закрыть позиции в SELL

5. разобраться с функцией Индикатора и также скопировать в коллекцию.

\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\

всё что нужно для открыть и закрыть и это можно во всём использовать

а с Индикатором тоже просто   - немножко разобраться и понять 

//+------------------------------------------------------------------+
//|                                                  2 Sprut 185.mq5 |
//|                                  Copyright 2021, MetaQuotes Ltd. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2021, MetaQuotes Ltd."
#property link      "https://www.mql5.com"
#property version   "1.00"
//---
int StepMA_NRTR_Handle;
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- create StepMA_NRTR indicator
   StepMA_NRTR_Handle=iCustom(NULL,0,"StepMA_NRTR");
   if(StepMA_NRTR_Handle==INVALID_HANDLE)
     {
      printf("Error creating StepMA_NRTR indicator");
      return(false);
     }
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
   if(!SearchTradingSignalsOpen())
     {
      return;
     }
  }
//+------------------------------------------------------------------+
//| Search trading signals                                           |
//+------------------------------------------------------------------+
bool SearchTradingSignalsOpen(void)
  {
//--- we work only at the time of the birth of new bar
   double StepMA_NRTR[],StepMA_NRTRS[];
   ArraySetAsSeries(StepMA_NRTR,true);
   ArraySetAsSeries(StepMA_NRTRS,true);
   int start_pos=0,count=3;
   if(!iGetArray(StepMA_NRTR_Handle,0,start_pos,count,StepMA_NRTR)||
      !iGetArray(StepMA_NRTR_Handle,1,start_pos,count,StepMA_NRTRS))
     {
      return(false);
     }
//--- BUY Signal
   if(StepMA_NRTR[0]<StepMA_NRTRS[0])
     {
      //--- здесь ваша функция для лонга  !!!!!!!!!!!!!!!!!!!!!!!
      printf("BUY Signal");
      return(false);
     }
//--- SELL Signal
   if(StepMA_NRTR[0]>StepMA_NRTRS[0])
     {
      //--- здесь ваша функция для шорта  !!!!!!!!!!!!!!!!!!!!!!!
      printf("SELL Signal");
      return(false);
     }
//---
   return(true);
  }
//+------------------------------------------------------------------+
//| Filling the indicator buffers from the indicator                 |
//+------------------------------------------------------------------+
bool iGetArray(const int handle,const int buffer,const int start_pos,
               const int count,double &arr_buffer[])
  {
   bool result=true;
   if(!ArrayIsDynamic(arr_buffer))
     {
      return(false);
     }
   ArrayFree(arr_buffer);
//--- reset error code
   ResetLastError();
//--- fill a part of the iBands array with values from the indicator buffer
   int copied=CopyBuffer(handle,buffer,start_pos,count,arr_buffer);
   if(copied!=count)
     {
      return(false);
     }
   return(result);
  }
//+------------------------------------------------------------------+

вот можно миллион индикаторов впихнуть 

//+------------------------------------------------------------------+
//| Search trading signals                                           |
//+------------------------------------------------------------------+
bool SearchTradingSignalsOpen(void)
  {
//--- we work only at the time of the birth of new bar
   datetime time_0=iTime(Symbol(),Period(),0);
   if(time_0==m_last_open)
      return(true);
   m_last_open=time_0;
//--- we work only at the time of the birth of new bar
   double MA5[],MA10[],RSI[],STO[],MACD[],STOS[],MACDS[],MAIN[],PLUSDI[],MINUSDI[],StepMA_NRTR[],StepMA_NRTRS[];
   bool MaUp,MaDn,RsiUp,RsiDn,StochUp,StochDn,MacdUp,MacdDn,AdxUp,AdxDn,StNRUp,StNRDn;
   ArraySetAsSeries(MA5,true);
   ArraySetAsSeries(MA10,true);
   ArraySetAsSeries(RSI,true);
   ArraySetAsSeries(STO,true);
   ArraySetAsSeries(STOS,true);
   ArraySetAsSeries(MACD,true);
   ArraySetAsSeries(MACDS,true);
   ArraySetAsSeries(MAIN,true);
   ArraySetAsSeries(PLUSDI,true);
   ArraySetAsSeries(MINUSDI,true);
   ArraySetAsSeries(StepMA_NRTR,true);
   ArraySetAsSeries(StepMA_NRTRS,true);
   int start_pos=InpBar,count=3;
   if(!iGetArray(MA5_Handle,0,start_pos,count,MA5))
     {
      return(false);
     }
   if(!iGetArray(MA10_Handle,0,start_pos,count,MA10))
     {
      return(false);
     }
   if(!iGetArray(RSI_Handle,0,start_pos,count,RSI))
     {
      return(false);
     }
   if(!iGetArray(STO_Handle,0,start_pos,count,STO)||
      !iGetArray(STO_Handle,1,start_pos,count,STOS))
     {
      return(false);
     }
   if(!iGetArray(MACD_Handle,0,start_pos,count,MACD)||
      !iGetArray(MACD_Handle,1,start_pos,count,MACDS))
     {
      return(false);
     }
   if(!iGetArray(ADX_Handle,0,start_pos,count,MAIN)||
      !iGetArray(ADX_Handle,1,start_pos,count,PLUSDI)||
      !iGetArray(ADX_Handle,2,start_pos,count,MINUSDI))
     {
      return(false);
     }
   if(!iGetArray(StepMA_NRTR_Handle,0,start_pos,count,StepMA_NRTR)||
      !iGetArray(StepMA_NRTR_Handle,1,start_pos,count,StepMA_NRTRS))
     {
      return(false);
     }
//+------------------------------------------------------------------+
   MaUp=MA5[0]>MA10[0];
   RsiUp=RSI[0]>=55.0;
   StochUp=STO[0]>STOS[0];
   MacdUp=MACD[0]>MACDS[0];
   AdxUp=MINUSDI[0]>PLUSDI[0];
   StNRUp=StepMA_NRTR[0]>StepMA_NRTRS[0];
//---
   MaDn=MA5[0]<MA10[0];
   RsiDn=RSI[0]<=45.0;
   StochDn=STO[0]<STOS[0];
   MacdDn=MACD[0]<MACDS[0];
   AdxDn=MINUSDI[0]<PLUSDI[0];
   StNRDn=StepMA_NRTR[0]<StepMA_NRTRS[0];
//+------------------------------------------------------------------+
//--- BUY Signal
   if(StNRUp)
     {
      if(InpClOp)
         CheckForCloseSell();
      if(price_uno<0)
         CheckForOpenBuy();
      price_uno=+1;
      return(true);
     }
//--- SELL Signal
   if(StNRDn)
     {
      if(InpClOp)
         CheckForCloseBuy();
      if(price_uno>0)
         CheckForOpenSell();
      price_uno=-1;
      return(true);
     }
//---
   return(true);
  }
//+------------------------------------------------------------------+



 

 
SanAlex:

а с Индикатором тоже просто   - немножко разобраться и понять 

вот можно миллион индикаторов впихнуть  

а тут можно их добавлять в фильтр или убирать

//+------------------------------------------------------------------+
   MaUp=MA5[0]>MA10[0];
   RsiUp=RSI[0]>=55.0;
   StochUp=STO[0]>STOS[0];
   MacdUp=MACD[0]>MACDS[0];
   AdxUp=MINUSDI[0]>PLUSDI[0];
   StNRUp=StepMA_NRTR[0]>StepMA_NRTRS[0];
//---
   MaDn=MA5[0]<MA10[0];
   RsiDn=RSI[0]<=45.0;
   StochDn=STO[0]<STOS[0];
   MacdDn=MACD[0]<MACDS[0];
   AdxDn=MINUSDI[0]<PLUSDI[0];
   StNRDn=StepMA_NRTR[0]<StepMA_NRTRS[0];
//+------------------------------------------------------------------+
//--- BUY Signal
   if(StNRUp && AdxUp && MacdUp && StochUp && MaUp)
     {
      if(InpClOp)
         CheckForCloseSell();
      if(price_uno<0)
         CheckForOpenBuy();
      price_uno=+1;
      return(true);
     }



Причина обращения: