если не сильно напрягаю — можно добавить пересечение 2 машек для открытия ордера при условии что советник сам торгует. вместо выше или ниже средней.
заранее благодарен буду.
//------- мувинги для работы ----------------------------------------+
extern string name_MA1 = "________ Быстрый MA_1 ________"; // Индикатор ==>>
extern int ma1_period = 13; // Период
extern int ma1_shift = 0; // Сдвиг
extern ENUM_MA_METHOD ma1_method = MODE_EMA; // Метод MA
extern ENUM_APPLIED_PRICE ma1_applied_price = PRICE_CLOSE; // Применить к
input string name_MA2 = "________ Средний MA_2 ________"; // Индикатор ==>>
extern int ma2_period = 26; // Период
extern int ma2_shift = 0; // Сдвиг
extern ENUM_MA_METHOD ma2_method = MODE_EMA; // Метод MA
extern ENUM_APPLIED_PRICE ma2_applied_price = PRICE_CLOSE; // Применить к
//+------------------------------------------------------------------+
//| Copyright © 2021, forex-time@mail.ru |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2021, forex-time@mail.ru"
#property strict
//+------------------------------------------------------------------+
enum trade
{
Auto, //Авто
Fixed //Ручная
};
//+----------------+
extern trade MethodTrade = Auto; //Торговля МЕНЮ ==>>
extern double Lots = 0.1; //Фиксированный лот
extern double MaxLot = 5.0; //MAX лот
extern double KLot = 2.0; //Увеличение лота
extern double Profit = 15.0; //Закрыть общий профит $
extern double Loss = 0.0; //Общий убыток $ (=0 откл)
extern int TakeProfit = 0; //Тейк профит (=0 откл)
extern int DistNewOrd = 300; //Дистанция новый ордер
extern int MaxOrd = 10; //MAX ордеров
extern int Magic = 0; //Магик ордеров
extern string IndMA = "=== Moving Average ==="; //Индикатор ===>>
extern int PeriodMA = 20; //Период
extern int ShiftMA = 3; //Сдвиг линии
extern ENUM_MA_METHOD MethodMA = MODE_SMA; //Метод
//+------------------------------------------------------------------+
//| 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(OP(-1)>0 && //Если есть ордера
(PrfOP(-1)>=Profit|| //Общий профит больше значения
(PrfOP(-1)<0 && Loss!=0.0 && MathAbs(PrfOP(-1))>=MathAbs(Loss))|| //Общий убыток больше значения
(OP(0)==0 && OP(1)==0))) //Нет открытых рыночных ордеров
DeleteAll(); //Закрыть и удалить все ордера
//Если выбран метод торговли АВТО
if(MethodTrade==Auto){
//Сигналы индикатора МА
int SignalMA=-1;
//Цена открытия текущей свечи выше МА и цена открытия предыдущей свечи ниже МА
if(Open[0]>MA(0) && Open[1]<=MA(1)) SignalMA=0;
//Цена открытия текущей свечи ниже МА и цена открытия предыдущей свечи выше МА
if(Open[0]<MA(0) && Open[1]>=MA(1)) 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);
}
//Сигнал МА, открыть ордер в направлении
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,Red);
if(LastTypeOP()==1 && OP(4)==0) Send(OP_BUYSTOP,Lot(),ND(LastPrcOP(1)+DistNewOrd*Point,Digits),0,TPb,Blue);
}
}
}
//+------------------------------------------------------------------+
//| Индикатор Moving Average |
//+------------------------------------------------------------------+
double MA(int bar){
double ma=iMA(Symbol(),0, PeriodMA,ShiftMA,MethodMA,PRICE_CLOSE, 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);}
//+------------------------------------------------------------------+
//| Расчёт лота |
//+------------------------------------------------------------------+
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");}
//-------------------------------------------------------------------+
Комментарии (3)
Сигнал по факту пересечения 2-х МА
Скачать: www.opentraders.ru/downloads/3244/
Редактировать: forex-time@mail.ru
15 forextime Сообщений: 141 - ExpertFX
6 eduard9898 Автор Сообщений: 81
можно попросить добавить трейлинг стоп т.к бывает что уходит в + до тейка не доходит и опять ожидание чуда. с благодарностью и уважением.
6 eduard9898 Автор Сообщений: 81
Зарегистрируйтесь или авторизуйтесь, чтобы оставить комментарий