Здравствуйте. Прошу реализовать такой алгоритм для торговли внутри дня.
Советник открывает по рынку одну сделку в день во время Т1. Затем закрывает ордер, когда цена достигла TP или SL. Во время Т2 — закрывается ордер, если не достигли нужную прибыль (или несработавшие отложенные ордера).
Исходные данные: Мт4, Альпари, 5 знаков после запятой.
Параметры советника:
Размер лота,
Выбор бай или селл,
Т1 – время открытия ордера,
Тр – тейк-профит для ордера,
SL – стоп-лосс для ордера,
Т2 — время удаления несработавших ордеров, либо ордера который не достиг TP или SL.
Предусмотреть торговлю в заданные дни недели, например торгуем только в понедельник.
Предусмотреть, что в работе будут другие ордера по этому же инструменту.
Мартин — не нужен!
Я заказывал похожие советники:
Советник для выставления двух ордеров в разное время
zakaz.opentraders.ru/51959.html
А в этом советнике вы использовали торговлю в заданные дни недели
zakaz.opentraders.ru/50746.html
Комментарии (20)
35 AM2 Сообщений: 16665 - Андрей
20 Boris54 Автор Сообщений: 827 - ПенSионер
16 ssg Сообщений: 817
20 Boris54 Автор Сообщений: 827 - ПенSионер
Торгует по дням недели на выбор.Можно менять время открытия позиции и можно менять время закрытия и направления торговли для каждого дня отдельно.
<code> //+------------------------------------------------------------------+ //| Boris54.mq4 | //| Copyright 2013, MetaQuotes Software Corp. | //| http://www.mункцql5.com | //+------------------------------------------------------------------+ #property copyright "Copyright 2019, AM2" #property link "http://www.forexsystems.biz" #property version "1.00" #property strict //--- Inputs extern double Lots = 0.1; // лот extern double Profit = 10; // профит extern double StopLoss1 = 500; // лось 1 extern double TakeProfit1 = 500; // язь 1 extern double StopLoss2 = 500; // лось 2 extern double TakeProfit2 = 500; // язь 2 extern int Slip = 30; // реквот extern int Magic = 123; // магик extern int Day1 = 1; // 1- торговать в понедельник 0 - не торговать extern int BuySell1 = 0; // 0-buy 1-sell extern string Time1 = "10:00:00";// время открытия позиции в понедельник extern string TimeClose1 = "23:00:00";// врямя закрытия позиций в понедельник extern int Day2 = 2; // 2- торговать во вторник 0 - не торговать extern int BuySell2 = 0; // 0-buy 1-sell extern string Time2 = "10:00:00";// время открытия позиции во вторник extern string TimeClose2 = "23:00:00";// врямя закрытия позиций во вторник extern int Day3 = 3; // 3- торговать в среду 0 - не торговать extern int BuySell3 = 0; // 0-buy 1-sell extern string Time3 = "10:00:00";// время открытия позиции в среду extern string TimeClose3 = "23:00:00";// врямя закрытия позиций в среду extern int Day4 = 4; // 4- торговать в четверг 0 - не торговать extern int BuySell4 = 0; // 0-buy 1-sell extern string Time4 = "10:00:00";// время открытия позиции в четверг extern string TimeClose4 = "23:00:00";// врямя закрытия позиций в четверг extern int Day5 = 5; //5- торговать в пятницу 0 - не торговать extern int BuySell5 = 0; // 0-buy 1-sell extern string Time5 = "10:00:00";// время открытия позиции в пятницу extern string TimeClose5 = "23:00:00";// врямя закрытия позиций в пятницу //+------------------------------------------------------------------+ //| Expert initialization function | //+------------------------------------------------------------------+ int OnInit() { //--- PutButton("c",111,44,"Close All"); //--- return(INIT_SUCCEEDED); } //+------------------------------------------------------------------+ //| Expert deinitialization function | //+------------------------------------------------------------------+ void OnDeinit(const int reason) { //--- } //+------------------------------------------------------------------+ //| | //+------------------------------------------------------------------+ void PutOrder(int type,double price,double StopLoss,double TakeProfit) { int r=0; color clr=Green; 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,Lots,NormalizeDouble(price,Digits),Slip,sl,tp,"",Magic,0,clr); return; } //+------------------------------------------------------------------+ //| Профит всех ордеров по типу ордера | //+------------------------------------------------------------------+ double AllProfit(int ot=-1){ 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 && (ot==0 || ot==-1)) { pr+=OrderProfit()+OrderCommission()+OrderSwap(); } if(OrderType()==1 && (ot==1 || ot==-1)) { pr+=OrderProfit()+OrderCommission()+OrderSwap(); } } } } return(pr); } //+------------------------------------------------------------------+ //| | //+------------------------------------------------------------------+ 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); } } } } } //+------------------------------------------------------------------+ //| | //+------------------------------------------------------------------+ 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); } //+------------------------------------------------------------------+ //| | //+------------------------------------------------------------------+ void PutButton(string name,int x,int y,string text) { ObjectCreate(0,name,OBJ_BUTTON,0,0,0); //--- установим координаты кнопки ObjectSetInteger(0,name,OBJPROP_XDISTANCE,x); ObjectSetInteger(0,name,OBJPROP_YDISTANCE,y); //--- установим размер кнопки ObjectSetInteger(0,name,OBJPROP_XSIZE,80); ObjectSetInteger(0,name,OBJPROP_YSIZE,30); //--- установим угол графика, относительно которого будут определяться координаты точки ObjectSetInteger(0,name,OBJPROP_CORNER,3); //--- установим текст ObjectSetString(0,name,OBJPROP_TEXT,text); //--- установим шрифт текста ObjectSetString(0,name,OBJPROP_FONT,"Arial"); //--- установим размер шрифта ObjectSetInteger(0,name,OBJPROP_FONTSIZE,12); //--- установим цвет текста ObjectSetInteger(0,name,OBJPROP_COLOR,Red); //--- установим цвет фона ObjectSetInteger(0,name,OBJPROP_BGCOLOR,White); //--- установим цвет границы ObjectSetInteger(0,name,OBJPROP_BORDER_COLOR,Blue); } //+------------------------------------------------------------------+ //| OnTick function | //+------------------------------------------------------------------+ </code>Редактирован: 3 марта 2022, 20:1116 ssg Сообщений: 817
16 ssg Сообщений: 817
35 AM2 Сообщений: 16665 - Андрей
В ранее сделанном советнике убрать выставление второго ордера и добавить дни недели, как во втором аналоге.
20 Boris54 Автор Сообщений: 827 - ПенSионер
Для удобства при оптимизации надо задавать SL и ТР один раз в параметрах. Нужен именно один ордер в день.
20 Boris54 Автор Сообщений: 827 - ПенSионер
<code> //+------------------------------------------------------------------+ //| Boris54 v1.mq4 | //| Copyright 2013, MetaQuotes Software Corp. | //| http://www.mункцql5.com | //+------------------------------------------------------------------+ #property copyright "Copyright 2019, AM2" #property link "http://www.forexsystems.biz" #property version "1.00" #property strict //--- Inputs extern int BuySell = 0; // 0-buy 1-sell extern double Lots = 0.1; // лот extern int StopLoss = 333; // лось extern int TakeProfit = 444; // язь extern int StartHour = 0; // час начала торговли extern int StartMin = 30; // минута начала торговли extern int EndHour = 23; // час окончания торговли extern int EndMin = 30; // минута окончания торговли extern int Slip = 0; // реквот extern int Magic = 123; // магик extern int CloseOn = 0; // 1-закрытие в конце работы extern bool MonDay = true; extern bool TuesDay = true; extern bool WednesDay = true; extern bool ThursDay = true; extern bool FriDay = true; //+------------------------------------------------------------------+ //| Expert initialization function | //+------------------------------------------------------------------+ int OnInit() { //--- Comment(""); //--- return(INIT_SUCCEEDED); } //+------------------------------------------------------------------+ //| Expert deinitialization function | //+------------------------------------------------------------------+ void OnDeinit(const int reason) { Comment(""); } //+------------------------------------------------------------------+ //| | //+------------------------------------------------------------------+ bool Trade() { if(DayOfWeek()==1 && MonDay) return(true); if(DayOfWeek()==2 && TuesDay) return(true); if(DayOfWeek()==3 && WednesDay) return(true); if(DayOfWeek()==4 && ThursDay) return(true); if(DayOfWeek()==5 && FriDay) return(true); return(false); } //+------------------------------------------------------------------+ //| | //+------------------------------------------------------------------+ void PutOrder(int type,double price,double stopLoss,double takeProfit) { int r=0; color clr=Green; 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,Lots,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); } //+------------------------------------------------------------------+ //| | //+------------------------------------------------------------------+ 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); } } } } } //+------------------------------------------------------------------+ //| | //+------------------------------------------------------------------+ bool TimeSession(int aStartHour,int aStartMinute,int aStopHour,int aStopMinute,datetime aTimeCur) { //--- время начала сессии int StartTime=3600*aStartHour+60*aStartMinute; //--- время окончания сессии int StopTime=3600*aStopHour+60*aStopMinute; //--- текущее время в секундах от начала дня aTimeCur=aTimeCur%86400; if(StopTime<StartTime) { //--- переход через полночь if(aTimeCur>=StartTime || aTimeCur<StopTime) { return(true); } } else { //--- внутри одного дня if(aTimeCur>=StartTime && aTimeCur<StopTime) { return(true); } } return(false); } //+------------------------------------------------------------------+ //| Expert tick function | //+------------------------------------------------------------------+ void OnTick() { if(!TimeSession(StartHour,StartMin,EndHour,EndMin,TimeCurrent()) && CloseOn>0) { CloseAll(); } if(Trade() && CountTrades()<1) { if(TimeSession(StartHour,StartMin,EndHour,EndMin,TimeCurrent())) { if(BuySell==0) PutOrder(0,Ask,StopLoss,TakeProfit); if(BuySell==1) PutOrder(1,Bid,StopLoss,TakeProfit); } } Comment("\n Time: ",TimeCurrent()); } //+------------------------------------------------------------------+ </code>Редактирован: 4 марта 2022, 05:1916 ssg Сообщений: 817
То что не умеете читать текст программы не сильно страшно.Главное что бы торговали успешно.
16 ssg Сообщений: 817
Явные недостатки:
-Советник торгует или бай или селл.
-Советник открывает позиции каждый день в одно время.
-Тейкпрофит и стоплосс для позиций каждого дня одинаковые.
Следовательно возможные преимущества статистического анализа используются не полностью.
Но это только моё мнение.
Главное что бы Вас устраивало. Деньги то Ваши.
16 ssg Сообщений: 817
20 Boris54 Автор Сообщений: 827 - ПенSионер
Мне нужен ОДИН ордер, который выставлен во время Т1 и всё! Редактирован: 11 марта 2022, 09:40
20 Boris54 Автор Сообщений: 827 - ПенSионер
<code> #property copyright "Copyright 2019, AM2" #property link "http://www.forexsystems.biz" #property version "1.00" #property strict //--- Inputs extern int BuySell = 0; // 0-buy 1-sell extern double Lots = 0.1; // лот extern int StopLoss = 333; // лось extern int TakeProfit = 444; // язь extern int StartHour = 0; // час начала торговли extern int StartMin = 30; // минута начала торговли extern int EndHour = 23; // час окончания торговли extern int EndMin = 30; // минута окончания торговли extern int Slip = 0; // реквот extern int Magic = 123; // магик extern int CloseOn = 0; // 1-закрытие в конце работы extern bool MonDay = true; extern bool TuesDay = true; extern bool WednesDay = true; extern bool ThursDay = true; extern bool FriDay = true; //+------------------------------------------------------------------+ //| Expert initialization function | //+------------------------------------------------------------------+ int OnInit() { //--- Comment(""); //--- return(INIT_SUCCEEDED); } //+------------------------------------------------------------------+ //| Expert deinitialization function | //+------------------------------------------------------------------+ void OnDeinit(const int reason) { Comment(""); } //+------------------------------------------------------------------+ //| | //+------------------------------------------------------------------+ bool Trade() { if(DayOfWeek()==1 && MonDay) return(true); if(DayOfWeek()==2 && TuesDay) return(true); if(DayOfWeek()==3 && WednesDay) return(true); if(DayOfWeek()==4 && ThursDay) return(true); if(DayOfWeek()==5 && FriDay) return(true); return(false); } //+------------------------------------------------------------------+ //| | //+------------------------------------------------------------------+ void PutOrder(int type,double price,double stopLoss,double takeProfit) { int r=0; color clr=Green; 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,Lots,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); } //+------------------------------------------------------------------+ //| | //+------------------------------------------------------------------+ 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); } } } } } //+------------------------------------------------------------------+ //| | //+------------------------------------------------------------------+ bool TimeSession(int aStartHour,int aStartMinute,int aStopHour,int aStopMinute,datetime aTimeCur) { //--- время начала сессии int StartTime=3600*aStartHour+60*aStartMinute; //--- время окончания сессии int StopTime=3600*aStopHour+60*aStopMinute; //--- текущее время в секундах от начала дня aTimeCur=aTimeCur%86400; if(StopTime<StartTime) { //--- переход через полночь if(aTimeCur>=StartTime || aTimeCur<StopTime) { return(true); } } else { //--- внутри одного дня if(aTimeCur>=StartTime && aTimeCur<StopTime) { return(true); } } return(false); } //+------------------------------------------------------------------+ //| Expert tick function | //+------------------------------------------------------------------+ void OnTick() { if(!TimeSession(StartHour,StartMin,EndHour,EndMin,TimeCurrent()) && CloseOn>0) { CloseAll(); } if(Trade() && CountTrades()<1) { if(TimeSession(StartHour,StartMin,EndHour,EndMin,TimeCurrent())) { if(BuySell==0) PutOrder(0,Ask,StopLoss,TakeProfit); if(BuySell==1) PutOrder(1,Bid,StopLoss,TakeProfit); } } Comment("\n Time: ",TimeCurrent()); } //+----------------------------------------------------------------------------+ </code>Редактирован: 11 марта 2022, 17:0116 ssg Сообщений: 817
Другой вариант — открываете код ненужного советника, удаляете старый код и копируйте туда этот код.Затем нажмите кнопку — компилировать.
16 ssg Сообщений: 817
35 AM2 Сообщений: 16665 - Андрей
35 AM2 Сообщений: 16665 - Андрей
20 Boris54 Автор Сообщений: 827 - ПенSионер
Прошу исправить.
Прошу сразу проверить работу советника при маленьком ТР (100 п) и маленьком SL (100 п). Мне нужен ОДИН ордер в день, не нужна серия ордеров внутри одного дня. Редактирован: 11 марта 2022, 09:38
20 Boris54 Автор Сообщений: 827 - ПенSионер
Зарегистрируйтесь или авторизуйтесь, чтобы оставить комментарий