Советники: Trading engine 4 - страница 3

 
Edviao #:
A) Предоставленный вами блок кода «Place Orders» уже доступен в текущей версии v4.010.

Недоступны только следующие строки:

Вы точно смотрели код??? Откройте функцию 'OpenPosition' и Вы увидите:

//+------------------------------------------------------------------+
//| Open position                                                    |
//+------------------------------------------------------------------+
void OpenPosition(const int index)
  {
   double freeze=0.0,stops=0.0;
   FreezeStopsLevels(freeze,stops);
   double max_levels=(freeze>stops)?freeze:stops;
   /*
 
Vladimir Karputov #:

Вы точно смотрели код??? Откройте функцию 'OpenPosition' и Вы увидите:

Строки, отмеченные желтым цветом, «требуют удаления».
Я правильно понял?

 
Edviao #:

Строки, отмеченные желтым цветом, «требуют удаления».
Я правильно понял?

Поясняю ещё раз: шаг 1, шаг 2:


Форум по трейдингу, автоматическим торговым системам и тестированию торговых стратегий

Советники: Trading engine 4

Vladimir Karputov, 2022.01.23 12:09

Обработка спреда для отложенных ордеров встроена в 'PlaceOrders'

//+------------------------------------------------------------------+
//| Place Orders                                                     |
//+------------------------------------------------------------------+
void PlaceOrders(const int index)
  {
***
   double spread=m_symbol.Ask()-m_symbol.Bid();
   if(m_pending_max_spread>0.0 && spread>m_pending_max_spread)
     {
      m_waiting_pending_order=false;
      if(InpPrintLog)
         Print(__FILE__," ",__FUNCTION__,
               ", ERROR: ","Spread Ask-Bid (",DoubleToString(spread,m_symbol.Digits()),")",
               " > Maximum spread (",DoubleToString(m_pending_max_spread,m_symbol.Digits()),")");
      return;
     }
//--- buy limit


Вам нужно встроить эту проверку в 'OpenPosition'

//+------------------------------------------------------------------+
//| Open position                                                    |
//+------------------------------------------------------------------+
void OpenPosition(const int index)
  {


Естественно, нужно параметры "***pending***" заменить на '***'position***"

 
Vladimir Karputov #:

Поясняю ещё раз: шаг 1, шаг 2:



После внесения этих двух ступенчатых изменений соответственно :

A) После всех этих изменений будет ли работать функция "маximum spread (0=закрыт)" как для отложенных, так и для рыночных ордеров?
Б) Следует ли после этих изменений кода снова добавить функцию «Маximum spread (0 = выкл.)» в качестве параметра для рыночных ордеров? (Нужны ли мне по-прежнему две отдельные настройки под названием «Маximum spread» после этих изменений? )

 
Edviao #:

После внесения этих двух ступенчатых изменений соответственно :

A) После всех этих изменений будет ли работать функция "максимальный спред (0=закрыт)" как для отложенных, так и для рыночных ордеров?
Б) Следует ли после этих изменений кода снова добавить функцию «Максимальный спред (0 = выкл.)» в качестве параметра для рыночных ордеров? (после этих изменений все еще нужны два отдельных параметра, называемых «Максимальный диапазон»?)

Если Вы хотите ограничить торговлю (открытие позиций) по спреду, первым делом нужно добавить входной параметр. Примерно так:

//--- input parameters
input group             "Trading settings"
input ENUM_TIMEFRAMES      InpWorkingPeriod        = PERIOD_CURRENT; // Working timeframe
input uint                 InpStopLoss             = 150;            // Stop Loss
input uint                 InpTakeProfit           = 460;            // Take Profit
input ENUM_BAR_CURRENT     InpTrailingBarCurrent   = bar_1;          // Trailing on ...
input ENUM_BAR_CURRENT     InpSignalsBarCurrent    = bar_1;          // Search signals on ...
input uint                 InpTrailingStop         = 250;            // Trailing Stop (min distance from price to Stop Loss)
input uint                 InpTrailingStep         = 50;             // Trailing Step
input uint                 InpPositionsMaxSpread   = 12;             // Positions: Maximum spread ('0' -> OFF)
input group             "Position size management (lot calculation)"


Затем нужно объявить переменную, в которой будет спред в виде числа 'double':

input ulong                InpMagic                = 200;            // Magic number
//---
double   m_stop_loss                = 0.0;      // Stop Loss                  -> double
double   m_take_profit              = 0.0;      // Take Profit                -> double
double   m_trailing_stop            = 0.0;      // Trailing Stop              -> double
double   m_trailing_step            = 0.0;      // Trailing Step              -> double
double   m_positions_max_spread     = 0.0;      // Positions: Maximum spread  -> double
double   m_pending_indent           = 0.0;      // Pending: Indent            -> double
double   m_pending_max_spread       = 0.0;      // Pending: Maximum spread    -> double


В OnInit не забываем инициализировать и заполнить переменную:

//--- forced initialization of variables
   m_stop_loss                = 0.0;      // Stop Loss                  -> double
   m_take_profit              = 0.0;      // Take Profit                -> double
   m_trailing_stop            = 0.0;      // Trailing Stop              -> double
   m_trailing_step            = 0.0;      // Trailing Step              -> double
   m_positions_max_spread     = 0.0;      // Positions: Maximum spread  -> double
***
//---
   m_stop_loss                = InpStopLoss                 * m_symbol.Point();
   m_take_profit              = InpTakeProfit               * m_symbol.Point();
   m_trailing_stop            = InpTrailingStop             * m_symbol.Point();
   m_trailing_step            = InpTrailingStep             * m_symbol.Point();
   m_positions_max_spread     = InpPositionsMaxSpread       * m_symbol.Point();
   m_pending_indent           = InpPendingIndent            * m_symbol.Point();
   m_pending_max_spread               = InpPendingMaxSpread         * m_symbol.Point();
//--- check the input parameter "Lots"


Последний шаг - прописываем ограничение в 'OpenPosition':

//+------------------------------------------------------------------+
//| Open position                                                    |
//+------------------------------------------------------------------+
void OpenPosition(const int index)
  {
   double freeze=0.0,stops=0.0;
   FreezeStopsLevels(freeze,stops);
   double max_levels=(freeze>stops)?freeze:stops;
   /*
   SYMBOL_TRADE_STOPS_LEVEL determines the number of points for minimum indentation of the
      StopLoss and TakeProfit levels from the current closing price of the open position
   ------------------------------------------------|------------------------------------------
   Buying is done at the Ask price                 |  Selling is done at the Bid price
   ------------------------------------------------|------------------------------------------
   TakeProfit        >= Bid                        |  TakeProfit        <= Ask
   StopLoss          <= Bid                        |  StopLoss          >= Ask
   TakeProfit - Bid  >= SYMBOL_TRADE_STOPS_LEVEL   |  Ask - TakeProfit  >= SYMBOL_TRADE_STOPS_LEVEL
   Bid - StopLoss    >= SYMBOL_TRADE_STOPS_LEVEL   |  StopLoss - Ask    >= SYMBOL_TRADE_STOPS_LEVEL
   ------------------------------------------------------------------------------------------
   */
   double spread=m_symbol.Ask()-m_symbol.Bid();
   if(m_positions_max_spread>0.0 && spread>m_positions_max_spread)
     {
      if(InpPrintLog)
         Print(__FILE__," ",__FUNCTION__,
               ", ERROR: ","Spread Ask-Bid (",DoubleToString(spread,m_symbol.Digits()),")",
               " > Maximum spread (",DoubleToString(m_positions_max_spread,m_symbol.Digits()),")");
      return;
     }
//--- buy


Будьте осторожны - в таком сценарии торговый приказ остаётся в массиве 'SPositions' и будет там до тех пор, пока спред не придёт в норму!

 
Vladimir,
Вы можете проверить, пожалуйста?
Файлы:
 
Edviao #:
Vladimir,
Вы можете проверить, пожалуйста?

Да, всё правильно.

 
Vladimir Karputov #:

Да, всё правильно.

Большое спасибо за вашу поддержку и терпение!

 
Здравствуйте еще раз Vladimir,

В версии v4.010.1 есть проблема с функцией "PositionsMaxSpread".
Любое значение, введенное в функцию, не влияет на результаты бэктеста, и советник всегда выдает одни и те же результаты.
Файлы:
 
Edviao #:
Здравствуйте еще раз Vladimir,

В версии v4.010.1 есть проблема с функцией "PositionsMaxSpread".
Любое значение, введенное в функцию, не влияет на результаты бэктеста, и советник всегда выдает одни и те же результаты.

Внимательно перечитайте все пункты из

Форум по трейдингу, автоматическим торговым системам и тестированию торговых стратегий

Советники: Trading engine 4

Vladimir Karputov, 2022.01.23 13:12

Если Вы хотите ограничить торговлю (открытие позиций) по спреду, первым делом нужно добавить входной параметр. Примерно так:

//--- input parameters
input group             "Trading settings"
input ENUM_TIMEFRAMES      InpWorkingPeriod        = PERIOD_CURRENT; // Working timeframe
input uint                 InpStopLoss             = 150;            // Stop Loss
input uint                 InpTakeProfit           = 460;            // Take Profit
input ENUM_BAR_CURRENT     InpTrailingBarCurrent   = bar_1;          // Trailing on ...
input ENUM_BAR_CURRENT     InpSignalsBarCurrent    = bar_1;          // Search signals on ...
input uint                 InpTrailingStop         = 250;            // Trailing Stop (min distance from price to Stop Loss)
input uint                 InpTrailingStep         = 50;             // Trailing Step
input uint                 InpPositionsMaxSpread   = 12;             // Positions: Maximum spread ('0' -> OFF)
input group             "Position size management (lot calculation)"


Затем нужно объявить переменную, в которой будет спред в виде числа 'double':

input ulong                InpMagic                = 200;            // Magic number
//---
double   m_stop_loss                = 0.0;      // Stop Loss                  -> double
double   m_take_profit              = 0.0;      // Take Profit                -> double
double   m_trailing_stop            = 0.0;      // Trailing Stop              -> double
double   m_trailing_step            = 0.0;      // Trailing Step              -> double
double   m_positions_max_spread     = 0.0;      // Positions: Maximum spread  -> double
double   m_pending_indent           = 0.0;      // Pending: Indent            -> double
double   m_pending_max_spread       = 0.0;      // Pending: Maximum spread    -> double


В OnInit не забываем инициализировать и заполнить переменную:

//--- forced initialization of variables
   m_stop_loss                = 0.0;      // Stop Loss                  -> double
   m_take_profit              = 0.0;      // Take Profit                -> double
   m_trailing_stop            = 0.0;      // Trailing Stop              -> double
   m_trailing_step            = 0.0;      // Trailing Step              -> double
   m_positions_max_spread     = 0.0;      // Positions: Maximum spread  -> double
***
//---
   m_stop_loss                = InpStopLoss                 * m_symbol.Point();
   m_take_profit              = InpTakeProfit               * m_symbol.Point();
   m_trailing_stop            = InpTrailingStop             * m_symbol.Point();
   m_trailing_step            = InpTrailingStep             * m_symbol.Point();
   m_positions_max_spread     = InpPositionsMaxSpread       * m_symbol.Point();
   m_pending_indent           = InpPendingIndent            * m_symbol.Point();
   m_pending_max_spread               = InpPendingMaxSpread         * m_symbol.Point();
//--- check the input parameter "Lots"


Последний шаг - прописываем ограничение в 'OpenPosition':

//+------------------------------------------------------------------+
//| Open position                                                    |
//+------------------------------------------------------------------+
void OpenPosition(const int index)
  {
   double freeze=0.0,stops=0.0;
   FreezeStopsLevels(freeze,stops);
   double max_levels=(freeze>stops)?freeze:stops;
   /*
   SYMBOL_TRADE_STOPS_LEVEL determines the number of points for minimum indentation of the
      StopLoss and TakeProfit levels from the current closing price of the open position
   ------------------------------------------------|------------------------------------------
   Buying is done at the Ask price                 |  Selling is done at the Bid price
   ------------------------------------------------|------------------------------------------
   TakeProfit        >= Bid                        |  TakeProfit        <= Ask
   StopLoss          <= Bid                        |  StopLoss          >= Ask
   TakeProfit - Bid  >= SYMBOL_TRADE_STOPS_LEVEL   |  Ask - TakeProfit  >= SYMBOL_TRADE_STOPS_LEVEL
   Bid - StopLoss    >= SYMBOL_TRADE_STOPS_LEVEL   |  StopLoss - Ask    >= SYMBOL_TRADE_STOPS_LEVEL
   ------------------------------------------------------------------------------------------
   */
   double spread=m_symbol.Ask()-m_symbol.Bid();
   if(m_positions_max_spread>0.0 && spread>m_positions_max_spread)
     {
      if(InpPrintLog)
         Print(__FILE__," ",__FUNCTION__,
               ", ERROR: ","Spread Ask-Bid (",DoubleToString(spread,m_symbol.Digits()),")",
               " > Maximum spread (",DoubleToString(m_positions_max_spread,m_symbol.Digits()),")");
      return;
     }
//--- buy


Будьте осторожны - в таком сценарии торговый приказ остаётся в массиве 'SPositions' и будет там до тех пор, пока спред не придёт в норму!

и найдите то место, где Вы совершили ошибку.
Причина обращения: