Как начать работу с MQL5 - страница 11

 
Bangun Prastyo :
Уважаемый Владимир, не могли бы вы помочь мне сделать советник только с сигналами фрактального индикатора. и носить SL и TP и трейлинг. для скальпинговой торговли. надеюсь, что это может обеспечить лучшие цвета в мире mql5. Вы очень хороший программист.

10:21

Уважаемый Владимир, вы можете помочь мне сделать советник, основанный только на сигналах от фрактальных индикаторов. и использовать SL, TP и трейлинг. для скальпинга. Надеюсь, это увеличит цвет в мире MQL5. Вы очень хороший программист.

10:22

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

10:26

На самом деле, каждый раз, когда происходит сделка, фрактал будет функционировать. Например, фрактал выше, сделка будет продавать дан SL и TP.

Добрый день.

На основе какого индикатора вы хотите создать советник?

 
Vladimir Karputov:

Ведите учет открытых графиков (точнее, ведите учет не номеров графиков, а учет действий: символ "такой-то и такой-то", таймфрейм "такой-то и такой-то" уже открыт.

Я пытался, но не могу найти как, я использую многосимвольный и многотаймфреймовый советник, поэтому мне трудно проверить символ и таймфрейм для более чем 100 графиков, есть ли более простой способ?
 
Ahmad861 :
Я пытался, но не могу найти способ, я использую многосимвольный и многотаймфреймовый советник, поэтому мне трудно проверить символ и таймфрейм для более чем 100 графиков, есть ли более простой способ?

Терминал может открыть максимум 100 графиков (не более).

Поэтому, прежде чем применить шаблон графика, необходимо обойти все графики и проверить: "Открыт ли уже график на "SYMBOL" "символе и на "TIMEFRAME" "таймфрейме"?

Пример обхода всех графиков можно взять отсюда: ChartNext.

Заключительная функция:

//+------------------------------------------------------------------+
//| Is Chart Open                                                    |
//+------------------------------------------------------------------+
bool IsChartOpen(const string symbol, const ENUM_TIMEFRAMES timeframe)
  {
//--- variables for chart ID
   long currChart,prevChart=ChartFirst();
   int i=0,limit=100;
   while(i<limit)// We have certainly not more than 100 open charts
     {
      currChart=ChartNext(prevChart); // Get the new chart ID by using the previous chart ID
      if(currChart<0)
         break;          // Have reached the end of the chart list
      if(ChartSymbol(currChart)==symbol)
         if(ChartPeriod(currChart)==timeframe)
            return(true);
      i++;// Do not forget to increase the counter
     }
//---
   return(false);
  }


Вызов примера:

   if(!IsChartOpen("USDJPY",PERIOD_D1))
     ChartApplyTemplate...
Documentation on MQL5: Chart Operations / ChartNext
Documentation on MQL5: Chart Operations / ChartNext
  • www.mql5.com
ChartNext - Chart Operations - MQL5 Reference - Reference on algorithmic/automated trading language for MetaTrader 5
 
Vladimir Karputov:

Терминал может открыть максимум 100 графиков (не более).

Поэтому, прежде чем применить шаблон графика, необходимо обойти все графики и проверить: "Открыт ли уже график на "SYMBOL" "символе и на "TIMEFRAME" "таймфрейме"?

Пример обхода всех графиков можно взять отсюда: ChartNext.

Заключительная функция:


Пример вызова:

Я пробовал этот способ, все равно не работает
 
Ahmad861 :
Я пробовал этот способ, все равно не работает.

Я никому не верю, если нет кода и описания действий :)

Вы не показали код - вы не описали свои действия - слышно только "не работает". Я вам не верю.
 

Пример работы с iCustom - мы получаем данные индикатора в папке советника [data folder]\MQL5\Indicators\Examples\MACD.mq5

Код: iCustom iMACD значение на графике.mq5

Пользовательский индикатор MACD находится в папке:

