Ищу код чтобы вписать в советник. Торговое расписание.

Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий
Eugene Maslyukov
210
Eugene Maslyukov  
Ищу рабочий код. Что уже только не пробовал. Есть советник. Как мне сделать так чтобы он торговал и закрывал сделки по расписанию Московской биржи. Тоесть чтобы можно было задавать время отключения торговли и закрытия всех сделок допустим перед клирингами и перед закрытие рынка. Все что тут находил на форумах ничего не работает толком. Везде ошибки. Логика такая. Торговля разрешена с 10.01 до 13.59. в 13.59 закрываются все ордера. Затем торговля разрешена с 14.05 до 18.44. в 18.44 закрываются все ордера. Затем торговля разрешена с 19.00 по 23.49. в 23.49 закрываются все ордера. Нужно чтобы каждый рабочий промежуток можно было отключить и включить. чтобы время можно было редактировать тоже. как это сделать.  через TradeState ничего не получается. Или не хватает знаний.
Alexsandr San
2200
Alexsandr San  
Eugene Maslyukov:
Ищу рабочий код. Что уже только не пробовал. Есть советник. Как мне сделать так чтобы он торговал и закрывал сделки по расписанию Московской биржи. Тоесть чтобы можно было задавать время отключения торговли и закрытия всех сделок допустим перед клирингами и перед закрытие рынка. Все что тут находил на форумах ничего не работает толком. Везде ошибки. Логика такая. Торговля разрешена с 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);
//---
  }
//+------------------------------------------------------------------+
Совершение сделок - Торговые операции - Справка по MetaTrader 5
Совершение сделок - Торговые операции - Справка по MetaTrader 5
  • www.metatrader5.com
Торговая деятельность в платформе связана с формированием и отсылкой рыночных и отложенных ордеров для исполнения брокером, а также с управлением текущими позициями путем их модификации или закрытия. Платформа позволяет удобно просматривать торговую историю на счете, настраивать оповещения о событиях на рынке и многое другое. Открытие позиций...
Файлы:
000103.mq5 13 kb
Eugene Maslyukov
210
Eugene Maslyukov  
Aleksandr Klapatyuk:

так вот можно - правда надо доделывать открывание . а на закрытие всё закроет 

выставляете время старта - если ниже значка эксперта, нету времени - в ожидании 

время закрытия все открытые позиции на всех символах закроет 

а как сделать несколько промежутков времени. часы минуты секунды.  чтобы повторялось каждый день. ? мне кажется это не совсем то что мне нужно. Нужно чтобы советник отключал возможность открыть новую позицию после ее закрытия. а потом все опять возобновлялось и повторялось. тоесть отключил возможность открывать позиции в 13.58. а в 13.59 все открытые позиции закрываются. а потом в 14.00 советник сново работает как и раньше до следующего заданного времени. 

Alexsandr San
2200
Alexsandr San  
Eugene Maslyukov:

а как сделать несколько промежутков времени. часы минуты секунды.  чтобы повторялось каждый день. ? мне кажется это не совсем то что мне нужно. Нужно чтобы советник отключал возможность открыть новую позицию после ее закрытия. а потом все опять возобновлялось и повторялось. тоесть отключил возможность открывать позиции в 13.58. а в 13.59 все открытые позиции закрываются. а потом в 14.00 советник сново работает как и раньше до следующего заданного времени. 

ну можно к примеру сохранять на графике эксперта с заданным временем .

один отработает - удаляясь меняет график с другим временем в эксперте . но это нужно функцию добавить 

Igor Makanu
9043
Igor Makanu  

вот выкладывал код https://www.mql5.com/ru/forum/317351#comment_12348805

работает в MQL4/MQL5

ну и в топике были еще варианты

Eugene Maslyukov
210
Eugene Maslyukov  
Igor Makanu:

вот выкладывал код https://www.mql5.com/ru/forum/317351#comment_12348805

работает в MQL4/MQL5

ну и в топике были еще варианты

то что в топике  ругается. не понимает он. пишет что неправильные данные в data

Eugene Maslyukov
210
Eugene Maslyukov  
у меня нет особых знаний. поэтому я мало понимаю как и что. нужно что то уже готовое что можно потом в код советника вписать....
Alexsandr San
2200
Alexsandr San  
Eugene Maslyukov:
у меня нет особых знаний. поэтому я мало понимаю как и что. нужно что то уже готовое что можно потом в код советника вписать....

вот добавил функцию . 

//+------------------------------------------------------------------+
//|                                                       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 с другими настройками и так далее

Файлы:
000104.mq5 15 kb
Eugene Maslyukov
210
Eugene Maslyukov  
Aleksandr Klapatyuk:

вот добавил функцию . 

сохраняем. -  график шаблона с экспертом настроеным на время старта и закрытия всех позиции

например шаблон 1 с одними настройками 

шаблон 2 с другими настройками и так далее

вот есть советник. я его перетянул на график. включил и настроил. затем беру сохраняю шаблон графика с экспертом со своим названием. потом на другой график кидаю ваш советник и указываю в настройках название моего шаблона? или я не так понял? а как тестировать в тестере всю эту конструкцию?

Igor Makanu
9043
Igor Makanu  
Eugene Maslyukov:
у меня нет особых знаний. поэтому я мало понимаю как и что. нужно что то уже готовое что можно потом в код советника вписать....

я дал код который нужно вписать в код советника, если не получается, или изучайте язык или фриланс

мой код работает только по часам, где то выкладывал и с учетом часов-минут, но нужно уметь хотя бы из готовых участков кода сложить свой код

вот еще пример кода ограничивающего время работы советника https://www.mql5.com/ru/code/26019

CTimeSession
CTimeSession
  • www.mql5.com
Класс позволяет определить любое количество торговых сессий, причем делать это можно разными способами. Определение торговых сессий выполняется в строковой переменной через запятую.  Возможны следующие способы задания времени: Просто число, оно означает час времени суток, например "12". В этом случае торговля разрешена в течение указанного...
Alexsandr San
2200
Alexsandr San  
Aleksandr Klapatyuk:

вот добавил функцию . 

сохраняем. -  график шаблона с экспертом настроеным на время старта и закрытия всех позиции

например шаблон 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);
     }


 

Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий