103 lines
7.8 KiB
MQL5
103 lines
7.8 KiB
MQL5
//+------------------------------------------------------------------+
|
|
//| Options.mq5 |
|
|
//| Arthur Albano |
|
|
//| https://www.mql5.com/en/users/arthuralbano/ |
|
|
//+------------------------------------------------------------------+
|
|
#property copyright "Arthur Albano"
|
|
#property link "https://www.mql5.com/en/users/arthuralbano"
|
|
|
|
#include <Math\Alglib\alglib.mqh>
|
|
#include <Graphics\Graphic.mqh>
|
|
#include "CSymbol.mqh"
|
|
const string _SYMBOL = _Symbol;
|
|
|
|
sinput uint inpFrequencia = 10; // Renderização (s):
|
|
|
|
enum CalcMode
|
|
{
|
|
VWAP, // Session Average Weighted
|
|
Last, // Last deal quote
|
|
AskBidWatch, // Watch(Ask+Bid)/2
|
|
Median, // Mediana
|
|
DWAP // Daily Weighted Average Price
|
|
};
|
|
|
|
sinput CalcMode inpCalcMode = Median; // Modo de Cálculo:
|
|
sinput ENUM_LINE_STYLE InpStyle = (ENUM_LINE_STYLE)STYLE_DOT; //Style
|
|
sinput color InpColor = clrGold; //Color
|
|
sinput ENUM_LINE_STYLE InpPremiumStyle = (ENUM_LINE_STYLE)STYLE_DASHDOTDOT; //Style
|
|
sinput color InpPremiumColor = clrYellow; //Color
|
|
sinput bool InpVerbose = false; //Print calculations
|
|
sinput bool InpGraph = true; //Show Graphic
|
|
sinput bool InpFilterBE = false; //Filter negative extrinsic
|
|
sinput ENUM_PRICE_MODE InpPriceMode = PRICE_MODE_MEDIAN;//CSymbol PRICE
|
|
|
|
double _S = 0.0; //spot (underlying/basis) price
|
|
double _T = 0.0; //relative time to expiration (t/t0)
|
|
double _Z = 0.0; //+1 for calls / -1 for puts
|
|
double _K = 0.0; //strike
|
|
double _X = 0.0; //OPM premium
|
|
double _r = 0.0; //calculated return
|
|
#define B(Z,K,X) {(K+Z*X)}
|
|
double _B = 0.0; //Break-even
|
|
|
|
//+------------------------------------------------------------------+
|
|
//| Expert initialization function |
|
|
//+------------------------------------------------------------------+
|
|
int OnInit()
|
|
{
|
|
Comment("\nCalculando...");
|
|
EventSetTimer(inpFrequencia);
|
|
if(InpVerbose==true)Print("Calculated Premium: "+DoubleToString(LSFit_OPTIONS(),4));
|
|
|
|
return(INIT_SUCCEEDED);
|
|
}
|
|
//+------------------------------------------------------------------+
|
|
//| Expert deinitialization function |
|
|
//+------------------------------------------------------------------+
|
|
void OnDeinit(const int reason)
|
|
{
|
|
EventKillTimer();
|
|
Comment("");
|
|
}
|
|
//+------------------------------------------------------------------+
|
|
//| Expert timer function |
|
|
//+------------------------------------------------------------------+
|
|
void OnTimer()
|
|
{
|
|
EA();
|
|
}
|
|
//+------------------------------------------------------------------+
|
|
void EA()
|
|
{
|
|
string out = "\n";
|
|
double dbOptionPrice=0.0;
|
|
CSymbol _CSymbol;
|
|
_CSymbol.SetSymbol(_SYMBOL);
|
|
dbOptionPrice = _CSymbol.Price(InpPriceMode);
|
|
|
|
if(ObjectCreate(0, "EA_PRICEOPTION", OBJ_HLINE, 0, 0, dbOptionPrice))
|
|
{
|
|
ObjectSetInteger(0, "EA_PRICEOPTION", OBJPROP_STYLE, InpStyle);
|
|
ObjectSetInteger(0, "EA_PRICEOPTION", OBJPROP_COLOR, InpColor);
|
|
}
|
|
else
|
|
{
|
|
Print(__FUNCTION__,": falha ao criar a linha de reposicionamento! Código de erro = ",GetLastError());
|
|
};
|
|
|
|
if(ObjectCreate(0, "OPTION_PREMIUM", OBJ_HLINE, 0, 0, LSFit_OPTIONS()))
|
|
{
|
|
ObjectSetInteger(0, "OPTION_PREMIUM", OBJPROP_STYLE, InpPremiumStyle);
|
|
ObjectSetInteger(0, "OPTION_PREMIUM", OBJPROP_COLOR, InpPremiumColor);
|
|
}
|
|
else
|
|
{
|
|
Print(__FUNCTION__,": falha ao criar a linha de reposicionamento! Código de erro = ",GetLastError());
|
|
};
|
|
|
|
out+="Price: "+DoubleToString(NormalizeDouble(dbOptionPrice,2),2)+"\n";
|
|
out+="OPM: "+DoubleToString(NormalizeDouble(LSFit_OPTIONS(),2),2)+"\n";
|
|
out+="Break-even: "+DoubleToString(NormalizeDouble(_K+_Z*LSFit_OPTIONS(),2),2)+"\n";
|
|
Comment(out);
|
|
}
|