86 lines
7.0 KiB
Plaintext
86 lines
7.0 KiB
Plaintext
|
|
//+------------------------------------------------------------------+
|
|||
|
|
//| EventListener.mqh |
|
|||
|
|
//| Copyright 2017, Vasiliy Sokolov, St-Petersburg, Russia |
|
|||
|
|
//| https://www.mql5.com/en/users/c-4 |
|
|||
|
|
//+------------------------------------------------------------------+
|
|||
|
|
#property copyright "Copyright 2017, Vasiliy Sokolov."
|
|||
|
|
#property link "https://www.mql5.com/en/users/c-4"
|
|||
|
|
#include <Strategy\Strategy.mqh>
|
|||
|
|
#include <Arrays\ArrayObj.mqh>
|
|||
|
|
#include "Panel.mqh"
|
|||
|
|
|
|||
|
|
//+------------------------------------------------------------------+
|
|||
|
|
//| Interest rate profile |
|
|||
|
|
//+------------------------------------------------------------------+
|
|||
|
|
class CIntRate : public CStrategy
|
|||
|
|
{
|
|||
|
|
CArrayObj Symbols; // The list of symbols
|
|||
|
|
CPercentPanel Panel; // Panel for displaying the interest rate
|
|||
|
|
double BaseRate(CSymbol* fut);
|
|||
|
|
public:
|
|||
|
|
virtual void OnEvent(const MarketEvent& event);
|
|||
|
|
virtual bool OnInit();
|
|||
|
|
};
|
|||
|
|
//+-------------------------------------------------------------------+
|
|||
|
|
//| Adds required futures to calculate the interest rate profile |
|
|||
|
|
//+-------------------------------------------------------------------+
|
|||
|
|
bool CIntRate::OnInit(void)
|
|||
|
|
{
|
|||
|
|
string basis = WS.NameBasisSymbol();
|
|||
|
|
for(int i = 0; i < SymbolsTotal(false); i++)
|
|||
|
|
{
|
|||
|
|
string name = SymbolName(i, false);
|
|||
|
|
int index = StringFind(name, basis, 0);
|
|||
|
|
if(index != 0)
|
|||
|
|
continue;
|
|||
|
|
CSymbol* Fut = new CSymbol(name, Timeframe());
|
|||
|
|
if(Fut.ExpirationDate() == 0 || Fut.ExpirationDate() < TimeCurrent())
|
|||
|
|
{
|
|||
|
|
delete Fut;
|
|||
|
|
continue;
|
|||
|
|
}
|
|||
|
|
string text = "Add new symbol " + Fut.Name() + " in symbols list";
|
|||
|
|
CMessage* msg = new CMessage(MESSAGE_INFO, __FUNCTION__, text);
|
|||
|
|
Log.AddMessage(msg);
|
|||
|
|
Symbols.Add(Fut);
|
|||
|
|
}
|
|||
|
|
string text = "Total add symbols " + (string)Symbols.Total();
|
|||
|
|
CMessage* msg = new CMessage(MESSAGE_INFO, __FUNCTION__, text);
|
|||
|
|
Log.AddMessage(msg);
|
|||
|
|
if(Symbols.Total() > 0)
|
|||
|
|
{
|
|||
|
|
Panel.Show();
|
|||
|
|
}
|
|||
|
|
return true;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
//+------------------------------------------------------------------+
|
|||
|
|
//| Calculates the profile and displays it in a table |
|
|||
|
|
//+------------------------------------------------------------------+
|
|||
|
|
void CIntRate::OnEvent(const MarketEvent &event)
|
|||
|
|
{
|
|||
|
|
double sec_one_day = 60*60*24; //86 400
|
|||
|
|
for(int i = 0; i < Symbols.Total(); i++)
|
|||
|
|
{
|
|||
|
|
CSymbol* Fut = Symbols.At(i);
|
|||
|
|
double brate = BaseRate(Fut);
|
|||
|
|
double days = (Fut.ExpirationDate()-TimeCurrent())/sec_one_day;
|
|||
|
|
if(Fut.Last() == 0.0)
|
|||
|
|
continue;
|
|||
|
|
double per = (Fut.Last() - brate)/brate*100.0;
|
|||
|
|
double per_in_year = per/days*365;
|
|||
|
|
Panel.SetLine(i, Fut.Name() + " " + DoubleToString(days, 0) + " Days:", DoubleToString(per_in_year, 2)+"%");
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
//+------------------------------------------------------------------+
|
|||
|
|
//| Returns the spot quote of the futures |
|
|||
|
|
//+------------------------------------------------------------------+
|
|||
|
|
double CIntRate::BaseRate(CSymbol* fut)
|
|||
|
|
{
|
|||
|
|
string name = fut.NameBasisSymbol();
|
|||
|
|
if(StringFind(name, "Si", 0) == 0)
|
|||
|
|
return SymbolInfoDouble("USDRUB_TOD", SYMBOL_LAST)*fut.ContractSize();
|
|||
|
|
return SymbolInfoDouble(name, SYMBOL_LAST)*fut.ContractSize();
|
|||
|
|
}
|
|||
|
|
//+------------------------------------------------------------------+
|
|||
|
|
�
|