Обсуждение статьи "Пошаговое руководство по написанию советников в MQL5 для начинающих" - страница 15

 
Rustam Ayupov #:

Нашел уникальный, простой до гениальности, "способ трейлинга" советника, самого автора, который, как уже традиционно для этой разработки, так и не исполняется так, как автор прокомментировал. Он, как и я, видимо тоже чайник, но большой) Обещал, при развороте цены, ранее открытая позиция закрывается, ну да, вот было бы здорово, если бы было бы... а вот только висят две открытые позиции, в обе стороны и не закрываются. Ранее, до Вашего первого совета, вообще сыпало в обе стороны целыми градами открытых позиций, которые не закрывались. Попробуйте дожать, эту вишенку на торте ?

Здравствуйте, Рустам! Чтобы мы могли дальше продуктивно сотрудничать, Вам сначала необходимо научиться прикреплять к сообщению код советника с проблемами. Если у Вас при тестировании советника есть проблемы, то нужно этот код сохранить под новым именем, скомпилировать, а потом прикрепить к сообщению. Сохранять советник под новым именем и компилировать нужно обязательно!!! Иначе мы с Вами при общении запутаемся в разных вариантах.

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

  1. В MetaEditor выделите код советника с проблемами путём нажатия на кнопки Ctrl+A
  2. Скопируйте код советника путём нажатия на кнопки Ctrl+С
  3. Создайте сообщении, которое Вы захотите разместить здесь на форуме и путём нажатия на кнопки AL+S откройте поле, в которое нужно будет вставить скопированный код путём нажатия на кнопки Ctrl+V
  4. Добавьте сообщение на форум

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

С уважением, Владимир.

 
MrBrooklin #:

Здравствуйте, Рустам! Чтобы мы могли дальше продуктивно сотрудничать, Вам сначала необходимо научиться прикреплять к сообщению код советника с проблемами. Если у Вас при тестировании советника есть проблемы, то нужно этот код сохранить под новым именем, скомпилировать, а потом прикрепить к сообщению. Сохранять советник под новым именем и компилировать нужно обязательно!!! Иначе мы с Вами при общении запутаемся в разных вариантах.

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

  1. В MetaEditor выделите код советника с проблемами путём нажатия на кнопки Ctrl+A
  2. Скопируйте код советника путём нажатия на кнопки Ctrl+С
  3. Создайте сообщении, которое Вы захотите разместить здесь на форуме и путём нажатия на кнопки AL+S откройте поле, в которое нужно будет вставить скопированный код путём нажатия на кнопки Ctrl+V
  4. Добавьте сообщение на форум

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

С уважением, Владимир.

Извините за задержку, за выходные выгорел, сутками, но нашел причину последней проблемы, как оказалось брокер FXopen, просто не дорос до MT5. Ну и научили меня простоте выбора файлов, к отсылке. Первые два Ваша оптимизация труда автора, где Вы прекратили авторскую невнимательность в коде, с массированным открыванием позиций, вместо одной, единственной, вторые два его декларации закрытия позиции при развороте цены. Во втором стоит поработать, все таки автор, если и не доделал, но хотел прибыльно)

 
Rustam Ayupov #:

Извините за задержку, за выходные выгорел, сутками, но нашел причину последней проблемы, как оказалось брокер FXopen, просто не дорос до MT5. Ну и научили меня простоте выбора файлов, к отсылке. Первые два Ваша оптимизация труда автора, где Вы прекратили авторскую невнимательность в коде, с массированным открыванием позиций, вместо одной, единственной, вторые два его декларации закрытия позиции при развороте цены. Во втором стоит поработать, все таки автор, если и не доделал, но хотел прибыльно)

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

Файлы:
 
Rustam Ayupov #:

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

Здравствуйте, Рустам! Внизу сообщения прикрепляю рабочий вариант этого советника. Изменения коснулись данного участка кода:

//--- Putting all together   
   if(Buy_Condition_1 && Buy_Condition_2)
     {
      if(Buy_Condition_3 && Buy_Condition_4 && PositionsTotal()==0)
        {
         ZeroMemory(mrequest);
         mrequest.action = TRADE_ACTION_DEAL;                                  // immediate order execution
         mrequest.price = NormalizeDouble(latest_price.ask,_Digits);           // latest ask price
         mrequest.sl = NormalizeDouble(latest_price.ask - STP*_Point,_Digits); // Stop Loss
         mrequest.tp = NormalizeDouble(latest_price.ask + TKP*_Point,_Digits); // Take Profit
         mrequest.symbol = _Symbol;                                            // currency pair
         mrequest.volume = Lot;                                                 // number of lots to trade
         mrequest.magic = EA_Magic;                                             // Order Magic Number
         mrequest.type = ORDER_TYPE_BUY;                                        // Buy Order
         mrequest.type_filling = ORDER_FILLING_FOK;                             // Order execution type
         mrequest.deviation=100;                                                // Deviation from current price
         //--- send order
         bool check=OrderSend(mrequest,mresult);
         // get the result code
         if(mresult.retcode==10009 || mresult.retcode==10008) //Request is completed or order placed
           {
            Alert("A Buy order has been successfully placed with Ticket#:",mresult.order,"!!");
           }
         else
           {
            Alert("The Buy order request could not be completed -error:",GetLastError());
            ResetLastError();           
            return;
           }
        }
     }
/*
    2. Check for a Short/Sell Setup : MA-8 decreasing downwards, 
    previous price close below it, ADX > 22, -DI > +DI
*/
//--- Declare bool type variables to hold our Sell Conditions
   bool Sell_Condition_1 = (maVal[0]<maVal[1]) && (maVal[1]<maVal[2]);  // MA-8 decreasing downwards
   bool Sell_Condition_2 = (p_close <maVal[1]);                         // Previous price closed below MA-8
   bool Sell_Condition_3 = (adxVal[0]>Adx_Min);                         // Current ADX value greater than minimum (22)
   bool Sell_Condition_4 = (plsDI[0]<minDI[0]);                         // -DI greater than +DI

//--- Putting all together
   if(Sell_Condition_1 && Sell_Condition_2)
     {
      if(Sell_Condition_3 && Sell_Condition_4 && PositionsTotal()==0)
        {
         ZeroMemory(mrequest);
         mrequest.action=TRADE_ACTION_DEAL;                                // immediate order execution
         mrequest.price = NormalizeDouble(latest_price.bid,_Digits);           // latest Bid price
         mrequest.sl = NormalizeDouble(latest_price.bid + STP*_Point,_Digits); // Stop Loss
         mrequest.tp = NormalizeDouble(latest_price.bid - TKP*_Point,_Digits); // Take Profit
         mrequest.symbol = _Symbol;                                          // currency pair
         mrequest.volume = Lot;                                              // number of lots to trade
         mrequest.magic = EA_Magic;                                          // Order Magic Number
         mrequest.type= ORDER_TYPE_SELL;                                     // Sell Order
         mrequest.type_filling = ORDER_FILLING_FOK;                          // Order execution type
         mrequest.deviation=100;                                             // Deviation from current price
         //--- send order
         bool check=OrderSend(mrequest,mresult);
         // get the result code
         if(mresult.retcode==10009 || mresult.retcode==10008) //Request is completed or order placed
           {
            Alert("A Sell order has been successfully placed with Ticket#:",mresult.order,"!!");
           }
         else
           {
            Alert("The Sell order request could not be completed -error:",GetLastError());
            ResetLastError();
            return;
           }
        }
     }
   return;
  }
//+------------------------------------------------------------------+

Было добавлено то, что выделено желтым цветом,:

&& PositionsTotal()==0

а также удалено условие, связанное с Buy_opened и Sell_opened:

         // any opened Buy position?
         if(Buy_opened)
           {
            Alert("We already have a Buy Position!!!");
            return;    // Don't open a new Buy Position
           }
.
.
.
         // any opened Sell position?
         if(Sell_opened)
           {
            Alert("We already have a Sell position!!!");
            return;    // Don't open a new Sell Position
           }

С уважением, Владимир.

Файлы:
 
MrBrooklin #:

Здравствуйте, Рустам! Внизу сообщения прикрепляю рабочий вариант этого советника. Изменения коснулись данного участка кода:

Было добавлено то, что выделено желтым цветом,:

а также удалено условие, связанное с Buy_opened и Sell_opened:

С уважением, Владим

MrBrooklin #:

Здравствуйте, Рустам! Внизу сообщения прикрепляю рабочий вариант этого советника. Изменения коснулись данного участка кода:

