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

[Удален]  
Sprut 185: 

Я начинаю подозревать, что для этого нужна дополнительная функция

Да всё правильно. В OnInit подключаем индикатор, задаём там параметры и получаем его хэндл. А дальше по месту используйте CopyBuffer.


https://www.mql5.com/ru/docs/series/copybuffer

Документация по MQL5: Доступ к таймсериям и индикаторам / CopyBuffer
Документация по MQL5: Доступ к таймсериям и индикаторам / CopyBuffer
  • www.mql5.com
CopyBuffer - Доступ к таймсериям и индикаторам - Справочник MQL5 - Справочник по языку алгоритмического/автоматического трейдинга для MetaTrader 5
 
SanAlex:

Вот слепил - вроде работает! (где жёлтым там буфера)

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

оказывается нужно ещё и стоп лосс - (не мог понять почему закрывало сразу) добавил  стоп лосс



Спасибо большое !!!

Вы хорошо всё слепили, но меня интересует совсем другой алгоритм работы советника. Я хотел бы использовать простой Мартингейл (сеточник) с такими настраиваемыми параметрами :

input group "======== МАРТИН ========"; 
input int      MMType        = 1;        // 1 - вкл. , 2 - выкл.
input double   Multiplikator = 1.667;    // множитель следующего лота
input double   Step          = 150.0;    // Расстояние между ордерами
input group "==== МАНИ МЕНЕДЖМЕНТ ====; 
input bool     LotConst      = true;     // фиксированный - true, или от  баланса - false
input group "-: фиксированный лот :--"; 
input double   Lot           = 0.01;     // первый фиксированный лот, если МАРТИН включен
input group "---: лот от баланса :---"; 
input double   RiskPercent   = 30.0;     // первый лот в процентах от баланса, если МАРТИН включен
input group "== ПРИБЫЛЬ В ПУНКТАХ ==="; 
input double   TakeProfit    = 56.0;     // параметры тейкпрофита в пунктах
input group "========= Шаг =========="; 
input double   Step          = 150.0;    // шаг в пунктах между ордерами
input group "===== ОГРАНИЧИТЕЛЬ =====";  
input int      MaxTrades     = 15;       // Максимальное количество ордеров одного направления
input group "=== ПРОСКАЛЬЗОВАНИЕ ====";  
input double   Slippage      = 5.0;      // Допустимое проскальзывание на новостях в пунктах
input group "== МАГИЧЕСКИЙ  НОМЕР ===";  
input int      Magic         = 1111111 ; // Идентификатор ордера (Магик №)

 , но в него добавить индикатор, который я вложил - выше. И использовать его, как триггер (false - работаем только в SHORT и true - работаем только в LONG).

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

