Советники: Long Short only EA based on CExpert

 

Long Short only EA based on CExpert:

Советник на базе CExpert, позволяющий открывать только длинные или только короткие ордера.

Expert Advisor, генерирующий только короткие/длинные ордера

Автор: Jose

 
Спасибо.
Очень понятно.
 

Простите, автор. Советник без реверса и с выбираемым лотом.

Советник с выбираемым лотом -> изменения в LongShortExpertMACD.mq5:

//+------------------------------------------------------------------+
//|LongShortExpertMACD.mq5 |
//| Copyright 2009-2013, MetaQuotes Software Corp. - 2013, jlwarrior |
//| https://login.mql5.com/en/users/jlwarrior |
//+------------------------------------------------------------------+
#property copyright "2009-2013, MetaQuotes Software Corp - 2013, jlwarrior"
#property link      "https://login.mql5.com/en/users/jlwarrior"
#property version   "1.00"
//+------------------------------------------------------------------+
//| Включить|
//+------------------------------------------------------------------+
#include <Expert\LongShortExpertModified.mqh>
#include <Expert\Signal\SignalMACD.mqh>
#include <Expert\Trailing\TrailingNone.mqh>
#include <Expert\Money\MoneyFixedLot.mqh>
//+------------------------------------------------------------------+
//| Входы|
//+------------------------------------------------------------------+
//--- входные данные для эксперта
input string Inp_Expert_Title            ="Long/Short ExpertMACD";
int          Expert_MagicNumber          =10981;
bool         Expert_EveryTick            =false;
input ENUM_AVAILABLE_POSITIONS Inp_Allowed_Positions=BOTH_POSITION; //короткие / длинные / обе позиции разрешены

//--- Входы MACDExpert по умолчанию
input int    Inp_Signal_MACD_PeriodFast  =12;                       // Быстрый период MACD
input int    Inp_Signal_MACD_PeriodSlow  =24;                       // Период медленного MACD
input int    Inp_Signal_MACD_PeriodSignal=9;                        // Сигнальный период MACD
input double Inp_Money_Lot               =0.5;                      // Стоимость лота
input int    Inp_Signal_MACD_TakeProfit  =50;                       // Значение тейк-профита
input int    Inp_Signal_MACD_StopLoss    =20;                       // Стоимость стоп-лосса
//+------------------------------------------------------------------+
//| Глобальный объект эксперта|
//+------------------------------------------------------------------+
CLongShortExpertModified ExtExpert;  //специфический разработанный подкласс CExpert
//+------------------------------------------------------------------+
//| Функция инициализации эксперта|
//+------------------------------------------------------------------+
int OnInit(void)
  {
//--- Инициализация эксперта
   if(!ExtExpert.Init(Symbol(),Period(),Expert_EveryTick,Expert_MagicNumber))
     {
      //--- не удалось
      printf(__FUNCTION__+": error initializing expert");
      ExtExpert.Deinit();
      return(-1);
     }   
   // Специфический параметр, контролирующий, какие позиции разрешены
   ExtExpert.SetAvailablePositions(Inp_Allowed_Positions);  

//--- Создание объекта сигнала
   CSignalMACD *signal=new CSignalMACD;
   if(signal==NULL)
     {
      //--- не удалось
      printf(__FUNCTION__+": error creating signal");
      ExtExpert.Deinit();
      return(-2);
     }
//--- Добавьте сигнал эксперту (будет удален автоматически))
   if(!ExtExpert.InitSignal(signal))
     {
      //--- не удалось
      printf(__FUNCTION__+": error initializing signal");
      ExtExpert.Deinit();
      return(-3);
     }
//--- Установите параметры сигнала
   signal.PeriodFast(Inp_Signal_MACD_PeriodFast);
   signal.PeriodSlow(Inp_Signal_MACD_PeriodSlow);
   signal.PeriodSignal(Inp_Signal_MACD_PeriodSignal);
   signal.TakeLevel(Inp_Signal_MACD_TakeProfit);
   signal.StopLevel(Inp_Signal_MACD_StopLoss);   
//--- Проверьте параметры сигнала
   if(!signal.ValidationSettings())
     {
      //--- не удалось
      printf(__FUNCTION__+": error signal parameters");
      ExtExpert.Deinit();
      return(-4);
     }
//--- Создание объекта в хвосте
   CTrailingNone *trailing=new CTrailingNone;
   if(trailing==NULL)
     {
      //--- не удалось
      printf(__FUNCTION__+": error creating trailing");
      ExtExpert.Deinit();
      return(-5);
     }
//--- Добавьте конец к эксперту (будет удален автоматически))
   if(!ExtExpert.InitTrailing(trailing))
     {
      //--- не удалось
      printf(__FUNCTION__+": error initializing trailing");
      ExtExpert.Deinit();
      return(-6);
     }
//--- Установите параметры в конце
//--- Проверьте параметры в конце строки
   if(!trailing.ValidationSettings())
     {
      //--- не удалось
      printf(__FUNCTION__+": error trailing parameters");
      ExtExpert.Deinit();
      return(-7);
     }
//--- Создание денежного объекта
   CMoneyFixedLot *money=new CMoneyFixedLot;
   if(money==NULL)
     {
      //--- не удалось
      printf(__FUNCTION__+": error creating money");
      ExtExpert.Deinit();
      return(-8);
     }
//--- Добавьте деньги эксперту (будут удалены автоматически))
   if(!ExtExpert.InitMoney(money))
     {
      //--- не удалось
      printf(__FUNCTION__+": error initializing money");
      ExtExpert.Deinit();
      return(-9);
     }
//--- Установите параметры денег 
   money.Lots(Inp_Money_Lot);
//--- Проверьте параметры денег
   if(!money.ValidationSettings())
     {
      //--- не удалось
      printf(__FUNCTION__+": error money parameters");
      ExtExpert.Deinit();
      return(-10);
     }
//--- Настройка всех необходимых индикаторов
   if(!ExtExpert.InitIndicators())
     {
      //--- не удалось
      printf(__FUNCTION__+": error initializing indicators");
      ExtExpert.Deinit();
      return(-11);
     }
//--- успех
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Функция деинициализации эксперта|
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
   ExtExpert.Deinit();
  }
