Всем доброго времени суток. Есть советник - сигналит по пересечению трендовой игоризонтальной линийопределенного цвета. Я Решил переделать его чтоб он сигналил при пересечении трендовой и горизонтальной линий определенного стиля. Получилось. Но мне нужно чтоб он сигналил при пересечении трендовой которая только с лучом вправо. Я понимаю что нужно прикрутить
OBJPROP_RAY_RIGHT
но куда и как пока не догоняю. Спасибо заранее.
//+------------------------------------------------------------------+//| TrendlineCrossAlert.mq5 |//| Copyright 2018, Strx |//| https://www.mql5.com/en/users/strx |//+------------------------------------------------------------------+#define EAName "TrendlineCrossAlert"#define EAVersion "1.01"#property copyright"Copyright 2018, Strx"#property link"https://www.mql5.com/en/users/strx"#property version EAVersion
#property description"Horizontal and Trendlines cross detection on any pair/timeframe"#property description"good for scalping on small timeframes (M1 to M15) and trend following on bigger ones."#property description"It send notifications when price crosses trendlines and horizontal lines"#property description"of specified color and when it happens, it change its color to CrossedColor input parameter"#property description"to be sure not to send multiple notifications for same line"#include <Arrays\ArrayString.mqh>
#include <Trade\SymbolInfo.mqh>
#include <ChartObjects\ChartObject.mqh>
#include <ChartObjects\ChartObjectsLines.mqh>
//--- External inputssinputENUM_LINE_STYLE MonitoringStyle = STYLE_SOLID; //MonitoringColor, EA only monitors this lines stylesinputENUM_LINE_STYLE CrossedStyle = STYLE_DASH; //CrossedColor, EA changes crossed lines style to this valuesinputbool EnableAlerts = true;
sinputbool EnableNotifications=true;
sinputbool EnableEmails=false;
//+------------------------------------------------------------------+//| Trendlines and Horizontal lines crossing notification expert//+------------------------------------------------------------------+class CTrendlineCrossAlertExpert
{
protected:
CSymbolInfo m_symbol; // symbol info object//--- Logic vars
CArrayString m_objectNames;
public:
CTrendlineCrossAlertExpert(void);
~CTrendlineCrossAlertExpert(void);
bool Init(void);
void Deinit(void);
bool Processing(void);
protected:
//--- Inline functions string FormatPrice(double price){ returnStringFormat("%."+(string)m_symbol.Digits()+"f",price); };
bool IsNewBar(){ returniVolume(NULL,0,0)==1; };
//--- Logic functionsint FindActiveObjects();
bool ActiveObject(string objName);
bool PriceCrossed(string objName);
void NotifyCrossing(string objName);
};
//--- global expert
CTrendlineCrossAlertExpert ExtExpert;
//+------------------------------------------------------------------+//| Constructor |//+------------------------------------------------------------------+
CTrendlineCrossAlertExpert::CTrendlineCrossAlertExpert(void){}
//+------------------------------------------------------------------+//| Destructor |//+------------------------------------------------------------------+
CTrendlineCrossAlertExpert::~CTrendlineCrossAlertExpert(void){}
//+------------------------------------------------------------------+//| Initialization and checking for input parameters |//+------------------------------------------------------------------+bool CTrendlineCrossAlertExpert::Init(void)
{
//--- initialize common information
m_symbol.Name(Symbol()); // symbol return(true);
}
//+------------------------------------------------------------------+//| main function returns true if any position processed |//+------------------------------------------------------------------+bool CTrendlineCrossAlertExpert::Processing(void)
{
bool rv=false;
int i;
string objName;
if(m_symbol.RefreshRates())
{
if(FindActiveObjects())
{
for(i=0; i<m_objectNames.Total(); i++)
{
objName=m_objectNames[i];
if(PriceCrossed(objName))
{
ObjectSetInteger(0,objName,OBJPROP_STYLE,CrossedStyle);
NotifyCrossing(objName);
}
}
}
}
Comment(EAName," v.",EAVersion," parameters: MonitoringStyle=",MonitoringStyle,", CrossedStyle=",CrossedStyle,", EnableAlerts=",EnableAlerts,", EnableNotifications=",EnableNotifications,", EnableEmails=",EnableEmails,"\n",
"Monitoring ",m_objectNames.Total()," lines");
return(rv);
}
//+------------------------------------------------------------------+//| Send Notifications function//+------------------------------------------------------------------+void CTrendlineCrossAlertExpert::NotifyCrossing(string objName)
{
string msg="Price crossed line ''"+objName+"' on "+m_symbol.Name();
if(EnableAlerts) Alert(msg);
if(EnableNotifications) SendNotification(msg);
if(EnableEmails) SendMail(EAName+" Event",msg);
Print(msg);
}
//+------------------------------------------------------------------+//| Returns true if objName has been crossed up or down by current price//+------------------------------------------------------------------+bool CTrendlineCrossAlertExpert::PriceCrossed(string objName)
{
ENUM_OBJECT objType;
double objPrice=0.0,openPrice,curPrice;
objType=(ENUM_OBJECT)ObjectGetInteger(0,objName,OBJPROP_TYPE);
if(objType==OBJ_HLINE)
{
objPrice= ObjectGetDouble(0, objName, OBJPROP_PRICE);
}elseif(objType==OBJ_TREND){
objPrice=ObjectGetValueByTime(0,objName,TimeCurrent(),0);
}
if(objPrice)
{
openPrice= iOpen(NULL,0,0);
curPrice = iClose(NULL,0,0);
return (openPrice<=objPrice && curPrice>objPrice) || (openPrice>=objPrice && curPrice<objPrice);
}
returnfalse;
}
//+------------------------------------------------------------------+//| Returns true if object has to be monitored based on color and//| previous crosses//+------------------------------------------------------------------+bool CTrendlineCrossAlertExpert::ActiveObject(string objName)
{
int objStyle=(int)ObjectGetInteger(0,objName,OBJPROP_STYLE,0);
return objStyle == MonitoringStyle;
}
//+------------------------------------------------------------------+//| Returns the list of object to be monitored//+------------------------------------------------------------------+int CTrendlineCrossAlertExpert::FindActiveObjects()
{
m_objectNames.Clear();
int nHLines=ObjectsTotal(0,-1,OBJ_HLINE),
nTrendLines=ObjectsTotal(0,-1,OBJ_TREND),
i;
string objName;
for(i=0; i<nHLines; i++)
{
objName=ObjectName(0,i,0,OBJ_HLINE);
if(ActiveObject(objName))
{
m_objectNames.Add(objName);
}
}
for(i=0; i<nTrendLines; i++)
{
objName=ObjectName(0,i,0,OBJ_TREND);
if(ActiveObject(objName))
{
m_objectNames.Add(objName);
}
}
return m_objectNames.Total();
}
//+------------------------------------------------------------------+//| Expert initialization function |//+------------------------------------------------------------------+intOnInit(void)
{
if(!ExtExpert.Init())
return(INIT_FAILED);
return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+//| Expert new tick handling function |//+------------------------------------------------------------------+voidOnTick(void)
{
ExtExpert.Processing();
}
//+------------------------------------------------------------------+
Типы объектов - Константы объектов - Константы, перечисления и структуры - Справочник MQL5 - Справочник по языку алгоритмического/автоматического трейдинга для MetaTrader 5
Добрый день. Согласно задумке советник должен проверять условия и открывать ордера при появлении нового бара.
Выдаёт ошибку "function declarations are allowed on global, namespace or class scope only". Перевёл :"объявления функций разрешены только в глобальной области, пространстве имен или классе". Всё равно ничего не понял, тупенький. Расскажите пожалуйста или подскажите где прочесть. Заранее спасибо!)
Для авторизации и пользования сайтом MQL5.com необходимо разрешить использование файлов Сookie.
Пожалуйста, включите в вашем браузере данную настройку, иначе вы не сможете авторизоваться.
Вы вошли в аккаунт. Двухфакторная аутентификация отключена. Настройте её заново и отсканируйте новый QR-код или продолжите с отключённой двухфакторной аутентификацией.
Можешь выложить код открытия сделки, я посмотрю почему не работает
нет
параметр 0 говорит о принадлежности к этому графику
Извините перепутал с функцией
StringFindМожешь выложить код открытия сделки, я посмотрю почему не работает
Вот вставил ваши функции
Вот вставил ваши функции
Первое
OrderOfSymbol=CounterOrderTradeType(-1);надо вынести сюда
Сейчас остальное подправлюВот вставил ваши функции
Пробуй
Еще чуть подправил и обновил
не дома уже, завтра потестирую. Спасибо.
не дома уже, завтра потестирую. Спасибо.
Всем доброго времени суток. Есть советник - сигналит по пересечению трендовой и горизонтальной линий определенного цвета. Я Решил переделать его чтоб он сигналил при пересечении трендовой и горизонтальной линий определенного стиля. Получилось. Но мне нужно чтоб он сигналил при пересечении трендовой которая только с лучом вправо. Я понимаю что нужно прикрутить
OBJPROP_RAY_RIGHT
Добрый день.
Согласно задумке советник должен проверять условия и открывать ордера при появлении нового бара.
Выдаёт ошибку "function declarations are allowed on global, namespace or class scope only". Перевёл :"объявления функций разрешены только в глобальной области, пространстве имен или классе".
Всё равно ничего не понял, тупенький. Расскажите пожалуйста или подскажите где прочесть. Заранее спасибо!)
***