EA-Setka-2/logic/api.mqh

144 lines
4.7 KiB
MQL5
Raw Permalink Normal View History

2025-05-30 14:50:44 +02:00
//+------------------------------------------------------------------+
//| ProjectName |
//| Copyright 2020, CompanyName |
//| http://www.companyname.net |
//+------------------------------------------------------------------+
#ifndef API_MQH
#define API_MQH
#define PREFIX_MAIN "IG"
#define PREFIX_ORDER_STEP "OrderStep"
#define PREFIX_NEXT_ORDER_POSITION "NextOrderPosition"
#define PREFIX_LEVEL_WITHOUT_LOSS "NoLossLevel"
#define PREFIX_TAKE_PROFIT "TakeProfit"
#define PREFIX_PROFIT_IN_CURRENCY "ProfitInCurrency"
#define PREFIX_FUTURE_PROFIT_IN_CURRENCY "FutureProfitInCurrency"
#define PREFIX_LOT_SUM "LotSum"
logic_handler *_api_long_handler;
logic_handler *_api_short_handler;
timer_t *_api_update_time;
// Нужно как то в таймере это сделать
bool _api_first_tick;
//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
class api
{
public:
static uchar gen_postfix(logic_handler *handler)
{
return c_order::is_buy_direction(handler._order_settings.order_type)?'B':'S';
}
#ifdef FOR_OPTIMIZATION
static void init() {}
static void deinit() {}
static void process() {}
static void set_times(int seconds) {}
static void set_short_handler(logic_handler *value) {}
static void set_long_handler(logic_handler *value) {}
#else
static void init()
{
_api_first_tick = true;
tool_global_var::delete_all();
}
static void deinit()
{
GC_DISPOSE_IF(_api_update_time);
}
static void process()
{
if(_api_update_time == NULL
|| (!_api_first_tick && !_api_update_time.is_elapsed()))
{
return;
}
_api_first_tick = false;
handler_process(_api_long_handler);
handler_process(_api_short_handler);
_api_update_time.reset();
}
static void set_times(int seconds)
{
_api_update_time = seconds == 0 ? NULL : timer_t::create(seconds);
}
static void set_short_handler(logic_handler *value)
{
_api_short_handler = value;
}
static void set_long_handler(logic_handler *value)
{
_api_long_handler = value;
}
private:
#define GLOB_SET(name, value) \
tool_global_var::set(name,value,gen_postfix(handler))
static void handler_process(logic_handler *handler)
{
list<c_order *> *orders = layer_order::get(handler._order_settings);
if(orders.count == 0)
{
tool_global_var::delete_all(gen_postfix(handler));
return;
}
if(!handler.can_update_params())
{
return;
}
double grid_step = layer::correct_price(calc_grid_step::get(handler._settings, orders.count + 1));
double next_lvl = layer::correct_price(handler.get_order_position(orders.last_or_default().open_price, orders.count + 1));
double level_without_loss = layer::correct_price(calc_take_profit::get(handler._settings, handler._order_settings, tp_level_without_loss, 0));
double take_profit = layer::correct_price(calc_take_profit::get(handler._settings, handler._order_settings, orders.count));
double current_price = layer_market::price_close(handler._order_settings.order_type);
double lot_sum = 0.0,
current_profit_in_currency = handler.get_profit(),
future_profit_in_currency = 0;
LIST_FOREACH(orders, c_order *, item,
{
lot_sum += item.lot;
if(item.is_order())
{
future_profit_in_currency += item.commission + item.swap;
future_profit_in_currency += item.get_profit_in_currency(take_profit);
continue;
}
if(item.is_before_line(take_profit))
{
future_profit_in_currency += item.get_profit_in_currency(take_profit);
}
});
GLOB_SET(PREFIX_ORDER_STEP, grid_step);
GLOB_SET(PREFIX_NEXT_ORDER_POSITION, next_lvl);
GLOB_SET(PREFIX_LEVEL_WITHOUT_LOSS, level_without_loss);
GLOB_SET(PREFIX_TAKE_PROFIT, take_profit);
GLOB_SET(PREFIX_PROFIT_IN_CURRENCY, current_profit_in_currency);
GLOB_SET(PREFIX_FUTURE_PROFIT_IN_CURRENCY, future_profit_in_currency);
GLOB_SET(PREFIX_LOT_SUM, lot_sum);
}
#endif
};
#endif
//+------------------------------------------------------------------+