Было добавлено то, что выделено желтым цветом,:

а также удалено условие, связанное с Buy_opened и Sell_opened:

С уважением, Владимир.

Здравствуйте Владимир ! Прикрепленный файл почему то не работает, буду пытаться вставить Ваши коды, в советник, поглядим.

С Уважением, Рустам.

Заработал в тестере, просто что то видать обновилось опять с операционной системой и вставил просто классически, без своих тут местнических особенностей) Глядим.
 
Rustam Ayupov #:

Здравствуйте Владимир ! Прикрепленный файл почему то не работает, буду пытаться вставить Ваши коды, в советник, поглядим.

С Уважением, Рустам.

Здравствуйте, Рустам! Проверил файл советника на двух разных терминалах. Всё работает. Это видно на нижней картинке. Попробуйте запустить визуальное тестирование и зайти во вкладку Журнал. Если будут сообщения с красными кружочками, то копируйте и размещайте здесь на форуме.

С уважением, Владимир.



 
MrBrooklin #:

Здравствуйте, Рустам! Проверил файл советника на двух разных терминалах. Всё работает. Это видно на нижней картинке. Попробуйте запустить визуальное тестирование и зайти во вкладку Журнал. Если будут сообщения с красными кружочками, то копируйте и размещайте здесь на форуме.

С уважением, Владимир.



Здравствуйте Владимир ! Ваш файл заработал, в тестере, просто что то видать обновилось опять с моей операционной системой и вставил просто классически, без своих тут местнических особенностей) Глядим.

И в демо заработал) Теперь оптимизирую, весьма экстремально) 

С Уважением, Рустам.

 
Rustam Ayupov #:

Здравствуйте Владимир ! Ваш файл заработал, в тестере, просто что то видать обновилось опять с моей операционной системой и вставил просто классически, без своих тут местнических особенностей) Глядим.

С Уважением, Рустам.

Исходя из личного опыта, могу выделить главное в самообучении языку MQL5:

  1. Пока самостоятельно не начнёте писать коды, пусть это будут даже короткие и простые скрипты, ничего толком не получится.
  2. Обязательно оставляйте комментарии к тем строка кода, которые Вы будете писать. Так легче будет разобраться в том коде, который Вы напишите прямо сейчас.
  3. Нужно понять для чего служат функции и научиться их писать.
  4. Обязательно изучайте и используйте Справочник MQL5 
С уважением, Владимир.
 
MrBrooklin #:

Исходя из личного опыта, могу выделить главное в самообучении языку MQL5:

  1. Пока самостоятельно не начнёте писать коды, пусть это будут даже короткие и простые скрипты, ничего толком не получится.
  2. Обязательно оставляйте комментарии к тем строка кода, которые Вы будете писать. Так легче будет разобраться в том коде, который Вы напишите прямо сейчас.
  3. Нужно понять для чего служат функции и научиться их писать.
  4. Обязательно изучайте и используйте Справочник MQL5 
С уважением, Владимир.

Все понял, согласен с Вами 100%, читаю все Ваши материалы, что нашел и вместе с обращениями к справочнику MQL5, поглядываю на опубликованные курсы С++. Авторы MQL5 высказывались о применении в своей программе терминала МТ5, еще одного языка Python, видимо ради его (весьма медленного) "сумасшедших", в последнее время скоростей, фантастика, но с этим не скоро. После понимания, что брокер FXopen отстал от новостей МТ5 и потому создавались ошибки, не выполнял строчку класса MQL5, убрал его из комплекта своих брокеров, наблюдаю пока за остальными, есть на форуме подобные разборки форумчан и еще по брокерам. Но стало ясно, что самое время обновить все, что осталось от прошлых навыков и добавить немалые, как я понял, новости, и с терминалом, и с редактором. Припас на будущее онлайн компилятор С++, и с ним протестим редактор терминала МТ5. В первую очередь хочется разобраться с подстраховкой огромных тейкпрофитов оптимизированного советника, трейлингом или по авторской декларации закрывать позиции после разворота цены. Все свое программирование строю от необходимого сейчас, если советник заработает, по крупному, а он заработает, лучшей стратегии алгоритма, я пока не встречал, а на рынке со времен еще МТ3) но тогда все постижение огромного MQL5, целиком, который от C++, видимо бессмысленно ? Неплохо работает справочник F1. Прошу простить за длинный спич) 

