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

Вы упускаете торговые возможности:
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Регистрация
Вход
Вы принимаете политику сайта и условия использования
Если у вас нет учетной записи, зарегистрируйтесь
Привет всем,
В настоящее время советник Самуэля работает на демо-счете, и я вполне доволен. Хорошее программирование!
Время от времени он показывает хорошую торговлю, но у него есть слабое место:
Опционы 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
С помощью этих подсказок вы можете более точно сформулировать свою идею, будь то просто для себя, чтобы посмотреть, работает ли она, или для того, чтобы попросить кого-то сделать это, с оплатой или без.
Всем привет (особенно уважаемому автору).
Я кодил по этой статье. Мне очень понравилось и я многому научился.
Спасибо, что написали такую информативную статью.
Однако у меня возникла проблема. Мой советник не выставляет ордера. Я скачал код автора, но он тоже не выставляет ордера.
Поскольку статье уже 13 лет, я предполагаю, что код уже устарел. Может ли кто-нибудь помочь мне?
Мой код находится в файле ниже. Заранее спасибо всем.
здравствуйте, сразу хочу предупредить что я новичок так что не ругайтесь сильно если что)
хотел создать советник через генератор (и вроде бы всё нормально но есть одно но)
хотелось бы чтобы сделка открывалась не сразу после закрытия предыдущей а например через одну свечу,
пробовал что-то писать но в итоге выдаёт ошибку.
Может кто-нибудь с этим помочь ну или указать что за ошибка и как её исправить?
а вот собственно код:
//+------------------------------------------------------------------+
//| 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();
}
//+------------------------------------------------------------------+
Привет всем😊
@Mario31415927
Это просто потому, что в тикере, каждый раз при новом периоде или новом баре (не важно) переменные:
сбрасываются, независимо от того, открыты ли уже позиции или нет.
Это можно сравнительно быстро найти в коде.
Однако возникает вопрос, так ли это было задумано, и если да, то как снова закрыть все позиции?
Возможно, я не понимаю тип ордера TRADE_ACTION_DEAL в этом контексте?
Вы также можете просто адаптировать процесс торгового ордера к торговому классу Trade. Например:
С наилучшими пожеланиями:-)Читайте: https://www.mql5.com/ru/articles/232
Это объясняет разницу и взаимосвязь между ордерами, позициями и сделками. Последние отражают процессы бронирования на стороне брокера.
Читайте: https://www.mql5.com/ru/articles/232
Здесь объясняется разница и взаимосвязь между ордерами, позициями и сделками. Последние отражают процессы бронирования на стороне брокера.
Здравствуйте, Карл,
спасибо за совет!
Однако я должен поправить себя.
Это правда, что переменные сбрасываются для каждого нового временного периода:
Но впоследствии они снова устанавливаются, если есть соответствующая позиция.
Однако я сталкиваюсь с тем, что покупка (POSITION_TYPE_BUY) запрашивается правильно, а продажа (POSITION_TYPE_SELL) - нет. Переменная просто больше не устанавливается?
Мне приходится отлаживать код шаг за шагом. Это может быть только логическая ошибка😉.
Sell_opened = true; // Это продажа
О, Боже, я сегодня в ударе.
Это запрашивается только один раз. Вот в чем ошибка;-)
Поиск по всем позициям должен осуществляться следующим образом;
Это действительно была ошибка, похоже, что это веб-файл.
Я сам переписал его на основе содержимого и загрузил. Я не знаю, есть ли какие-либо подробности, потому что я новичок в этом деле. Надеюсь, это поможет.
Tester - "Unsupported filling mode"
Tried on 3 different brokers. Whats the problem?