Пишем эффективного советника - страница 27

 
darirunu1 #:

представь советник что 

говорил год назад до сих пор зарабатывает,если можно сказать 50 процентов в год заработок. 

на тиках можно

заделай то же самое на месяцы и не парься

спокойно, уверенно и ощутимо

;)

 
darirunu1 #:

Это я сам))

норм

 
Renat Akhtyamov #:

норП

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

 
Renat Akhtyamov #:

на тиках можно

заделай то же самое на месяцы и не парься

спокойно, уверенно и ощутимо

;)

Пока об этом не думал.Год советник висит для проверки вшивости . На фунте все го тренды выдержал. ОН как будто бы заранее знает когда начинать торговать. Просадка составила 1,47%.

 
darirunu1 #:

Пока об этом не думал.Год советник висит для проверки вшивости . На фунте все го тренды выдержал. ОН как будто бы заранее знает когда начинать торговать. Просадка составила 1,47%.

увеличьте лот в 10 раз - прибыль увеличится в 10 раз

 
a007 #:

увеличьте лот в 10 раз - прибыль увеличится в 10 раз

Вабабай , вот какой умный  умный мальчик)) А может есть другие варианты?

 

Пишем эффективного советника - Продолжение следует.

и так с чего начнём? 

1. с каким плечом лучше для советника. - думаю не выше 100

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

3. ----

4. ----

итд. ----

какие ещё функции нужны для эффективности советнику? 

 
SanAlex #:

Пишем эффективного советника - Продолжение следует.

и так с чего начнём? 

1. с каким плечом лучше для советника. - думаю не выше 100

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

3. ----

4. ----

итд. ----

какие ещё функции нужны для эффективности советнику? 

Начну тогда - если не возражаете - 

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

//+------------------------------------------------------------------+
//|                                                  MACD Sample.mq5 |
//|                   Copyright 2009-2017, MetaQuotes Software Corp. |
//|                                              http://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright   "Copyright 2009-2017, MetaQuotes Software Corp."
#property link        "http://www.mql5.com"
#property version     "5.50"
#property description "It is important to make sure that the expert works with a normal"
#property description "chart and the user did not make any mistakes setting input"
#property description "variables (Lots, TakeProfit, TrailingStop) in our case,"
#property description "we check TakeProfit on a chart of more than 2*trend_period bars"

#define MACD_MAGIC 1234502
//---
#include <Trade\Trade.mqh>
#include <Trade\SymbolInfo.mqh>
#include <Trade\PositionInfo.mqh>
#include <Trade\AccountInfo.mqh>
//+------------------------------------------------------------------+
//| ENUM_LOT_RISK                                                    |
//+------------------------------------------------------------------+
enum LotMax
  {
   Lot=0,   // Lots
   Lotx2=1, // Lots*2
  };
//---
input LotMax InpLotRisk       =Lotx2; // Lots,- Lots*2
input double InpLots          =0.01;  // Lots
input int    InpMACDOpenLevel =3;     // MACD open level (in pips)
input int    InpMACDCloseLevel=2;     // MACD close level (in pips)
input int    InpMATrendPeriod =26;    // MA trend period
//---
int ExtTimeOut=10; // time out in seconds between trade operations
//+------------------------------------------------------------------+
//| MACD Sample expert class                                         |
//+------------------------------------------------------------------+
class CSampleExpert
  {
protected:
   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
   //--- indicators
   int               m_handle_macd;                // MACD indicator handle
   int               m_handle_ema;                 // moving average indicator handle
   //--- indicator buffers
   double            m_buff_MACD_main[];           // MACD indicator main buffer
   double            m_buff_MACD_signal[];         // MACD indicator signal buffer
   double            m_buff_EMA[];                 // EMA indicator buffer
   //--- indicator data for processing
   double            m_macd_current;
   double            m_macd_previous;
   double            m_signal_current;
   double            m_signal_previous;
   double            m_ema_current;
   double            m_ema_previous;
   //---
   double            m_macd_open_level;
   double            m_macd_close_level;
   datetime          ExtPrevBars;                // "0" -> D'1970.01.01 00:00';

public:
                     CSampleExpert(void);
                    ~CSampleExpert(void);
   bool              Init(void);
   void              Deinit(void);
   bool              Processing(void);
   double            OptimizedBuy(void);
   double            OptimizedSell(void);

protected:
   bool              InitIndicators(void);
   bool              LongOpened(void);
   bool              ShortOpened(void);
  };
//--- global expert
CSampleExpert ExtExpert;
//+------------------------------------------------------------------+
//| Constructor                                                      |
//+------------------------------------------------------------------+
CSampleExpert::CSampleExpert(void) : m_adjusted_point(0),
   m_handle_macd(INVALID_HANDLE),
   m_handle_ema(INVALID_HANDLE),
   m_macd_current(0),
   m_macd_previous(0),
   m_signal_current(0),
   m_signal_previous(0),
   m_ema_current(0),
   m_ema_previous(0),
   m_macd_open_level(0),
   m_macd_close_level(0),
   ExtPrevBars(0)
  {
   ArraySetAsSeries(m_buff_MACD_main,true);
   ArraySetAsSeries(m_buff_MACD_signal,true);
   ArraySetAsSeries(m_buff_EMA,true);
  }
//+------------------------------------------------------------------+
//| Destructor                                                       |
//+------------------------------------------------------------------+
CSampleExpert::~CSampleExpert(void)
  {
  }
