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

 
Файл внутри загрузки неправильный, пожалуйста, исправьте это.
 

Привет всем,

В настоящее время советник Самуэля работает на демо-счете, и я вполне доволен. Хорошее программирование!

Время от времени он показывает хорошую торговлю, но у него есть слабое место:

Опционы SELL накапливаются в разворотных точках в долине графика и то же самое на соответствующих пиках с опционами BUY, которые затем сначала массово попадают в книги как отрицательные. Я хотел бы перепрограммировать это, т.е. ПОКУПКИ в течение дня, ПРОДАЖИ на пике, но пока мои попытки не увенчались успехом. Я также имею лишь начальные знания о MQL5.

Может ли кто-нибудь помочь мне?

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

 

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

Но прочитайте это:

Спецификации EA-freelancer : https://www.mql5.com/ru/articles/4368
Indi : https://www.mql5.com/ru/articles/4304
Как заказать торгового робота на MQL5 и MQL4 : https://www.mql5.com/ru/articles/117

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

So formulieren Sie das Pflichtenheft eines Auftrages für einen Handelsroboter
So formulieren Sie das Pflichtenheft eines Auftrages für einen Handelsroboter
  • www.mql5.com
Handeln Sie nach Ihrer eigenen Strategie? Wenn Sie Ihre Handelsregeln formalisieren und als Algorithmus für ein Programm beschreiben können, wäre es doch besser, Ihren Handel einem automatisierten Expert Advisor anzuvertrauen. Ein Roboter braucht weder Schlaf noch Nahrung und ist keinen menschlichen Schwächen unterworfen. In diesem Artikel zeigen wir Ihnen, wie Sie, um einen Handelsroboter im Freelance-Service in Auftrag zu geben, das sogenannte Pflichtenheft erstellen.
 

Всем привет (особенно уважаемому автору).

Я кодил по этой статье. Мне очень понравилось и я многому научился.

Спасибо, что написали такую информативную статью.

Однако у меня возникла проблема. Мой советник не выставляет ордера. Я скачал код автора, но он тоже не выставляет ордера.

Поскольку статье уже 13 лет, я предполагаю, что код уже устарел. Может ли кто-нибудь помочь мне?

Мой код находится в файле ниже. Заранее спасибо всем.

Файлы:
myFirstEA.mq5  25 kb
 

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

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

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

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

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

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


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

//|                                                    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
 
Joosy #:

Привет всем😊

@Mario31415927

Это просто потому, что в тикере, каждый раз при новом периоде или новом баре (не важно) переменные:

сбрасываются, независимо от того, открыты ли уже позиции или нет.

Это можно сравнительно быстро найти в коде.

Однако возникает вопрос, так ли это было задумано, и если да, то как снова закрыть все позиции?

Возможно, я не понимаю тип ордера TRADE_ACTION_DEAL в этом контексте?

Вы также можете просто адаптировать процесс торгового ордера к торговому классу Trade. Например:

С наилучшими пожеланиями:-)

Читайте: https://www.mql5.com/ru/articles/232

Это объясняет разницу и взаимосвязь между ордерами, позициями и сделками. Последние отражают процессы бронирования на стороне брокера.

Handelsereignisse in MetaTrader 5
Handelsereignisse in MetaTrader 5
  • www.mql5.com
Eine Überwachung des aktuellen Status eines Handels-Account bedeutet offene Positions und Order kontrollieren zu können. Bevor ein Handelssignal zu einem Abschluss wird, sollte es vom Client-Terminal als Anfrage zum Handels-Server geschickt werden, wo es in eine Order-Warteschlange gestellt wird und auf seine Bearbeitung wartet. Eine Anfrage vom Handels-Server annehmen, sie löschen, wenn sie abläuft oder auf ihrer Grundlage einen Abschluss ausführen - alle diese Handlungen haben Handelsereignisse zur Folge, und der Handels-Server informiert das Terminal entsprechend darüber.
 
Carl Schreiber #:

Читайте: https://www.mql5.com/ru/articles/232

Здесь объясняется разница и взаимосвязь между ордерами, позициями и сделками. Последние отражают процессы бронирования на стороне брокера.

Здравствуйте, Карл,

спасибо за совет!

Однако я должен поправить себя.

Это правда, что переменные сбрасываются для каждого нового временного периода:

   bool Buy_opened = false, Sell_opened = false; // переменные для хранения результата открытия позиции

Но впоследствии они снова устанавливаются, если есть соответствующая позиция.

   if(PositionSelect(_Symbol) == true) { // у нас есть открытая позиция

      if(PositionGetInteger(POSITION_TYPE) == POSITION_TYPE_BUY) {

         Buy_opened = true;  //Купить

      }

      if(PositionGetInteger(POSITION_TYPE) == POSITION_TYPE_SELL) {

         Sell_opened = true; // Это продажа

      }

   }

Однако я сталкиваюсь с тем, что покупка (POSITION_TYPE_BUY) запрашивается правильно, а продажа (POSITION_TYPE_SELL) - нет. Переменная просто больше не устанавливается?

Мне приходится отлаживать код шаг за шагом. Это может быть только логическая ошибка😉.

Einen Expert Advisor mit Hilfe des MQL5 Objekt-orientierten Programmieransatzes schreiben
Einen Expert Advisor mit Hilfe des MQL5 Objekt-orientierten Programmieransatzes schreiben
  • www.mql5.com
Dieser Beitrag beschäftigt sich mit dem Objekt-orientierten Ansatz, um das zu machen, was wir bereits im Artikel "Schrittweiser Leitfaden zum Schreiben eines Expert Advisors in MQL5 für Anfänger" getan haben - einen einfachen Expert Advisor erstellen. Die meisten Menschen glauben, das sei schwer, doch ich darf Ihnen versichern: wenn Sie diesen Beitrag gelesen haben, dann können Sie Ihren eigenen Objekt-orientierten Expert Advisor schreiben.
 
Joosy #:
Sell_opened = true; // Это продажа

О, Боже, я сегодня в ударе.

Это запрашивается только один раз. Вот в чем ошибка;-)

Поиск по всем позициям должен осуществляться следующим образом;

   bool Buy_opened = false, Sell_opened = false; // переменные для хранения результата открытия позиции
   
   for(int i=0; i < PositionsTotal(); i++) {
      ticket = PositionGetTicket(i);
      if(PositionGetString(POSITION_SYMBOL) == _Symbol && PositionGetInteger(POSITION_MAGIC) == EA_Magic) {
         if(PositionGetInteger(POSITION_TYPE) == POSITION_TYPE_BUY) { 
            Buy_opened = true; 
         }
         if(PositionGetInteger(POSITION_TYPE) == POSITION_TYPE_SELL) { 
            Sell_opened = true; 
         }
      }   
   }
 

Это действительно была ошибка, похоже, что это веб-файл.

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

Файлы:
my_first_ea.mq5  12 kb
 

Tester - "Unsupported filling mode"

Tried on 3 different brokers. Whats the problem?