просьба добавить в советник который вы сделали еще 2 индикатора MACD и AC (accelerator oscillator) для фильтра при входе в рынок . |
//+------------------------------------------------------------------+
//| ПОМОШНИК РАБОТАЕТ ТОЛКО ПРИ СИГНАЛЕ СРЕДНИХ. |
//+------------------------------------------------------------------+
#property copyright "Copyright 2022, MetaQuotes Software Corp."
#property link "https://www.mql5.com"
#property version "1.00"
#property strict
//+------------------------------------------------------------------+
enum trade
{
Auto, //Авто
Fixed //Ручная
};
//+----------------+
extern trade MethodTrade = Auto; //Торговля, выбор МЕНЮ ==>>
extern double Lots = 0.3; //Фиксированный лот
extern double MaxLot = 1.2; //MAX лот
extern double KLot = 2.0; //Увеличение лота
//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
extern double ProfitCL = 200.0; //Закрыть общий профит $ (=0 откл)
extern double LossCL = 70.0; //Общий убыток $ (=0 откл)
//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
extern int TakeProfit = 220; //Тейк профит (=0 откл)
extern int DistNewOrd = 150; //Дистанция новый ордер
extern int MaxOrd = 3; //MAX ордеров
int Magic = 777; //Магик ордеров в анализе не учавствует
extern string Ind = "=== Сигналы индикаторов ==="; //=====================
extern int BarSignal = 0; //Бар сигнала (=0 текущий)
extern string MAfast = "=== Быстрый MA ==="; //Индикатор ==>>
extern int FastPeriod = 77; //Период
extern int FastShift = 1; //Сдвиг
extern ENUM_MA_METHOD FastMethod = MODE_EMA; //Метод
extern ENUM_APPLIED_PRICE FastPrice = PRICE_CLOSE; //Цена
extern string MAslow = "=== Медленный MA ==="; //Индикатор ==>>
extern int SlowPeriod = 150; //Период
extern int SlowShift = 1; //Сдвиг
extern ENUM_MA_METHOD SlowMethod = MODE_EMA; //Метод
extern ENUM_APPLIED_PRICE SlowPrice = PRICE_CLOSE; //Цена
extern ENUM_TIMEFRAMES TimeFrameMA1 = 5; //default chart TF
extern ENUM_TIMEFRAMES TimeFrameMA2 = 15; //default chart TF
extern ENUM_TIMEFRAMES TimeFrameMA3 = 30; //default chart TF
//+------------------------------------------------------------------+
//| Expert initialization function |
//+------------------------------------------------------------------+
int OnInit()
{
//Убрать сетку при тесте
if(IsTesting())
ChartSetInteger(0,CHART_SHOW_GRID,false);
return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| Expert deinitialization function |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{
Comment("");
}
//+------------------------------------------------------------------+
//| Expert tick function |
//+------------------------------------------------------------------+
void OnTick()
{
//Если торговля разрешена
if(IsTradeAllowed())
{
//Закрытие ордеров
if(OP(-1)>0 && //Если есть ордера
((PrfOP(-1)>=ProfitCL && ProfitCL!=0.0)|| //Общий профит больше значения
(PrfOP(-1)<0 && LossCL!=0.0 && MathAbs(PrfOP(-1))>=MathAbs(LossCL))|| //Общий убыток больше значения
(OP(0)==0 && OP(1)==0))) //Нет открытых рыночных ордеров
DeleteAll(); //Закрыть и удалить все ордера
//Если выбран метод торговли АВТО
if(MethodTrade==Auto)
{
//+----------------------------------------------------------------------------------------------------------+
//| записали условия для входа в сделку . но смотреть надо с старшего тайма и к меньшему . |
//+----------------------------------------------------------------------------------------------------------+
//Сигнал, факт пересечения быстрой и медленной МА
int SignalMA=-1;
if(FastMA(TimeFrameMA1,BarSignal)>SlowMA(TimeFrameMA1,BarSignal)
&& FastMA(TimeFrameMA2,BarSignal)>SlowMA(TimeFrameMA2,BarSignal)
&& FastMA(TimeFrameMA3,BarSignal)>SlowMA(TimeFrameMA3,BarSignal))
SignalMA=0;
if(FastMA(TimeFrameMA1,BarSignal)<SlowMA(TimeFrameMA1,BarSignal)
&&FastMA(TimeFrameMA2,BarSignal)<SlowMA(TimeFrameMA2,BarSignal)
&&FastMA(TimeFrameMA3,BarSignal)<SlowMA(TimeFrameMA3,BarSignal))
SignalMA=1;
//+----------------------------------------------------------------------------------------------------------+
//| начинаем торговать .условия что нет открытых ордеров |
//+----------------------------------------------------------------------------------------------------------+
//Если нет ордеров, то открыть первый по сигналу МА
if(OP(-1)==0)
{
double TPb=0.0,TPs=0.0;
if(TakeProfit>0)
{
TPs=ND(Bid-TakeProfit*Point,Digits);
TPb=ND(Ask+TakeProfit*Point,Digits);
}
//Открытие 1 раз на текущем баре
if(NewBar()!=0)
{
//Сигнал МА, открыть ордер в направлении
if(SignalMA==0)
Send(OP_BUY,Lots,Ask,0,TPb,Blue);
if(SignalMA==1)
Send(OP_SELL,Lots,Bid,0,TPs,Red);
}
}
}
//+----------------------------------------------------------------------------------------------------------+
//| отсюда не чего не трогаем ... начинается переворот |
//+----------------------------------------------------------------------------------------------------------+
//Если есть рыночные ордера то ставить отложенные
if((OP(0)>0||OP(1)>0) && OP(-1)<MaxOrd)
{
//Рассчитать тейк профит для отложенных
double TPb=0.0,TPs=0.0;
if(TakeProfit>0)
{
TPs=ND(LastPrcOP(0)-(DistNewOrd+TakeProfit)*Point,Digits);
TPb=ND(LastPrcOP(1)+(DistNewOrd+TakeProfit)*Point,Digits);
}
//Поставить отложенный противоположный последнему рыночному
int Spread=int(((Ask-Bid)/Point)*2); //Дистанция нового ордера должна быть больше спреда *2
if(DistNewOrd>0 && DistNewOrd>=Spread)
{
if(LastTypeOP()==0 && OP(5)==0)
Send(OP_SELLSTOP,Lot(),ND(LastPrcOP(0)-DistNewOrd*Point,Digits),0,TPs,Magenta);
if(LastTypeOP()==1 && OP(4)==0)
Send(OP_BUYSTOP,Lot(),ND(LastPrcOP(1)+DistNewOrd*Point,Digits),0,TPb,Aqua);
}
}
}//IsTradeAllowed END
//-----------------+
}// OnTick END |
//-----------------+
//+------------------------------------------------------------------+
//| Индикатор Moving Average |
//+------------------------------------------------------------------+
double FastMA(int tf, int bar)
{
double ma=iMA(Symbol(),tf, FastPeriod,FastShift,FastMethod,FastPrice, bar);
return(ma);
}
//+-------------------+
double SlowMA(int tf, int bar)
{
double ma=iMA(Symbol(),tf, SlowPeriod,SlowShift,SlowMethod,SlowPrice, bar);
return(ma);
}
//+------------------------------------------------------------------+
//| Подсчет открытых ордеров по типу |
//+------------------------------------------------------------------+
int OP(int type=-1)
{
int op=0;
for(int i=OrdersTotal()-1; i>=0; i--)
if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES) && OrderSymbol()==Symbol())
{
if(OrderType()==type||type<0)
op++;
}
return(op);
}
//+------------------------------------------------------------------+
//| Профит всех ордеров по типу |
//+------------------------------------------------------------------+
double PrfOP(int type=-1)
{
double pf=0.0;
for(int i=OrdersTotal()-1; i>=0; i--)
if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES) && OrderType()<2 && OrderSymbol()==Symbol())
{
if(OrderType()==type||type<0)
pf+=OrderProfit()+OrderCommission()+OrderSwap();
}
return(pf);
}
//+------------------------------------------------------------------+
//| Цена последнего ордера по типу |
//+------------------------------------------------------------------+
double LastPrcOP(int type=-1)
{
double prc=0.0;
datetime t=0;
for(int i=OrdersTotal()-1; i>=0; i--)
if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES) && OrderSymbol()==Symbol())
{
if((OrderType()==type||type<0) && t<OrderOpenTime())
{
t=OrderOpenTime();
prc=OrderOpenPrice();
}
}
return(prc);
}
//+------------------------------------------------------------------+
//| Тип последнего ордера |
//+------------------------------------------------------------------+
int LastTypeOP()
{
int type=-1;
datetime t=0;
for(int i=OrdersTotal()-1; i>=0; i--)
if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES) && OrderSymbol()==Symbol())
{
if(t<OrderOpenTime())
{
t=OrderOpenTime();
type=OrderType();
}
}
return(type);
}
//+------------------------------------------------------------------+
//| Одно открытие на одном баре if(NewBar()!=0) |
//+------------------------------------------------------------------+
int NewBar()
{
datetime t=0;
for(int i=OrdersTotal()-1; i>=0; i--)
if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES) && OrderSymbol()==Symbol())
{
if(t<OrderOpenTime())
t=OrderOpenTime();
}
for(int i=OrdersHistoryTotal()-1; i>=0; i--)
if(OrderSelect(i,SELECT_BY_POS,MODE_HISTORY) && OrderSymbol()==Symbol())
{
if(t<OrderCloseTime())
t=OrderCloseTime();
}
return(iBarShift(Symbol(),0,t));
}
//+------------------------------------------------------------------+
//| Расчёт лота |
//+------------------------------------------------------------------+
double Lot()
{
double lot=0;
if(OP(-1)>0)
lot=ND(Lots*MathPow(KLot,OP(-1)),2);
if(lot>MaxLot)
lot=Lots;
return(lot);
}
//+------------------------------------------------------------------+
//| ND - нормализация числа |
//-------------------------------------------------------------------+
double ND(double value, int digits)
{
return(NormalizeDouble(value, digits));
}
//+------------------------------------------------------------------+
//| Открытие, закрытие ордеров |
//+------------------------------------------------------------------+
void Send(int type, double lt, double price, double sl, double tp, color clr)
{
int send=0;
send=OrderSend(Symbol(),type,lt,price,30,sl,tp,"",Magic,0,clr);
if(send>0)
Print("Успешно открыт ордер "+TypeToStr(type),", Lot: "+(string)lt,", Ticket: "+(string)send,", Magic: "+(string)Magic);
else
Print("Невозможно открыть ордер "+TypeToStr(type),". Ошибка: "+string(GetLastError()));
}
//+------------------------------------------------------------------+
void DeleteAll()
{
color cls=Gray;
for(int i=OrdersTotal()-1; i>=0; i--)
if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES) && OrderSymbol()==Symbol())
{
if(OrderType()==OP_BUY)
cls=DeepSkyBlue;
if(OrderType()==OP_SELL)
cls=Magenta;
if(!OrderSelect(OrderTicket(),SELECT_BY_TICKET)||OrderCloseTime()>0)
return;
if(OrderType()<2 && !OrderClose(OrderTicket(),OrderLots(),OrderClosePrice(),30,cls))
Print("Невозможно закрыть ордер "+TypeToStr(OrderType()),". Ошибка: "+string(GetLastError()));
if(OrderType()>1 && !OrderDelete(OrderTicket()))
Print("Невозможно удалить ордер "+TypeToStr(OrderType()),". Ошибка: "+string(GetLastError()));
}
}
//+------------------------------------------------------------------+
string TypeToStr(int type)
{
switch(type)
{
case 0:
return("Buy");
case 1:
return("Sell");
case 2:
return("BuyLimit");
case 3:
return("SellLimit");
case 4:
return("BuyStop");
case 5:
return("SellStop");
}
return("NONE");
}
//--------------------------ФИНИШ-----------ФИНИШ-------------------------+
//+-----------------------------------ФИНИШ-------------------------------+
Предыдущая запись в
группе если можно заменить в советнике который вы помогли собрать еще чуток дороботать его. |
|
04 февраля 2022
|
26 апреля 2022
|
Комментарии (17)
В коде же есть образец как расписывать индикатор и получать сигнал.
Как можно чему-то научиться если кто-то другой решает задачи?
15 forextime Сообщений: 141 - ExpertFX
//+------------------------------------------------------------------+
//| инддюк MACD |
//+------------------------------------------------------------------+
extern string ind3 = "--- MACD ---";
extern int Fast = 21;
extern int Slow = 55;
extern int Signal = 9;
extern int Price_MACD = PRICE_MEDIAN;
//+----------------------------------------------------------------------------------------------------------+
//| записали условия для входа в сделку. но смотреть надо с старшего тайма и к меньшему. |
//+----------------------------------------------------------------------------------------------------------+
//Сигнал, факт пересечения быстрой и медленной МА
int SignalMA=-1;
if(FastMA(TimeFrameMA1,BarSignal)>SlowMA(TimeFrameMA1,BarSignal)
&& FastMA(TimeFrameMA2,BarSignal)>SlowMA(TimeFrameMA2,BarSignal))
//Сигнал индикатора MACD
if( (MACD_2 < Lo_LEVEL || !Buy_Lo_Level) && MACD_1 > MACD_2 && MACD_3 >= MACD_2 ))
//условие для открытия ордера на покупку
SignalMA=0;
if(FastMA(TimeFrameMA1,BarSignal)<SlowMA(TimeFrameMA1,BarSignal)
&&FastMA(TimeFrameMA2,BarSignal)<SlowMA(TimeFrameMA2,BarSignal))
//Сигнал индикатора MACD
if( (MACD_2 > Hi_LEVEL || !Sell_Hi_Level) && MACD_1 < MACD_2 && MACD_3 <= MACD_2 ))
{
//условие для открытия ордера на продажу
SignalMA=1;
Редактирован: 5 марта 2022, 21:04
6 eduard9898 Автор Сообщений: 81
или правильно так с добовлением tf,
Редактирован: 5 марта 2022, 21:16
6 eduard9898 Автор Сообщений: 81
пишет 2 ошибки с скобками — кроме того надо как то чтобы сигналы от средних и от macd — совпадали и давали один сигнал ??? Редактирован: 5 марта 2022, 21:59
6 eduard9898 Автор Сообщений: 81
2.Подумайте нужно ли Вам это.
АО = ExtAOBuffer[i]=iMA(NULL,0,PERIOD_FAST,0,MODE_SMA,PRICE_MEDIAN,i)-
iMA(NULL,0,PERIOD_SLOW,0,MODE_SMA,PRICE_MEDIAN,i);
МАСД = ExtMacdBuffer[i]=iMA(NULL,0,InpFastEMA,0,MODE_EMA,PRICE_CLOSE,i)-
iMA(NULL,0,InpSlowEMA,0,MODE_EMA,PRICE_CLOSE,i);
Эти индикаторы производные от Ма, а Ма производная от цены.
У Вас уже есть в коде сигналы на основе Ма.
Изучайте как рассчитываются индикаторы, пригодится при торговле, избежите лишней ненужной избыточности в коде и позволит избежать самообмана.
16 ssg Сообщений: 817
6 eduard9898 Автор Сообщений: 81
6 eduard9898 Автор Сообщений: 81
16 ssg Сообщений: 817
т.е исходя из опыта смысла добавлять еще что то нет? или есть все таки варианты
6 eduard9898 Автор Сообщений: 81
Все Ваши индикаторы — трендовые. Зачем их плодить?
16 ssg Сообщений: 817
поэтому и спрашиваю — дополнительный индикатор нужен только для фильтра и чем быстрее он реагирует на цену тем лучше т.к будет изменять условия для входа.
и конечно может быть что даже после того что сделаю дополнение будет и следующее и потом еще
я не пытаюсь найти граль — мне нужен советник — помошник. (на случай если я не у компа )
6 eduard9898 Автор Сообщений: 81
2.Вам нужно на основании этого движения определить наилучший момент входа в позицию. Для этого многие используют импульсные или осциляторные индикаторы на нижнем таймфрейме.
3.Стратегия Вашего советника заключается, по факту, в том, что при определенной просадке открыть противоположенную позиции большим лотом. Расчет на то, что большим лотом возместить убыток предыдущей позиции и получить некоторую прибыль. Допуская несколько переворотов.
4.Следовательно выбор сигнала для открытия позиции отходит на второй план.
Отсюда следует нет необходимости громоздить кучу индикаторы.
Например сигналом для открытия позиции может быть просто время.
16 ssg Сообщений: 817
и вот результат уходим в минус Редактирован: 11 марта 2022, 09:12
6 eduard9898 Автор Сообщений: 81
6 eduard9898 Автор Сообщений: 81
Скачать: www.opentraders.ru/downloads/3244/
Там используется сам факт пересечения двух МА.
А в этой версии берётся направление МА на разных ТФ, а не факт пересечения, все МА в одном направлении, сигнал. Ордер закроется и откроется новый в том же направлении, т.к. сигнал ещё активен.
15 forextime Сообщений: 141 - ExpertFX
пошел учиться .
6 eduard9898 Автор Сообщений: 81
Зарегистрируйтесь или авторизуйтесь, чтобы оставить комментарий