Запомните правило работы с индикаторами в MQL5: хэндл индикатора создается в OnInit. В дальнейшем хэндл индикатора, используя CopyBuffer, используется для получения данных от индикатора.

//+------------------------------------------------------------------+
//|                                 iCustom iMACD value on chart.mq5 |
//|                              Copyright © 2020, Vladimir Karputov |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2020, Vladimir Karputov"
#property version   "1.000"
#property tester_indicator "Examples\\MACD"
//--- input parameters
input int                  Inp_MACD_fast_ema_period= 8;           // MACD: period for Fast average calculation
input int                  Inp_MACD_slow_ema_period= 17;          // MACD: period for Slow average calculation
input int                  Inp_MACD_signal_period  = 9;           // MACD: period for their difference averaging
input ENUM_APPLIED_PRICE   Inp_MACD_applied_price  = PRICE_CLOSE; // MACD: type of price
//---
int      handle_iCustom;                     // variable for storing the handle of the iCustom indicator
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- create handle of the indicator iMACD ([data folder]\MQL5\Indicators\Examples\MACD.mq5)
   handle_iCustom=iCustom(Symbol(),Period(),"Examples\\MACD",Inp_MACD_fast_ema_period,Inp_MACD_slow_ema_period,
                          Inp_MACD_signal_period,Inp_MACD_applied_price);
//--- if the handle is not created
   if(handle_iCustom==INVALID_HANDLE)
     {
      //--- tell about the failure and output the error code
      PrintFormat("Failed to create handle of the iMACD indicator for the symbol %s/%s, error code %d",
                  Symbol(),
                  EnumToString(Period()),
                  GetLastError());
      //--- the indicator is stopped early
      return(INIT_FAILED);
     }
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---
   if(handle_iCustom!=INVALID_HANDLE)
      IndicatorRelease(handle_iCustom);
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
//---
   double main[],signal[];
   ArraySetAsSeries(main,true);
   ArraySetAsSeries(signal,true);
   int start_pos=0,count=3;
   if(!iGetArray(handle_iCustom,MAIN_LINE,start_pos,count,main) ||
      !iGetArray(handle_iCustom,SIGNAL_LINE,start_pos,count,signal))
     {
      return;
     }
//---
   string text_main="Main |",text_signal="Signal |";
   for(int i=count-1; i>=0; i--)
     {
      text_main=text_main+" #"+IntegerToString(i)+" "+DoubleToString(main[i],Digits()+1)+" | ";
      text_signal=text_signal+" #"+IntegerToString(i)+" "+DoubleToString(signal[i],Digits()+1)+" | ";
     }
   Comment(text_main,"\n",text_signal);
  }
//+------------------------------------------------------------------+
//| Get value of buffers                                             |
//+------------------------------------------------------------------+
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))
     {
      PrintFormat("ERROR! EA: %s, FUNCTION: %s, this a no dynamic array!",__FILE__,__FUNCTION__);
      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)
     {
      //--- if the copying fails, tell the error code
      PrintFormat("ERROR! EA: %s, FUNCTION: %s, amount to copy: %d, copied: %d, error code %d",
                  __FILE__,__FUNCTION__,count,copied,GetLastError());
      //--- quit with zero result - it means that the indicator is considered as not calculated
      return(false);
     }
   return(result);
  }
//+------------------------------------------------------------------+
 
Vladimir Karputov:

Я никому не верю, если нет кода и описания действий :)

Вы не показали код - не описали свои действия - слышно только "не работает". Я вам не верю.
Что я получу, если буду врать? Если это не работает, это не работает, это совершенно нормально.
 
Ahmad861 :
Что я получу, если буду врать? Если это не работает, то это не работает, это совершенно нормально.

Ваша проблема в том, что вы не можете сформулировать проблему. Я не волшебник и не телепат - но я сделал попытку прочитать ваши мысли ( ). Если вы говорите "у меня это не работает" - пожалуйста, поставьте себя на мое место: посмотрите со стороны - вы ничего не сказали, но говорите, что ничего не работает.