//+------------------------------------------------------------------+
//| Calculate optimal lot size                                       |
//+------------------------------------------------------------------+
double CSampleExpert::OptimizedBuy(void)
  {
   double PROFIT_BUY=0.00;
   for(int i=PositionsTotal()-1; i>=0; i--) // returns the number of open positions
     {
      string   position_GetSymbol=PositionGetSymbol(i); // GetSymbol позиции
      if(position_GetSymbol==m_symbol.Name())
        {
         if(m_position.PositionType()==POSITION_TYPE_BUY)
           {
            PROFIT_BUY=PROFIT_BUY+m_position.Select(Symbol());
           }
        }
     }
   double Lots=InpLots;
   double ab=PROFIT_BUY;
   switch(InpLotRisk)
     {
      case Lot:
         Lots=InpLots;
         break;
      case Lotx2:
         if(ab>0 && ab<=1)
            Lots=InpLots*2;
         if(ab>1 && ab<=2)
            Lots=InpLots*4;
         if(ab>2 && ab<=3)
            Lots=InpLots*8;
         if(ab>3)
            Lots=InpLots*16;
         break;
     }
   return(Lots);
  }
//+------------------------------------------------------------------+
//| Calculate optimal lot size                                       |
//+------------------------------------------------------------------+
double CSampleExpert::OptimizedSell(void)
  {
   double PROFIT_SELL=0.00;
   for(int i=PositionsTotal()-1; i>=0; i--) // returns the number of open positions
     {
      string   position_GetSymbol=PositionGetSymbol(i); // GetSymbol позиции
      if(position_GetSymbol==m_symbol.Name())
        {
         if(m_position.PositionType()==POSITION_TYPE_SELL)
           {
            PROFIT_SELL=PROFIT_SELL+m_position.Select(Symbol());
           }
        }
     }
   double Lots=InpLots;
   double ab=PROFIT_SELL;
   switch(InpLotRisk)
     {
      case Lot:
         Lots=InpLots;
         break;
      case Lotx2:
         if(ab>0 && ab<=1)
            Lots=InpLots*2;
         if(ab>1 && ab<=2)
            Lots=InpLots*4;
         if(ab>2 && ab<=3)
            Lots=InpLots*8;
         if(ab>3)
            Lots=InpLots*16;
         break;
     }
   return(Lots);
  }
//+------------------------------------------------------------------+
//| Initialization and checking for input parameters                 |
//+------------------------------------------------------------------+
bool CSampleExpert::Init(void)
  {
//--- 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_macd_open_level =InpMACDOpenLevel*m_adjusted_point;
   m_macd_close_level=InpMACDCloseLevel*m_adjusted_point;
//--- set default deviation for trading in adjusted points
   m_trade.SetDeviationInPoints(3*digits_adjust);
//---
   if(!InitIndicators())
      return(false);
//--- succeed
   return(true);
  }
//+------------------------------------------------------------------+
//| 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 opening                                  |
//+------------------------------------------------------------------+
bool CSampleExpert::LongOpened(void)
  {
   bool res=false;
//--- 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)
           {
            double price=m_symbol.Ask();
            //--- 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,0.0,0.0))
                  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",price);
                 }
              }
            //--- in any case we must exit from expert
            res=true;
           }
//--- result
   return(res);
  }
//+------------------------------------------------------------------+
//| Check for short position opening                                 |
//+------------------------------------------------------------------+
bool CSampleExpert::ShortOpened(void)
  {
   bool res=false;
//--- check for short position (SELL) possibility
   if(m_macd_current>0)
      if(m_macd_current<m_signal_current && m_macd_previous>m_signal_previous)
         if(m_macd_current>(m_macd_open_level) && m_ema_current<m_ema_previous)
           {
            double price=m_symbol.Bid();
            //--- 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,0.0,0.0))
                  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",price);
                 }
              }
            //--- in any case we must exit from expert
            res=true;
           }
//--- result
   return(res);
  }
//+------------------------------------------------------------------+
//| main function returns true if any position processed             |
//+------------------------------------------------------------------+
bool CSampleExpert::Processing(void)
  {
//--- we work only at the time of the birth of new bar
   datetime time_0=iTime(m_symbol.Name(),Period(),0);
   if(time_0==ExtPrevBars)
      return(false);
   ExtPrevBars=time_0;
   if(!m_symbol.RefreshRates())
     {
      ExtPrevBars=0;
      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)
     {
      ExtPrevBars=0;
      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];
//--- it is important to enter the market correctly,
//--- but it is more important to exit it correctly...
//--- first check if position exists - try to select it
//--- 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);
  }
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit(void)
  {
//--- create all necessary objects
   if(!ExtExpert.Init())
      return(INIT_FAILED);
//--- secceed
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert new tick handling 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*InpMATrendPeriod)
        {
         //--- change limit time by timeout in seconds if processed
         if(ExtExpert.Processing())
            limit_time=TimeCurrent()+ExtTimeOut;
        }
     }
  }
//+------------------------------------------------------------------+
Файлы:
 
Georgiy Merts #:

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

Сейчас я возьму текущий график с классическими фракталами, построю линию. Погодите немного. 

Во. Текущий график евродоллара, часовки. Если отмечать максимумы и минимумы фракталами, то на графике имеются две трендовых линии, обе уже пробиты, момент их построения - отмечен стрелками. В момент пробития - линии обрываются. Намечается третья, нисходящая линия, она будет построена через сегодняшние вчерашние 8-часовой и 18-часовой фракталы. Рисовать ее надо, как только цена опустится ниже 15часового минимума. 


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

 
SanAlex #:

Начну тогда - если не возражаете - 

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

это без закрытия результат

Снимок экрана 2021-11-21 072405

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

1. надо добавить закрытие ,= к примеру с buy закрыли прибыль - а sell к примеру пусть висят, пока не наступит прибыль.

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