Новый бар в мултивалютном советнике. - страница 3

 
Vitalii Ananev:

Это просто примерный алгоритм. Лень было все полностью писать. А так, это есть методы класса

Это получается перед каждым обращением к NewBar надо символ загонять через Init ? И если надо будет определять по не текущему периоду, то и период загонять вместе с символом?

Я по неопытности, для себя сделал такой класс

class CNewBar
{
protected:
  MqlRates newBarRates[];
public:
 bool newBar();
 bool newBar(ENUM_TIMEFRAMES timeframe, datetime & tOld);
 bool newBar(string symb, ENUM_TIMEFRAMES timeframe, datetime & tOld);
};/********************************************************************/

bool CNewBar::newBar()
{
 static datetime timeLastBar;
  if(CopyRates(_Symbol, PERIOD_CURRENT, 0, 1, newBarRates) < 0)
   return(false);
  bool ret = timeLastBar != newBarRates[0].time;
   if(ret)
    timeLastBar = newBarRates[0].time;
   return(ret);
}/********************************************************************/

bool CNewBar::newBar(ENUM_TIMEFRAMES timeframe, datetime & tOld)
{
 datetime tNew = iTime(_Symbol, PERIOD_W1, 0);
  if(tNew == 0)
   return(false);
   bool ret = tOld != tNew;
   if(ret)
    tOld = tNew;
   return(ret);
}/********************************************************************/

bool CNewBar::newBar(string _symb, ENUM_TIMEFRAMES timeframe, datetime & tOld)
{
 datetime tNew = iTime(_symb, PERIOD_W1, 0);
  if(tNew == 0)
   return(false);
   bool ret = tOld != tNew;
   if(ret)
    tOld = tNew;
   return(ret);
}/********************************************************************/

Третий метод дописал только-что. Как я и предположил в предыдущем сообщении, я с дуру вызывал для разных символов второй метод, без учёта символа. :)

 
Alexey Viktorov:

Это получается перед каждым обращением к NewBar надо символ загонять через Init ? И если надо будет определять по не текущему периоду, то и период загонять вместе с символом?

Я по неопытности, для себя сделал такой класс

Третий метод дописал только-что. Как я и предположил в предыдущем сообщении, я с дуру вызывал для разных символов второй метод, без учёта символа. :)

Нет. Один раз в конструкторе инициализировал экземпляр класса нужным символом и все. Метод init это я для простоты написал, думал, что так будет более понятно.

...

Для каждого символа по которому будет идти торговля создается свой экземпляр класса и они уже не зависимо друг от друга работают только со своим символом.

class Trader
{
private:
   string   Smb;//торгуемый символ
   uint     MN;//магик
   uint     Slip;//проскальзывание
   string   Comm;//комментарий
   bool     Market;//вид исполнения 
   
   double   Price;//цена по которой открывать ордер
   double   StopLoss;//стоп
   double   TakeProfit;//профит
   double   Lots;//объем
   int      NewOrder(uint Cmd,uint try=3);
   double   GetPriceLot(uint Cmd);
protected:
   bool     DeleteOrder(int Ticet); 
   bool     OrderParent();  

   int      CloseOrder(double Vol,uint try);
   void     SortOrder(int &array[]);
public:
                     Trader();
                    ~Trader();
   void     Initalize(string pSmb, uint pMN, uint pSlip, string comm, bool ndd=false);
   void     SetComment(string comm){Comm=comm;};
   void     SetSymbol(string smb){Smb=smb;};
   void     SetMagik(int mn) {MN=mn;};
   void     SetSlippage(int slip) {Slip=slip*GetDigits();}; 
   void     SetMarket(bool NDD){Market=NDD;};
   bool     SetLots(double lot);
   double   GetLots(){return(Lots);};
   

   int      OpenMarket(uint Cmd,double Vol, uint   TP,uint   SL);
   int      OpenMarket(uint Cmd,double Vol, double TP,double SL);   
   int      OpenMarket(uint Cmd,double Vol, double TP,uint   SL);   
   int      OpenMarket(uint Cmd,double Vol, uint   TP,double SL);
         
   int      OpenPending(uint Cmd,double _Price,double Vol, uint   TP,uint   SL);
   int      OpenPending(uint Cmd,double _Price,double Vol, double TP,double SL);
   int      OpenPending(uint Cmd,double _Price,double Vol, double TP,uint   SL);   
   int      OpenPending(uint Cmd,double _Price,double Vol, uint   TP,double SL);   
   

   void     CloseSelectedOrder(int Ticet,double Vol);
   void     CloseSelectedOrder(double Vol);
   void     CloseAllOrder(uint Cmd,bool Sort = false);
   void     CloseAllOrder(uint Cmd,double PartVol,bool Sort=false);   
   void     CloseAllOrder(uint Cmd,uint TimeLimit,bool Sort=false);   
   void     CloseAllOrder(bool Sort = false);

