- Браузерная платформа MetaTrader 5
- MetaTrader 5 для ваших менеджеров
- Скачайте приложение MetaTrader 5 для iPhone и iPad
Ищу рабочий код. Что уже только не пробовал. Есть советник. Как мне сделать так чтобы он торговал и закрывал сделки по расписанию Московской биржи. Тоесть чтобы можно было задавать время отключения торговли и закрытия всех сделок допустим перед клирингами и перед закрытие рынка. Все что тут находил на форумах ничего не работает толком. Везде ошибки. Логика такая. Торговля разрешена с 10.01 до 13.59. в 13.59 закрываются все ордера. Затем торговля разрешена с 14.05 до 18.44. в 18.44 закрываются все ордера. Затем торговля разрешена с 19.00 по 23.49. в 23.49 закрываются все ордера. Нужно чтобы каждый рабочий промежуток можно было отключить и включить. чтобы время можно было редактировать тоже. как это сделать. через TradeState ничего не получается. Или не хватает знаний.
так вот можно - правда надо доделывать открывание . а на закрытие всё закроет
выставляете время старта - если ниже значка эксперта, нету времени - в ожидании
время закрытия все открытые позиции на всех символах закроет
//--- input datetime HoursFrom = D'1970.01.01'; // Время старта Эксперта input datetime HoursTo = D'2030.12.31'; // Время закрытия всех позиций //---
//+------------------------------------------------------------------+ //| 000103.mq5 | //| Copyright 2019, MetaQuotes Software Corp. | //| https://www.mql5.com | //+------------------------------------------------------------------+ #property copyright "Copyright 2019, MetaQuotes Software Corp." #property link "https://www.mql5.com" #property version "1.00" //--- #include <Trade\Trade.mqh> #include <Trade\SymbolInfo.mqh> #include <Trade\PositionInfo.mqh> #include <Trade\AccountInfo.mqh> //--- CTrade m_trade; // trading object CSymbolInfo m_symbol; // symbol info object CPositionInfo m_position; // trade position object CAccountInfo m_account; // account info wrapper //--- input datetime HoursFrom = D'1970.01.01'; // Время старта Эксперта input datetime HoursTo = D'2030.12.31'; // Время закрытия всех позиций //--- int ticks_to_close = 1;// количество тиков до снятия эксперта string txt; //+------------------------------------------------------------------+ //| Expert initialization function | //+------------------------------------------------------------------+ int OnInit() { //--- //--- return(INIT_SUCCEEDED); } //+------------------------------------------------------------------+ //| Expert deinitialization function | //+------------------------------------------------------------------+ void OnDeinit(const int reason) { //--- Print(TimeCurrent(),": ",__FUNCTION__," reason code = ",reason); ObjectsDeleteAll(0,"cm"); Comment(""); //--- } //+------------------------------------------------------------------+ //| Expert tick function | //+------------------------------------------------------------------+ void OnTick() { //--- if(TimeLocal()>HoursTo) { CloseAll(); PlaySound("expert.wav"); ExpertRemoves(); } //--- if(TimeLocal()>HoursTo) //--- MqlDateTime TimeLocal; if((HoursFrom<HoursTo && TimeLocal()>=HoursFrom && TimeLocal()<HoursTo) || (HoursFrom>HoursTo && (TimeLocal()<HoursTo || TimeLocal()>=HoursFrom))) { StringConcatenate(txt,"",TimeToString(TimeCurrent(),TIME_DATE|TIME_MINUTES)); DrawLABEL(3,"cm 3",txt,5,30,Lime,ANCHOR_RIGHT); } //--- } //+------------------------------------------------------------------+ //| DrawLABEL | //+------------------------------------------------------------------+ void DrawLABEL(int c,string name,string text,int X,int Y,color clr, int ANCHOR=ANCHOR_LEFT,int FONTSIZE=8) { if(ObjectFind(0,name)==-1) { ObjectCreate(0,name,OBJ_LABEL,0,0,0); ObjectSetInteger(0,name,OBJPROP_CORNER,c); ObjectSetInteger(0,name,OBJPROP_XDISTANCE,X); ObjectSetInteger(0,name,OBJPROP_YDISTANCE,Y); ObjectSetInteger(0,name,OBJPROP_SELECTABLE,false); ObjectSetInteger(0,name,OBJPROP_SELECTED,false); ObjectSetInteger(0,name,OBJPROP_FONTSIZE,FONTSIZE); ObjectSetString(0,name,OBJPROP_FONT,"Arial"); ObjectSetInteger(0,name,OBJPROP_ANCHOR,ANCHOR); } ObjectSetString(0,name,OBJPROP_TEXT,text); ObjectSetInteger(0,name,OBJPROP_COLOR,clr); } //+------------------------------------------------------------------+ //| start function | //+------------------------------------------------------------------+ void CloseAll(void) { //--- for(int i=PositionsTotal()-1; i>=0; i--) // returns the number of current positions if(m_position.SelectByIndex(i)) // selects the position by index for further access to its properties { ClosePosition(m_position.Symbol()); // close a position by the specified symbo } } //+------------------------------------------------------------------+ //| Close selected position | //+------------------------------------------------------------------+ void ClosePosition(const string symbol) { if(InitTrade(symbol)) m_trade.PositionClose(m_position.Ticket()); // close a position by the specified symbo PlaySound("ok.wav"); } //+------------------------------------------------------------------+ //| Init trade object | //+------------------------------------------------------------------+ bool InitTrade(const string symbol) { if(!m_symbol.Name(symbol)) // sets symbol name return(false); //--- if(IsFillingTypeAllowed(symbol,SYMBOL_FILLING_FOK)) m_trade.SetTypeFilling(ORDER_FILLING_FOK); else if(IsFillingTypeAllowed(symbol,SYMBOL_FILLING_IOC)) m_trade.SetTypeFilling(ORDER_FILLING_IOC); else m_trade.SetTypeFilling(ORDER_FILLING_RETURN); //--- return(true); //--- } //+------------------------------------------------------------------+ //| Checks if the specified filling mode is allowed | //+------------------------------------------------------------------+ bool IsFillingTypeAllowed(string symbol,int fill_type) { //--- Obtain the value of the property that describes allowed filling modes int filling=(int)SymbolInfoInteger(symbol,SYMBOL_FILLING_MODE); //--- Return true, if mode fill_type is allowed return((filling & fill_type)==fill_type); } //+------------------------------------------------------------------+ //| start function | //+------------------------------------------------------------------+ void ExpertRemoves(void) { static int tick_counter=0; //--- tick_counter++; Comment("\nДо выгрузки эксперта ",__FILE__," осталось ", (ticks_to_close-tick_counter)," тиков "); //--- до if(tick_counter>=ticks_to_close) { ExpertRemove(); Print(TimeCurrent(),": ",__FUNCTION__," эксперт будет выгружен"); } Print("tick_counter = ",tick_counter); //--- } //+------------------------------------------------------------------+
- www.metatrader5.com
так вот можно - правда надо доделывать открывание . а на закрытие всё закроет
выставляете время старта - если ниже значка эксперта, нету времени - в ожидании
время закрытия все открытые позиции на всех символах закроет
а как сделать несколько промежутков времени. часы минуты секунды. чтобы повторялось каждый день. ? мне кажется это не совсем то что мне нужно. Нужно чтобы советник отключал возможность открыть новую позицию после ее закрытия. а потом все опять возобновлялось и повторялось. тоесть отключил возможность открывать позиции в 13.58. а в 13.59 все открытые позиции закрываются. а потом в 14.00 советник сново работает как и раньше до следующего заданного времени.
а как сделать несколько промежутков времени. часы минуты секунды. чтобы повторялось каждый день. ? мне кажется это не совсем то что мне нужно. Нужно чтобы советник отключал возможность открыть новую позицию после ее закрытия. а потом все опять возобновлялось и повторялось. тоесть отключил возможность открывать позиции в 13.58. а в 13.59 все открытые позиции закрываются. а потом в 14.00 советник сново работает как и раньше до следующего заданного времени.
ну можно к примеру сохранять на графике эксперта с заданным временем .
один отработает - удаляясь меняет график с другим временем в эксперте . но это нужно функцию добавить
вот выкладывал код https://www.mql5.com/ru/forum/317351#comment_12348805
работает в MQL4/MQL5
ну и в топике были еще варианты
вот выкладывал код https://www.mql5.com/ru/forum/317351#comment_12348805
работает в MQL4/MQL5
ну и в топике были еще варианты
то что в топике ругается. не понимает он. пишет что неправильные данные в data
у меня нет особых знаний. поэтому я мало понимаю как и что. нужно что то уже готовое что можно потом в код советника вписать....
вот добавил функцию .
//+------------------------------------------------------------------+ //| 000104.mq5 | //| Copyright 2019, MetaQuotes Software Corp. | //| https://www.mql5.com | //+------------------------------------------------------------------+ #property copyright "Copyright 2019, MetaQuotes Software Corp." #property link "https://www.mql5.com" #property version "1.00" //--- #include <Trade\Trade.mqh> #include <Trade\SymbolInfo.mqh> #include <Trade\PositionInfo.mqh> #include <Trade\AccountInfo.mqh> //--- CTrade m_trade; // trading object CSymbolInfo m_symbol; // symbol info object CPositionInfo m_position; // trade position object CAccountInfo m_account; // account info wrapper //--- input string Template = "ADX"; // Имя шаблона(without '.tpl') input datetime HoursFrom = D'1970.01.01'; // Время старта Эксперта input datetime HoursTo = D'2030.12.31'; // Время закрытия всех позиций //--- int ticks_to_close = 1; // количество тиков до снятия эксперта ENUM_TIMEFRAMES TimeFrame; // Change TimeFrame - Current = dont changed string txt; //+------------------------------------------------------------------+ //| Expert initialization function | //+------------------------------------------------------------------+ int OnInit() { //--- //--- return(INIT_SUCCEEDED); } //+------------------------------------------------------------------+ //| Expert deinitialization function | //+------------------------------------------------------------------+ void OnDeinit(const int reason) { //--- Print(TimeCurrent(),": ",__FUNCTION__," reason code = ",reason); ObjectsDeleteAll(0,"cm"); Comment(""); //--- } //+------------------------------------------------------------------+ //| Expert tick function | //+------------------------------------------------------------------+ void OnTick() { //--- if(TimeLocal()>HoursTo) { CloseAll(); PlaySound("expert.wav"); DeleteChart(); ExpertRemoves(); } //--- if(TimeLocal()>HoursTo) //--- MqlDateTime TimeLocal; if((HoursFrom<HoursTo && TimeLocal()>=HoursFrom && TimeLocal()<HoursTo) || (HoursFrom>HoursTo && (TimeLocal()<HoursTo || TimeLocal()>=HoursFrom))) { StringConcatenate(txt,"",TimeToString(TimeCurrent(),TIME_DATE|TIME_MINUTES)); DrawLABEL(3,"cm 3",txt,5,30,Lime,ANCHOR_RIGHT); } //--- } //+------------------------------------------------------------------+ //| DrawLABEL | //+------------------------------------------------------------------+ void DrawLABEL(int c,string name,string text,int X,int Y,color clr, int ANCHOR=ANCHOR_LEFT,int FONTSIZE=8) { if(ObjectFind(0,name)==-1) { ObjectCreate(0,name,OBJ_LABEL,0,0,0); ObjectSetInteger(0,name,OBJPROP_CORNER,c); ObjectSetInteger(0,name,OBJPROP_XDISTANCE,X); ObjectSetInteger(0,name,OBJPROP_YDISTANCE,Y); ObjectSetInteger(0,name,OBJPROP_SELECTABLE,false); ObjectSetInteger(0,name,OBJPROP_SELECTED,false); ObjectSetInteger(0,name,OBJPROP_FONTSIZE,FONTSIZE); ObjectSetString(0,name,OBJPROP_FONT,"Arial"); ObjectSetInteger(0,name,OBJPROP_ANCHOR,ANCHOR); } ObjectSetString(0,name,OBJPROP_TEXT,text); ObjectSetInteger(0,name,OBJPROP_COLOR,clr); } //+------------------------------------------------------------------+ //| start function | //+------------------------------------------------------------------+ void CloseAll(void) { //--- for(int i=PositionsTotal()-1; i>=0; i--) // returns the number of current positions if(m_position.SelectByIndex(i)) // selects the position by index for further access to its properties { ClosePosition(m_position.Symbol()); // close a position by the specified symbo } } //+------------------------------------------------------------------+ //| Close selected position | //+------------------------------------------------------------------+ void ClosePosition(const string symbol) { if(InitTrade(symbol)) m_trade.PositionClose(m_position.Ticket()); // close a position by the specified symbo PlaySound("ok.wav"); } //+------------------------------------------------------------------+ //| Init trade object | //+------------------------------------------------------------------+ bool InitTrade(const string symbol) { if(!m_symbol.Name(symbol)) // sets symbol name return(false); //--- if(IsFillingTypeAllowed(symbol,SYMBOL_FILLING_FOK)) m_trade.SetTypeFilling(ORDER_FILLING_FOK); else if(IsFillingTypeAllowed(symbol,SYMBOL_FILLING_IOC)) m_trade.SetTypeFilling(ORDER_FILLING_IOC); else m_trade.SetTypeFilling(ORDER_FILLING_RETURN); //--- return(true); //--- } //+------------------------------------------------------------------+ //| Checks if the specified filling mode is allowed | //+------------------------------------------------------------------+ bool IsFillingTypeAllowed(string symbol,int fill_type) { //--- Obtain the value of the property that describes allowed filling modes int filling=(int)SymbolInfoInteger(symbol,SYMBOL_FILLING_MODE); //--- Return true, if mode fill_type is allowed return((filling & fill_type)==fill_type); } //+------------------------------------------------------------------+ //| start function | //+------------------------------------------------------------------+ void ExpertRemoves(void) { static int tick_counter=0; //--- tick_counter++; Comment("\nДо выгрузки эксперта ",__FILE__," осталось ", (ticks_to_close-tick_counter)," тиков "); //--- до if(tick_counter>=ticks_to_close) { ExpertRemove(); Print(TimeCurrent(),": ",__FUNCTION__," эксперт будет выгружен"); } Print("tick_counter = ",tick_counter); //--- } //+------------------------------------------------------------------+ //| start function | //+------------------------------------------------------------------+ void DeleteChart(void) { long currChart,prevChart=ChartFirst(); int i=0,limit=100; bool errTemplate; while(i<limit) { currChart=ChartNext(prevChart); if(TimeFrame!=PERIOD_CURRENT) { ChartSetSymbolPeriod(prevChart,ChartSymbol(prevChart),TimeFrame); } errTemplate=ChartApplyTemplate(prevChart,Template+".tpl"); if(!errTemplate) { Print("Error ",ChartSymbol(prevChart),"-> ",GetLastError()); } if(currChart<0) break; Print(i,ChartSymbol(currChart)," ID =",currChart); prevChart=currChart; i++; } } //+------------------------------------------------------------------+
сохраняем. - график шаблона с экспертом настроеным на время старта и закрытия всех позиции
например шаблон 1 с одними настройками
шаблон 2 с другими настройками и так далее
вот добавил функцию .
сохраняем. - график шаблона с экспертом настроеным на время старта и закрытия всех позиции
например шаблон 1 с одними настройками
шаблон 2 с другими настройками и так далее
вот есть советник. я его перетянул на график. включил и настроил. затем беру сохраняю шаблон графика с экспертом со своим названием. потом на другой график кидаю ваш советник и указываю в настройках название моего шаблона? или я не так понял? а как тестировать в тестере всю эту конструкцию?
у меня нет особых знаний. поэтому я мало понимаю как и что. нужно что то уже готовое что можно потом в код советника вписать....
я дал код который нужно вписать в код советника, если не получается, или изучайте язык или фриланс
мой код работает только по часам, где то выкладывал и с учетом часов-минут, но нужно уметь хотя бы из готовых участков кода сложить свой код
вот еще пример кода ограничивающего время работы советника https://www.mql5.com/ru/code/26019
- www.mql5.com
вот добавил функцию .
сохраняем. - график шаблона с экспертом настроеным на время старта и закрытия всех позиции
например шаблон 1 с одними настройками
шаблон 2 с другими настройками и так далее
теперь ваш советник копируете
только void OnTick() измените например void OnTickOnTick()
и скопируйте из своего int OnInit() что бы был один . другой удалите
так же и void OnDeinit(const int reason) что бы был один.
теперь нужно что бы ваш советник запускался OnTickOnTick(); эту надпись нужно скопировать в void OnTick()
вот сюда
MqlDateTime TimeLocal; if((HoursFrom<HoursTo && TimeLocal()>=HoursFrom && TimeLocal()<HoursTo) || (HoursFrom>HoursTo && (TimeLocal()<HoursTo || TimeLocal()>=HoursFrom))) { OnTickOnTick(); вот сюда StringConcatenate(txt,"",TimeToString(TimeCurrent(),TIME_DATE|TIME_MINUTES)); DrawLABEL(3,"cm 3",txt,5,30,Lime,ANCHOR_RIGHT); }
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Вы принимаете политику сайта и условия использования