Options/Options.mq5
super.admin a1cfcf8eff convert
2025-05-30 16:14:55 +02:00

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);
}