   void     DeleteAllOrder(int Cmd);
   void     DeleteAllOrder(int Cmd,uint TimeLimit);
   void     DeleteAllOrder(int Cmd,datetime Dt);      
   bool     ModifyStopLoss(int Ticet, double SL, uint try=3);
   bool     ModifyStopLoss(double SL, uint try=3);
   bool     Modify(int Ticet, double SL, double TP, uint try=3);
   bool     Modify(double SL, double TP, uint try=3);       
   int      OrderOpenCount(int OrderCmd=-1);
   int      OrderOpenCount(int &Sell,int &Buy,int &SellLimit,int &BuyLimit,int &SellStop,int &BuyStop);
   int      OrderOpenCount(int &Sell,int &Buy);      
   double   ProfitOrder(int OrderCmd=-1);
   int      ProfitPoint(int Ticet);
   int      ProfitPoint();   
   int      AllProfitPoint(int Cmd);
   int      GetLastCloseOrderTicket(double price=0); 
   int      GetLastOpenOrderTicket();
   bool     LastCloseOrderStopLoss();      
   double   GetPoint();
   int      GetDigits();   

   int      GetOrder(int &array[],bool Sort=false);
   void     ProfitLoss(int &ProfitTicet[],double &Profit[],int &LossTicet[],double &Loss[]);      
   double   GetTakeProfit(uint Cmd,uint Profit);
   double   GetStopLoss(uint Cmd,uint Stop);
   void     TrallStopLoss(double ProfitStart,double TrStop,double LossStep);
};

В классе можно реализовать любые методы на все случаи жизни. Потом использовать его в торговле. А в сам советник будет состоять всего из нескольких строк в которых определяются параметры открытия позиций независимо от кол-ва торгуемых символов.

 

А вот как это в советнике выглядит.

#include <Classes\Trader\Trader.mqh>
//#include <Classes\Candle.mqh>
input bool   Multi     = false;//мульти символьные торги
input double Lots =0.01;//Объем
input uint StopLoss = 70;//стоп лосс
input uint TakeProfit = 20;//Таке профит
input int StartHour = 0;//минуты старта
input int StartMinute =6;//минуты старта
input string SYMBOLS ="EURUSD;GBPUSD;USDCHF;USDCAD";//торгуемые символы через ;
input bool   Market = false;//Тип счета ECN или нет
int Magik = 21230;
uint Slipage =3;
string Comm="Toad v. 3.0";

//Trader Smb1;

string Symbols[];
uint SymbolCount = 1;
Trader Traders[];

//Candle Cnd;
//Trader Smb2;
//Trader Smb3;
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
{
   if (Multi)
   {
      int res=StringSplit(SYMBOLS,StringGetCharacter(";",0),Symbols);
      if (res<=0) return(INIT_PARAMETERS_INCORRECT); 
      SymbolCount = res;
      ArrayResize(Traders,SymbolCount);
      for (uint i=0;i<=SymbolCount-1;i++)
      {
         Traders[i].Init(Symbols[i],Magik,Slipage,Comm,Market);        
      }
   }else 
   {
      ArrayResize(Traders,SymbolCount);
      ArrayResize(Symbols,SymbolCount);
      Symbols[0]=Symbol();    
      Traders[0].Init(Symbol(),Magik,Slipage,Comm,Market);
   }   
   return(INIT_SUCCEEDED);
}
void OnTick()
{
  if (!IsTradeAllowed()) return;
  if (Signal()) 
  {
      for (uint i=0;i<=SymbolCount-1;i++)
      {             
         if (Traders[i].OrderOpenCount(-2)==0)
         {          
            Traders[i].OpenMarket(OP_BUY,Lots,TakeProfit,StopLoss);
            Traders[i].OpenMarket(OP_SELL,Lots,TakeProfit,StopLoss);
         }
       }  
  }
}
 

Вот так на двух массивах:


 
Vladimir Karputov:

Вот так на двух массивах:


А зачем текстовый файл. Торгуемые символы можно в параметрах указать.

 
Я торгую исключительно на мультивалютниках. Все индикаторы такие же. Работа по таймеру. Значение, которое приписывается, скажем, на минутках (или любом другом таймфрейме), вычисляется по последней известной цене на этот момент времени. Поэтому, понятия "новый бар" в обычном смысле не существует. Началась новая минута - вот тебе и новый бар.
 
Vladimir Karputov:

Вот так на двух массивах:


Я думал о массиве типа datetime, но что-то мне не понравилось. Зачем ещё один массив если есть уже массив структур MqlRates где есть это время, только память забивать... А в принципе, если-бы не MqlRates, то можно было-бы делать так.

И правильно Виталий задаёт вопрос: "Зачем текстовый файл?" если можно строкой через запятую перечислить символы или считать их из MarketWatch предварительно подготовив окно данных.

 
Alexey Viktorov:

***

И правильно Виталий задаёт вопрос: "Зачем текстовый файл?" если можно строкой через запятую перечислить символы или считать их из MarketWatch предварительно подготовив окно данных.

На любителя. Мне нравится аккуратно складывать названия символов в файле. Потом один раз его прочитал и всё.

 
Vladimir Karputov:

На любителя. Мне нравится аккуратно складывать названия символов в файле. Потом один раз его прочитал и всё.

Но для "несебя" такое не очень подходит. Встречаются такие, что пальцы в растопырку, я крутой хакер, а заполнить текстовый файл.... Хотя в любом варианте не исключено встретить именно такого...

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