EA-Setka-2/framework/kernel/mql5/kernel_market.mqh
super.admin a4b861dd93 convert
2025-05-30 14:50:44 +02:00

293 lines
No EOL
7.4 KiB
MQL5

#ifndef FRAMEWORK_KERNEL_MARKET_MQH
#define FRAMEWORK_KERNEL_MARKET_MQH
class kernel_market {
public:
static double price_buy ( string symbol ) {
MqlTick last_tick;
SymbolInfoTick ( symbol, last_tick );
return last_tick.ask;
}
static double price_sell ( string symbol ) {
MqlTick last_tick;
SymbolInfoTick ( symbol, last_tick );
return last_tick.bid;
}
static double price_day_min ( string symbol ) {
return SymbolInfoDouble ( symbol, SYMBOL_LASTLOW );
}
static double price_day_min ( ) {
return price_day_min ( CURRENT_SYMBOL );
}
static double price_day_max ( string symbol ) {
return SymbolInfoDouble ( symbol, SYMBOL_LASTHIGH );
}
static double price_day_max ( ) {
return price_day_max ( CURRENT_SYMBOL );
}
static double tick_value ( string symbol ) {
double res =0;
for (int i = 0; i < 10; i++)
{
MqlTick m_tick;
if (SymbolInfoTick(symbol, m_tick))
{
res = SymbolInfoDouble ( symbol, SYMBOL_TRADE_TICK_VALUE );
if(res != 0)
break;
}
if (i == 9)
{
if (OrderCalcProfit(ORDER_TYPE_BUY, symbol,1,m_tick.bid,m_tick.bid+SymbolInfoDouble(symbol, SYMBOL_TRADE_TICK_SIZE), res)
&& res != 0
)
break;
Print(__FUNCTION__," Cant get symbol data! Attemp to calculate!");
res = CalcTickValue();
//OnDeinit(10);
}
Sleep(100);
}
//if (res == 0)
// res = SymbolInfoDouble (symbol,SYMBOL_TRADE_TICK_VALUE_LOSS);
//if(res == 0)
// Print(__FUNCTION__," Zero tick value detected!");
return res;
}
static double tick_value () {
return tick_value ( CURRENT_SYMBOL );
}
static double tick_size ( string symbol ) {
return SymbolInfoDouble ( symbol, SYMBOL_TRADE_TICK_SIZE );
}
static double tick_size () {
return tick_size ( CURRENT_SYMBOL );
}
static datetime tick_last_time ( string symbol ) {
return (datetime)SymbolInfoInteger ( symbol, SYMBOL_TIME );
}
static datetime tick_last_time () {
return tick_last_time ( CURRENT_SYMBOL );
}
static double lot_min ( string symbol ) {
return SymbolInfoDouble ( symbol, SYMBOL_VOLUME_MIN );
}
static double lot_min () {
return lot_min ( CURRENT_SYMBOL );
}
static double lot_size ( string symbol ) {
return SymbolInfoDouble ( symbol, SYMBOL_TRADE_CONTRACT_SIZE );
}
static double lot_size () {
return lot_size ( CURRENT_SYMBOL );
}
static double lot_step ( string symbol ) {
return SymbolInfoDouble ( symbol, SYMBOL_VOLUME_STEP );
}
static double lot_step () {
return lot_size ( CURRENT_SYMBOL );
}
static double lot_max ( string symbol ) {
return SymbolInfoDouble ( symbol, SYMBOL_VOLUME_MAX );
}
static double lot_max () {
return lot_max ( CURRENT_SYMBOL );
}
static enum_swap_type swap_type ( string symbol ) {
return ( enum_swap_type ) SymbolInfoInteger ( symbol, SYMBOL_SWAP_MODE );
}
static enum_swap_type swap_type () {
return swap_type ( CURRENT_SYMBOL );
}
static double swap_long ( string symbol ) {
return SymbolInfoDouble ( symbol, SYMBOL_SWAP_LONG );
}
static double swap_long ( ) {
return swap_long ( CURRENT_SYMBOL );
}
static double swap_short ( string symbol ) {
return SymbolInfoDouble ( symbol, SYMBOL_SWAP_SHORT );
}
static double swap_short ( ) {
return swap_short ( CURRENT_SYMBOL );
}
static enum_margin_calc_type margin_calc_type ( string symbol ) {
return margin_calc_type_forex;
}
static enum_margin_calc_type margin_calc_type () {
return margin_calc_type_forex;
}
static double margin_required ( string symbol ) {
double result = -255;
double request_result = OrderCalcMargin ( ORDER_TYPE_BUY,
symbol,
1.0,
price_buy ( symbol ),
result );
if ( !request_result ) {
Print ( StringFormat ( "%d", layer_error::get_last() ) );
}
return result;
}
static double margin_required ( ) {
return 0.0;
}
static double margin_hedged ( string symbol ) {
return SymbolInfoDouble ( symbol, SYMBOL_MARGIN_HEDGED );
}
static double margin_hedged ( ) {
return SymbolInfoDouble ( CURRENT_SYMBOL, SYMBOL_MARGIN_HEDGED );
}
static double margin_maintenance ( string symbol ) {
return SymbolInfoDouble ( symbol, SYMBOL_MARGIN_MAINTENANCE );
}
static double margin_maintenance () {
return SymbolInfoDouble ( CURRENT_SYMBOL, SYMBOL_MARGIN_MAINTENANCE );
}
static double margin_init ( string symbol ) {
return SymbolInfoDouble ( symbol, SYMBOL_MARGIN_INITIAL );
}
static double margin_init () {
return SymbolInfoDouble ( CURRENT_SYMBOL, SYMBOL_MARGIN_INITIAL );
}
static double point ( string symbol ) {
return SymbolInfoDouble ( symbol, SYMBOL_POINT );
}
static double point () {
return point ( CURRENT_SYMBOL );
// return SymbolInfoDouble ( CURRENT_SYMBOL, SYMBOL_POINT );
}
static datetime starting ( string symbol ) {
return 0;
}
static datetime starting ( ) {
return 0;
}
static datetime expiration ( string symbol ) {
return 0;
}
static datetime expiration () {
return 0;
}
static bool trade_allowed ( string symbol ) {
if ( SymbolInfoInteger( symbol, SYMBOL_TRADE_MODE) == SYMBOL_TRADE_MODE_FULL ) return true;
return false;
}
static bool trade_allowed () {
return trade_allowed( CURRENT_SYMBOL );
return false;
}
static int stop_level ( string symbol ) {
return (int)SymbolInfoInteger ( symbol, SYMBOL_TRADE_STOPS_LEVEL );
}
static double stop_level () {
return stop_level ( CURRENT_SYMBOL );
}
static double freeze_level ( string symbol ) {
return (double)SymbolInfoInteger ( symbol, SYMBOL_TRADE_FREEZE_LEVEL );
}
static double freeze_level () {
return (double)freeze_level ( CURRENT_SYMBOL );
}
static int spread ( string symbol ) {
return (int)SymbolInfoInteger ( symbol, SYMBOL_SPREAD );
}
static int spread () {
return (int)spread ( CURRENT_SYMBOL );
}
static int digits ( string symbol ) {
return (int)SymbolInfoInteger ( symbol, SYMBOL_DIGITS );
}
static int digits () {
return digits ( CURRENT_SYMBOL );
}
static enum_profit_calc_type profit_calc_type ( string symbol ) {
return ( enum_profit_calc_type ) SymbolInfoInteger ( symbol, SYMBOL_TRADE_CALC_MODE );
}
static enum_profit_calc_type profit_calc_type () {
return profit_calc_type ( CURRENT_SYMBOL );
}
static double CalcTickValue()
{
int count = kernel_order::count();
double open_price,
price,
lots,
profit;
for (int i = 0; i < count; i++)
{
if (kernel_order::select_by_index( i ) && kernel_order::symbol() == CURRENT_SYMBOL)
{
open_price = kernel_order::open_price();
price = (kernel_order::type()== order_operation_buy || kernel_order::type() == order_operation_buy_stop)?
kernel_market::price_sell(CURRENT_SYMBOL):
kernel_market::price_buy(CURRENT_SYMBOL);
lots = kernel_order::lots();
profit = kernel_order::get_profit(true);
if(profit != 0 && lots != 0 && open_price != price)
return MathAbs(open_price - price)/profit/lots;
}
}
Print(__FUNCTION__," ",__LINE__," Can't calculate TickValue!");
return 1;
}
};
#endif