il y a maintenant trois lignes de tendance dans l'indicateur et le conseiller expert ouvre une position à partir de celles-ci
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
Il y a maintenant trois lignes de tendance dans l'indicateur et le conseiller expert ouvre des positions à partir de ces lignes.
Voici une version - comment je l'ai fait - elle fonctionne entièrement à partir des lignes de tendance que vous avez tracées manuellement
les paramètres - qu'il a
//---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)
ajoutée à partir de la ligne de tendance moyenne - lorsqu'elle est ouverte, elle dessine une ligne horizontale qui se déplace derrière le prix et à partir de laquelle vous pouvez définir une commande
il y a encore quelques ajustements
//---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//---
ajouté à partir de la ligne médiane de tendance - lorsqu'il est ouvert, il trace une ligne horizontale qui se déplace derrière le prix et peut être commandé à partir de celui-ci
Il y a un peu plus d'ajustement
J'ai également ajouté quelques options - à partir de la ligne de tendance il y a une option pour dessiner des lignes horizontales à une distance donnée
//---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//---
pour éviter que les lignes horizontales ne ressortent - il faut mettre zéro
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 индикаторными буферами...
Si vous n'avez pas de compte, veuillez vous inscrire
Autorisez l'utilisation de cookies pour vous connecter au site Web MQL5.com.
Veuillez activer les paramètres nécessaires dans votre navigateur, sinon vous ne pourrez pas vous connecter.
Vous êtes connecté. L'authentification à deux facteurs a été désactivée. Configurez-la à nouveau et scannez un nouveau code QR, ou continuez avec l'authentification à deux facteurs désactivée.
Je vais ajouter une autre fonction à l'Expert Advisor
parfois il est nécessaire de ne pas déclencher immédiatement la ligne, mais lorsqu'elle a franchi et fixé la barre
https://www.mql5.com/ru/forum/310846/page9#comment_11404620
https://www.mql5.com/ru/code/25309
Je vais ajouter une autre fonction à l'Expert Advisor
parfois il est nécessaire de ne pas déclencher immédiatement la ligne, mais lorsqu'elle a franchi et fixé la barre
https://www.mql5.com/ru/forum/310846/page9#comment_11404620
https://www.mql5.com/ru/code/25309
en quelque sorte trompé -
de la ligne de tendance - si elle se croise et que la barre reste là, le signal se déclenchera
un autre indicateur a triché - ligne horizontale supérieure et inférieure, ligne de tendance centrale
version de démonstration - comment elle fonctionne en combinaison avec cet indicateur
Si la ligne verte va de pair avec la ligne bleue, ce sera parfait.
une autre version pour le test
il y a maintenant trois lignes de tendance dans l'indicateur et le conseiller expert ouvre une position à partir de celles-ci
une autre version pour le test
Il y a maintenant trois lignes de tendance dans l'indicateur et le conseiller expert ouvre des positions à partir de ces lignes.
Voici une version - comment je l'ai fait - elle fonctionne entièrement à partir des lignes de tendance que vous avez tracées manuellement
les paramètres - qu'il a
voici la version - comment je l'ai fait - elle est totalement opérationnelle à partir des lignes de tendance que vous dessinez manuellement
les paramètres qu'il a.
pas moyen ! - pour le mettre en place - et aucun courtier ne vous laissera vous inscrire
voici la version - comment je l'ai fait - il est entièrement opérationnel à partir des lignes de tendance que vous dessinez manuellement
les paramètres qu'il possède.
On dirait un bon indicateur
Expert sans paramètres - donne un résultat de cet indicateur2 Obj Volatility_StepChannel.mq5
ajouté, nombre de positions, ouvert sur un côté
ajouté, nombre de positions, ouvert sur un côté
ajoutée à partir de la ligne de tendance moyenne - lorsqu'elle est ouverte, elle dessine une ligne horizontale qui se déplace derrière le prix et à partir de laquelle vous pouvez définir une commande
il y a encore quelques ajustements
ajouté à partir de la ligne médiane de tendance - lorsqu'il est ouvert, il trace une ligne horizontale qui se déplace derrière le prix et peut être commandé à partir de celui-ci
Il y a un peu plus d'ajustement
J'ai également ajouté quelques options - à partir de la ligne de tendance il y a une option pour dessiner des lignes horizontales à une distance donnée
pour éviter que les lignes horizontales ne ressortent - il faut mettre zéro
Quelques options supplémentaires - à partir de la ligne de tendance, il y a une option pour faire tomber les lignes horizontales à une distance donnée
pour éviter que les lignes horizontales ne tombent - le zéro doit être fixé
une autre option de la ligne horizontale
pour tester - vous avez besoin de cet indicateurhttps://www.mql5.com/ru/code/1114