Нашел ручной трейлинг, прямо на графике, смотрю поползет ли за ценой ? Ведь это не стоплосс.

СПАСИБО ВАМ !

С Уважением, Рустам.

 

здравствуйте, сразу хочу предупредить что я новичок так что не ругайтесь сильно если что)

хотел создать советник через генератор (и вроде бы всё нормально но есть одно но)

хотелось бы чтобы сделка открывалась не сразу после закрытия предыдущей а например через одну свечу,

пробовал что-то писать но в итоге выдаёт ошибку.

Может кто-нибудь с этим помочь ну или указать что за ошибка и как её исправить?

а вот собственно код:


//+------------------------------------------------------------------+

//|                                                    ParExpert.mq5 |

//|                                  Copyright 2022, MetaQuotes Ltd. |

//|                                             https://www.mql5.com |

//+------------------------------------------------------------------+

#property copyright "Copyright 2022, MetaQuotes Ltd."

#property link      "https://www.mql5.com"

#property version   "1.00"

//+------------------------------------------------------------------+

//| Include                                                          |

//+------------------------------------------------------------------+

#include <Expert\Expert.mqh>

//--- available signals

#include <Expert\Signal\SignalSAR.mqh>

//--- available trailing

#include <Expert\Trailing\TrailingFixedPips.mqh>

//--- available money management

#include <Expert\Money\MoneyFixedLot.mqh>

//+------------------------------------------------------------------+

//| Inputs                                                           |

//+------------------------------------------------------------------+

//--- inputs for expert

input string Expert_Title                  = "ParExpert";  // Document name

ulong        Expert_MagicNumber            = 24195;        //

bool         Expert_EveryTick              = false;        //

//--- inputs for main signal

input int    Signal_ThresholdOpen          = 10;           // Signal threshold value to open [0...100]

input int    Signal_ThresholdClose         = 0;            // Signal threshold value to close [0...100]

input double Signal_PriceLevel             = 0.0;          // Price level to execute a deal

input double Signal_StopLevel              = 500;          // Stop Loss level (in points)

input double Signal_TakeLevel              = 70;           // Take Profit level (in points)

input int    Signal_Expiration             = 4;            // Expiration of pending orders (in bars)

input double Signal_SAR_Step               = 0.02;         // Parabolic SAR(0.02,0.2) Speed increment

input double Signal_SAR_Maximum            = 0.2;          // Parabolic SAR(0.02,0.2) Maximum rate

input double Signal_SAR_Weight             = 0.6;          // Parabolic SAR(0.02,0.2) Weight [0...1.0]

//--- inputs for trailing

input int    Trailing_FixedPips_StopLevel  = 0;            // Stop Loss trailing level (in points)

input int    Trailing_FixedPips_ProfitLevel= 10;           // Take Profit trailing level (in points)

//--- inputs for money

input double Money_FixLot_Percent          = 10.0;         // Percent

input double Money_FixLot_Lots             = 0.1;          // Fixed volume

//--- inputs for trade cooldown

input int    Expert_TradeCooldown          = 1;            // Cooldown period between trades (in bars)

//+------------------------------------------------------------------+

//| Global expert object                                             |

//+------------------------------------------------------------------+

CExpert ExtExpert;

//+------------------------------------------------------------------+

//| Initialization function of the expert                            |

//+------------------------------------------------------------------+

int OnInit()

