оказывается нужно ещё и стоп лосс - (не мог понять почему закрывало сразу) добавил стоп лосс
Спасибо большое !!!
Вы хорошо всё слепили, но меня интересует совсем другой алгоритм работы советника. Я хотел бы использовать простой Мартингейл (сеточник) с такими настраиваемыми параметрами :
input group "======== МАРТИН ========";
inputint MMType = 1; // 1 - вкл. , 2 - выкл.
inputdouble Multiplikator = 1.667; // множитель следующего лота
inputdouble Step = 150.0; // Расстояние между ордерами
input group "==== МАНИ МЕНЕДЖМЕНТ ====;
inputbool LotConst = true; // фиксированный - true, или от баланса - falseinput group "-: фиксированный лот :--";
inputdouble Lot = 0.01; // первый фиксированный лот, если МАРТИН включен
input group "---: лот от баланса :---";
inputdouble RiskPercent = 30.0; // первый лот в процентах от баланса, если МАРТИН включен
input group "== ПРИБЫЛЬ В ПУНКТАХ ===";
inputdouble TakeProfit = 56.0; // параметры тейкпрофита в пунктах
input group "========= Шаг ==========";
inputdouble Step = 150.0; // шаг в пунктах между ордерами
input group "===== ОГРАНИЧИТЕЛЬ =====";
inputint MaxTrades = 15; // Максимальное количество ордеров одного направления
input group "=== ПРОСКАЛЬЗОВАНИЕ ====";
inputdouble Slippage = 5.0; // Допустимое проскальзывание на новостях в пунктах
input group "== МАГИЧЕСКИЙ НОМЕР ===";
inputint Magic = 1111111 ; // Идентификатор ордера (Магик №)
, но в него добавить индикатор, который я вложил - выше. И использовать его, как триггер (false - работаем только в SHORT и true - работаем только в LONG).
Я выбрал этот индикатор - только потому, что он работает, как MovingAverages, но в нем есть некоторые сглаживающие фильтры и точки изменения направления движения цены, которые можно использовать, как триггер для работы советника только по тренду с использованием настроек профита из меню.
И как только происходит закрытие по тейку - открывать следующий ордер в ту же сторону (по тренду), пока тренд не закончиться и не переключиться - наш триггер. Если же всё таки появится ордер не по тренду (в момент перехода тренда из одного состояния в другое, то использовать для него Мартин с настройками из меню.
Если есть желание помочь написать такого советника, то буду очень признателен .
Теперь по теме:
Я так понял, что у меня в кодах самого индюка - находятся не индикаторные буферы, а массивы буферов и Вы - в советнике их привели в индикаторные.
я самоучка и не смогу Вам объяснить - я просто выбрал функции которые мне нужны , знаю что через это туда через то туда .
в основном все функции я копирую из кодов Vladimir Karputov за что Большое ему Спасибо!!! - если какие вопросы он Вам подскажет.
Вы самоучка, а я вообще только начал программировать и в голове одни вопросы.
Я представляю в своей голове алгоритм работы этого советника и не вопрос, если в процессе придется поменять индикатор - ведь из него нежны всего две задачи (тачка направления - вверх и точка направления -вниз).
На текущий момент я исхожу из классики, что само простое - это самое лучшее. Вот почему я хочу до придела упростить...... и в тоже время получить максимум от того, что хочу создать. Предлагаю вместе поработать над моим алгоритмом - мне кажется это будет обоим интересно.
вот ещё вариант - как тейк сработал - откроется опять в туже сторону
Совершенно верно, с профитом !!!
На первый взгляд - все правильно.
И то, что Стоп Лосса - тоже не должно быть - всё правильно.
Но я не понял, куда девается одер, который не закрылся по Тейк Профиту....... при изменении направления движения цены....(просто закрывается по дефолту, т.е. по сигналу индикатора изменения тренда)? Если это так, то это не по моей задумки.
А по моей задумки - ордер должен остаться, но тут должен вступить в работу - мартин с его настройками:
input group "======== МАРТИН ========";
inputint MMType = 1; // 1 - вкл. , 2 - выкл.inputdouble Multiplikator = 1.667; // множитель следующего лотаinputdouble Step = 150.0; // Расстояние между ордерами
т.е. устанавливать ордера в противоположенную тренду сторону с увеличением лота и усреднением тейк профита. Короче работать, как простой Мартин - например (Советник Автопрофит 3), который есть в открытом коде в инете, но написан на mql4.
Кстати первоначальный вариант - работы по тренду, который Вы правилно написали - никто при работе с мартином не отменял.
Короче работа по тренду - это одна задача, которую Вы частично и с блеском продемонстрировали и вторая задача - это мартин.
Не обязательно, что бы эти две задачи были взаимосвязаны - на мой взгляд, они могут работать совершенно независимо
И то, что Стоп Лосса - тоже не должно быть - всё правильно.
Но я не понял, куда девается одер, который не закрылся по Тейк Профиту....... при изменении направления движения цены....(просто закрывается по дефолту, т.е. по сигналу индикатора изменения тренда)? Если это так, то это не по моей задумки.
А по моей задумки - ордер должен остаться, но тут должен вступить в работу - мартин с его настройками:
т.е. устанавливать ордера в противоположенную тренду сторону с увеличением лота и усреднением тейк профита. Короче работать, как простой Мартин - например (Советник Автопрофит 3), который есть в открытом коде в инете, но написан на mql4.
все варианты которые я смог обнаружить - больше вроде нет вариантов
//+------------------------------------------------------------------+//| 4 Sprut 185.mq5 |//| Copyright 2021, MetaQuotes Ltd. |//| https://www.mql5.com |//+------------------------------------------------------------------+#property copyright"Copyright 2021, MetaQuotes Ltd."#property link"https://www.mql5.com"#property version"1.00"//---#define MACD_MAGIC 1234502//---#include <Trade\Trade.mqh>
#include <Trade\SymbolInfo.mqh>
#include <Trade\PositionInfo.mqh>
#include <Trade\AccountInfo.mqh>
//---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//---inputdouble InpLots =0.1; // Lotsinputint InpTakeProfit =50; // Take Profit (in pips)inputbool InpVariant =false; // Optioninputint InpBar =1; // Barinputbool InpClOp =false; // Close opposite//---double m_macd_current;
double m_signal_current;
double m_take_profit;
int price_uno;
int m_handle_macd; // MACD indicator handleint ExtTimeOut=10; // time out in seconds between trade operations//+------------------------------------------------------------------+//| Expert initialization function |//+------------------------------------------------------------------+intOnInit()
{
//--- initialize common information
m_symbol.Name(Symbol()); // symbol
m_trade.SetExpertMagicNumber(MACD_MAGIC); // magic
m_trade.SetMarginMode();
m_trade.SetTypeFillingBySymbol(Symbol());
//--- 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);
//--- create StepMA_NRTR indicator
m_handle_macd=iCustom(NULL,0,"StepMA_NRTR");
if(m_handle_macd==INVALID_HANDLE)
{
printf("Error creating StepMA_NRTR indicator");
return(false);
}
//---return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+//| Expert deinitialization function |//+------------------------------------------------------------------+voidOnDeinit(constint reason)
{
//---
}
//+------------------------------------------------------------------+//| Expert tick 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)
{
//--- change limit time by timeout in seconds if processedif(!InpVariant && Processing())
limit_time=TimeCurrent()+ExtTimeOut;
//--- change limit time by timeout in seconds if processedif(InpVariant && Processing_1())
limit_time=TimeCurrent()+ExtTimeOut;
}
}
}
//+------------------------------------------------------------------+//| main function returns true if any position processed |//+------------------------------------------------------------------+bool Processing(void)
{
//--- refresh ratesif(!m_symbol.RefreshRates())
return(false);
double m_buff_MACD_main[],m_buff_MACD_signal[];
ArraySetAsSeries(m_buff_MACD_main,true);
ArraySetAsSeries(m_buff_MACD_signal,true);
int start_pos=InpBar,count=3;
if(!iGetArray(m_handle_macd,0,start_pos,count,m_buff_MACD_main)||
!iGetArray(m_handle_macd,1,start_pos,count,m_buff_MACD_signal))
{
return(false);
}
//---
m_macd_current =m_buff_MACD_main[0];
m_signal_current =m_buff_MACD_signal[0];
//---if(m_position.Select(Symbol()))
{
//--- try to close or modify long positionif(LongClosed())
return(true);
//--- try to close or modify short positionif(ShortClosed())
return(true);
}
else
{
//--- check for long position (BUY) possibilityif(LongOpened())
return(true);
//--- check for short position (SELL) possibilityif(ShortOpened())
return(true);
}
//--- exit without position processingreturn(false);
}
//+------------------------------------------------------------------+//| main function returns true if any position processed |//+------------------------------------------------------------------+bool Processing_1(void)
{
//--- refresh ratesif(!m_symbol.RefreshRates())
return(false);
double m_buff_MACD_main[],m_buff_MACD_signal[];
bool StNRUp,StNRDn;
ArraySetAsSeries(m_buff_MACD_main,true);
ArraySetAsSeries(m_buff_MACD_signal,true);
int start_pos=InpBar,count=3;
if(!iGetArray(m_handle_macd,0,start_pos,count,m_buff_MACD_main)||
!iGetArray(m_handle_macd,1,start_pos,count,m_buff_MACD_signal))
{
return(false);
}
//---
m_macd_current =m_buff_MACD_main[0];
m_signal_current =m_buff_MACD_signal[0];
//---
StNRUp=m_buff_MACD_main[0]<m_buff_MACD_signal[0];
StNRDn=m_buff_MACD_main[0]>m_buff_MACD_signal[0];
//--- BUY Signalif(StNRUp)
{
if(InpClOp)
if(ShortClosed())
Sleep(1000);
if(price_uno<0)
LongOpened();
price_uno=+1;
return(true);
}
//--- SELL Signalif(StNRDn)
{
if(InpClOp)
if(LongClosed())
Sleep(1000);
if(price_uno>0)
ShortOpened();
price_uno=-1;
return(true);
}
//--- exit without position processingreturn(false);
}
//+------------------------------------------------------------------+//| Check for long position closing |//+------------------------------------------------------------------+bool LongClosed(void)
{
bool res=false;
//--- should it be closed?if(m_macd_current>m_signal_current)
{
//--- close positionif(InpClOp)
ClosePositions(POSITION_TYPE_BUY);
//--- processed and cannot be modified
res=true;
}
//--- resultreturn(res);
}
//+------------------------------------------------------------------+//| Check for short position closing |//+------------------------------------------------------------------+bool ShortClosed(void)
{
bool res=false;
//--- should it be closed?if(m_macd_current<m_signal_current)
{
//--- close positionif(InpClOp)
ClosePositions(POSITION_TYPE_SELL);
//--- processed and cannot be modified
res=true;
}
//--- resultreturn(res);
}
//+------------------------------------------------------------------+//| Check for long position opening |//+------------------------------------------------------------------+bool LongOpened(void)
{
bool res=false;
//--- check for long position (BUY) possibilityif(m_macd_current<m_signal_current)
{
double price=m_symbol.Ask();
double tp =m_symbol.Bid()+m_take_profit;
//--- check for free moneyif(m_account.FreeMarginCheck(Symbol(),ORDER_TYPE_BUY,InpLots,price)<0.0)
printf("We have no money. Free Margin = %f",m_account.FreeMargin());
else
{
//--- open positionif(m_trade.PositionOpen(Symbol(),ORDER_TYPE_BUY,InpLots,price,0.0,tp))
printf("Position by %s to be opened",Symbol());
else
{
printf("Error opening BUY position by %s : '%s'",Symbol(),m_trade.ResultComment());
printf("Open parameters : price=%f,TP=%f",price,tp);
}
PlaySound("ok.wav");
}
//--- in any case we must exit from expert
res=true;
}
//--- resultreturn(res);
}
//+------------------------------------------------------------------+//| Check for short position opening |//+------------------------------------------------------------------+bool ShortOpened(void)
{
bool res=false;
//--- check for short position (SELL) possibilityif(m_macd_current>m_signal_current)
{
double price=m_symbol.Bid();
double tp =m_symbol.Ask()-m_take_profit;
//--- check for free moneyif(m_account.FreeMarginCheck(Symbol(),ORDER_TYPE_SELL,InpLots,price)<0.0)
printf("We have no money. Free Margin = %f",m_account.FreeMargin());
else
{
//--- open positionif(m_trade.PositionOpen(Symbol(),ORDER_TYPE_SELL,InpLots,price,0.0,tp))
printf("Position by %s to be opened",Symbol());
else
{
printf("Error opening SELL position by %s : '%s'",Symbol(),m_trade.ResultComment());
printf("Open parameters : price=%f,TP=%f",price,tp);
}
PlaySound("ok.wav");
}
//--- in any case we must exit from expert
res=true;
}
//--- resultreturn(res);
}
//+------------------------------------------------------------------+//| Refreshes the symbol quotes data |//+------------------------------------------------------------------+bool RefreshRates()
{
//--- refresh ratesif(!m_symbol.RefreshRates())
{
return(false);
}
//--- protection against the return value of "zero"if(m_symbol.Ask()==0 || m_symbol.Bid()==0)
{
return(false);
}
//---return(true);
}
//+------------------------------------------------------------------+//| Check Freeze and Stops levels |//+------------------------------------------------------------------+void FreezeStopsLevels(double &freeze,double &stops)
{
//--- check Freeze and Stops levelsdouble coeff=(double)1;
if(!RefreshRates() || !m_symbol.Refresh())
return;
//--- FreezeLevel -> for pending order and modificationdouble freeze_level=m_symbol.FreezeLevel()*m_symbol.Point();
if(freeze_level==0.0)
if(1>0)
freeze_level=(m_symbol.Ask()-m_symbol.Bid())*coeff;
//--- StopsLevel -> for TakeProfit and StopLossdouble stop_level=m_symbol.StopsLevel()*m_symbol.Point();
if(stop_level==0.0)
if(1>0)
stop_level=(m_symbol.Ask()-m_symbol.Bid())*coeff;
//---
freeze=freeze_level;
stops=stop_level;
//---return;
}
//+------------------------------------------------------------------+//| Close positions |//+------------------------------------------------------------------+void ClosePositions(constENUM_POSITION_TYPE pos_type)
{
double freeze=0.0,stops=0.0;
FreezeStopsLevels(freeze,stops);
for(int i=PositionsTotal()-1; i>=0; i--) // returns the number of current positionsif(m_position.SelectByIndex(i)) // selects the position by index for further access to its propertiesif(m_position.Symbol()==m_symbol.Name() && m_position.Magic()==MACD_MAGIC)
if(m_position.PositionType()==pos_type)
{
if(m_position.PositionType()==POSITION_TYPE_BUY)
{
bool take_profit_level=((m_position.TakeProfit()!=0.0 && m_position.TakeProfit()-m_position.PriceCurrent()>=freeze) || m_position.TakeProfit()==0.0);
bool stop_loss_level=((m_position.StopLoss()!=0.0 && m_position.PriceCurrent()-m_position.StopLoss()>=freeze) || m_position.StopLoss()==0.0);
if(take_profit_level && stop_loss_level)
if(!m_trade.PositionClose(m_position.Ticket())) // close a position by the specified m_symbolPrint(__FILE__," ",__FUNCTION__,", ERROR: ","BUY PositionClose ",m_position.Ticket(),", ",m_trade.ResultRetcodeDescription());
}
if(m_position.PositionType()==POSITION_TYPE_SELL)
{
bool take_profit_level=((m_position.TakeProfit()!=0.0 && m_position.PriceCurrent()-m_position.TakeProfit()>=freeze) || m_position.TakeProfit()==0.0);
bool stop_loss_level=((m_position.StopLoss()!=0.0 && m_position.StopLoss()-m_position.PriceCurrent()>=freeze) || m_position.StopLoss()==0.0);
if(take_profit_level && stop_loss_level)
if(!m_trade.PositionClose(m_position.Ticket())) // close a position by the specified m_symbolPrint(__FILE__," ",__FUNCTION__,", ERROR: ","SELL PositionClose ",m_position.Ticket(),", ",m_trade.ResultRetcodeDescription());
}
PlaySound("ok.wav");
}
}
//+------------------------------------------------------------------+//| Filling the indicator buffers from the indicator |//+------------------------------------------------------------------+bool iGetArray(constint handle,constint buffer,constint start_pos,
constint count,double &arr_buffer[])
{
bool result=true;
if(!ArrayIsDynamic(arr_buffer))
{
return(false);
}
ArrayFree(arr_buffer);
//--- reset error codeResetLastError();
//--- fill a part of the iBands array with values from the indicator bufferint copied=CopyBuffer(handle,buffer,start_pos,count,arr_buffer);
if(copied!=count)
{
return(false);
}
return(result);
}
//+------------------------------------------------------------------+
Для авторизации и пользования сайтом MQL5.com необходимо разрешить использование файлов Сookie.
Пожалуйста, включите в вашем браузере данную настройку, иначе вы не сможете авторизоваться.
Вы вошли в аккаунт. Двухфакторная аутентификация отключена. Настройте её заново и отсканируйте новый QR-код или продолжите с отключённой двухфакторной аутентификацией.
Я начинаю подозревать, что для этого нужна дополнительная функция
Да всё правильно. В OnInit подключаем индикатор, задаём там параметры и получаем его хэндл. А дальше по месту используйте CopyBuffer.
https://www.mql5.com/ru/docs/series/copybuffer
Вот слепил - вроде работает! (где жёлтым там буфера)
\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
оказывается нужно ещё и стоп лосс - (не мог понять почему закрывало сразу) добавил стоп лосс
Спасибо большое !!!
Вы хорошо всё слепили, но меня интересует совсем другой алгоритм работы советника. Я хотел бы использовать простой Мартингейл (сеточник) с такими настраиваемыми параметрами :
, но в него добавить индикатор, который я вложил - выше. И использовать его, как триггер (false - работаем только в SHORT и true - работаем только в LONG).
Я выбрал этот индикатор - только потому, что он работает, как MovingAverages, но в нем есть некоторые сглаживающие фильтры и точки изменения направления движения цены, которые можно использовать, как триггер для работы советника только по тренду с использованием настроек профита из меню.
И как только происходит закрытие по тейку - открывать следующий ордер в ту же сторону (по тренду), пока тренд не закончиться и не переключиться - наш триггер. Если же всё таки появится ордер не по тренду (в момент перехода тренда из одного состояния в другое, то использовать для него Мартин с настройками из меню.
Если есть желание помочь написать такого советника, то буду очень признателен .
Теперь по теме:
я самоучка и не смогу Вам объяснить - я просто выбрал функции которые мне нужны , знаю что через это туда через то туда .
в основном все функции я копирую из кодов Vladimir Karputov за что Большое ему Спасибо!!! - если какие вопросы он Вам подскажет.
как я понял вам нужно чтобы индикатор фильтровал !?
Вам нужно ваш эксперт пропустить через этот фильтр
я самоучка и не смогу Вам объяснить - я просто выбрал функции которые мне нужны , знаю что через это туда через то туда .
в основном все функции я копирую из кодов Vladimir Karputov за что Большое ему Спасибо!!! - если какие вопросы он Вам подскажет.
Вы самоучка, а я вообще только начал программировать и в голове одни вопросы.
Я представляю в своей голове алгоритм работы этого советника и не вопрос, если в процессе придется поменять индикатор - ведь из него нежны всего две задачи (тачка направления - вверх и точка направления -вниз).
Наследование подразумевает создание класса.
Вот я и пишу -- от какого класса наследовать свой класс?, чтоб использовать эти методы их стандартной библиотеки
вот ещё вариант - как тейк сработал - откроется опять в туже сторону
Совершенно верно, с профитом !!!
На первый взгляд - все правильно.
И то, что Стоп Лосса - тоже не должно быть - всё правильно.
Но я не понял, куда девается одер, который не закрылся по Тейк Профиту....... при изменении направления движения цены....(просто закрывается по дефолту, т.е. по сигналу индикатора изменения тренда)? Если это так, то это не по моей задумки.
А по моей задумки - ордер должен остаться, но тут должен вступить в работу - мартин с его настройками:
т.е. устанавливать ордера в противоположенную тренду сторону с увеличением лота и усреднением тейк профита. Короче работать, как простой Мартин - например (Советник Автопрофит 3), который есть в открытом коде в инете, но написан на mql4.
Кстати первоначальный вариант - работы по тренду, который Вы правилно написали - никто при работе с мартином не отменял.
Короче работа по тренду - это одна задача, которую Вы частично и с блеском продемонстрировали и вторая задача - это мартин.
Не обязательно, что бы эти две задачи были взаимосвязаны - на мой взгляд, они могут работать совершенно независимо
Совершенно верно, с профитом !!!
На первый взгляд - все правильно.
И то, что Стоп Лосса - тоже не должно быть - всё правильно.
Но я не понял, куда девается одер, который не закрылся по Тейк Профиту....... при изменении направления движения цены....(просто закрывается по дефолту, т.е. по сигналу индикатора изменения тренда)? Если это так, то это не по моей задумки.
А по моей задумки - ордер должен остаться, но тут должен вступить в работу - мартин с его настройками:
т.е. устанавливать ордера в противоположенную тренду сторону с увеличением лота и усреднением тейк профита. Короче работать, как простой Мартин - например (Советник Автопрофит 3), который есть в открытом коде в инете, но написан на mql4.Сразу одно замечание: не "ордер", а "позиция".
Сразу одно замечание: не "ордер", а "позиция".
все варианты которые я смог обнаружить - больше вроде нет вариантов