Es gibt jetzt drei Trendlinien im Indikator, und der Expert Advisor eröffnet eine Position aus diesen Linien.
inputstring t10="----- Trend Line Name ------"; // Trend Line Nameinputstring InpNameAverage = "AVERAGE 0"; // Trend Line Nameinputstring InpNameAverage0 = "TOP 0"; // Trend Line Nameinputstring InpNameAverage1 = "LOWER 0"; // Trend Line Name
Jetzt gibt es drei Trendlinien im Indikator, und der Expert Advisor eröffnet Positionen anhand dieser Linien
Hier ist eine Version - wie ich es gemacht habe - es funktioniert vollständig mit den Trendlinien, die Sie manuell gezeichnet haben
die Einstellungen - die sie hat
//---inputdouble InpLots = 0.1; // Lotsinputint InpTakeProfit = 50; // Take Profit (in pips)inputstring t0="----- Trend Line Name ------";// Trend Line Nameinputstring InpNameAverage = "AVERAGE 0"; // Trend Line Nameinputstring InpNameAverage0 = "TOP 0"; // Trend Line Nameinputstring InpNameAverage1 = "LOWER 0"; // Trend Line Name//---
//+------------------------------------------------------------------+//| MACD Sample.mq5 |//| Copyright 2009-2017, MetaQuotes Software Corp. |//| http://www.mql5.com |//+------------------------------------------------------------------+#property copyright"Copyright 2009-2017, MetaQuotes Software Corp."#property link"http://www.mql5.com"#property version"5.50"#property description"It is important to make sure that the expert works with a normal"#property description"chart and the user did not make any mistakes setting input"#property description"variables (Lots, TakeProfit, TrailingStop) in our case,"#property description"we check TakeProfit on a chart of more than 2*trend_period bars"#define MACD_MAGIC 1234502//---#include <Trade\Trade.mqh>
#include <Trade\SymbolInfo.mqh>
#include <Trade\PositionInfo.mqh>
#include <Trade\AccountInfo.mqh>
//---inputdouble InpLots = 0.1; // Lotsinputint InpTakeProfit = 50; // Take Profit (in pips)inputstring t0="----- Trend Line Name ------";// Trend Line Nameinputstring InpNameAverage = "AVERAGE 0"; // Trend Line Nameinputstring InpNameAverage0 = "TOP 0"; // Trend Line Nameinputstring InpNameAverage1 = "LOWER 0"; // Trend Line Name//---datetime ExtLastINAverage = 0; // "0" -> D'1970.01.01 00:00';datetime ExtLastINAverage0 = 0; // "0" -> D'1970.01.01 00:00';datetime ExtLastINAverage1 = 0; // "0" -> D'1970.01.01 00:00';datetime ExtPrevBars = 0; // "0" -> D'1970.01.01 00:00';//---int ExtTimeOut=10; // time out in seconds between trade operations//+------------------------------------------------------------------+//| MACD Sample expert class |//+------------------------------------------------------------------+class CSampleExpert
{
protected:
double m_adjusted_point; // point value adjusted for 3 or 5 points
CTrade m_trade; // trading object
CSymbolInfo m_symbol; // symbol info object
CPositionInfo m_position; // trade position object
CAccountInfo m_account; // account info wrapper//--- indicatorsint m_handle_ema; // moving average indicator handle//--- indicator buffersdouble m_buff_EMA[]; // EMA indicator buffer//--- indicator data for processingdouble m_ema_current;
double m_ema_previous;
//---double m_take_profit;
public:
CSampleExpert(void);
~CSampleExpert(void);
bool Init(void);
void Deinit(void);
bool Processing(void);
protected:
bool InitIndicators(void);
bool TrendOpened(void);
bool TrendOpened0(void);
bool TrendOpened1(void);
};
//--- global expert
CSampleExpert ExtExpert;
//+------------------------------------------------------------------+//| Constructor |//+------------------------------------------------------------------+
CSampleExpert::CSampleExpert(void) : m_adjusted_point(0),
m_handle_ema(INVALID_HANDLE),
m_ema_current(0),
m_ema_previous(0),
m_take_profit(0)
{
ArraySetAsSeries(m_buff_EMA,true);
}
//+------------------------------------------------------------------+//| Destructor |//+------------------------------------------------------------------+
CSampleExpert::~CSampleExpert(void)
{
}
//+------------------------------------------------------------------+//| Initialization and checking for input parameters |//+------------------------------------------------------------------+bool CSampleExpert::Init(void)
{
//--- initialize common information
m_symbol.Name(Symbol()); // symbol
m_trade.SetExpertMagicNumber(MACD_MAGIC); // magic
m_trade.SetMarginMode();
m_trade.SetTypeFillingBySymbol(m_symbol.Name());
//--- tuning for 3 or 5 digitsint digits_adjust=1;
if(m_symbol.Digits()==3 || m_symbol.Digits()==5)
digits_adjust=10;
m_adjusted_point=m_symbol.Point()*digits_adjust;
//--- set default deviation for trading in adjusted points
m_take_profit =InpTakeProfit*m_adjusted_point;
//--- set default deviation for trading in adjusted points
m_trade.SetDeviationInPoints(3*digits_adjust);
//---if(!InitIndicators())
return(false);
//--- succeedreturn(true);
}
//+------------------------------------------------------------------+//| Initialization of the indicators |//+------------------------------------------------------------------+bool CSampleExpert::InitIndicators(void)
{
//--- create EMA indicator and add it to collectionif(m_handle_ema==INVALID_HANDLE)
if((m_handle_ema=iCustom(m_symbol.Name(),Period(),"2 Obj Volatility_StepChannel"))==INVALID_HANDLE)
{
printf("Error creating EMA indicator");
return(false);
}
//--- succeedreturn(true);
}
//+------------------------------------------------------------------+//| Check for long position opening |//+------------------------------------------------------------------+bool CSampleExpert::TrendOpened(void)
{
bool res=false;
//--- check for long position (BUY) possibilityif(ObjectFind(0,InpNameAverage)<0)
return(true);
MqlRates ratesAverage[];
ArraySetAsSeries(ratesAverage,true);
int start_pos=0,count=3;
if(CopyRates(m_symbol.Name(),Period(),start_pos,count,ratesAverage)!=count)
return(false);
if(ratesAverage[0].time==ExtLastINAverage)
return(true);
double value_by_time=ObjectGetValueByTime(0,InpNameAverage,ratesAverage[1].time);
if(value_by_time==0.0)
return(true);
if(ratesAverage[1].open<value_by_time && ratesAverage[1].close>value_by_time)
{
double price=m_symbol.Ask();
double tp =m_symbol.Bid()+m_take_profit;
//--- open positionif(m_trade.PositionOpen(Symbol(),ORDER_TYPE_BUY,InpLots,price,0.0,tp))
printf("Position by %s to be opened",m_symbol.Name());
else
{
printf("Error opening BUY position by %s : '%s'",m_symbol.Name(),m_trade.ResultComment());
printf("Open parameters : price=%f,TP=%f",price,tp);
}
res=true;
}
if(ratesAverage[1].open>value_by_time && ratesAverage[1].close<value_by_time)
{
double price=m_symbol.Bid();
double tp =m_symbol.Ask()-m_take_profit;
if(m_trade.PositionOpen(m_symbol.Name(),ORDER_TYPE_SELL,InpLots,price,0.0,tp))
printf("Position by %s to be opened",m_symbol.Name());
else
{
printf("Error opening SELL position by %s : '%s'",m_symbol.Name(),m_trade.ResultComment());
printf("Open parameters : price=%f,TP=%f",price,tp);
} //--- in any case we must exit from expert
res=true;
}
//--- resultreturn(res);
}
//+------------------------------------------------------------------+//| Check for long position opening |//+------------------------------------------------------------------+bool CSampleExpert::TrendOpened0(void)
{
bool res=false;
//--- check for long position (BUY) possibilityif(ObjectFind(0,InpNameAverage0)<0)
return(true);
MqlRates ratesAverage[];
ArraySetAsSeries(ratesAverage,true);
int start_pos=0,count=3;
if(CopyRates(m_symbol.Name(),Period(),start_pos,count,ratesAverage)!=count)
return(false);
if(ratesAverage[0].time==ExtLastINAverage0)
return(true);
double value_by_time=ObjectGetValueByTime(0,InpNameAverage0,ratesAverage[1].time);
if(value_by_time==0.0)
return(true);
if(ratesAverage[1].open<value_by_time && ratesAverage[1].close>value_by_time)
{
double price=m_symbol.Ask();
double tp =m_symbol.Bid()+m_take_profit;
//--- open positionif(m_trade.PositionOpen(m_symbol.Name(),ORDER_TYPE_BUY,InpLots,price,0.0,tp))
printf("Position by %s to be opened",m_symbol.Name());
else
{
printf("Error opening BUY position by %s : '%s'",m_symbol.Name(),m_trade.ResultComment());
printf("Open parameters : price=%f,TP=%f",price,tp);
}
res=true;
}
if(ratesAverage[1].open>value_by_time && ratesAverage[1].close<value_by_time)
{
double price=m_symbol.Bid();
double tp =m_symbol.Ask()-m_take_profit;
if(m_trade.PositionOpen(m_symbol.Name(),ORDER_TYPE_SELL,InpLots,price,0.0,tp))
printf("Position by %s to be opened",m_symbol.Name());
else
{
printf("Error opening SELL position by %s : '%s'",m_symbol.Name(),m_trade.ResultComment());
printf("Open parameters : price=%f,TP=%f",price,tp);
} //--- in any case we must exit from expert
res=true;
}
//--- resultreturn(res);
}
//+------------------------------------------------------------------+//| Check for long position opening |//+------------------------------------------------------------------+bool CSampleExpert::TrendOpened1(void)
{
bool res=false;
//--- check for long position (BUY) possibilityif(ObjectFind(0,InpNameAverage1)<0)
return(true);
MqlRates ratesAverage[];
ArraySetAsSeries(ratesAverage,true);
int start_pos=0,count=3;
if(CopyRates(m_symbol.Name(),Period(),start_pos,count,ratesAverage)!=count)
return(false);
if(ratesAverage[0].time==ExtLastINAverage1)
return(true);
double value_by_time=ObjectGetValueByTime(0,InpNameAverage1,ratesAverage[1].time);
if(value_by_time==0.0)
return(true);
if(ratesAverage[1].open<value_by_time && ratesAverage[1].close>value_by_time)
{
double price=m_symbol.Ask();
double tp =m_symbol.Bid()+m_take_profit;
//--- open positionif(m_trade.PositionOpen(m_symbol.Name(),ORDER_TYPE_BUY,InpLots,price,0.0,tp))
printf("Position by %s to be opened",m_symbol.Name());
else
{
printf("Error opening BUY position by %s : '%s'",m_symbol.Name(),m_trade.ResultComment());
printf("Open parameters : price=%f,TP=%f",price,tp);
}
res=true;
}
if(ratesAverage[1].open>value_by_time && ratesAverage[1].close<value_by_time)
{
double price=m_symbol.Bid();
double tp =m_symbol.Ask()-m_take_profit;
if(m_trade.PositionOpen(m_symbol.Name(),ORDER_TYPE_SELL,InpLots,price,0.0,tp))
printf("Position by %s to be opened",m_symbol.Name());
else
{
printf("Error opening SELL position by %s : '%s'",m_symbol.Name(),m_trade.ResultComment());
printf("Open parameters : price=%f,TP=%f",price,tp);
} //--- in any case we must exit from expert
res=true;
}
//--- resultreturn(res);
}
//+------------------------------------------------------------------+//| main function returns true if any position processed |//+------------------------------------------------------------------+bool CSampleExpert::Processing(void)
{
//--- refresh ratesif(!m_symbol.RefreshRates())
return(false);
//--- refresh indicatorsif(BarsCalculated(m_handle_ema)<2)
return(false);
if(CopyBuffer(m_handle_ema,0,0,2,m_buff_EMA)!=2)
return(false);
// m_indicators.Refresh();//--- to simplify the coding and speed up access//--- data are put into internal variables
m_ema_current =m_buff_EMA[0];
m_ema_previous =m_buff_EMA[1];
//--- it is important to enter the market correctly,//--- but it is more important to exit it correctly...//--- first check if position exists - try to select it//--- no opened position identified//--- no opened position identifieddatetime time_0=iTime(m_symbol.Name(),Period(),0);
if(time_0==ExtPrevBars)
return(true);
ExtPrevBars=time_0;
{
//--- try to close or modify long positionif(TrendOpened()||TrendOpened0()||TrendOpened1())
return(true);
}
//--- exit without position processingreturn(false);
}
//+------------------------------------------------------------------+//| Expert initialization function |//+------------------------------------------------------------------+intOnInit(void)
{
//--- create all necessary objectsif(!ExtExpert.Init())
return(INIT_FAILED);
//--- secceedreturn(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+//| Expert new tick handling function |//+------------------------------------------------------------------+voidOnTick(void)
{
staticdatetime limit_time=0; // last trade processing time + timeout//--- don't process if timeoutif(TimeCurrent()>=limit_time)
{
//--- check for dataif(Bars(Symbol(),Period())>2*0)
{
//--- change limit time by timeout in seconds if processedif(ExtExpert.Processing())
limit_time=TimeCurrent()+ExtTimeOut;
}
}
}
//+------------------------------------------------------------------+
При создании графического объекта функцией ObjectCreate() необходимо указать тип создаваемого объекта, который может принимать одно из значений перечисления ENUM_OBJECT. Дальнейшие уточнения свойств созданного объекта возможно с помощью функций по работе с графическими объектами.
inputuint maxLimits = 1; // Кол-во Позиции Открыть в одну сторонуinputdouble InpLots = 0.1; // Lotsinputint InpTakeProfit = 50; // Take Profit (in pips)
hinzugefügt von der durchschnittlichen Trendlinie - wenn sie geöffnet wird, zeichnet sie eine horizontale Linie, die sich hinter dem Preis bewegt und von der aus Sie einen Befehl setzen können
Es gibt noch einige weitere Anpassungen
//---inputuint maxLimits = 1; // Кол-во Позиции Открыть в одну сторонуinputdouble InpLots = 0.1; // Lotsinputint InpTakeProfit = 50; // Take Profit (in pips)inputstring t0="----- Trend Line Name ------"; // Trend Line Nameinputstring InpNameAverage = "AVERAGE 0"; // Trend Line Nameinputstring InpNameAverage0 = "TOP 0"; // Trend Line Nameinputstring InpNameAverage1 = "LOWER 0"; // Trend Line Nameinputstring t1="--- Obj:Trailing Line --- "; // Trailing Obj:Lineinputstring InpObjUpName = "BUY"; // Obj: TOP (Horizontal Line) ВВЕРХУinput ENUM_TRADE_COMMAND InpTradeCommand = open_sell; // Obj: command:inputstring InpObjDownName = "SELL"; // Obj: LOWER (Horizontal Line) ВНИЗУinput ENUM_TRADE_COMMAND InTradeCommand = open_buy; // Obj: command:inputushort InpObjTrailingStop = 25; // Obj: Trailing Stop (distance from price to object, in pips)inputushort InpObjTrailingStep = 5; // Obj: Trailing Step, in pips (1.00045-1.00055=1 pips)inputstring t2="------ Obj: Revers Buy and Sell --"; // Obj: Revers Buy and Sellinputbool ObjRevers = false; // Obj: Revers//---
hinzugefügt von der mittleren Trendlinie - wenn sie geöffnet wird, zeichnet sie eine horizontale Linie, die sich hinter dem Preis bewegt und von diesem aus befohlen werden kann
Es gibt ein bisschen mehr Anpassung
Ich habe auch einige Optionen hinzugefügt - von der Trendlinie gibt es eine Option, um horizontale Linien in einem bestimmten Abstand zu zeichnen
//---inputuint maxLimits = 1; // Кол-во Позиции Открыть в одну сторонуinputdouble InpLots = 0.1; // Lotsinputint InpTakeProfit = 50; // Take Profit (in pips)inputstring t0="----- Trend Line Name ------"; // Trend Line Nameinputstring InpNameAverage = "AVERAGE 0"; // Trend Line Nameinputbool InpObjHLine = false; // Obj: HLineinputstring InpNameAverage0 = "TOP 0"; // Trend Line Nameinputbool InpObjHLine0 = false; // Obj: HLineinputstring InpNameAverage1 = "LOWER 0"; // Trend Line Nameinputbool InpObjHLine1 = false; // Obj: HLineinputstring t1="--- Obj:Trailing Line --- "; // Trailing Obj:Line/*
input string InpObjUpNamex = "BUYx"; // Obj: TOP (Horizontal Line) ВВЕРХУ
input string InpObjDownNamex = "SELLx"; // Obj: LOWER (Horizontal Line) ВНИЗУ
*/inputint InpStep = 15; // Obj: Шаг сетки, пунктов("0" -> false)inputstring InpObjUpName = "BUY"; // Obj: TOP (Horizontal Line) ВВЕРХУinput ENUM_TRADE_COMMAND InpTradeCommand = open_buy; // Obj: command:inputstring InpObjDownName = "SELL"; // Obj: LOWER (Horizontal Line) ВНИЗУinput ENUM_TRADE_COMMAND InTradeCommand = open_sell; // Obj: command:inputushort InpObjTrailingStop = 25; // Obj: Trailing Stop (distance from price to object, in pips)inputushort InpObjTrailingStep = 5; // Obj: Trailing Step, in pips (1.00045-1.00055=1 pips)inputstring t2="------ Obj: Revers Buy and Sell --"; // Obj: Revers Buy and Sellinputbool ObjRevers = false; // Obj: Revers//---
um zu vermeiden, dass horizontale Linien hervortreten, sollte Null eingestellt werden
inputint InpStep = 15; // Obj: Шаг сетки, пунктов("0" -> false)inputushort InpObjTrailingStop = 25; // Obj: Trailing Stop (distance from price to object, in pips)
Индикатор рисует уровни Pivot, промежуточные уровни Pivot и уровни Camarilla. Уровни могут отображаться индикаторными буферами (по всей истории) и/или только текущие уровни горизонтальными линиями. DayStartHour - Час времени начала дня. DayStartMinute - Минуты времени начала дня. PivotsBufers - Отображать уровни Pivot индикаторными буферами...
Ich werde dem Expert Advisor eine weitere Funktion hinzufügen
Manchmal ist es notwendig, die Linie nicht sofort auszulösen, sondern erst dann, wenn sie den Balken überschritten und fixiert hat.
https://www.mql5.com/ru/forum/310846/page9#comment_11404620
https://www.mql5.com/ru/code/25309
Ich werde dem Expert Advisor eine weitere Funktion hinzufügen
Manchmal ist es notwendig, die Linie nicht sofort auszulösen, sondern erst, wenn sie den Balken überschritten und fixiert hat.
https://www.mql5.com/ru/forum/310846/page9#comment_11404620
https://www.mql5.com/ru/code/25309
irgendwie betrogen -
von der Trendlinie - wenn sie sich kreuzt und der Balken dort bleibt, wird das Signal ausgelöst
ein anderer Indikator hat geschummelt - obere und untere horizontale Linie, mittlere Trendlinie
Demo-Version - wie es in Kombination mit diesem Indikator funktioniert
Wenn die grüne Linie zusammen mit der blauen Linie verläuft, wäre das in Ordnung.
eine andere Version für den Test
Es gibt jetzt drei Trendlinien im Indikator, und der Expert Advisor eröffnet eine Position aus diesen Linien.
eine andere Version für den Test
Jetzt gibt es drei Trendlinien im Indikator, und der Expert Advisor eröffnet Positionen anhand dieser Linien
Hier ist eine Version - wie ich es gemacht habe - es funktioniert vollständig mit den Trendlinien, die Sie manuell gezeichnet haben
die Einstellungen - die sie hat
hier ist die Version - wie ich es gemacht habe - es ist voll funktionsfähig von den Trendlinien, die Sie manuell zeichnen
die Einstellungen, die er hat.
keine Möglichkeit, es einzurichten - und kein Makler wird Sie sich anmelden lassen
hier ist die Version - wie ich es gemacht habe - es ist voll funktionsfähig von den Trendlinien, die Sie manuell zeichnen
die Einstellungen, die es hat.
Scheint ein guter Indikator zu sein
Experte ohne Einstellungen - gibt ein Ergebnis dieses Indikators2 Obj Volatility_StepChannel.mq5
hinzugefügt, Anzahl der Positionen, nach einer Seite offen
hinzugefügt, Anzahl der Positionen, nach einer Seite offen
hinzugefügt von der durchschnittlichen Trendlinie - wenn sie geöffnet wird, zeichnet sie eine horizontale Linie, die sich hinter dem Preis bewegt und von der aus Sie einen Befehl setzen können
Es gibt noch einige weitere Anpassungen
hinzugefügt von der mittleren Trendlinie - wenn sie geöffnet wird, zeichnet sie eine horizontale Linie, die sich hinter dem Preis bewegt und von diesem aus befohlen werden kann
Es gibt ein bisschen mehr Anpassung
Ich habe auch einige Optionen hinzugefügt - von der Trendlinie gibt es eine Option, um horizontale Linien in einem bestimmten Abstand zu zeichnen
um zu vermeiden, dass horizontale Linien hervortreten, sollte Null eingestellt werden
Ein paar weitere Optionen - von der Trendlinie gibt es eine Option, um horizontale Linien in einem bestimmten Abstand zu entfernen
um zu verhindern, dass horizontale Linien ausfallen, sollte Null eingestellt werden
eine weitere Option aus der horizontalen Linie
zu testen - Sie benötigen diesen Indikatorhttps://www.mql5.com/ru/code/1114