{

   //--- Initializing expert

   if (!ExtExpert.Init(Symbol(), Period(), Expert_EveryTick, Expert_MagicNumber))

   {

      //--- failed

      printf(__FUNCTION__ + ": error initializing expert");

      ExtExpert.Deinit();

      return (INIT_FAILED);

   }


   //--- Creating signal

   CExpertSignal *signal = new CExpertSignal;

   if (signal == NULL)

   {

      //--- failed

      printf(__FUNCTION__ + ": error creating signal");

      ExtExpert.Deinit();

      return (INIT_FAILED);

   }


   //---

   ExtExpert.InitSignal(signal);

   signal.ThresholdOpen(Signal_ThresholdOpen);

   signal.ThresholdClose(Signal_ThresholdClose);

   signal.PriceLevel(Signal_PriceLevel);

   signal.StopLevel(Signal_StopLevel);

   signal.TakeLevel(Signal_TakeLevel);

   signal.Expiration(Signal_Expiration);


   //--- Creating filter CSignalSAR

   CSignalSAR *filter0 = new CSignalSAR;

   if (filter0 == NULL)

   {

      //--- failed

      printf(__FUNCTION__ + ": error creating filter0");

      ExtExpert.Deinit();

      return (INIT_FAILED);

   }

   signal.AddFilter(filter0);


   //--- Set filter parameters

   filter0.Step(Signal_SAR_Step);

   filter0.Maximum(Signal_SAR_Maximum);

   filter0.Weight(Signal_SAR_Weight);


   //--- Creation of trailing object

   CTrailingFixedPips *trailing = new CTrailingFixedPips;

   if (trailing == NULL)

   {

      //--- failed

      printf(__FUNCTION__ + ": error creating trailing");

      ExtExpert.Deinit();

      return (INIT_FAILED);

   }


   //--- Add trailing to expert (will be deleted automatically))

   if (!ExtExpert.InitTrailing(trailing))

   {

      //--- failed

      printf(__FUNCTION__ + ": error initializing trailing");

      ExtExpert.Deinit();

      return (INIT_FAILED);

   }


   //--- Set trailing parameters

   trailing.StopLevel(Trailing_FixedPips_StopLevel);

   trailing.ProfitLevel(Trailing_FixedPips_ProfitLevel);


   //--- Creation of money object

   CMoneyFixedLot *money = new CMoneyFixedLot;

   if (money == NULL)

   {

      //--- failed

      printf(__FUNCTION__ + ": error creating money");

      ExtExpert.Deinit();

      return (INIT_FAILED);

   }


   //--- Add money to expert (will be deleted automatically))

   if (!ExtExpert.InitMoney(money))

   {

      //--- failed

      printf(__FUNCTION__ + ": error initializing money");

      ExtExpert.Deinit();

      return (INIT_FAILED);

   }


   //--- Set money parameters

   money.Percent(Money_FixLot_Percent);

   money.Lots(Money_FixLot_Lots);


   //--- Check all trading objects parameters

   if (!ExtExpert.ValidationSettings())

   {

      //--- failed

      ExtExpert.Deinit();

      return (INIT_FAILED);

   }


   //--- Tuning of all necessary indicators

   if (!ExtExpert.InitIndicators())

   {

      //--- failed

      printf(__FUNCTION__ + ": error initializing indicators");

      ExtExpert.Deinit();

      return (INIT_FAILED);

   }


   //--- Initialize last trade time variable

   datetime lastTradeTime = 0;

   ExtExpert.SetVariable("LastTradeTime", lastTradeTime);


   //--- ok

   return (INIT_SUCCEEDED);

}

//+------------------------------------------------------------------+

//| Deinitialization function of the expert                          |

//+------------------------------------------------------------------+

void OnDeinit(const int reason)

{

   ExtExpert.Deinit();

}

//+------------------------------------------------------------------+

//| "Tick" event handler function                                    |

//+------------------------------------------------------------------+

void OnTick()

{

   //--- Check time since last trade

   datetime lastTradeTime = ExtExpert.GetVariable("LastTradeTime");

   int cooldownBars = Bars - ExtExpert.GetBarShiftByTime(Symbol(), Period(), lastTradeTime);


   if (cooldownBars < Expert_TradeCooldown)

   {

      //--- Trade cooldown period not elapsed, skip opening new trade

      return;

   }


   ExtExpert.OnTrade();

}

//+------------------------------------------------------------------+

//| "Trade" event handler function                                   |

//+------------------------------------------------------------------+

void OnTrade()

{

   ExtExpert.OnTrade();

}

//+------------------------------------------------------------------+

//| "Timer" event handler function                                   |

//+------------------------------------------------------------------+

void OnTimer()

{

   ExtExpert.OnTimer();

}

//+------------------------------------------------------------------+

Discover new MetaTrader 5 opportunities with MQL5 community and services
Discover new MetaTrader 5 opportunities with MQL5 community and services
  • 2023.05.27
  • www.mql5.com
MQL5: language of trade strategies built-in the MetaTrader 5 Trading Platform, allows writing your own trading robots, technical indicators, scripts and libraries of functions
Причина обращения: