Доброго времени суток!
Прошу автоматизировать мою торговую стратегию. Использую два стандартных мувинга с разными настройками.
Алгоритм торговли следующий. Для открытия ордера на buy — пример на скриншоте.
В верху медленный мувинг, ниже быстрый мувинг, еще ниже сама цена. Между ценой и медленным мувингом заданное в параметрах отклонение в пунктах. Между ценой и быстрым мувингом также заданное в параметрах отклонение в пунктах.Например, мы прописываем в параметрах отклонение между ценой и медленным мувингом 400, отклонение между ценой и быстрым мувингом 200. Это значит, что для открытия ордера на повышение отклонение цены от медленного мувинга должно быть не менее 400 пунктов, отклонение цены от быстрого мувинга не менее 200 пунктов. Если оба условия соблюдены, открывается ордер на buy.
Для открытия ордера на sell, условия зеркально противоположные. А именно, внизу медленный мувинг, выше быстрый мувинг, еще выше сама цена. Пример на скриншоте.
Если условия, заданные в параметрах соблюдены, открывается ордер на sell.
Параметры советника:
прописываются параметры обоих мувингов.
Минимальный лот для открытия ордера 0.01( по умолчанию ).
Отклонение цены от быстрого мувинга( по умолчанию 200 пунктов пятизнак).
Отклонение цены от медленного мувинга ( по умолчанию 400 пунктов пятизнак ).
Усреднение: расстояние между ордерами 100 пунктов пятизнак ( по умолчанию).
Тейк профит 100 пунктов пятизнак( по умолчанию ).
Коэффициент увеличение величины лота 1 ( по умолчанию)
Максимальное одновременно открытых ордеров на данной паре 5( по умолчанию)
Открытие ордера — соблюдение заданных в параметрах двух условий( отклонение цены от медленного мувинга не менее 400 пунктов, отклонение цены от быстрого мувинга не менее 200 пунктов).
Закрытие ордера — закрытие усредненных ордеров по заданному тейк профиту.
Если нет усредненных ордеров, закрытие ордера происходит при касании ценой медленного мувинга.
Должен быть magic.
Советник должен уметь торговать как на 4-х знаке, так и на 5-знаке.
Кажется все, ничего не забыл.
Комментарии (24)
35 AM2 Сообщений: 16266 - Андрей
LotExponent=1
Default Pips = 100
Take Profit = 100
Max Trades = 5
Выход при отсутствии усреднения:
цена возвращается к медленному мувингу. Редактирован: 1 ноября 2019, 18:21
12 marattmb Автор Сообщений: 739
35 AM2 Сообщений: 16266 - Андрей
12 marattmb Автор Сообщений: 739
35 AM2 Сообщений: 16266 - Андрей
12 marattmb Автор Сообщений: 739
В параметрах МА1 — быстрый мувинг, МА2 — медленный мувинг?
12 marattmb Автор Сообщений: 739
35 AM2 Сообщений: 16266 - Андрей
12 Slava78 Сообщений: 598
15 el12EL12 Сообщений: 84 - el12EL12
9 volondai Сообщений: 155
15 el12EL12 Сообщений: 84 - el12EL12
12 Slava78 Сообщений: 598
МЕСТА БАЯ СЕЛ, МЕСТА СЕЛА БАЙ ПО ТРЕНДУ ВСЕГО ЛИШЬ МЕСТАМИ ПОМЕНЯТЬ
15 el12EL12 Сообщений: 84 - el12EL12
18 Boris54 Сообщений: 810 - ПенSионер
//+------------------------------------------------------------------+
//| 2MA4.mq4 |
//| Copyright 2019, AM2 |
//| www.forexsystems.biz |
//+------------------------------------------------------------------+
#property copyright «Copyright 2019, AM2»
#property link «www.forexsystems.biz»
#property version «1.00»
#property strict
//--- Inputs
extern double Lots = 0.1; // торговый объем ордера
extern double MaxLot = 5; // максимальный торговый объем
extern double KLot = 2; // увеличение лота
extern int StopLoss = 444; // лось
extern int TakeProfit = 333; // язь
extern int Delta1 = 100; // расстояние от быстрой МА
extern int Delta2 = 200; // расстояние от медленной МА
extern int Step = 200; // шаг усреднения
extern int Count = 5; // число поз
extern int Slip = 30; // реквот
extern int Shift = 1; // на каком баре сигнал индикатора
extern int Magic = 123; // магик
extern bool CloseSig = 1; // закрытие по сигналу
extern int MA1Period = 12; // период МА1
extern int MA2Period = 44; // период МА2
//+------------------------------------------------------------------+
//| Expert initialization function |
//+------------------------------------------------------------------+
int OnInit()
{
//---
Comment("");
//---
return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| Expert deinitialization function |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{
Comment("");
}
//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
void PutOrder(int type,double price)
{
int r=0;
color clr=clrNONE;
double sl=0,tp=0;
if(type==1 || type==3 || type==5)
{
clr=Red;
if(StopLoss>0)
sl=NormalizeDouble(price+StopLoss*Point,Digits);
if(TakeProfit>0)
tp=NormalizeDouble(price-TakeProfit*Point,Digits);
}
if(type==0 || type==2 || type==4)
{
clr=Blue;
if(StopLoss>0)
sl=NormalizeDouble(price-StopLoss*Point,Digits);
if(TakeProfit>0)
tp=NormalizeDouble(price+TakeProfit*Point,Digits);
}
r=OrderSend(NULL,type,Lot(),NormalizeDouble(price,Digits),Slip,sl,tp,"",Magic,0,clr);
return;
}
//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
int CountTrades()
{
int count=0;
for(int i=OrdersTotal()-1; i>=0; i--)
{
if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
{
if(OrderSymbol()==Symbol() && OrderMagicNumber()==Magic)
{
if(OrderType()<2)
count++;
}
}
}
return(count);
}
//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
int FindOrderType()
{
int oticket,ticketNumber=0,type=0;
for(int i=OrdersTotal()-1; i>=0; i--)
{
if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
{
if(OrderSymbol()==Symbol() && OrderMagicNumber()==Magic)
{
oticket=OrderTicket();
if(oticket>ticketNumber)
{
ticketNumber=oticket;
type=OrderType();
}
}
}
}
return(type);
}
//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
double FindLastBuyPrice()
{
int oticket,ticketNumber=0;
double oprice=0;
for(int i=OrdersTotal()-1; i>=0; i--)
{
if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
{
if(OrderSymbol()==Symbol() && OrderType()==OP_BUY && OrderMagicNumber()==Magic)
{
oticket=OrderTicket();
if(oticket>ticketNumber)
{
ticketNumber=oticket;
oprice=OrderOpenPrice();
}
}
}
}
return(oprice);
}
//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
double FindLastSellPrice()
{
int oticket,ticketNumber=0;
double oprice=0;
for(int i=OrdersTotal()-1; i>=0; i--)
{
if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
{
if(OrderSymbol()==Symbol() && OrderType()==OP_SELL && OrderMagicNumber()==Magic)
{
oticket=OrderTicket();
if(oticket>ticketNumber)
{
ticketNumber=oticket;
oprice=OrderOpenPrice();
}
}
}
}
return(oprice);
}
//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
void ModifyOrders()
{
double all=0,count=0,sl=0,tp=0;
for(int i=OrdersTotal()-1; i>=0; i--)
{
if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
{
if(OrderSymbol()==Symbol() && OrderMagicNumber()==Magic)
{
if(OrderType()<2)
{
all+=OrderOpenPrice()*OrderLots();
count+=OrderLots();
}
}
}
}
if(count>0)
all=NormalizeDouble(all/count,Digits);
for(int i=OrdersTotal()-1; i>=0; i--)
{
if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
{
if(OrderSymbol()==Symbol())
{
if(OrderType()==OP_BUY)
{
tp=NormalizeDouble(all+TakeProfit*Point,Digits);
sl=NormalizeDouble(all-StopLoss*Point,Digits);
if(OrderTakeProfit()!=tp || OrderStopLoss()!=sl)
bool mod=OrderModify(OrderTicket(),OrderOpenPrice(),sl,tp,0,Yellow);
}
else
if(OrderType()==OP_SELL)
{
tp=NormalizeDouble(all-TakeProfit*Point,Digits);
sl=NormalizeDouble(all+StopLoss*Point,Digits);
if(OrderTakeProfit()!=tp || OrderStopLoss()!=sl)
bool mod=OrderModify(OrderTicket(),OrderOpenPrice(),sl,tp,0,Yellow);
}
}
}
}
}
//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
double Lot()
{
double lot=Lots;
if(CountTrades()>0)
lot=NormalizeDouble(Lots*MathPow(KLot,CountTrades()),2);
if(lot>MaxLot)
lot=Lots;
return(lot);
}
//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
void CloseAll(int ot=-1)
{
bool cl;
for(int i=OrdersTotal()-1; i>=0; i--)
{
if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
{
if(OrderSymbol()==Symbol() && OrderMagicNumber()==Magic)
{
if(OrderType()==0 && (ot==0 || ot==-1))
{
RefreshRates();
cl=OrderClose(OrderTicket(),OrderLots(),NormalizeDouble(Bid,Digits),Slip,White);
}
if(OrderType()==1 && (ot==1 || ot==-1))
{
RefreshRates();
cl=OrderClose(OrderTicket(),OrderLots(),NormalizeDouble(Ask,Digits),Slip,White);
}
}
}
}
}
//+------------------------------------------------------------------+
//| Профит всех ордеров по типу ордера |
//+------------------------------------------------------------------+
double AllProfit()
{
double pr=0;
for(int i=OrdersTotal()-1; i>=0; i--)
{
if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
{
if(OrderSymbol()==Symbol() && OrderMagicNumber()==Magic)
{
if(OrderType()==0)
{
pr+=OrderProfit()+OrderCommission()+OrderSwap();
}
if(OrderType()==1)
{
pr+=OrderProfit()+OrderCommission()+OrderSwap();
}
}
}
}
return(pr);
}
//+------------------------------------------------------------------+
//| Expert tick function |
//+------------------------------------------------------------------+
void OnTick()
{
double ma1=iMA(NULL,0,MA1Period,0,0,0,Shift);
double ma2=iMA(NULL,0,MA2Period,0,0,0,Shift);
if(CloseSig)
{
if(Bid>ma2)
CloseAll(0);
if(Bid<ma2)
CloseAll(1);
}
// первый ордер
if(CountTrades()<1)
{
if(ma1-Ask>Delta1*_Point && ma2-Ask>Delta2*_Point)
{
PutOrder(0,Ask);
ModifyOrders();
}
if(Bid-ma1>Delta1*_Point && Bid-ma2>Delta2*_Point)
{
PutOrder(1,Bid);
ModifyOrders();
}
}
// усреднение
if(CountTrades()>0 && CountTrades()<Count)
{
if(FindOrderType()==0 && (FindLastBuyPrice()-Ask)/_Point>=Step)
{
PutOrder(0,Ask);
ModifyOrders();
}
if(FindOrderType()==1 && (Bid-FindLastSellPrice())/_Point>=Step)
{
PutOrder(1,Bid);
ModifyOrders();
}
}
Comment("\n Lot: ",Lot(),
"\n Trades: ",CountTrades(),
"\n Profit: ",AllProfit());
}
//+------------------------------------------------------------------+
15 el12EL12 Сообщений: 84 - el12EL12
18 Boris54 Сообщений: 810 - ПенSионер
11 Kuzimich Сообщений: 246 - Андрей
15 el12EL12 Сообщений: 84 - el12EL12
18 Boris54 Сообщений: 810 - ПенSионер
15 el12EL12 Сообщений: 84 - el12EL12
12 Slava78 Сообщений: 598
15 el12EL12 Сообщений: 84 - el12EL12
18 Boris54 Сообщений: 810 - ПенSионер
Зарегистрируйтесь или авторизуйтесь, чтобы оставить комментарий