И как только происходит закрытие по тейку - открывать следующий ордер в ту же сторону (по тренду), пока тренд не закончиться и не переключиться - наш триггер. Если же всё таки появится ордер не по тренду (в момент перехода тренда из одного состояния в другое, то использовать для него Мартин с настройками из меню.

Если есть желание помочь  написать такого советника, то буду очень признателен .

Теперь по теме:
Я так понял, что у меня в кодах самого индюка - находятся не индикаторные буферы, а массивы буферов и Вы - в советнике их привели в индикаторные. 
Напишите пожалуйста правильно ли я понял?


[Удален]  
Sprut 185:

Теперь по теме:

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


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

в основном все функции я копирую из кодов  Vladimir Karputov за что Большое ему Спасибо!!! - если какие вопросы он Вам подскажет.

Vladimir Karputov
Vladimir Karputov
  • 2021.06.25
  • www.mql5.com
Профиль трейдера
 
SanAlex:

как я понял вам нужно чтобы индикатор фильтровал !? 

Вам нужно ваш эксперт пропустить через этот фильтр 

Не совсем Вы меня правильно поняли !!!
 
SanAlex:

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

в основном все функции я копирую из кодов  Vladimir Karputov за что Большое ему Спасибо!!! - если какие вопросы он Вам подскажет.

Вы самоучка, а я вообще только начал программировать и в голове одни вопросы. 

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

На текущий момент я исхожу из классики, что само простое - это самое лучшее. Вот почему я хочу до придела упростить...... и в тоже время получить максимум от того, что хочу создать. Предлагаю вместе поработать над моим алгоритмом - мне кажется это будет обоим интересно. 
Если заинтересовал пишите в личку.
 
Vladimir Karputov:

Наследование подразумевает создание класса.

Вот я и пишу  --  от какого класса наследовать свой класс?, чтоб использовать эти методы их стандартной библиотеки

 
SanAlex:

вот ещё вариант - как тейк сработал - откроется опять в туже сторону

Совершенно верно, с профитом !!! 

На первый взгляд - все правильно.

И то, что Стоп Лосса - тоже не должно быть - всё правильно.

Но я не понял, куда девается одер, который не закрылся по Тейк Профиту....... при изменении направления движения цены....(просто закрывается по дефолту, т.е. по сигналу индикатора изменения тренда)? Если это так, то это не по моей задумки.

А по моей задумки - ордер должен остаться, но тут должен вступить в работу - мартин с его настройками:

input group "======== МАРТИН ========"; 
input int      MMType        = 1;        // 1 - вкл. , 2 - выкл.
input double   Multiplikator = 1.667;    // множитель следующего лота
input double   Step          = 150.0;    // Расстояние между ордерами

т.е. устанавливать ордера в противоположенную тренду сторону с увеличением лота и усреднением тейк профита. Короче работать, как простой Мартин - например (Советник Автопрофит 3), который есть в открытом коде в инете, но написан на mql4.

Кстати первоначальный вариант - работы по тренду, который Вы правилно написали - никто  при работе с мартином не отменял.

Короче работа по тренду - это одна задача, которую Вы частично и с блеском продемонстрировали  и вторая задача - это мартин.

Не обязательно, что бы эти две задачи были взаимосвязаны - на мой взгляд, они могут работать совершенно независимо

 
Sprut 185:

Совершенно верно, с профитом !!! 

На первый взгляд - все правильно.

И то, что Стоп Лосса - тоже не должно быть - всё правильно.

Но я не понял, куда девается одер, который не закрылся по Тейк Профиту....... при изменении направления движения цены....(просто закрывается по дефолту, т.е. по сигналу индикатора изменения тренда)? Если это так, то это не по моей задумки.

А по моей задумки - ордер должен остаться, но тут должен вступить в работу - мартин с его настройками:

т.е. устанавливать ордера в противоположенную тренду сторону с увеличением лота и усреднением тейк профита. Короче работать, как простой Мартин - например (Советник Автопрофит 3), который есть в открытом коде в инете, но написан на mql4.

Сразу одно замечание: не "ордер", а "позиция". 

 
Vladimir Karputov:

Сразу одно замечание: не "ордер", а "позиция". 

Прошу прощения за допущенную ошибку.
Приму во внимание и постараюсь впредь исправиться.
[Удален]  
Sprut 185:

все варианты которые я смог обнаружить - больше вроде нет вариантов 

4 Sprut 185

//+------------------------------------------------------------------+
//|                                                  4 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"
//---
#define MACD_MAGIC 1234502
//---
#include <Trade\Trade.mqh>
#include <Trade\SymbolInfo.mqh>
#include <Trade\PositionInfo.mqh>
#include <Trade\AccountInfo.mqh>
//---
double            m_adjusted_point;             // point value adjusted for 3 or 5 points
CTrade            m_trade;                      // trading object
CSymbolInfo       m_symbol;                     // symbol info object
CPositionInfo     m_position;                   // trade position object
CAccountInfo      m_account;                    // account info wrapper
//---
input double InpLots          =0.1;   // Lots
input int    InpTakeProfit    =50;    // Take Profit (in pips)
input bool   InpVariant       =false; // Option
input int    InpBar           =1;     // Bar
input bool   InpClOp          =false; // Close opposite
//---
double m_macd_current;
double m_signal_current;
double m_take_profit;
int    price_uno;
int    m_handle_macd; // MACD indicator handle
int    ExtTimeOut=10; // time out in seconds between trade operations
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- initialize common information
   m_symbol.Name(Symbol());                  // symbol
   m_trade.SetExpertMagicNumber(MACD_MAGIC); // magic
   m_trade.SetMarginMode();
   m_trade.SetTypeFillingBySymbol(Symbol());
//--- tuning for 3 or 5 digits
   int digits_adjust=1;
   if(m_symbol.Digits()==3 || m_symbol.Digits()==5)
      digits_adjust=10;
   m_adjusted_point=m_symbol.Point()*digits_adjust;
//--- set default deviation for trading in adjusted points
   m_take_profit     =InpTakeProfit*m_adjusted_point;
//--- set default deviation for trading in adjusted points
   m_trade.SetDeviationInPoints(3*digits_adjust);
//--- create StepMA_NRTR indicator
   m_handle_macd=iCustom(NULL,0,"StepMA_NRTR");
   if(m_handle_macd==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(void)
  {
   static datetime limit_time=0; // last trade processing time + timeout
//--- don't process if timeout
   if(TimeCurrent()>=limit_time)
     {
      //--- check for data
      if(Bars(Symbol(),Period())>2)
        {
         //--- change limit time by timeout in seconds if processed
         if(!InpVariant && Processing())
            limit_time=TimeCurrent()+ExtTimeOut;
         //--- change limit time by timeout in seconds if processed
         if(InpVariant && Processing_1())
            limit_time=TimeCurrent()+ExtTimeOut;
        }
     }
  }
//+------------------------------------------------------------------+
//| main function returns true if any position processed             |
//+------------------------------------------------------------------+
bool Processing(void)
  {
//--- refresh rates
   if(!m_symbol.RefreshRates())
      return(false);
   double m_buff_MACD_main[],m_buff_MACD_signal[];
   ArraySetAsSeries(m_buff_MACD_main,true);
   ArraySetAsSeries(m_buff_MACD_signal,true);
   int start_pos=InpBar,count=3;
   if(!iGetArray(m_handle_macd,0,start_pos,count,m_buff_MACD_main)||
      !iGetArray(m_handle_macd,1,start_pos,count,m_buff_MACD_signal))
     {
      return(false);
     }
//---
   m_macd_current   =m_buff_MACD_main[0];
   m_signal_current =m_buff_MACD_signal[0];
//---
   if(m_position.Select(Symbol()))
     {
      //--- try to close or modify long position
      if(LongClosed())
         return(true);
      //--- try to close or modify short position
      if(ShortClosed())
         return(true);
     }
   else
     {
      //--- check for long position (BUY) possibility
      if(LongOpened())
         return(true);
      //--- check for short position (SELL) possibility
      if(ShortOpened())
         return(true);
     }
//--- exit without position processing
   return(false);
  }
//+------------------------------------------------------------------+
//| main function returns true if any position processed             |
//+------------------------------------------------------------------+
bool Processing_1(void)
  {
//--- refresh rates
   if(!m_symbol.RefreshRates())
      return(false);
   double m_buff_MACD_main[],m_buff_MACD_signal[];
   bool StNRUp,StNRDn;
   ArraySetAsSeries(m_buff_MACD_main,true);
   ArraySetAsSeries(m_buff_MACD_signal,true);
   int start_pos=InpBar,count=3;
   if(!iGetArray(m_handle_macd,0,start_pos,count,m_buff_MACD_main)||
      !iGetArray(m_handle_macd,1,start_pos,count,m_buff_MACD_signal))
     {
      return(false);
     }
//---
   m_macd_current   =m_buff_MACD_main[0];
   m_signal_current =m_buff_MACD_signal[0];
//---
   StNRUp=m_buff_MACD_main[0]<m_buff_MACD_signal[0];
   StNRDn=m_buff_MACD_main[0]>m_buff_MACD_signal[0];
//--- BUY Signal
   if(StNRUp)
     {
      if(InpClOp)
         if(ShortClosed())
            Sleep(1000);
      if(price_uno<0)
         LongOpened();
      price_uno=+1;
      return(true);
     }
//--- SELL Signal
   if(StNRDn)
     {
      if(InpClOp)
         if(LongClosed())
            Sleep(1000);
      if(price_uno>0)
         ShortOpened();
      price_uno=-1;
      return(true);
     }
//--- exit without position processing
   return(false);
  }
//+------------------------------------------------------------------+
//| Check for long position closing                                  |
//+------------------------------------------------------------------+
bool LongClosed(void)
  {
   bool res=false;
//--- should it be closed?
   if(m_macd_current>m_signal_current)
     {
      //--- close position
      if(InpClOp)
         ClosePositions(POSITION_TYPE_BUY);
      //--- processed and cannot be modified
      res=true;
     }
//--- result
   return(res);
  }
//+------------------------------------------------------------------+
//| Check for short position closing                                 |
//+------------------------------------------------------------------+
bool ShortClosed(void)
  {
   bool res=false;
//--- should it be closed?
   if(m_macd_current<m_signal_current)
     {
      //--- close position
      if(InpClOp)
         ClosePositions(POSITION_TYPE_SELL);
      //--- processed and cannot be modified
      res=true;
     }
//--- result
   return(res);
  }
//+------------------------------------------------------------------+
//| Check for long position opening                                  |
//+------------------------------------------------------------------+
bool LongOpened(void)
  {
   bool res=false;
//--- check for long position (BUY) possibility
   if(m_macd_current<m_signal_current)
     {
      double price=m_symbol.Ask();
      double tp   =m_symbol.Bid()+m_take_profit;
      //--- check for free money
      if(m_account.FreeMarginCheck(Symbol(),ORDER_TYPE_BUY,InpLots,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,InpLots,price,0.0,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,TP=%f",price,tp);
           }
         PlaySound("ok.wav");
        }
      //--- in any case we must exit from expert
      res=true;
     }
//--- result
   return(res);
  }
//+------------------------------------------------------------------+
//| Check for short position opening                                 |
//+------------------------------------------------------------------+
bool ShortOpened(void)
  {
   bool res=false;
//--- check for short position (SELL) possibility
   if(m_macd_current>m_signal_current)
     {
      double price=m_symbol.Bid();
      double tp   =m_symbol.Ask()-m_take_profit;
      //--- check for free money
      if(m_account.FreeMarginCheck(Symbol(),ORDER_TYPE_SELL,InpLots,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,InpLots,price,0.0,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,TP=%f",price,tp);
           }
         PlaySound("ok.wav");
        }
      //--- in any case we must exit from expert
      res=true;
     }
//--- result
   return(res);
  }
//+------------------------------------------------------------------+
//| 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()==MACD_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");
              }
  }
//+------------------------------------------------------------------+
//| 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);
  }
//+------------------------------------------------------------------+