Если вы хотите помощи - опишите свою проблему, покажите код, расскажите, что именно не работает.

How to start with MQL5
How to start with MQL5
  • 2020.09.06
  • www.mql5.com
This thread discusses MQL5 code examples. There will be examples of how to get data from indicators, how to program advisors...
 

Удалить все символы из обзора рынка

Код: Удалить все символы.mq5

//+------------------------------------------------------------------+
//|                                           Remove all symbols.mq5 |
//|                              Copyright © 2020, Vladimir Karputov |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2020, Vladimir Karputov"
#property version   "1.00"
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
  {
//--- remove all symbols from the Market Watch
   int symbols_total=SymbolsTotal(true);
   for(int i=symbols_total-1; i>=0; i--)
     {
      string symbol_name=SymbolName(i,true);
      SymbolSelect(symbol_name,false);
     }
//---
  }
Файлы:
 

Пример: как получить значение индикатора 'iAO' в советнике

Код: iAO Get Value.mq5

При работе на MQL5 запомните главное правило: хэндл индикатора (в данном примере это переменная 'handle_iAO') должен быть создан ТОЛЬКО ОДИН раз, и делать это нужно обязательно в OnInit ().

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

Код:

//+------------------------------------------------------------------+
//|                                                iAO Get Value.mq5 |
//|                              Copyright © 2020, Vladimir Karputov |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2020, Vladimir Karputov"
#property version   "1.001"
#property description "Example: how to get the value of the 'iAO' indicator in an advisor"
//--- input parameters
input group                "AO"
input ENUM_TIMEFRAMES      Inp_AO_period        = PERIOD_CURRENT;    // AO: timeframe
input group                "Additional features"
input bool                 InpPrintLog          = false;             // Print log
//---
int      handle_iAO;                            // variable for storing the handle of the iAO indicator
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- create handle of the indicator iAO
   handle_iAO=iAO(Symbol(),Inp_AO_period);
//--- if the handle is not created
   if(handle_iAO==INVALID_HANDLE)
     {
      //--- tell about the failure and output the error code
      PrintFormat("Failed to create handle of the iAO indicator for the symbol %s/%s, error code %d",
                  Symbol(),
                  EnumToString(Inp_AO_period),
                  GetLastError());
      //--- the indicator is stopped early
      return(INIT_FAILED);
     }
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---
   if(handle_iAO!=INVALID_HANDLE)
      IndicatorRelease(handle_iAO);
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
//---
   double ao[];
   ArraySetAsSeries(ao,true);
   int start_pos=0,count=2;
   if(!iGetArray(handle_iAO,0,start_pos,count,ao))
      return;
//---
   string text="";
   int limit=(count>2)?2:count;
   for(int i=0; i<limit; i++)
     {
      text=text+
           " bar #"+IntegerToString(i)+": "+
           " AO "+DoubleToString(ao[i],Digits()+1)+"\n";
     }
   Comment(text);
  }
//+------------------------------------------------------------------+
//| Get value of buffers                                             |
//+------------------------------------------------------------------+
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))
     {
      if(InpPrintLog)
         PrintFormat("ERROR! EA: %s, FUNCTION: %s, this a no dynamic array!",__FILE__,__FUNCTION__);
      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)
     {
      //--- if the copying fails, tell the error code
      if(InpPrintLog)
         PrintFormat("ERROR! EA: %s, FUNCTION: %s, amount to copy: %d, copied: %d, error code %d",
                     __FILE__,__FUNCTION__,count,copied,GetLastError());
      //--- quit with zero result - it means that the indicator is considered as not calculated
      return(false);
     }
   return(result);
  }
//+------------------------------------------------------------------+


Результат:

iAO Получить значение

Рис. 1. iAO Get Value


iAO Получить значение

Рис. 2. iAO Получить значение

Файлы: