Buona giornata a tutti. Ho un EA che segnala l'attraversamento di una linea di tendenza e diuna lineaorizzontale di un certo colore. Ho deciso di rifarlo in modo che segnali quando la linea di tendenza e la linea orizzontale incrociano un certo stile. Ha funzionato. Ma mi serve per segnalare quando una linea di tendenza attraversa solo il raggio a destra. Capisco che devo aggiungere
OBJPROP_RAY_RIGHT
ma non so dove o come. Grazie in anticipo.
//+------------------------------------------------------------------+//| 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
Buon pomeriggio. L'Expert Advisor dovrebbe controllare le condizioni e aprire gli ordini quando appare una nuova barra.
Ho ottenuto l'errore" le dichiarazioni difunzione sono consentite solo su ambito globale, spazio dei nomi o classe". L'ho tradotto in "le dichiarazioni di funzione sono permesse solo nell'ambito globale, namespace o classe". Ancora non lo capisco, sono troppo stupido. Per favore, ditemi o ditemi dove leggerlo. Grazie in anticipo)
Puoi postare il codice per aprire un trade, vedrò perché non funziona
no
il parametro 0 indica l'appartenenza a questo grafico
Scusa, mi sono confuso con la funzione
StringFindPuoi postare il codice per aprire un trade, vedrò perché non funziona
Ecco incollare le tue funzioni
Ecco incollare le tue caratteristiche
Prima
OrderOfSymbol=CounterOrderTradeType(-1);dovrebbe essere messo qui.
Sistemerò il resto.Ecco incollare le tue funzioni
Prova
L'ho modificato e aggiornato un po' di più
Sono fuori casa, lo testerò domani. Grazie.
Sono fuori casa, lo testerò domani. Grazie.
Buona giornata a tutti. Ho un EA che segnala l'attraversamento di una linea di tendenza e diuna lineaorizzontale di un certo colore. Ho deciso di rifarlo in modo che segnali quando la linea di tendenza e la linea orizzontale incrociano un certo stile. Ha funzionato. Ma mi serve per segnalare quando una linea di tendenza attraversa solo il raggio a destra. Capisco che devo aggiungere
OBJPROP_RAY_RIGHT
Buon pomeriggio.
L'Expert Advisor dovrebbe controllare le condizioni e aprire gli ordini quando appare una nuova barra.
Ho ottenuto l'errore" le dichiarazioni difunzione sono consentite solo su ambito globale, spazio dei nomi o classe". L'ho tradotto in "le dichiarazioni di funzione sono permesse solo nell'ambito globale, namespace o classe".
Ancora non lo capisco, sono troppo stupido. Per favore, ditemi o ditemi dove leggerlo. Grazie in anticipo)
***