//+------------------------------------------------------------------+
//| Функция-обработчик события "tick"|
//+------------------------------------------------------------------+
void OnTick(void)
  {
   ExtExpert.OnTick();
  }
//+------------------------------------------------------------------+
//| Функция-обработчик события "торговля"|
//+------------------------------------------------------------------+
void OnTrade(void)
  {
   ExtExpert.OnTrade();
  }
//+------------------------------------------------------------------+
//| Функция-обработчик события "timer"|
//+------------------------------------------------------------------+
void OnTimer(void)
  {
   ExtExpert.OnTimer();
  }
//+------------------------------------------------------------------+

Советник без реверса -> изменения в LongShortExpertModified.mqh:

//+------------------------------------------------------------------+
//|LongShortExpertModified.mqh |
//|Copyright 2013, jlwarrior |
//| https://login.mql5.com/en/users/jlwarrior |
//+------------------------------------------------------------------+
#include <Expert\Expert.mqh>
//+------------------------------------------------------------------+
//| Перечисление для управления длинными / короткими или обеими позициями.
//| разрешено открывать|
//+------------------------------------------------------------------+
//--- 
enum ENUM_AVAILABLE_POSITIONS
  {
   LONG_POSITION,
   SHORT_POSITION,
   BOTH_POSITION
  };
//+------------------------------------------------------------------+
//| Класс CLongShortExpertModified.|
//| Назначение: Позволяет открывать только длинные / короткие / обе позиции |
//| Происходит от класса CExpert (изменяет только методы Open / Reverse)|
//+------------------------------------------------------------------+
class CLongShortExpertModified : public CExpert
  {
protected:
   ENUM_AVAILABLE_POSITIONS m_positions;
public:
                     CLongShortExpertModified(void);
                    ~CLongShortExpertModified(void);
   virtual bool      CheckOpen(void);
   void SetAvailablePositions(ENUM_AVAILABLE_POSITIONS newValue){m_positions=newValue;};
  };
//+------------------------------------------------------------------+
//| Конструктор|
//+------------------------------------------------------------------+
CLongShortExpertModified ::CLongShortExpertModified(void) : m_positions(BOTH_POSITION)
  {
  }
//+------------------------------------------------------------------+
//| Деструктор|
//+------------------------------------------------------------------+
CLongShortExpertModified ::~CLongShortExpertModified(void)
  {
  }
//+------------------------------------------------------------------+
//| Проверьте открытые позиции на наличие разрешенных.|
//+------------------------------------------------------------------+
bool CLongShortExpertModified :: CheckOpen()
  {
   switch(m_positions)
     {
      case LONG_POSITION:
         return CheckOpenLong();         // Проверьте только новые длинные позиции
      case SHORT_POSITION:
         return CheckOpenShort();        //проверьте только новые короткие позиции
      default:
         return CExpert::CheckOpen();    // поведение по умолчанию
     }
  }
//+------------------------------------------------------------------+
 
где находится поле для ввода кода акции для Long x short?